aarch64.ad (8426:e8f144c18e99) | aarch64.ad (8462:5b8b5731ca2d) |
---|---|
1// 2// Copyright (c) 2003, 2015, Oracle and/or its affiliates. All rights reserved. 3// Copyright (c) 2014, Red Hat Inc. All rights reserved. 4// DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 5// 6// This code is free software; you can redistribute it and/or modify it 7// under the terms of the GNU General Public License version 2 only, as 8// published by the Free Software Foundation. --- 147 unchanged lines hidden (view full) --- 156// single or double precision floating-point values up to 8 * 32 157// floats, 4 * 64 bit floats or 2 * 128 bit floats. We currently only 158// use the first float or double element of the vector. 159 160// for Java use float registers v0-v15 are always save on call whereas 161// the platform ABI treats v8-v15 as callee save). float registers 162// v16-v31 are SOC as per the platform spec 163 | 1// 2// Copyright (c) 2003, 2015, Oracle and/or its affiliates. All rights reserved. 3// Copyright (c) 2014, Red Hat Inc. All rights reserved. 4// DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 5// 6// This code is free software; you can redistribute it and/or modify it 7// under the terms of the GNU General Public License version 2 only, as 8// published by the Free Software Foundation. --- 147 unchanged lines hidden (view full) --- 156// single or double precision floating-point values up to 8 * 32 157// floats, 4 * 64 bit floats or 2 * 128 bit floats. We currently only 158// use the first float or double element of the vector. 159 160// for Java use float registers v0-v15 are always save on call whereas 161// the platform ABI treats v8-v15 as callee save). float registers 162// v16-v31 are SOC as per the platform spec 163 |
164 reg_def V0 ( SOC, SOC, Op_RegF, 0, v0->as_VMReg() ); 165 reg_def V0_H ( SOC, SOC, Op_RegF, 0, v0->as_VMReg()->next() ); 166 reg_def V1 ( SOC, SOC, Op_RegF, 1, v1->as_VMReg() ); 167 reg_def V1_H ( SOC, SOC, Op_RegF, 1, v1->as_VMReg()->next() ); 168 reg_def V2 ( SOC, SOC, Op_RegF, 2, v2->as_VMReg() ); 169 reg_def V2_H ( SOC, SOC, Op_RegF, 2, v2->as_VMReg()->next() ); 170 reg_def V3 ( SOC, SOC, Op_RegF, 3, v3->as_VMReg() ); 171 reg_def V3_H ( SOC, SOC, Op_RegF, 3, v3->as_VMReg()->next() ); 172 reg_def V4 ( SOC, SOC, Op_RegF, 4, v4->as_VMReg() ); 173 reg_def V4_H ( SOC, SOC, Op_RegF, 4, v4->as_VMReg()->next() ); 174 reg_def V5 ( SOC, SOC, Op_RegF, 5, v5->as_VMReg() ); 175 reg_def V5_H ( SOC, SOC, Op_RegF, 5, v5->as_VMReg()->next() ); 176 reg_def V6 ( SOC, SOC, Op_RegF, 6, v6->as_VMReg() ); 177 reg_def V6_H ( SOC, SOC, Op_RegF, 6, v6->as_VMReg()->next() ); 178 reg_def V7 ( SOC, SOC, Op_RegF, 7, v7->as_VMReg() ); 179 reg_def V7_H ( SOC, SOC, Op_RegF, 7, v7->as_VMReg()->next() ); 180 reg_def V8 ( SOC, SOE, Op_RegF, 8, v8->as_VMReg() ); 181 reg_def V8_H ( SOC, SOE, Op_RegF, 8, v8->as_VMReg()->next() ); 182 reg_def V9 ( SOC, SOE, Op_RegF, 9, v9->as_VMReg() ); 183 reg_def V9_H ( SOC, SOE, Op_RegF, 9, v9->as_VMReg()->next() ); 184 reg_def V10 ( SOC, SOE, Op_RegF, 10, v10->as_VMReg() ); 185 reg_def V10_H( SOC, SOE, Op_RegF, 10, v10->as_VMReg()->next()); 186 reg_def V11 ( SOC, SOE, Op_RegF, 11, v11->as_VMReg() ); 187 reg_def V11_H( SOC, SOE, Op_RegF, 11, v11->as_VMReg()->next()); 188 reg_def V12 ( SOC, SOE, Op_RegF, 12, v12->as_VMReg() ); 189 reg_def V12_H( SOC, SOE, Op_RegF, 12, v12->as_VMReg()->next()); 190 reg_def V13 ( SOC, SOE, Op_RegF, 13, v13->as_VMReg() ); 191 reg_def V13_H( SOC, SOE, Op_RegF, 13, v13->as_VMReg()->next()); 192 reg_def V14 ( SOC, SOE, Op_RegF, 14, v14->as_VMReg() ); 193 reg_def V14_H( SOC, SOE, Op_RegF, 14, v14->as_VMReg()->next()); 194 reg_def V15 ( SOC, SOE, Op_RegF, 15, v15->as_VMReg() ); 195 reg_def V15_H( SOC, SOE, Op_RegF, 15, v15->as_VMReg()->next()); 196 reg_def V16 ( SOC, SOC, Op_RegF, 16, v16->as_VMReg() ); 197 reg_def V16_H( SOC, SOC, Op_RegF, 16, v16->as_VMReg()->next()); 198 reg_def V17 ( SOC, SOC, Op_RegF, 17, v17->as_VMReg() ); 199 reg_def V17_H( SOC, SOC, Op_RegF, 17, v17->as_VMReg()->next()); 200 reg_def V18 ( SOC, SOC, Op_RegF, 18, v18->as_VMReg() ); 201 reg_def V18_H( SOC, SOC, Op_RegF, 18, v18->as_VMReg()->next()); 202 reg_def V19 ( SOC, SOC, Op_RegF, 19, v19->as_VMReg() ); 203 reg_def V19_H( SOC, SOC, Op_RegF, 19, v19->as_VMReg()->next()); 204 reg_def V20 ( SOC, SOC, Op_RegF, 20, v20->as_VMReg() ); 205 reg_def V20_H( SOC, SOC, Op_RegF, 20, v20->as_VMReg()->next()); 206 reg_def V21 ( SOC, SOC, Op_RegF, 21, v21->as_VMReg() ); 207 reg_def V21_H( SOC, SOC, Op_RegF, 21, v21->as_VMReg()->next()); 208 reg_def V22 ( SOC, SOC, Op_RegF, 22, v22->as_VMReg() ); 209 reg_def V22_H( SOC, SOC, Op_RegF, 22, v22->as_VMReg()->next()); 210 reg_def V23 ( SOC, SOC, Op_RegF, 23, v23->as_VMReg() ); 211 reg_def V23_H( SOC, SOC, Op_RegF, 23, v23->as_VMReg()->next()); 212 reg_def V24 ( SOC, SOC, Op_RegF, 24, v24->as_VMReg() ); 213 reg_def V24_H( SOC, SOC, Op_RegF, 24, v24->as_VMReg()->next()); 214 reg_def V25 ( SOC, SOC, Op_RegF, 25, v25->as_VMReg() ); 215 reg_def V25_H( SOC, SOC, Op_RegF, 25, v25->as_VMReg()->next()); 216 reg_def V26 ( SOC, SOC, Op_RegF, 26, v26->as_VMReg() ); 217 reg_def V26_H( SOC, SOC, Op_RegF, 26, v26->as_VMReg()->next()); 218 reg_def V27 ( SOC, SOC, Op_RegF, 27, v27->as_VMReg() ); 219 reg_def V27_H( SOC, SOC, Op_RegF, 27, v27->as_VMReg()->next()); 220 reg_def V28 ( SOC, SOC, Op_RegF, 28, v28->as_VMReg() ); 221 reg_def V28_H( SOC, SOC, Op_RegF, 28, v28->as_VMReg()->next()); 222 reg_def V29 ( SOC, SOC, Op_RegF, 29, v29->as_VMReg() ); 223 reg_def V29_H( SOC, SOC, Op_RegF, 29, v29->as_VMReg()->next()); 224 reg_def V30 ( SOC, SOC, Op_RegF, 30, v30->as_VMReg() ); 225 reg_def V30_H( SOC, SOC, Op_RegF, 30, v30->as_VMReg()->next()); 226 reg_def V31 ( SOC, SOC, Op_RegF, 31, v31->as_VMReg() ); 227 reg_def V31_H( SOC, SOC, Op_RegF, 31, v31->as_VMReg()->next()); | 164 reg_def V0 ( SOC, SOC, Op_RegF, 0, v0->as_VMReg() ); 165 reg_def V0_H ( SOC, SOC, Op_RegF, 0, v0->as_VMReg()->next() ); 166 reg_def V0_J ( SOC, SOC, Op_RegF, 0, v0->as_VMReg()->next(2) ); 167 reg_def V0_K ( SOC, SOC, Op_RegF, 0, v0->as_VMReg()->next(3) ); |
228 | 168 |
169 reg_def V1 ( SOC, SOC, Op_RegF, 1, v1->as_VMReg() ); 170 reg_def V1_H ( SOC, SOC, Op_RegF, 1, v1->as_VMReg()->next() ); 171 reg_def V1_J ( SOC, SOC, Op_RegF, 1, v1->as_VMReg()->next(2) ); 172 reg_def V1_K ( SOC, SOC, Op_RegF, 1, v1->as_VMReg()->next(3) ); 173 174 reg_def V2 ( SOC, SOC, Op_RegF, 2, v2->as_VMReg() ); 175 reg_def V2_H ( SOC, SOC, Op_RegF, 2, v2->as_VMReg()->next() ); 176 reg_def V2_J ( SOC, SOC, Op_RegF, 2, v2->as_VMReg()->next(2) ); 177 reg_def V2_K ( SOC, SOC, Op_RegF, 2, v2->as_VMReg()->next(3) ); 178 179 reg_def V3 ( SOC, SOC, Op_RegF, 3, v3->as_VMReg() ); 180 reg_def V3_H ( SOC, SOC, Op_RegF, 3, v3->as_VMReg()->next() ); 181 reg_def V3_J ( SOC, SOC, Op_RegF, 3, v3->as_VMReg()->next(2) ); 182 reg_def V3_K ( SOC, SOC, Op_RegF, 3, v3->as_VMReg()->next(3) ); 183 184 reg_def V4 ( SOC, SOC, Op_RegF, 4, v4->as_VMReg() ); 185 reg_def V4_H ( SOC, SOC, Op_RegF, 4, v4->as_VMReg()->next() ); 186 reg_def V4_J ( SOC, SOC, Op_RegF, 4, v4->as_VMReg()->next(2) ); 187 reg_def V4_K ( SOC, SOC, Op_RegF, 4, v4->as_VMReg()->next(3) ); 188 189 reg_def V5 ( SOC, SOC, Op_RegF, 5, v5->as_VMReg() ); 190 reg_def V5_H ( SOC, SOC, Op_RegF, 5, v5->as_VMReg()->next() ); 191 reg_def V5_J ( SOC, SOC, Op_RegF, 5, v5->as_VMReg()->next(2) ); 192 reg_def V5_K ( SOC, SOC, Op_RegF, 5, v5->as_VMReg()->next(3) ); 193 194 reg_def V6 ( SOC, SOC, Op_RegF, 6, v6->as_VMReg() ); 195 reg_def V6_H ( SOC, SOC, Op_RegF, 6, v6->as_VMReg()->next() ); 196 reg_def V6_J ( SOC, SOC, Op_RegF, 6, v6->as_VMReg()->next(2) ); 197 reg_def V6_K ( SOC, SOC, Op_RegF, 6, v6->as_VMReg()->next(3) ); 198 199 reg_def V7 ( SOC, SOC, Op_RegF, 7, v7->as_VMReg() ); 200 reg_def V7_H ( SOC, SOC, Op_RegF, 7, v7->as_VMReg()->next() ); 201 reg_def V7_J ( SOC, SOC, Op_RegF, 7, v7->as_VMReg()->next(2) ); 202 reg_def V7_K ( SOC, SOC, Op_RegF, 7, v7->as_VMReg()->next(3) ); 203 204 reg_def V8 ( SOC, SOC, Op_RegF, 8, v8->as_VMReg() ); 205 reg_def V8_H ( SOC, SOC, Op_RegF, 8, v8->as_VMReg()->next() ); 206 reg_def V8_J ( SOC, SOC, Op_RegF, 8, v8->as_VMReg()->next(2) ); 207 reg_def V8_K ( SOC, SOC, Op_RegF, 8, v8->as_VMReg()->next(3) ); 208 209 reg_def V9 ( SOC, SOC, Op_RegF, 9, v9->as_VMReg() ); 210 reg_def V9_H ( SOC, SOC, Op_RegF, 9, v9->as_VMReg()->next() ); 211 reg_def V9_J ( SOC, SOC, Op_RegF, 9, v9->as_VMReg()->next(2) ); 212 reg_def V9_K ( SOC, SOC, Op_RegF, 9, v9->as_VMReg()->next(3) ); 213 214 reg_def V10 ( SOC, SOC, Op_RegF, 10, v10->as_VMReg() ); 215 reg_def V10_H( SOC, SOC, Op_RegF, 10, v10->as_VMReg()->next() ); 216 reg_def V10_J( SOC, SOC, Op_RegF, 10, v10->as_VMReg()->next(2)); 217 reg_def V10_K( SOC, SOC, Op_RegF, 10, v10->as_VMReg()->next(3)); 218 219 reg_def V11 ( SOC, SOC, Op_RegF, 11, v11->as_VMReg() ); 220 reg_def V11_H( SOC, SOC, Op_RegF, 11, v11->as_VMReg()->next() ); 221 reg_def V11_J( SOC, SOC, Op_RegF, 11, v11->as_VMReg()->next(2)); 222 reg_def V11_K( SOC, SOC, Op_RegF, 11, v11->as_VMReg()->next(3)); 223 224 reg_def V12 ( SOC, SOC, Op_RegF, 12, v12->as_VMReg() ); 225 reg_def V12_H( SOC, SOC, Op_RegF, 12, v12->as_VMReg()->next() ); 226 reg_def V12_J( SOC, SOC, Op_RegF, 12, v12->as_VMReg()->next(2)); 227 reg_def V12_K( SOC, SOC, Op_RegF, 12, v12->as_VMReg()->next(3)); 228 229 reg_def V13 ( SOC, SOC, Op_RegF, 13, v13->as_VMReg() ); 230 reg_def V13_H( SOC, SOC, Op_RegF, 13, v13->as_VMReg()->next() ); 231 reg_def V13_J( SOC, SOC, Op_RegF, 13, v13->as_VMReg()->next(2)); 232 reg_def V13_K( SOC, SOC, Op_RegF, 13, v13->as_VMReg()->next(3)); 233 234 reg_def V14 ( SOC, SOC, Op_RegF, 14, v14->as_VMReg() ); 235 reg_def V14_H( SOC, SOC, Op_RegF, 14, v14->as_VMReg()->next() ); 236 reg_def V14_J( SOC, SOC, Op_RegF, 14, v14->as_VMReg()->next(2)); 237 reg_def V14_K( SOC, SOC, Op_RegF, 14, v14->as_VMReg()->next(3)); 238 239 reg_def V15 ( SOC, SOC, Op_RegF, 15, v15->as_VMReg() ); 240 reg_def V15_H( SOC, SOC, Op_RegF, 15, v15->as_VMReg()->next() ); 241 reg_def V15_J( SOC, SOC, Op_RegF, 15, v15->as_VMReg()->next(2)); 242 reg_def V15_K( SOC, SOC, Op_RegF, 15, v15->as_VMReg()->next(3)); 243 244 reg_def V16 ( SOC, SOC, Op_RegF, 16, v16->as_VMReg() ); 245 reg_def V16_H( SOC, SOC, Op_RegF, 16, v16->as_VMReg()->next() ); 246 reg_def V16_J( SOC, SOC, Op_RegF, 16, v16->as_VMReg()->next(2)); 247 reg_def V16_K( SOC, SOC, Op_RegF, 16, v16->as_VMReg()->next(3)); 248 249 reg_def V17 ( SOC, SOC, Op_RegF, 17, v17->as_VMReg() ); 250 reg_def V17_H( SOC, SOC, Op_RegF, 17, v17->as_VMReg()->next() ); 251 reg_def V17_J( SOC, SOC, Op_RegF, 17, v17->as_VMReg()->next(2)); 252 reg_def V17_K( SOC, SOC, Op_RegF, 17, v17->as_VMReg()->next(3)); 253 254 reg_def V18 ( SOC, SOC, Op_RegF, 18, v18->as_VMReg() ); 255 reg_def V18_H( SOC, SOC, Op_RegF, 18, v18->as_VMReg()->next() ); 256 reg_def V18_J( SOC, SOC, Op_RegF, 18, v18->as_VMReg()->next(2)); 257 reg_def V18_K( SOC, SOC, Op_RegF, 18, v18->as_VMReg()->next(3)); 258 259 reg_def V19 ( SOC, SOC, Op_RegF, 19, v19->as_VMReg() ); 260 reg_def V19_H( SOC, SOC, Op_RegF, 19, v19->as_VMReg()->next() ); 261 reg_def V19_J( SOC, SOC, Op_RegF, 19, v19->as_VMReg()->next(2)); 262 reg_def V19_K( SOC, SOC, Op_RegF, 19, v19->as_VMReg()->next(3)); 263 264 reg_def V20 ( SOC, SOC, Op_RegF, 20, v20->as_VMReg() ); 265 reg_def V20_H( SOC, SOC, Op_RegF, 20, v20->as_VMReg()->next() ); 266 reg_def V20_J( SOC, SOC, Op_RegF, 20, v20->as_VMReg()->next(2)); 267 reg_def V20_K( SOC, SOC, Op_RegF, 20, v20->as_VMReg()->next(3)); 268 269 reg_def V21 ( SOC, SOC, Op_RegF, 21, v21->as_VMReg() ); 270 reg_def V21_H( SOC, SOC, Op_RegF, 21, v21->as_VMReg()->next() ); 271 reg_def V21_J( SOC, SOC, Op_RegF, 21, v21->as_VMReg()->next(2)); 272 reg_def V21_K( SOC, SOC, Op_RegF, 21, v21->as_VMReg()->next(3)); 273 274 reg_def V22 ( SOC, SOC, Op_RegF, 22, v22->as_VMReg() ); 275 reg_def V22_H( SOC, SOC, Op_RegF, 22, v22->as_VMReg()->next() ); 276 reg_def V22_J( SOC, SOC, Op_RegF, 22, v22->as_VMReg()->next(2)); 277 reg_def V22_K( SOC, SOC, Op_RegF, 22, v22->as_VMReg()->next(3)); 278 279 reg_def V23 ( SOC, SOC, Op_RegF, 23, v23->as_VMReg() ); 280 reg_def V23_H( SOC, SOC, Op_RegF, 23, v23->as_VMReg()->next() ); 281 reg_def V23_J( SOC, SOC, Op_RegF, 23, v23->as_VMReg()->next(2)); 282 reg_def V23_K( SOC, SOC, Op_RegF, 23, v23->as_VMReg()->next(3)); 283 284 reg_def V24 ( SOC, SOC, Op_RegF, 24, v24->as_VMReg() ); 285 reg_def V24_H( SOC, SOC, Op_RegF, 24, v24->as_VMReg()->next() ); 286 reg_def V24_J( SOC, SOC, Op_RegF, 24, v24->as_VMReg()->next(2)); 287 reg_def V24_K( SOC, SOC, Op_RegF, 24, v24->as_VMReg()->next(3)); 288 289 reg_def V25 ( SOC, SOC, Op_RegF, 25, v25->as_VMReg() ); 290 reg_def V25_H( SOC, SOC, Op_RegF, 25, v25->as_VMReg()->next() ); 291 reg_def V25_J( SOC, SOC, Op_RegF, 25, v25->as_VMReg()->next(2)); 292 reg_def V25_K( SOC, SOC, Op_RegF, 25, v25->as_VMReg()->next(3)); 293 294 reg_def V26 ( SOC, SOC, Op_RegF, 26, v26->as_VMReg() ); 295 reg_def V26_H( SOC, SOC, Op_RegF, 26, v26->as_VMReg()->next() ); 296 reg_def V26_J( SOC, SOC, Op_RegF, 26, v26->as_VMReg()->next(2)); 297 reg_def V26_K( SOC, SOC, Op_RegF, 26, v26->as_VMReg()->next(3)); 298 299 reg_def V27 ( SOC, SOC, Op_RegF, 27, v27->as_VMReg() ); 300 reg_def V27_H( SOC, SOC, Op_RegF, 27, v27->as_VMReg()->next() ); 301 reg_def V27_J( SOC, SOC, Op_RegF, 27, v27->as_VMReg()->next(2)); 302 reg_def V27_K( SOC, SOC, Op_RegF, 27, v27->as_VMReg()->next(3)); 303 304 reg_def V28 ( SOC, SOC, Op_RegF, 28, v28->as_VMReg() ); 305 reg_def V28_H( SOC, SOC, Op_RegF, 28, v28->as_VMReg()->next() ); 306 reg_def V28_J( SOC, SOC, Op_RegF, 28, v28->as_VMReg()->next(2)); 307 reg_def V28_K( SOC, SOC, Op_RegF, 28, v28->as_VMReg()->next(3)); 308 309 reg_def V29 ( SOC, SOC, Op_RegF, 29, v29->as_VMReg() ); 310 reg_def V29_H( SOC, SOC, Op_RegF, 29, v29->as_VMReg()->next() ); 311 reg_def V29_J( SOC, SOC, Op_RegF, 29, v29->as_VMReg()->next(2)); 312 reg_def V29_K( SOC, SOC, Op_RegF, 29, v29->as_VMReg()->next(3)); 313 314 reg_def V30 ( SOC, SOC, Op_RegF, 30, v30->as_VMReg() ); 315 reg_def V30_H( SOC, SOC, Op_RegF, 30, v30->as_VMReg()->next() ); 316 reg_def V30_J( SOC, SOC, Op_RegF, 30, v30->as_VMReg()->next(2)); 317 reg_def V30_K( SOC, SOC, Op_RegF, 30, v30->as_VMReg()->next(3)); 318 319 reg_def V31 ( SOC, SOC, Op_RegF, 31, v31->as_VMReg() ); 320 reg_def V31_H( SOC, SOC, Op_RegF, 31, v31->as_VMReg()->next() ); 321 reg_def V31_J( SOC, SOC, Op_RegF, 31, v31->as_VMReg()->next(2)); 322 reg_def V31_K( SOC, SOC, Op_RegF, 31, v31->as_VMReg()->next(3)); 323 |
|
229// ---------------------------- 230// Special Registers 231// ---------------------------- 232 233// the AArch64 CSPR status flag register is not directly acessible as 234// instruction operand. the FPSR status flag register is a system 235// register which can be written/read using MSR/MRS but again does not 236// appear as an operand (a code identifying the FSPR occurs as an --- 49 unchanged lines hidden (view full) --- 286 R29, R29_H, // fp 287 R30, R30_H, // lr 288 R31, R31_H, // sp 289); 290 291alloc_class chunk1( 292 293 // no save | 324// ---------------------------- 325// Special Registers 326// ---------------------------- 327 328// the AArch64 CSPR status flag register is not directly acessible as 329// instruction operand. the FPSR status flag register is a system 330// register which can be written/read using MSR/MRS but again does not 331// appear as an operand (a code identifying the FSPR occurs as an --- 49 unchanged lines hidden (view full) --- 381 R29, R29_H, // fp 382 R30, R30_H, // lr 383 R31, R31_H, // sp 384); 385 386alloc_class chunk1( 387 388 // no save |
294 V16, V16_H, 295 V17, V17_H, 296 V18, V18_H, 297 V19, V19_H, 298 V20, V20_H, 299 V21, V21_H, 300 V22, V22_H, 301 V23, V23_H, 302 V24, V24_H, 303 V25, V25_H, 304 V26, V26_H, 305 V27, V27_H, 306 V28, V28_H, 307 V29, V29_H, 308 V30, V30_H, 309 V31, V31_H, | 389 V16, V16_H, V16_J, V16_K, 390 V17, V17_H, V17_J, V17_K, 391 V18, V18_H, V18_J, V18_K, 392 V19, V19_H, V19_J, V19_K, 393 V20, V20_H, V20_J, V20_K, 394 V21, V21_H, V21_J, V21_K, 395 V22, V22_H, V22_J, V22_K, 396 V23, V23_H, V23_J, V23_K, 397 V24, V24_H, V24_J, V24_K, 398 V25, V25_H, V25_J, V25_K, 399 V26, V26_H, V26_J, V26_K, 400 V27, V27_H, V27_J, V27_K, 401 V28, V28_H, V28_J, V28_K, 402 V29, V29_H, V29_J, V29_K, 403 V30, V30_H, V30_J, V30_K, 404 V31, V31_H, V31_J, V31_K, |
310 311 // arg registers | 405 406 // arg registers |
312 V0, V0_H, 313 V1, V1_H, 314 V2, V2_H, 315 V3, V3_H, 316 V4, V4_H, 317 V5, V5_H, 318 V6, V6_H, 319 V7, V7_H, | 407 V0, V0_H, V0_J, V0_K, 408 V1, V1_H, V1_J, V1_K, 409 V2, V2_H, V2_J, V2_K, 410 V3, V3_H, V3_J, V3_K, 411 V4, V4_H, V4_J, V4_K, 412 V5, V5_H, V5_J, V5_K, 413 V6, V6_H, V6_J, V6_K, 414 V7, V7_H, V7_J, V7_K, |
320 321 // non-volatiles | 415 416 // non-volatiles |
322 V8, V8_H, 323 V9, V9_H, 324 V10, V10_H, 325 V11, V11_H, 326 V12, V12_H, 327 V13, V13_H, 328 V14, V14_H, 329 V15, V15_H, | 417 V8, V8_H, V8_J, V8_K, 418 V9, V9_H, V9_J, V9_K, 419 V10, V10_H, V10_J, V10_K, 420 V11, V11_H, V11_J, V11_K, 421 V12, V12_H, V12_J, V12_K, 422 V13, V13_H, V13_J, V13_K, 423 V14, V14_H, V14_J, V14_K, 424 V15, V15_H, V15_J, V15_K, |
330); 331 332alloc_class chunk2(RFLAGS); 333 334//----------Architecture Description Register Classes-------------------------- 335// Several register classes are automatically defined based upon information in 336// this architecture description. 337// 1) reg_class inline_cache_reg ( /* as def'd in frame section */ ) --- 427 unchanged lines hidden (view full) --- 765 V26, V26_H, 766 V27, V27_H, 767 V28, V28_H, 768 V29, V29_H, 769 V30, V30_H, 770 V31, V31_H 771); 772 | 425); 426 427alloc_class chunk2(RFLAGS); 428 429//----------Architecture Description Register Classes-------------------------- 430// Several register classes are automatically defined based upon information in 431// this architecture description. 432// 1) reg_class inline_cache_reg ( /* as def'd in frame section */ ) --- 427 unchanged lines hidden (view full) --- 860 V26, V26_H, 861 V27, V27_H, 862 V28, V28_H, 863 V29, V29_H, 864 V30, V30_H, 865 V31, V31_H 866); 867 |
868// Class for all 128bit vector registers 869reg_class vectorx_reg( 870 V0, V0_H, V0_J, V0_K, 871 V1, V1_H, V1_J, V1_K, 872 V2, V2_H, V2_J, V2_K, 873 V3, V3_H, V3_J, V3_K, 874 V4, V4_H, V4_J, V4_K, 875 V5, V5_H, V5_J, V5_K, 876 V6, V6_H, V6_J, V6_K, 877 V7, V7_H, V7_J, V7_K, 878 V8, V8_H, V8_J, V8_K, 879 V9, V9_H, V9_J, V9_K, 880 V10, V10_H, V10_J, V10_K, 881 V11, V11_H, V11_J, V11_K, 882 V12, V12_H, V12_J, V12_K, 883 V13, V13_H, V13_J, V13_K, 884 V14, V14_H, V14_J, V14_K, 885 V15, V15_H, V15_J, V15_K, 886 V16, V16_H, V16_J, V16_K, 887 V17, V17_H, V17_J, V17_K, 888 V18, V18_H, V18_J, V18_K, 889 V19, V19_H, V19_J, V19_K, 890 V20, V20_H, V20_J, V20_K, 891 V21, V21_H, V21_J, V21_K, 892 V22, V22_H, V22_J, V22_K, 893 V23, V23_H, V23_J, V23_K, 894 V24, V24_H, V24_J, V24_K, 895 V25, V25_H, V25_J, V25_K, 896 V26, V26_H, V26_J, V26_K, 897 V27, V27_H, V27_J, V27_K, 898 V28, V28_H, V28_J, V28_K, 899 V29, V29_H, V29_J, V29_K, 900 V30, V30_H, V30_J, V30_K, 901 V31, V31_H, V31_J, V31_K 902); 903 |
|
773// Class for 128 bit register v0 774reg_class v0_reg( 775 V0, V0_H 776); 777 778// Class for 128 bit register v1 779reg_class v1_reg( 780 V1, V1_H --- 1178 unchanged lines hidden (view full) --- 1959 // we have 30 int registers * 2 halves 1960 // (rscratch1 and rscratch2 are omitted) 1961 1962 if (reg < 60) { 1963 return rc_int; 1964 } 1965 1966 // we have 32 float register * 2 halves | 904// Class for 128 bit register v0 905reg_class v0_reg( 906 V0, V0_H 907); 908 909// Class for 128 bit register v1 910reg_class v1_reg( 911 V1, V1_H --- 1178 unchanged lines hidden (view full) --- 2090 // we have 30 int registers * 2 halves 2091 // (rscratch1 and rscratch2 are omitted) 2092 2093 if (reg < 60) { 2094 return rc_int; 2095 } 2096 2097 // we have 32 float register * 2 halves |
1967 if (reg < 60 + 64) { | 2098 if (reg < 60 + 128) { |
1968 return rc_float; 1969 } 1970 1971 // Between float regs & stack is the flags regs. 1972 assert(OptoReg::is_stack(reg), "blow up if spilling flags"); 1973 1974 return rc_stack; 1975} --- 19 unchanged lines hidden (view full) --- 1995 (dst_lo&1)==0 && dst_lo+1==dst_hi, 1996 "expected aligned-adjacent pairs"); 1997 } 1998 1999 if (src_lo == dst_lo && src_hi == dst_hi) { 2000 return 0; // Self copy, no move. 2001 } 2002 | 2099 return rc_float; 2100 } 2101 2102 // Between float regs & stack is the flags regs. 2103 assert(OptoReg::is_stack(reg), "blow up if spilling flags"); 2104 2105 return rc_stack; 2106} --- 19 unchanged lines hidden (view full) --- 2126 (dst_lo&1)==0 && dst_lo+1==dst_hi, 2127 "expected aligned-adjacent pairs"); 2128 } 2129 2130 if (src_lo == dst_lo && src_hi == dst_hi) { 2131 return 0; // Self copy, no move. 2132 } 2133 |
2134 if (bottom_type()->isa_vect() != NULL) { 2135 uint len = 4; 2136 if (cbuf) { 2137 MacroAssembler _masm(cbuf); 2138 uint ireg = ideal_reg(); 2139 assert((src_lo_rc != rc_int && dst_lo_rc != rc_int), "sanity"); 2140 assert(ireg == Op_VecX, "sanity"); 2141 if (src_lo_rc == rc_stack && dst_lo_rc == rc_stack) { 2142 // stack->stack 2143 int src_offset = ra_->reg2offset(src_lo); 2144 int dst_offset = ra_->reg2offset(dst_lo); 2145 assert((src_offset & 7) && (dst_offset & 7), "unaligned stack offset"); 2146 len = 8; 2147 if (src_offset < 512) { 2148 __ ldp(rscratch1, rscratch2, Address(sp, src_offset)); 2149 } else { 2150 __ ldr(rscratch1, Address(sp, src_offset)); 2151 __ ldr(rscratch2, Address(sp, src_offset+4)); 2152 len += 4; 2153 } 2154 if (dst_offset < 512) { 2155 __ stp(rscratch1, rscratch2, Address(sp, dst_offset)); 2156 } else { 2157 __ str(rscratch1, Address(sp, dst_offset)); 2158 __ str(rscratch2, Address(sp, dst_offset+4)); 2159 len += 4; 2160 } 2161 } else if (src_lo_rc == rc_float && dst_lo_rc == rc_float) { 2162 __ orr(as_FloatRegister(Matcher::_regEncode[dst_lo]), __ T16B, 2163 as_FloatRegister(Matcher::_regEncode[src_lo]), 2164 as_FloatRegister(Matcher::_regEncode[src_lo])); 2165 } else if (src_lo_rc == rc_float && dst_lo_rc == rc_stack) { 2166 __ str(as_FloatRegister(Matcher::_regEncode[src_lo]), __ Q, 2167 Address(sp, ra_->reg2offset(dst_lo))); 2168 } else if (src_lo_rc == rc_stack && dst_lo_rc == rc_float) { 2169 __ ldr(as_FloatRegister(Matcher::_regEncode[dst_lo]), __ Q, 2170 Address(sp, ra_->reg2offset(src_lo))); 2171 } else { 2172 ShouldNotReachHere(); 2173 } 2174 } else if (st) { 2175 if (src_lo_rc == rc_stack && dst_lo_rc == rc_stack) { 2176 // stack->stack 2177 int src_offset = ra_->reg2offset(src_lo); 2178 int dst_offset = ra_->reg2offset(dst_lo); 2179 if (src_offset < 512) { 2180 st->print("ldp rscratch1, rscratch2, [sp, #%d]", src_offset); 2181 } else { 2182 st->print("ldr rscratch1, [sp, #%d]", src_offset); 2183 st->print("\nldr rscratch2, [sp, #%d]", src_offset+4); 2184 } 2185 if (dst_offset < 512) { 2186 st->print("\nstp rscratch1, rscratch2, [sp, #%d]", dst_offset); 2187 } else { 2188 st->print("\nstr rscratch1, [sp, #%d]", dst_offset); 2189 st->print("\nstr rscratch2, [sp, #%d]", dst_offset+4); 2190 } 2191 st->print("\t# vector spill, stack to stack"); 2192 } else if (src_lo_rc == rc_float && dst_lo_rc == rc_float) { 2193 st->print("mov %s, %s\t# vector spill, reg to reg", 2194 Matcher::regName[dst_lo], Matcher::regName[src_lo]); 2195 } else if (src_lo_rc == rc_float && dst_lo_rc == rc_stack) { 2196 st->print("str %s, [sp, #%d]\t# vector spill, reg to stack", 2197 Matcher::regName[src_lo], ra_->reg2offset(dst_lo)); 2198 } else if (src_lo_rc == rc_stack && dst_lo_rc == rc_float) { 2199 st->print("ldr %s, [sp, #%d]\t# vector spill, stack to reg", 2200 Matcher::regName[dst_lo], ra_->reg2offset(src_lo)); 2201 } 2202 } 2203 return len; 2204 } 2205 |
|
2003 switch (src_lo_rc) { 2004 case rc_int: 2005 if (dst_lo_rc == rc_int) { // gpr --> gpr copy 2006 if (((src_lo & 1) == 0 && src_lo + 1 == src_hi) && 2007 (dst_lo & 1) == 0 && dst_lo + 1 == dst_hi) { 2008 // 64 bit 2009 if (cbuf) { 2010 MacroAssembler _masm(cbuf); --- 406 unchanged lines hidden (view full) --- 2417 2418// true just means we have fast l2f conversion 2419const bool Matcher::convL2FSupported(void) { 2420 return true; 2421} 2422 2423// Vector width in bytes. 2424const int Matcher::vector_width_in_bytes(BasicType bt) { | 2206 switch (src_lo_rc) { 2207 case rc_int: 2208 if (dst_lo_rc == rc_int) { // gpr --> gpr copy 2209 if (((src_lo & 1) == 0 && src_lo + 1 == src_hi) && 2210 (dst_lo & 1) == 0 && dst_lo + 1 == dst_hi) { 2211 // 64 bit 2212 if (cbuf) { 2213 MacroAssembler _masm(cbuf); --- 406 unchanged lines hidden (view full) --- 2620 2621// true just means we have fast l2f conversion 2622const bool Matcher::convL2FSupported(void) { 2623 return true; 2624} 2625 2626// Vector width in bytes. 2627const int Matcher::vector_width_in_bytes(BasicType bt) { |
2425 // TODO fixme 2426 return 0; | 2628 int size = MIN2(16,(int)MaxVectorSize); 2629 // Minimum 2 values in vector 2630 if (size < 2*type2aelembytes(bt)) size = 0; 2631 // But never < 4 2632 if (size < 4) size = 0; 2633 return size; |
2427} 2428 2429// Limits on vector size (number of elements) loaded into vector. 2430const int Matcher::max_vector_size(const BasicType bt) { 2431 return vector_width_in_bytes(bt)/type2aelembytes(bt); 2432} 2433const int Matcher::min_vector_size(const BasicType bt) { | 2634} 2635 2636// Limits on vector size (number of elements) loaded into vector. 2637const int Matcher::max_vector_size(const BasicType bt) { 2638 return vector_width_in_bytes(bt)/type2aelembytes(bt); 2639} 2640const int Matcher::min_vector_size(const BasicType bt) { |
2434 int max_size = max_vector_size(bt); 2435 // Min size which can be loaded into vector is 4 bytes. 2436 int size = (type2aelembytes(bt) == 1) ? 4 : 2; 2437 return MIN2(size,max_size); | 2641 //return (type2aelembytes(bt) == 1) ? 4 : 2; 2642 // For the moment, only support 1 vector size, 128 bits 2643 return max_vector_size(bt); |
2438} 2439 2440// Vector ideal reg. 2441const int Matcher::vector_ideal_reg(int len) { | 2644} 2645 2646// Vector ideal reg. 2647const int Matcher::vector_ideal_reg(int len) { |
2442 // TODO fixme 2443 return Op_RegD; | 2648 return Op_VecX; |
2444} 2445 2446// Only lowest bits of xmm reg are used for vector shift count. 2447const int Matcher::vector_shift_count_ideal_reg(int size) { | 2649} 2650 2651// Only lowest bits of xmm reg are used for vector shift count. 2652const int Matcher::vector_shift_count_ideal_reg(int size) { |
2448 // TODO fixme 2449 return Op_RegL; | 2653 return Op_VecX; |
2450} 2451 2452// AES support not yet implemented 2453const bool Matcher::pass_original_key_for_aes() { 2454 return false; 2455} 2456 2457// x86 supports misaligned vectors store/load. --- 194 unchanged lines hidden (view full) --- 2652 guarantee(INDEX == -1, "mode not permitted for volatile"); \ 2653 guarantee(DISP == 0, "mode not permitted for volatile"); \ 2654 guarantee(SCALE == 0, "mode not permitted for volatile"); \ 2655 __ INSN(REG, as_Register(BASE)); \ 2656 } 2657 2658typedef void (MacroAssembler::* mem_insn)(Register Rt, const Address &adr); 2659typedef void (MacroAssembler::* mem_float_insn)(FloatRegister Rt, const Address &adr); | 2654} 2655 2656// AES support not yet implemented 2657const bool Matcher::pass_original_key_for_aes() { 2658 return false; 2659} 2660 2661// x86 supports misaligned vectors store/load. --- 194 unchanged lines hidden (view full) --- 2856 guarantee(INDEX == -1, "mode not permitted for volatile"); \ 2857 guarantee(DISP == 0, "mode not permitted for volatile"); \ 2858 guarantee(SCALE == 0, "mode not permitted for volatile"); \ 2859 __ INSN(REG, as_Register(BASE)); \ 2860 } 2861 2862typedef void (MacroAssembler::* mem_insn)(Register Rt, const Address &adr); 2863typedef void (MacroAssembler::* mem_float_insn)(FloatRegister Rt, const Address &adr); |
2864typedef void (MacroAssembler::* mem_vector_insn)(FloatRegister Rt, 2865 MacroAssembler::SIMD_RegVariant T, const Address &adr); |
|
2660 2661 // Used for all non-volatile memory accesses. The use of 2662 // $mem->opcode() to discover whether this pattern uses sign-extended 2663 // offsets is something of a kludge. 2664 static void loadStore(MacroAssembler masm, mem_insn insn, 2665 Register reg, int opcode, 2666 Register base, int index, int size, int disp) 2667 { --- 51 unchanged lines hidden (view full) --- 2719 (masm.*insn)(reg, Address(base, as_Register(index), scale)); 2720 } else { 2721 masm.lea(rscratch1, Address(base, disp)); 2722 (masm.*insn)(reg, Address(rscratch1, as_Register(index), scale)); 2723 } 2724 } 2725 } 2726 | 2866 2867 // Used for all non-volatile memory accesses. The use of 2868 // $mem->opcode() to discover whether this pattern uses sign-extended 2869 // offsets is something of a kludge. 2870 static void loadStore(MacroAssembler masm, mem_insn insn, 2871 Register reg, int opcode, 2872 Register base, int index, int size, int disp) 2873 { --- 51 unchanged lines hidden (view full) --- 2925 (masm.*insn)(reg, Address(base, as_Register(index), scale)); 2926 } else { 2927 masm.lea(rscratch1, Address(base, disp)); 2928 (masm.*insn)(reg, Address(rscratch1, as_Register(index), scale)); 2929 } 2930 } 2931 } 2932 |
2933 static void loadStore(MacroAssembler masm, mem_vector_insn insn, 2934 FloatRegister reg, MacroAssembler::SIMD_RegVariant T, 2935 int opcode, Register base, int index, int size, int disp) 2936 { 2937 if (index == -1) { 2938 (masm.*insn)(reg, T, Address(base, disp)); 2939 } else { 2940 assert(disp == 0, "unsupported address mode"); 2941 (masm.*insn)(reg, T, Address(base, as_Register(index), Address::lsl(size))); 2942 } 2943 } 2944 |
|
2727%} 2728 2729 2730 2731//----------ENCODING BLOCK----------------------------------------------------- 2732// This block specifies the encoding classes used by the compiler to 2733// output byte streams. Encoding classes are parameterized macros 2734// used by Machine Instruction Nodes in order to generate the bit --- 115 unchanged lines hidden (view full) --- 2850 %} 2851 2852 enc_class aarch64_enc_ldrd(vRegD dst, memory mem) %{ 2853 FloatRegister dst_reg = as_FloatRegister($dst$$reg); 2854 loadStore(MacroAssembler(&cbuf), &MacroAssembler::ldrd, dst_reg, $mem->opcode(), 2855 as_Register($mem$$base), $mem$$index, $mem$$scale, $mem$$disp); 2856 %} 2857 | 2945%} 2946 2947 2948 2949//----------ENCODING BLOCK----------------------------------------------------- 2950// This block specifies the encoding classes used by the compiler to 2951// output byte streams. Encoding classes are parameterized macros 2952// used by Machine Instruction Nodes in order to generate the bit --- 115 unchanged lines hidden (view full) --- 3068 %} 3069 3070 enc_class aarch64_enc_ldrd(vRegD dst, memory mem) %{ 3071 FloatRegister dst_reg = as_FloatRegister($dst$$reg); 3072 loadStore(MacroAssembler(&cbuf), &MacroAssembler::ldrd, dst_reg, $mem->opcode(), 3073 as_Register($mem$$base), $mem$$index, $mem$$scale, $mem$$disp); 3074 %} 3075 |
3076 enc_class aarch64_enc_ldrvS(vecX dst, memory mem) %{ 3077 FloatRegister dst_reg = as_FloatRegister($dst$$reg); 3078 loadStore(MacroAssembler(&cbuf), &MacroAssembler::ldr, dst_reg, MacroAssembler::S, 3079 $mem->opcode(), as_Register($mem$$base), $mem$$index, $mem$$scale, $mem$$disp); 3080 %} 3081 3082 enc_class aarch64_enc_ldrvD(vecX dst, memory mem) %{ 3083 FloatRegister dst_reg = as_FloatRegister($dst$$reg); 3084 loadStore(MacroAssembler(&cbuf), &MacroAssembler::ldr, dst_reg, MacroAssembler::D, 3085 $mem->opcode(), as_Register($mem$$base), $mem$$index, $mem$$scale, $mem$$disp); 3086 %} 3087 3088 enc_class aarch64_enc_ldrvQ(vecX dst, memory mem) %{ 3089 FloatRegister dst_reg = as_FloatRegister($dst$$reg); 3090 loadStore(MacroAssembler(&cbuf), &MacroAssembler::ldr, dst_reg, MacroAssembler::Q, 3091 $mem->opcode(), as_Register($mem$$base), $mem$$index, $mem$$scale, $mem$$disp); 3092 %} 3093 |
|
2858 enc_class aarch64_enc_strb(iRegI src, memory mem) %{ 2859 Register src_reg = as_Register($src$$reg); 2860 loadStore(MacroAssembler(&cbuf), &MacroAssembler::strb, src_reg, $mem->opcode(), 2861 as_Register($mem$$base), $mem$$index, $mem$$scale, $mem$$disp); 2862 %} 2863 2864 enc_class aarch64_enc_strb0(memory mem) %{ 2865 MacroAssembler _masm(&cbuf); --- 52 unchanged lines hidden (view full) --- 2918 %} 2919 2920 enc_class aarch64_enc_strd(vRegD src, memory mem) %{ 2921 FloatRegister src_reg = as_FloatRegister($src$$reg); 2922 loadStore(MacroAssembler(&cbuf), &MacroAssembler::strd, src_reg, $mem->opcode(), 2923 as_Register($mem$$base), $mem$$index, $mem$$scale, $mem$$disp); 2924 %} 2925 | 3094 enc_class aarch64_enc_strb(iRegI src, memory mem) %{ 3095 Register src_reg = as_Register($src$$reg); 3096 loadStore(MacroAssembler(&cbuf), &MacroAssembler::strb, src_reg, $mem->opcode(), 3097 as_Register($mem$$base), $mem$$index, $mem$$scale, $mem$$disp); 3098 %} 3099 3100 enc_class aarch64_enc_strb0(memory mem) %{ 3101 MacroAssembler _masm(&cbuf); --- 52 unchanged lines hidden (view full) --- 3154 %} 3155 3156 enc_class aarch64_enc_strd(vRegD src, memory mem) %{ 3157 FloatRegister src_reg = as_FloatRegister($src$$reg); 3158 loadStore(MacroAssembler(&cbuf), &MacroAssembler::strd, src_reg, $mem->opcode(), 3159 as_Register($mem$$base), $mem$$index, $mem$$scale, $mem$$disp); 3160 %} 3161 |
3162 enc_class aarch64_enc_strvS(vecX src, memory mem) %{ 3163 FloatRegister src_reg = as_FloatRegister($src$$reg); 3164 loadStore(MacroAssembler(&cbuf), &MacroAssembler::str, src_reg, MacroAssembler::S, 3165 $mem->opcode(), as_Register($mem$$base), $mem$$index, $mem$$scale, $mem$$disp); 3166 %} 3167 3168 enc_class aarch64_enc_strvD(vecX src, memory mem) %{ 3169 FloatRegister src_reg = as_FloatRegister($src$$reg); 3170 loadStore(MacroAssembler(&cbuf), &MacroAssembler::str, src_reg, MacroAssembler::D, 3171 $mem->opcode(), as_Register($mem$$base), $mem$$index, $mem$$scale, $mem$$disp); 3172 %} 3173 3174 enc_class aarch64_enc_strvQ(vecX src, memory mem) %{ 3175 FloatRegister src_reg = as_FloatRegister($src$$reg); 3176 loadStore(MacroAssembler(&cbuf), &MacroAssembler::str, src_reg, MacroAssembler::Q, 3177 $mem->opcode(), as_Register($mem$$base), $mem$$index, $mem$$scale, $mem$$disp); 3178 %} 3179 |
|
2926 // END Non-volatile memory access 2927 2928 // volatile loads and stores 2929 2930 enc_class aarch64_enc_stlrb(iRegI src, memory mem) %{ 2931 MOV_VOLATILE(as_Register($src$$reg), $mem$$base, $mem$$index, $mem$$scale, $mem$$disp, 2932 rscratch1, stlrb); 2933 %} --- 1994 unchanged lines hidden (view full) --- 4928 constraint(ALLOC_IN_RC(double_reg)); 4929 match(RegD); 4930 4931 op_cost(0); 4932 format %{ %} 4933 interface(REG_INTER); 4934%} 4935 | 3180 // END Non-volatile memory access 3181 3182 // volatile loads and stores 3183 3184 enc_class aarch64_enc_stlrb(iRegI src, memory mem) %{ 3185 MOV_VOLATILE(as_Register($src$$reg), $mem$$base, $mem$$index, $mem$$scale, $mem$$disp, 3186 rscratch1, stlrb); 3187 %} --- 1994 unchanged lines hidden (view full) --- 5182 constraint(ALLOC_IN_RC(double_reg)); 5183 match(RegD); 5184 5185 op_cost(0); 5186 format %{ %} 5187 interface(REG_INTER); 5188%} 5189 |
5190operand vecX() 5191%{ 5192 constraint(ALLOC_IN_RC(vectorx_reg)); 5193 match(VecX); 5194 5195 op_cost(0); 5196 format %{ %} 5197 interface(REG_INTER); 5198%} 5199 |
|
4936operand vRegD_V0() 4937%{ 4938 constraint(ALLOC_IN_RC(v0_reg)); 4939 match(RegD); 4940 op_cost(0); 4941 format %{ %} 4942 interface(REG_INTER); 4943%} --- 556 unchanged lines hidden (view full) --- 5500 5501 match(ConvL2I reg); 5502 5503 format %{ "l2i($reg)" %} 5504 5505 interface(REG_INTER) 5506%} 5507 | 5200operand vRegD_V0() 5201%{ 5202 constraint(ALLOC_IN_RC(v0_reg)); 5203 match(RegD); 5204 op_cost(0); 5205 format %{ %} 5206 interface(REG_INTER); 5207%} --- 556 unchanged lines hidden (view full) --- 5764 5765 match(ConvL2I reg); 5766 5767 format %{ "l2i($reg)" %} 5768 5769 interface(REG_INTER) 5770%} 5771 |
5772opclass vmem(indirect, indIndex, indOffI, indOffL); |
|
5508 5509//----------OPERAND CLASSES---------------------------------------------------- 5510// Operand Classes are groups of operands that are used as to simplify 5511// instruction definitions by not requiring the AD writer to specify 5512// separate instructions for every form of operand when the 5513// instruction accepts multiple operand types with the same basic 5514// encoding and format. The classic case of this is memory operands. 5515 --- 7405 unchanged lines hidden (view full) --- 12921 12922 size(0); 12923 12924 ins_encode( /*empty*/ ); 12925 12926 ins_pipe(pipe_class_empty); 12927%} 12928 | 5773 5774//----------OPERAND CLASSES---------------------------------------------------- 5775// Operand Classes are groups of operands that are used as to simplify 5776// instruction definitions by not requiring the AD writer to specify 5777// separate instructions for every form of operand when the 5778// instruction accepts multiple operand types with the same basic 5779// encoding and format. The classic case of this is memory operands. 5780 --- 7405 unchanged lines hidden (view full) --- 13186 13187 size(0); 13188 13189 ins_encode( /*empty*/ ); 13190 13191 ins_pipe(pipe_class_empty); 13192%} 13193 |
13194// ====================VECTOR INSTRUCTIONS===================================== |
|
12929 | 13195 |
13196// Load vector (32 bits) 13197instruct loadV4(vecX dst, vmem mem) 13198%{ 13199 predicate(n->as_LoadVector()->memory_size() == 4); 13200 match(Set dst (LoadVector mem)); 13201 ins_cost(4 * INSN_COST); 13202 format %{ "ldrs $dst,$mem\t# vector (32 bits)" %} 13203 ins_encode( aarch64_enc_ldrvS(dst, mem) ); 13204 ins_pipe(pipe_class_memory); 13205%} |
|
12930 | 13206 |
13207// Load vector (64 bits) 13208instruct loadV8(vecX dst, vmem mem) 13209%{ 13210 predicate(n->as_LoadVector()->memory_size() == 8); 13211 match(Set dst (LoadVector mem)); 13212 ins_cost(4 * INSN_COST); 13213 format %{ "ldrd $dst,$mem\t# vector (64 bits)" %} 13214 ins_encode( aarch64_enc_ldrvD(dst, mem) ); 13215 ins_pipe(pipe_class_memory); 13216%} 13217 13218// Load Vector (128 bits) 13219instruct loadV16(vecX dst, vmem mem) 13220%{ 13221 predicate(n->as_LoadVector()->memory_size() == 16); 13222 match(Set dst (LoadVector mem)); 13223 ins_cost(4 * INSN_COST); 13224 format %{ "ldrq $dst,$mem\t# vector (128 bits)" %} 13225 ins_encode( aarch64_enc_ldrvQ(dst, mem) ); 13226 ins_pipe(pipe_class_memory); 13227%} 13228 13229// Store Vector (32 bits) 13230instruct storeV4(vecX src, vmem mem) 13231%{ 13232 predicate(n->as_StoreVector()->memory_size() == 4); 13233 match(Set mem (StoreVector mem src)); 13234 ins_cost(4 * INSN_COST); 13235 format %{ "strs $mem,$src\t# vector (32 bits)" %} 13236 ins_encode( aarch64_enc_strvS(src, mem) ); 13237 ins_pipe(pipe_class_memory); 13238%} 13239 13240// Store Vector (64 bits) 13241instruct storeV8(vecX src, vmem mem) 13242%{ 13243 predicate(n->as_StoreVector()->memory_size() == 8); 13244 match(Set mem (StoreVector mem src)); 13245 ins_cost(4 * INSN_COST); 13246 format %{ "strd $mem,$src\t# vector (64 bits)" %} 13247 ins_encode( aarch64_enc_strvD(src, mem) ); 13248 ins_pipe(pipe_class_memory); 13249%} 13250 13251// Store Vector (128 bits) 13252instruct storeV16(vecX src, vmem mem) 13253%{ 13254 predicate(n->as_StoreVector()->memory_size() == 16); 13255 match(Set mem (StoreVector mem src)); 13256 ins_cost(4 * INSN_COST); 13257 format %{ "strq $mem,$src\t# vector (128 bits)" %} 13258 ins_encode( aarch64_enc_strvQ(src, mem) ); 13259 ins_pipe(pipe_class_memory); 13260%} 13261 13262instruct replicate16B(vecX dst, iRegIorL2I src) 13263%{ 13264 match(Set dst (ReplicateB src)); 13265 ins_cost(INSN_COST); 13266 format %{ "dup $dst, $src\t# vector (16B)" %} 13267 ins_encode %{ 13268 __ dup(as_FloatRegister($dst$$reg), __ T16B, as_Register($src$$reg)); 13269 %} 13270 ins_pipe(pipe_class_default); 13271%} 13272 13273instruct replicate16B_imm(vecX dst, immI con) 13274%{ 13275 match(Set dst (ReplicateB con)); 13276 ins_cost(INSN_COST); 13277 format %{ "movi $dst, $con\t# vector(16B)" %} 13278 ins_encode %{ 13279 __ mov(as_FloatRegister($dst$$reg), __ T16B, $con$$constant); 13280 %} 13281 ins_pipe(pipe_class_default); 13282%} 13283 13284instruct replicate8S(vecX dst, iRegIorL2I src) 13285%{ 13286 match(Set dst (ReplicateS src)); 13287 ins_cost(INSN_COST); 13288 format %{ "dup $dst, $src\t# vector (8S)" %} 13289 ins_encode %{ 13290 __ dup(as_FloatRegister($dst$$reg), __ T8H, as_Register($src$$reg)); 13291 %} 13292 ins_pipe(pipe_class_default); 13293%} 13294 13295instruct replicate8S_imm(vecX dst, immI con) 13296%{ 13297 match(Set dst (ReplicateS con)); 13298 ins_cost(INSN_COST); 13299 format %{ "movi $dst, $con\t# vector(8H)" %} 13300 ins_encode %{ 13301 __ mov(as_FloatRegister($dst$$reg), __ T8H, $con$$constant); 13302 %} 13303 ins_pipe(pipe_class_default); 13304%} 13305 13306instruct replicate4I(vecX dst, iRegIorL2I src) 13307%{ 13308 match(Set dst (ReplicateI src)); 13309 ins_cost(INSN_COST); 13310 format %{ "dup $dst, $src\t# vector (4I)" %} 13311 ins_encode %{ 13312 __ dup(as_FloatRegister($dst$$reg), __ T4S, as_Register($src$$reg)); 13313 %} 13314 ins_pipe(pipe_class_default); 13315%} 13316 13317instruct replicate4I_imm(vecX dst, immI con) 13318%{ 13319 match(Set dst (ReplicateI con)); 13320 ins_cost(INSN_COST); 13321 format %{ "movi $dst, $con\t# vector(4I)" %} 13322 ins_encode %{ 13323 __ mov(as_FloatRegister($dst$$reg), __ T4S, $con$$constant); 13324 %} 13325 ins_pipe(pipe_class_default); 13326%} 13327 13328instruct replicate2L(vecX dst, iRegL src) 13329%{ 13330 match(Set dst (ReplicateL src)); 13331 ins_cost(INSN_COST); 13332 format %{ "dup $dst, $src\t# vector (2L)" %} 13333 ins_encode %{ 13334 __ dup(as_FloatRegister($dst$$reg), __ T2D, as_Register($src$$reg)); 13335 %} 13336 ins_pipe(pipe_class_default); 13337%} 13338 13339instruct replicate2L_zero(vecX dst, immI0 zero) 13340%{ 13341 match(Set dst (ReplicateI zero)); 13342 ins_cost(INSN_COST); 13343 format %{ "movi $dst, $zero\t# vector(4I)" %} 13344 ins_encode %{ 13345 __ eor(as_FloatRegister($dst$$reg), __ T16B, 13346 as_FloatRegister($dst$$reg), 13347 as_FloatRegister($dst$$reg)); 13348 %} 13349 ins_pipe(pipe_class_default); 13350%} 13351 13352instruct replicate4F(vecX dst, vRegF src) 13353%{ 13354 match(Set dst (ReplicateF src)); 13355 ins_cost(INSN_COST); 13356 format %{ "dup $dst, $src\t# vector (4F)" %} 13357 ins_encode %{ 13358 __ dup(as_FloatRegister($dst$$reg), __ T4S, 13359 as_FloatRegister($src$$reg)); 13360 %} 13361 ins_pipe(pipe_class_default); 13362%} 13363 13364instruct replicate2D(vecX dst, vRegD src) 13365%{ 13366 match(Set dst (ReplicateD src)); 13367 ins_cost(INSN_COST); 13368 format %{ "dup $dst, $src\t# vector (2D)" %} 13369 ins_encode %{ 13370 __ dup(as_FloatRegister($dst$$reg), __ T2D, 13371 as_FloatRegister($src$$reg)); 13372 %} 13373 ins_pipe(pipe_class_default); 13374%} 13375 13376// ====================REDUCTION ARITHMETIC==================================== 13377 13378instruct reduce_add4I(iRegINoSp dst, iRegIorL2I src1, vecX src2, vecX tmp, iRegI tmp2) 13379%{ 13380 match(Set dst (AddReductionVI src1 src2)); 13381 ins_cost(INSN_COST); 13382 effect(TEMP tmp, TEMP tmp2); 13383 format %{ "addv $tmp, T4S, $src2\n\t" 13384 "umov $tmp2, $tmp, S, 0\n\t" 13385 "addw $dst, $tmp2, $src1\t add reduction4i" 13386 %} 13387 ins_encode %{ 13388 __ addv(as_FloatRegister($tmp$$reg), __ T4S, 13389 as_FloatRegister($src2$$reg)); 13390 __ umov($tmp2$$Register, as_FloatRegister($tmp$$reg), __ S, 0); 13391 __ addw($dst$$Register, $tmp2$$Register, $src1$$Register); 13392 %} 13393 ins_pipe(pipe_class_default); 13394%} 13395 13396instruct reduce_mul4I(iRegINoSp dst, iRegIorL2I src1, vecX src2, vecX tmp, iRegI tmp2) 13397%{ 13398 match(Set dst (MulReductionVI src1 src2)); 13399 ins_cost(INSN_COST); 13400 effect(TEMP tmp, TEMP tmp2, TEMP dst); 13401 format %{ "ins $tmp, $src2, 0, 1\n\t" 13402 "mul $tmp, $tmp, $src2\n\t" 13403 "umov $tmp2, $tmp, S, 0\n\t" 13404 "mul $dst, $tmp2, $src1\n\t" 13405 "umov $tmp2, $tmp, S, 1\n\t" 13406 "mul $dst, $tmp2, $dst\t mul reduction4i\n\t" 13407 %} 13408 ins_encode %{ 13409 __ ins(as_FloatRegister($tmp$$reg), __ D, 13410 as_FloatRegister($src2$$reg), 0, 1); 13411 __ mulv(as_FloatRegister($tmp$$reg), __ T2S, 13412 as_FloatRegister($tmp$$reg), as_FloatRegister($src2$$reg)); 13413 __ umov($tmp2$$Register, as_FloatRegister($tmp$$reg), __ S, 0); 13414 __ mul($dst$$Register, $tmp2$$Register, $src1$$Register); 13415 __ umov($tmp2$$Register, as_FloatRegister($tmp$$reg), __ S, 1); 13416 __ mul($dst$$Register, $tmp2$$Register, $dst$$Register); 13417 %} 13418 ins_pipe(pipe_class_default); 13419%} 13420 13421instruct reduce_add4F(vRegF dst, vRegF src1, vecX src2, vecX tmp) 13422%{ 13423 match(Set dst (AddReductionVF src1 src2)); 13424 ins_cost(INSN_COST); 13425 effect(TEMP tmp, TEMP dst); 13426 format %{ "fadds $dst, $src1, $src2\n\t" 13427 "ins $tmp, S, $src2, 0, 1\n\t" 13428 "fadds $dst, $dst, $tmp\n\t" 13429 "ins $tmp, S, $src2, 0, 2\n\t" 13430 "fadds $dst, $dst, $tmp\n\t" 13431 "ins $tmp, S, $src2, 0, 3\n\t" 13432 "fadds $dst, $dst, $tmp\t add reduction4f" 13433 %} 13434 ins_encode %{ 13435 __ fadds(as_FloatRegister($dst$$reg), 13436 as_FloatRegister($src1$$reg), as_FloatRegister($src2$$reg)); 13437 __ ins(as_FloatRegister($tmp$$reg), __ S, 13438 as_FloatRegister($src2$$reg), 0, 1); 13439 __ fadds(as_FloatRegister($dst$$reg), 13440 as_FloatRegister($dst$$reg), as_FloatRegister($tmp$$reg)); 13441 __ ins(as_FloatRegister($tmp$$reg), __ S, 13442 as_FloatRegister($src2$$reg), 0, 2); 13443 __ fadds(as_FloatRegister($dst$$reg), 13444 as_FloatRegister($dst$$reg), as_FloatRegister($tmp$$reg)); 13445 __ ins(as_FloatRegister($tmp$$reg), __ S, 13446 as_FloatRegister($src2$$reg), 0, 3); 13447 __ fadds(as_FloatRegister($dst$$reg), 13448 as_FloatRegister($dst$$reg), as_FloatRegister($tmp$$reg)); 13449 %} 13450 ins_pipe(pipe_class_default); 13451%} 13452 13453instruct reduce_mul4F(vRegF dst, vRegF src1, vecX src2, vecX tmp) 13454%{ 13455 match(Set dst (MulReductionVF src1 src2)); 13456 ins_cost(INSN_COST); 13457 effect(TEMP tmp, TEMP dst); 13458 format %{ "fmuls $dst, $src1, $src2\n\t" 13459 "ins $tmp, S, $src2, 0, 1\n\t" 13460 "fmuls $dst, $dst, $tmp\n\t" 13461 "ins $tmp, S, $src2, 0, 2\n\t" 13462 "fmuls $dst, $dst, $tmp\n\t" 13463 "ins $tmp, S, $src2, 0, 3\n\t" 13464 "fmuls $dst, $dst, $tmp\t add reduction4f" 13465 %} 13466 ins_encode %{ 13467 __ fmuls(as_FloatRegister($dst$$reg), 13468 as_FloatRegister($src1$$reg), as_FloatRegister($src2$$reg)); 13469 __ ins(as_FloatRegister($tmp$$reg), __ S, 13470 as_FloatRegister($src2$$reg), 0, 1); 13471 __ fmuls(as_FloatRegister($dst$$reg), 13472 as_FloatRegister($dst$$reg), as_FloatRegister($tmp$$reg)); 13473 __ ins(as_FloatRegister($tmp$$reg), __ S, 13474 as_FloatRegister($src2$$reg), 0, 2); 13475 __ fmuls(as_FloatRegister($dst$$reg), 13476 as_FloatRegister($dst$$reg), as_FloatRegister($tmp$$reg)); 13477 __ ins(as_FloatRegister($tmp$$reg), __ S, 13478 as_FloatRegister($src2$$reg), 0, 3); 13479 __ fmuls(as_FloatRegister($dst$$reg), 13480 as_FloatRegister($dst$$reg), as_FloatRegister($tmp$$reg)); 13481 %} 13482 ins_pipe(pipe_class_default); 13483%} 13484 13485instruct reduce_add2D(vRegD dst, vRegD src1, vecX src2, vecX tmp) 13486%{ 13487 match(Set dst (AddReductionVD src1 src2)); 13488 ins_cost(INSN_COST); 13489 effect(TEMP tmp, TEMP dst); 13490 format %{ "faddd $dst, $src1, $src2\n\t" 13491 "ins $tmp, D, $src2, 0, 1\n\t" 13492 "faddd $dst, $dst, $tmp\t add reduction2d" 13493 %} 13494 ins_encode %{ 13495 __ faddd(as_FloatRegister($dst$$reg), 13496 as_FloatRegister($src1$$reg), as_FloatRegister($src2$$reg)); 13497 __ ins(as_FloatRegister($tmp$$reg), __ D, 13498 as_FloatRegister($src2$$reg), 0, 1); 13499 __ faddd(as_FloatRegister($dst$$reg), 13500 as_FloatRegister($dst$$reg), as_FloatRegister($tmp$$reg)); 13501 %} 13502 ins_pipe(pipe_class_default); 13503%} 13504 13505instruct reduce_mul2D(vRegD dst, vRegD src1, vecX src2, vecX tmp) 13506%{ 13507 match(Set dst (MulReductionVD src1 src2)); 13508 ins_cost(INSN_COST); 13509 effect(TEMP tmp, TEMP dst); 13510 format %{ "fmuld $dst, $src1, $src2\n\t" 13511 "ins $tmp, D, $src2, 0, 1\n\t" 13512 "fmuld $dst, $dst, $tmp\t add reduction2d" 13513 %} 13514 ins_encode %{ 13515 __ fmuld(as_FloatRegister($dst$$reg), 13516 as_FloatRegister($src1$$reg), as_FloatRegister($src2$$reg)); 13517 __ ins(as_FloatRegister($tmp$$reg), __ D, 13518 as_FloatRegister($src2$$reg), 0, 1); 13519 __ fmuld(as_FloatRegister($dst$$reg), 13520 as_FloatRegister($dst$$reg), as_FloatRegister($tmp$$reg)); 13521 %} 13522 ins_pipe(pipe_class_default); 13523%} 13524 13525// ====================VECTOR ARITHMETIC======================================= 13526 13527// --------------------------------- ADD -------------------------------------- 13528 13529instruct vadd16B(vecX dst, vecX src1, vecX src2) 13530%{ 13531 match(Set dst (AddVB src1 src2)); 13532 ins_cost(INSN_COST); 13533 format %{ "addv $dst,$src1,$src2\t# vector (16B)" %} 13534 ins_encode %{ 13535 __ addv(as_FloatRegister($dst$$reg), __ T16B, 13536 as_FloatRegister($src1$$reg), 13537 as_FloatRegister($src2$$reg)); 13538 %} 13539 ins_pipe(pipe_class_default); 13540%} 13541 13542instruct vadd8S(vecX dst, vecX src1, vecX src2) 13543%{ 13544 match(Set dst (AddVS src1 src2)); 13545 ins_cost(INSN_COST); 13546 format %{ "addv $dst,$src1,$src2\t# vector (8H)" %} 13547 ins_encode %{ 13548 __ addv(as_FloatRegister($dst$$reg), __ T8H, 13549 as_FloatRegister($src1$$reg), 13550 as_FloatRegister($src2$$reg)); 13551 %} 13552 ins_pipe(pipe_class_default); 13553%} 13554 13555instruct vadd4I(vecX dst, vecX src1, vecX src2) 13556%{ 13557 match(Set dst (AddVI src1 src2)); 13558 ins_cost(INSN_COST); 13559 format %{ "addv $dst,$src1,$src2\t# vector (4S)" %} 13560 ins_encode %{ 13561 __ addv(as_FloatRegister($dst$$reg), __ T4S, 13562 as_FloatRegister($src1$$reg), 13563 as_FloatRegister($src2$$reg)); 13564 %} 13565 ins_pipe(pipe_class_default); 13566%} 13567 13568instruct vadd2L(vecX dst, vecX src1, vecX src2) 13569%{ 13570 match(Set dst (AddVL src1 src2)); 13571 ins_cost(INSN_COST); 13572 format %{ "addv $dst,$src1,$src2\t# vector (2L)" %} 13573 ins_encode %{ 13574 __ addv(as_FloatRegister($dst$$reg), __ T2D, 13575 as_FloatRegister($src1$$reg), 13576 as_FloatRegister($src2$$reg)); 13577 %} 13578 ins_pipe(pipe_class_default); 13579%} 13580 13581instruct vadd4F(vecX dst, vecX src1, vecX src2) 13582%{ 13583 match(Set dst (AddVF src1 src2)); 13584 ins_cost(INSN_COST); 13585 format %{ "fadd $dst,$src1,$src2\t# vector (4S)" %} 13586 ins_encode %{ 13587 __ fadd(as_FloatRegister($dst$$reg), __ T4S, 13588 as_FloatRegister($src1$$reg), 13589 as_FloatRegister($src2$$reg)); 13590 %} 13591 ins_pipe(pipe_class_default); 13592%} 13593 13594instruct vadd2D(vecX dst, vecX src1, vecX src2) 13595%{ 13596 match(Set dst (AddVD src1 src2)); 13597 ins_cost(INSN_COST); 13598 format %{ "fadd $dst,$src1,$src2\t# vector (2D)" %} 13599 ins_encode %{ 13600 __ fadd(as_FloatRegister($dst$$reg), __ T2D, 13601 as_FloatRegister($src1$$reg), 13602 as_FloatRegister($src2$$reg)); 13603 %} 13604 ins_pipe(pipe_class_default); 13605%} 13606 13607// --------------------------------- SUB -------------------------------------- 13608 13609instruct vsub16B(vecX dst, vecX src1, vecX src2) 13610%{ 13611 match(Set dst (SubVB src1 src2)); 13612 ins_cost(INSN_COST); 13613 format %{ "subv $dst,$src1,$src2\t# vector (16B)" %} 13614 ins_encode %{ 13615 __ subv(as_FloatRegister($dst$$reg), __ T16B, 13616 as_FloatRegister($src1$$reg), 13617 as_FloatRegister($src2$$reg)); 13618 %} 13619 ins_pipe(pipe_class_default); 13620%} 13621 13622instruct vsub8S(vecX dst, vecX src1, vecX src2) 13623%{ 13624 match(Set dst (SubVS src1 src2)); 13625 ins_cost(INSN_COST); 13626 format %{ "subv $dst,$src1,$src2\t# vector (8H)" %} 13627 ins_encode %{ 13628 __ subv(as_FloatRegister($dst$$reg), __ T8H, 13629 as_FloatRegister($src1$$reg), 13630 as_FloatRegister($src2$$reg)); 13631 %} 13632 ins_pipe(pipe_class_default); 13633%} 13634 13635instruct vsub4I(vecX dst, vecX src1, vecX src2) 13636%{ 13637 match(Set dst (SubVI src1 src2)); 13638 ins_cost(INSN_COST); 13639 format %{ "subv $dst,$src1,$src2\t# vector (4S)" %} 13640 ins_encode %{ 13641 __ subv(as_FloatRegister($dst$$reg), __ T4S, 13642 as_FloatRegister($src1$$reg), 13643 as_FloatRegister($src2$$reg)); 13644 %} 13645 ins_pipe(pipe_class_default); 13646%} 13647 13648instruct vsub2L(vecX dst, vecX src1, vecX src2) 13649%{ 13650 match(Set dst (SubVL src1 src2)); 13651 ins_cost(INSN_COST); 13652 format %{ "subv $dst,$src1,$src2\t# vector (2L)" %} 13653 ins_encode %{ 13654 __ subv(as_FloatRegister($dst$$reg), __ T2D, 13655 as_FloatRegister($src1$$reg), 13656 as_FloatRegister($src2$$reg)); 13657 %} 13658 ins_pipe(pipe_class_default); 13659%} 13660 13661instruct vsub4F(vecX dst, vecX src1, vecX src2) 13662%{ 13663 match(Set dst (SubVF src1 src2)); 13664 ins_cost(INSN_COST); 13665 format %{ "fsub $dst,$src1,$src2\t# vector (4S)" %} 13666 ins_encode %{ 13667 __ fsub(as_FloatRegister($dst$$reg), __ T4S, 13668 as_FloatRegister($src1$$reg), 13669 as_FloatRegister($src2$$reg)); 13670 %} 13671 ins_pipe(pipe_class_default); 13672%} 13673 13674instruct vsub2D(vecX dst, vecX src1, vecX src2) 13675%{ 13676 match(Set dst (SubVD src1 src2)); 13677 ins_cost(INSN_COST); 13678 format %{ "fsub $dst,$src1,$src2\t# vector (2D)" %} 13679 ins_encode %{ 13680 __ fsub(as_FloatRegister($dst$$reg), __ T2D, 13681 as_FloatRegister($src1$$reg), 13682 as_FloatRegister($src2$$reg)); 13683 %} 13684 ins_pipe(pipe_class_default); 13685%} 13686 13687// --------------------------------- MUL -------------------------------------- 13688 13689instruct vmul8S(vecX dst, vecX src1, vecX src2) 13690%{ 13691 match(Set dst (MulVS src1 src2)); 13692 ins_cost(INSN_COST); 13693 format %{ "mulv $dst,$src1,$src2\t# vector (8H)" %} 13694 ins_encode %{ 13695 __ mulv(as_FloatRegister($dst$$reg), __ T8H, 13696 as_FloatRegister($src1$$reg), 13697 as_FloatRegister($src2$$reg)); 13698 %} 13699 ins_pipe(pipe_class_default); 13700%} 13701 13702instruct vmul4I(vecX dst, vecX src1, vecX src2) 13703%{ 13704 match(Set dst (MulVI src1 src2)); 13705 ins_cost(INSN_COST); 13706 format %{ "mulv $dst,$src1,$src2\t# vector (4S)" %} 13707 ins_encode %{ 13708 __ mulv(as_FloatRegister($dst$$reg), __ T4S, 13709 as_FloatRegister($src1$$reg), 13710 as_FloatRegister($src2$$reg)); 13711 %} 13712 ins_pipe(pipe_class_default); 13713%} 13714 13715instruct vmul4F(vecX dst, vecX src1, vecX src2) 13716%{ 13717 match(Set dst (MulVF src1 src2)); 13718 ins_cost(INSN_COST); 13719 format %{ "fmul $dst,$src1,$src2\t# vector (4S)" %} 13720 ins_encode %{ 13721 __ fmul(as_FloatRegister($dst$$reg), __ T4S, 13722 as_FloatRegister($src1$$reg), 13723 as_FloatRegister($src2$$reg)); 13724 %} 13725 ins_pipe(pipe_class_default); 13726%} 13727 13728instruct vmul2D(vecX dst, vecX src1, vecX src2) 13729%{ 13730 match(Set dst (MulVD src1 src2)); 13731 ins_cost(INSN_COST); 13732 format %{ "fmul $dst,$src1,$src2\t# vector (2D)" %} 13733 ins_encode %{ 13734 __ fmul(as_FloatRegister($dst$$reg), __ T2D, 13735 as_FloatRegister($src1$$reg), 13736 as_FloatRegister($src2$$reg)); 13737 %} 13738 ins_pipe(pipe_class_default); 13739%} 13740 13741// --------------------------------- DIV -------------------------------------- 13742 13743instruct vdiv4F(vecX dst, vecX src1, vecX src2) 13744%{ 13745 match(Set dst (DivVF src1 src2)); 13746 ins_cost(INSN_COST); 13747 format %{ "fdiv $dst,$src1,$src2\t# vector (4S)" %} 13748 ins_encode %{ 13749 __ fdiv(as_FloatRegister($dst$$reg), __ T4S, 13750 as_FloatRegister($src1$$reg), 13751 as_FloatRegister($src2$$reg)); 13752 %} 13753 ins_pipe(pipe_class_default); 13754%} 13755 13756instruct vdiv2D(vecX dst, vecX src1, vecX src2) 13757%{ 13758 match(Set dst (DivVD src1 src2)); 13759 ins_cost(INSN_COST); 13760 format %{ "fdiv $dst,$src1,$src2\t# vector (2D)" %} 13761 ins_encode %{ 13762 __ fdiv(as_FloatRegister($dst$$reg), __ T2D, 13763 as_FloatRegister($src1$$reg), 13764 as_FloatRegister($src2$$reg)); 13765 %} 13766 ins_pipe(pipe_class_default); 13767%} 13768 13769// --------------------------------- AND -------------------------------------- 13770 13771instruct vand16B(vecX dst, vecX src1, vecX src2) 13772%{ 13773 match(Set dst (AndV src1 src2)); 13774 ins_cost(INSN_COST); 13775 format %{ "and $dst,$src1,$src2\t# vector (16B)" %} 13776 ins_encode %{ 13777 __ andr(as_FloatRegister($dst$$reg), __ T16B, 13778 as_FloatRegister($src1$$reg), 13779 as_FloatRegister($src2$$reg)); 13780 %} 13781 ins_pipe(pipe_class_default); 13782%} 13783 13784// --------------------------------- OR --------------------------------------- 13785 13786instruct vor16B(vecX dst, vecX src1, vecX src2) 13787%{ 13788 match(Set dst (OrV src1 src2)); 13789 ins_cost(INSN_COST); 13790 format %{ "orr $dst,$src1,$src2\t# vector (16B)" %} 13791 ins_encode %{ 13792 __ orr(as_FloatRegister($dst$$reg), __ T16B, 13793 as_FloatRegister($src1$$reg), 13794 as_FloatRegister($src2$$reg)); 13795 %} 13796 ins_pipe(pipe_class_default); 13797%} 13798 13799// --------------------------------- XOR -------------------------------------- 13800 13801instruct vxor16B(vecX dst, vecX src1, vecX src2) 13802%{ 13803 match(Set dst (XorV src1 src2)); 13804 ins_cost(INSN_COST); 13805 format %{ "xor $dst,$src1,$src2\t# vector (16B)" %} 13806 ins_encode %{ 13807 __ eor(as_FloatRegister($dst$$reg), __ T16B, 13808 as_FloatRegister($src1$$reg), 13809 as_FloatRegister($src2$$reg)); 13810 %} 13811 ins_pipe(pipe_class_default); 13812%} 13813 13814// ------------------------------ Shift --------------------------------------- 13815 13816instruct vshiftcntL(vecX dst, iRegIorL2I cnt) %{ 13817 match(Set dst (LShiftCntV cnt)); 13818 format %{ "dup $dst, $cnt\t# shift count (vecX)" %} 13819 ins_encode %{ 13820 __ dup(as_FloatRegister($dst$$reg), __ T16B, as_Register($cnt$$reg)); 13821 %} 13822 ins_pipe(pipe_class_default); 13823%} 13824 13825// Right shifts on aarch64 SIMD are implemented as left shift by -ve amount 13826instruct vshiftcntR(vecX dst, iRegIorL2I cnt) %{ 13827 match(Set dst (RShiftCntV cnt)); 13828 format %{ "dup $dst, $cnt\t# shift count (vecX)\n\tneg $dst, $dst\t T16B" %} 13829 ins_encode %{ 13830 __ dup(as_FloatRegister($dst$$reg), __ T16B, as_Register($cnt$$reg)); 13831 __ negr(as_FloatRegister($dst$$reg), __ T16B, as_FloatRegister($dst$$reg)); 13832 %} 13833 ins_pipe(pipe_class_default); 13834%} 13835 13836instruct vsll16B(vecX dst, vecX src, vecX shift) %{ 13837 match(Set dst (LShiftVB src shift)); 13838 match(Set dst (RShiftVB src shift)); 13839 ins_cost(INSN_COST); 13840 format %{ "sshl $dst,$src,$shift\t# vector (16B)" %} 13841 ins_encode %{ 13842 __ sshl(as_FloatRegister($dst$$reg), __ T16B, 13843 as_FloatRegister($src$$reg), 13844 as_FloatRegister($shift$$reg)); 13845 %} 13846 ins_pipe(pipe_class_default); 13847%} 13848 13849instruct vsrl16B(vecX dst, vecX src, vecX shift) %{ 13850 match(Set dst (URShiftVB src shift)); 13851 ins_cost(INSN_COST); 13852 format %{ "ushl $dst,$src,$shift\t# vector (16B)" %} 13853 ins_encode %{ 13854 __ ushl(as_FloatRegister($dst$$reg), __ T16B, 13855 as_FloatRegister($src$$reg), 13856 as_FloatRegister($shift$$reg)); 13857 %} 13858 ins_pipe(pipe_class_default); 13859%} 13860 13861instruct vsll16B_imm(vecX dst, vecX src, immI shift) %{ 13862 match(Set dst (LShiftVB src shift)); 13863 ins_cost(INSN_COST); 13864 format %{ "shl $dst, $src, $shift\t# vector (16B)" %} 13865 ins_encode %{ 13866 int sh = (int)$shift$$constant & 31; 13867 if (sh >= 8) { 13868 __ eor(as_FloatRegister($dst$$reg), __ T16B, 13869 as_FloatRegister($src$$reg), 13870 as_FloatRegister($src$$reg)); 13871 } else { 13872 __ shl(as_FloatRegister($dst$$reg), __ T16B, 13873 as_FloatRegister($src$$reg), sh); 13874 } 13875 %} 13876 ins_pipe(pipe_class_default); 13877%} 13878 13879instruct vsra16B_imm(vecX dst, vecX src, immI shift) %{ 13880 match(Set dst (RShiftVB src shift)); 13881 ins_cost(INSN_COST); 13882 format %{ "sshr $dst, $src, $shift\t# vector (16B)" %} 13883 ins_encode %{ 13884 int sh = (int)$shift$$constant & 31; 13885 if (sh >= 8) sh = 7; 13886 sh = -sh & 7; 13887 __ sshr(as_FloatRegister($dst$$reg), __ T16B, 13888 as_FloatRegister($src$$reg), sh); 13889 %} 13890 ins_pipe(pipe_class_default); 13891%} 13892 13893instruct vsrl16B_imm(vecX dst, vecX src, immI shift) %{ 13894 match(Set dst (URShiftVB src shift)); 13895 ins_cost(INSN_COST); 13896 format %{ "ushr $dst, $src, $shift\t# vector (16B)" %} 13897 ins_encode %{ 13898 int sh = (int)$shift$$constant & 31; 13899 if (sh >= 8) { 13900 __ eor(as_FloatRegister($dst$$reg), __ T16B, 13901 as_FloatRegister($src$$reg), 13902 as_FloatRegister($src$$reg)); 13903 } else { 13904 __ ushr(as_FloatRegister($dst$$reg), __ T16B, 13905 as_FloatRegister($src$$reg), -sh & 7); 13906 } 13907 %} 13908 ins_pipe(pipe_class_default); 13909%} 13910 13911instruct vsll8S(vecX dst, vecX src, vecX shift) %{ 13912 match(Set dst (LShiftVS src shift)); 13913 match(Set dst (RShiftVS src shift)); 13914 ins_cost(INSN_COST); 13915 format %{ "sshl $dst,$src,$shift\t# vector (8H)" %} 13916 ins_encode %{ 13917 __ sshl(as_FloatRegister($dst$$reg), __ T8H, 13918 as_FloatRegister($src$$reg), 13919 as_FloatRegister($shift$$reg)); 13920 %} 13921 ins_pipe(pipe_class_default); 13922%} 13923 13924instruct vsrl8S(vecX dst, vecX src, vecX shift) %{ 13925 match(Set dst (URShiftVS src shift)); 13926 ins_cost(INSN_COST); 13927 format %{ "ushl $dst,$src,$shift\t# vector (8H)" %} 13928 ins_encode %{ 13929 __ ushl(as_FloatRegister($dst$$reg), __ T8H, 13930 as_FloatRegister($src$$reg), 13931 as_FloatRegister($shift$$reg)); 13932 %} 13933 ins_pipe(pipe_class_default); 13934%} 13935 13936instruct vsll8S_imm(vecX dst, vecX src, immI shift) %{ 13937 match(Set dst (LShiftVS src shift)); 13938 ins_cost(INSN_COST); 13939 format %{ "shl $dst, $src, $shift\t# vector (8H)" %} 13940 ins_encode %{ 13941 int sh = (int)$shift$$constant & 31; 13942 if (sh >= 16) { 13943 __ eor(as_FloatRegister($dst$$reg), __ T16B, 13944 as_FloatRegister($src$$reg), 13945 as_FloatRegister($src$$reg)); 13946 } else { 13947 __ shl(as_FloatRegister($dst$$reg), __ T8H, 13948 as_FloatRegister($src$$reg), sh); 13949 } 13950 %} 13951 ins_pipe(pipe_class_default); 13952%} 13953 13954instruct vsra8S_imm(vecX dst, vecX src, immI shift) %{ 13955 match(Set dst (RShiftVS src shift)); 13956 ins_cost(INSN_COST); 13957 format %{ "sshr $dst, $src, $shift\t# vector (8H)" %} 13958 ins_encode %{ 13959 int sh = (int)$shift$$constant & 31; 13960 if (sh >= 16) sh = 15; 13961 sh = -sh & 15; 13962 __ sshr(as_FloatRegister($dst$$reg), __ T8H, 13963 as_FloatRegister($src$$reg), sh); 13964 %} 13965 ins_pipe(pipe_class_default); 13966%} 13967 13968instruct vsrl8S_imm(vecX dst, vecX src, immI shift) %{ 13969 match(Set dst (URShiftVS src shift)); 13970 ins_cost(INSN_COST); 13971 format %{ "ushr $dst, $src, $shift\t# vector (8H)" %} 13972 ins_encode %{ 13973 int sh = (int)$shift$$constant & 31; 13974 if (sh >= 16) { 13975 __ eor(as_FloatRegister($dst$$reg), __ T16B, 13976 as_FloatRegister($src$$reg), 13977 as_FloatRegister($src$$reg)); 13978 } else { 13979 __ ushr(as_FloatRegister($dst$$reg), __ T8H, 13980 as_FloatRegister($src$$reg), -sh & 15); 13981 } 13982 %} 13983 ins_pipe(pipe_class_default); 13984%} 13985 13986instruct vsll4I(vecX dst, vecX src, vecX shift) %{ 13987 match(Set dst (LShiftVI src shift)); 13988 match(Set dst (RShiftVI src shift)); 13989 ins_cost(INSN_COST); 13990 format %{ "sshl $dst,$src,$shift\t# vector (4S)" %} 13991 ins_encode %{ 13992 __ sshl(as_FloatRegister($dst$$reg), __ T4S, 13993 as_FloatRegister($src$$reg), 13994 as_FloatRegister($shift$$reg)); 13995 %} 13996 ins_pipe(pipe_class_default); 13997%} 13998 13999instruct vsrl4I(vecX dst, vecX src, vecX shift) %{ 14000 match(Set dst (URShiftVI src shift)); 14001 ins_cost(INSN_COST); 14002 format %{ "ushl $dst,$src,$shift\t# vector (4S)" %} 14003 ins_encode %{ 14004 __ ushl(as_FloatRegister($dst$$reg), __ T4S, 14005 as_FloatRegister($src$$reg), 14006 as_FloatRegister($shift$$reg)); 14007 %} 14008 ins_pipe(pipe_class_default); 14009%} 14010 14011instruct vsll4I_imm(vecX dst, vecX src, immI shift) %{ 14012 match(Set dst (LShiftVI src shift)); 14013 ins_cost(INSN_COST); 14014 format %{ "shl $dst, $src, $shift\t# vector (4S)" %} 14015 ins_encode %{ 14016 __ shl(as_FloatRegister($dst$$reg), __ T4S, 14017 as_FloatRegister($src$$reg), 14018 (int)$shift$$constant & 31); 14019 %} 14020 ins_pipe(pipe_class_default); 14021%} 14022 14023instruct vsra4I_imm(vecX dst, vecX src, immI shift) %{ 14024 match(Set dst (RShiftVI src shift)); 14025 ins_cost(INSN_COST); 14026 format %{ "sshr $dst, $src, $shift\t# vector (4S)" %} 14027 ins_encode %{ 14028 __ sshr(as_FloatRegister($dst$$reg), __ T4S, 14029 as_FloatRegister($src$$reg), 14030 -(int)$shift$$constant & 31); 14031 %} 14032 ins_pipe(pipe_class_default); 14033%} 14034 14035instruct vsrl4I_imm(vecX dst, vecX src, immI shift) %{ 14036 match(Set dst (URShiftVI src shift)); 14037 ins_cost(INSN_COST); 14038 format %{ "ushr $dst, $src, $shift\t# vector (4S)" %} 14039 ins_encode %{ 14040 __ ushr(as_FloatRegister($dst$$reg), __ T4S, 14041 as_FloatRegister($src$$reg), 14042 -(int)$shift$$constant & 31); 14043 %} 14044 ins_pipe(pipe_class_default); 14045%} 14046 14047instruct vsll2L(vecX dst, vecX src, vecX shift) %{ 14048 match(Set dst (LShiftVL src shift)); 14049 match(Set dst (RShiftVL src shift)); 14050 ins_cost(INSN_COST); 14051 format %{ "sshl $dst,$src,$shift\t# vector (2D)" %} 14052 ins_encode %{ 14053 __ sshl(as_FloatRegister($dst$$reg), __ T2D, 14054 as_FloatRegister($src$$reg), 14055 as_FloatRegister($shift$$reg)); 14056 %} 14057 ins_pipe(pipe_class_default); 14058%} 14059 14060instruct vsrl2L(vecX dst, vecX src, vecX shift) %{ 14061 match(Set dst (URShiftVL src shift)); 14062 ins_cost(INSN_COST); 14063 format %{ "ushl $dst,$src,$shift\t# vector (2D)" %} 14064 ins_encode %{ 14065 __ ushl(as_FloatRegister($dst$$reg), __ T2D, 14066 as_FloatRegister($src$$reg), 14067 as_FloatRegister($shift$$reg)); 14068 %} 14069 ins_pipe(pipe_class_default); 14070%} 14071 14072instruct vsll2L_imm(vecX dst, vecX src, immI shift) %{ 14073 match(Set dst (LShiftVL src shift)); 14074 ins_cost(INSN_COST); 14075 format %{ "shl $dst, $src, $shift\t# vector (2D)" %} 14076 ins_encode %{ 14077 __ shl(as_FloatRegister($dst$$reg), __ T2D, 14078 as_FloatRegister($src$$reg), 14079 (int)$shift$$constant & 63); 14080 %} 14081 ins_pipe(pipe_class_default); 14082%} 14083 14084instruct vsra2L_imm(vecX dst, vecX src, immI shift) %{ 14085 match(Set dst (RShiftVL src shift)); 14086 ins_cost(INSN_COST); 14087 format %{ "sshr $dst, $src, $shift\t# vector (2D)" %} 14088 ins_encode %{ 14089 __ sshr(as_FloatRegister($dst$$reg), __ T2D, 14090 as_FloatRegister($src$$reg), 14091 -(int)$shift$$constant & 63); 14092 %} 14093 ins_pipe(pipe_class_default); 14094%} 14095 14096instruct vsrl2L_imm(vecX dst, vecX src, immI shift) %{ 14097 match(Set dst (URShiftVL src shift)); 14098 ins_cost(INSN_COST); 14099 format %{ "ushr $dst, $src, $shift\t# vector (2D)" %} 14100 ins_encode %{ 14101 __ ushr(as_FloatRegister($dst$$reg), __ T2D, 14102 as_FloatRegister($src$$reg), 14103 -(int)$shift$$constant & 63); 14104 %} 14105 ins_pipe(pipe_class_default); 14106%} 14107 |
|
12931//----------PEEPHOLE RULES----------------------------------------------------- 12932// These must follow all instruction definitions as they use the names 12933// defined in the instructions definitions. 12934// 12935// peepmatch ( root_instr_name [preceding_instruction]* ); 12936// 12937// peepconstraint %{ 12938// (instruction_number.operand_name relational_op instruction_number.operand_name --- 121 unchanged lines hidden --- | 14108//----------PEEPHOLE RULES----------------------------------------------------- 14109// These must follow all instruction definitions as they use the names 14110// defined in the instructions definitions. 14111// 14112// peepmatch ( root_instr_name [preceding_instruction]* ); 14113// 14114// peepconstraint %{ 14115// (instruction_number.operand_name relational_op instruction_number.operand_name --- 121 unchanged lines hidden --- |