15ffd83dbSDimitry Andric//=----- AArch64InstrGISel.td - AArch64 GISel target pseudos -*- tablegen -*-=// 25ffd83dbSDimitry Andric// 35ffd83dbSDimitry Andric// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 45ffd83dbSDimitry Andric// See https://llvm.org/LICENSE.txt for license information. 55ffd83dbSDimitry Andric// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 65ffd83dbSDimitry Andric// 75ffd83dbSDimitry Andric//===----------------------------------------------------------------------===// 85ffd83dbSDimitry Andric// 95ffd83dbSDimitry Andric// AArch64 GlobalISel target pseudo instruction definitions. This is kept 105ffd83dbSDimitry Andric// separately from the other tablegen files for organizational purposes, but 115ffd83dbSDimitry Andric// share the same infrastructure. 125ffd83dbSDimitry Andric// 135ffd83dbSDimitry Andric//===----------------------------------------------------------------------===// 145ffd83dbSDimitry Andric 155ffd83dbSDimitry Andric 165ffd83dbSDimitry Andricclass AArch64GenericInstruction : GenericInstruction { 175ffd83dbSDimitry Andric let Namespace = "AArch64"; 185ffd83dbSDimitry Andric} 195ffd83dbSDimitry Andric 205ffd83dbSDimitry Andric// A pseudo to represent a relocatable add instruction as part of address 215ffd83dbSDimitry Andric// computation. 225ffd83dbSDimitry Andricdef G_ADD_LOW : AArch64GenericInstruction { 235ffd83dbSDimitry Andric let OutOperandList = (outs type0:$dst); 245ffd83dbSDimitry Andric let InOperandList = (ins type1:$src, type2:$imm); 255ffd83dbSDimitry Andric let hasSideEffects = 0; 265ffd83dbSDimitry Andric} 275ffd83dbSDimitry Andric 285ffd83dbSDimitry Andric// Pseudo for a rev16 instruction. Produced post-legalization from 295ffd83dbSDimitry Andric// G_SHUFFLE_VECTORs with appropriate masks. 305ffd83dbSDimitry Andricdef G_REV16 : AArch64GenericInstruction { 315ffd83dbSDimitry Andric let OutOperandList = (outs type0:$dst); 325ffd83dbSDimitry Andric let InOperandList = (ins type0:$src); 335ffd83dbSDimitry Andric let hasSideEffects = 0; 345ffd83dbSDimitry Andric} 355ffd83dbSDimitry Andric 365ffd83dbSDimitry Andric// Pseudo for a rev32 instruction. Produced post-legalization from 375ffd83dbSDimitry Andric// G_SHUFFLE_VECTORs with appropriate masks. 385ffd83dbSDimitry Andricdef G_REV32 : AArch64GenericInstruction { 395ffd83dbSDimitry Andric let OutOperandList = (outs type0:$dst); 405ffd83dbSDimitry Andric let InOperandList = (ins type0:$src); 415ffd83dbSDimitry Andric let hasSideEffects = 0; 425ffd83dbSDimitry Andric} 435ffd83dbSDimitry Andric 445ffd83dbSDimitry Andric// Pseudo for a rev64 instruction. Produced post-legalization from 455ffd83dbSDimitry Andric// G_SHUFFLE_VECTORs with appropriate masks. 465ffd83dbSDimitry Andricdef G_REV64 : AArch64GenericInstruction { 475ffd83dbSDimitry Andric let OutOperandList = (outs type0:$dst); 485ffd83dbSDimitry Andric let InOperandList = (ins type0:$src); 495ffd83dbSDimitry Andric let hasSideEffects = 0; 505ffd83dbSDimitry Andric} 515ffd83dbSDimitry Andric 525ffd83dbSDimitry Andric// Represents an uzp1 instruction. Produced post-legalization from 535ffd83dbSDimitry Andric// G_SHUFFLE_VECTORs with appropriate masks. 545ffd83dbSDimitry Andricdef G_UZP1 : AArch64GenericInstruction { 555ffd83dbSDimitry Andric let OutOperandList = (outs type0:$dst); 565ffd83dbSDimitry Andric let InOperandList = (ins type0:$v1, type0:$v2); 575ffd83dbSDimitry Andric let hasSideEffects = 0; 585ffd83dbSDimitry Andric} 595ffd83dbSDimitry Andric 605ffd83dbSDimitry Andric// Represents an uzp2 instruction. Produced post-legalization from 615ffd83dbSDimitry Andric// G_SHUFFLE_VECTORs with appropriate masks. 625ffd83dbSDimitry Andricdef G_UZP2 : AArch64GenericInstruction { 635ffd83dbSDimitry Andric let OutOperandList = (outs type0:$dst); 645ffd83dbSDimitry Andric let InOperandList = (ins type0:$v1, type0:$v2); 655ffd83dbSDimitry Andric let hasSideEffects = 0; 665ffd83dbSDimitry Andric} 675ffd83dbSDimitry Andric 685ffd83dbSDimitry Andric// Represents a zip1 instruction. Produced post-legalization from 695ffd83dbSDimitry Andric// G_SHUFFLE_VECTORs with appropriate masks. 705ffd83dbSDimitry Andricdef G_ZIP1 : AArch64GenericInstruction { 715ffd83dbSDimitry Andric let OutOperandList = (outs type0:$dst); 725ffd83dbSDimitry Andric let InOperandList = (ins type0:$v1, type0:$v2); 735ffd83dbSDimitry Andric let hasSideEffects = 0; 745ffd83dbSDimitry Andric} 755ffd83dbSDimitry Andric 765ffd83dbSDimitry Andric// Represents a zip2 instruction. Produced post-legalization from 775ffd83dbSDimitry Andric// G_SHUFFLE_VECTORs with appropriate masks. 785ffd83dbSDimitry Andricdef G_ZIP2 : AArch64GenericInstruction { 795ffd83dbSDimitry Andric let OutOperandList = (outs type0:$dst); 805ffd83dbSDimitry Andric let InOperandList = (ins type0:$v1, type0:$v2); 815ffd83dbSDimitry Andric let hasSideEffects = 0; 825ffd83dbSDimitry Andric} 835ffd83dbSDimitry Andric 845ffd83dbSDimitry Andric// Represents a dup instruction. Produced post-legalization from 855ffd83dbSDimitry Andric// G_SHUFFLE_VECTORs with appropriate masks. 865ffd83dbSDimitry Andricdef G_DUP: AArch64GenericInstruction { 875ffd83dbSDimitry Andric let OutOperandList = (outs type0:$dst); 885ffd83dbSDimitry Andric let InOperandList = (ins type1:$lane); 895ffd83dbSDimitry Andric let hasSideEffects = 0; 905ffd83dbSDimitry Andric} 91e8d8bef9SDimitry Andric 92e8d8bef9SDimitry Andric// Represents a lane duplicate operation. 93e8d8bef9SDimitry Andricdef G_DUPLANE8 : AArch64GenericInstruction { 94e8d8bef9SDimitry Andric let OutOperandList = (outs type0:$dst); 95e8d8bef9SDimitry Andric let InOperandList = (ins type0:$src, type1:$lane); 96e8d8bef9SDimitry Andric let hasSideEffects = 0; 97e8d8bef9SDimitry Andric} 98e8d8bef9SDimitry Andricdef G_DUPLANE16 : AArch64GenericInstruction { 99e8d8bef9SDimitry Andric let OutOperandList = (outs type0:$dst); 100e8d8bef9SDimitry Andric let InOperandList = (ins type0:$src, type1:$lane); 101e8d8bef9SDimitry Andric let hasSideEffects = 0; 102e8d8bef9SDimitry Andric} 103e8d8bef9SDimitry Andricdef G_DUPLANE32 : AArch64GenericInstruction { 104e8d8bef9SDimitry Andric let OutOperandList = (outs type0:$dst); 105e8d8bef9SDimitry Andric let InOperandList = (ins type0:$src, type1:$lane); 106e8d8bef9SDimitry Andric let hasSideEffects = 0; 107e8d8bef9SDimitry Andric} 108e8d8bef9SDimitry Andricdef G_DUPLANE64 : AArch64GenericInstruction { 109e8d8bef9SDimitry Andric let OutOperandList = (outs type0:$dst); 110e8d8bef9SDimitry Andric let InOperandList = (ins type0:$src, type1:$lane); 111e8d8bef9SDimitry Andric let hasSideEffects = 0; 112e8d8bef9SDimitry Andric} 113e8d8bef9SDimitry Andric 1145ffd83dbSDimitry Andric// Represents a trn1 instruction. Produced post-legalization from 1155ffd83dbSDimitry Andric// G_SHUFFLE_VECTORs with appropriate masks. 1165ffd83dbSDimitry Andricdef G_TRN1 : AArch64GenericInstruction { 1175ffd83dbSDimitry Andric let OutOperandList = (outs type0:$dst); 1185ffd83dbSDimitry Andric let InOperandList = (ins type0:$v1, type0:$v2); 1195ffd83dbSDimitry Andric let hasSideEffects = 0; 1205ffd83dbSDimitry Andric} 1215ffd83dbSDimitry Andric 1225ffd83dbSDimitry Andric// Represents a trn2 instruction. Produced post-legalization from 1235ffd83dbSDimitry Andric// G_SHUFFLE_VECTORs with appropriate masks. 1245ffd83dbSDimitry Andricdef G_TRN2 : AArch64GenericInstruction { 1255ffd83dbSDimitry Andric let OutOperandList = (outs type0:$dst); 1265ffd83dbSDimitry Andric let InOperandList = (ins type0:$v1, type0:$v2); 1275ffd83dbSDimitry Andric let hasSideEffects = 0; 1285ffd83dbSDimitry Andric} 1295ffd83dbSDimitry Andric 1305ffd83dbSDimitry Andric// Represents an ext instruction. Produced post-legalization from 1315ffd83dbSDimitry Andric// G_SHUFFLE_VECTORs with appropriate masks. 1325ffd83dbSDimitry Andricdef G_EXT: AArch64GenericInstruction { 1335ffd83dbSDimitry Andric let OutOperandList = (outs type0:$dst); 1345ffd83dbSDimitry Andric let InOperandList = (ins type0:$v1, type0:$v2, untyped_imm_0:$imm); 135fe6060f1SDimitry Andric let hasSideEffects = 0; 1365ffd83dbSDimitry Andric} 1375ffd83dbSDimitry Andric 138e8d8bef9SDimitry Andric// Represents a vector G_ASHR with an immediate. 139e8d8bef9SDimitry Andricdef G_VASHR : AArch64GenericInstruction { 140e8d8bef9SDimitry Andric let OutOperandList = (outs type0:$dst); 141e8d8bef9SDimitry Andric let InOperandList = (ins type0:$src1, untyped_imm_0:$imm); 142fe6060f1SDimitry Andric let hasSideEffects = 0; 143e8d8bef9SDimitry Andric} 144e8d8bef9SDimitry Andric 145e8d8bef9SDimitry Andric// Represents a vector G_LSHR with an immediate. 146e8d8bef9SDimitry Andricdef G_VLSHR : AArch64GenericInstruction { 147e8d8bef9SDimitry Andric let OutOperandList = (outs type0:$dst); 148e8d8bef9SDimitry Andric let InOperandList = (ins type0:$src1, untyped_imm_0:$imm); 149fe6060f1SDimitry Andric let hasSideEffects = 0; 150e8d8bef9SDimitry Andric} 151e8d8bef9SDimitry Andric 152e8d8bef9SDimitry Andric// Represents an integer to FP conversion on the FPR bank. 153e8d8bef9SDimitry Andricdef G_SITOF : AArch64GenericInstruction { 154e8d8bef9SDimitry Andric let OutOperandList = (outs type0:$dst); 155e8d8bef9SDimitry Andric let InOperandList = (ins type0:$src); 156fe6060f1SDimitry Andric let hasSideEffects = 0; 157e8d8bef9SDimitry Andric} 158e8d8bef9SDimitry Andricdef G_UITOF : AArch64GenericInstruction { 159e8d8bef9SDimitry Andric let OutOperandList = (outs type0:$dst); 160e8d8bef9SDimitry Andric let InOperandList = (ins type0:$src); 161fe6060f1SDimitry Andric let hasSideEffects = 0; 162fe6060f1SDimitry Andric} 163fe6060f1SDimitry Andric 164fe6060f1SDimitry Andricdef G_FCMEQ : AArch64GenericInstruction { 165fe6060f1SDimitry Andric let OutOperandList = (outs type0:$dst); 166fe6060f1SDimitry Andric let InOperandList = (ins type0:$src1, type1:$src2); 167fe6060f1SDimitry Andric let hasSideEffects = 0; 168fe6060f1SDimitry Andric} 169fe6060f1SDimitry Andric 170fe6060f1SDimitry Andricdef G_FCMGE : AArch64GenericInstruction { 171fe6060f1SDimitry Andric let OutOperandList = (outs type0:$dst); 172fe6060f1SDimitry Andric let InOperandList = (ins type0:$src1, type1:$src2); 173fe6060f1SDimitry Andric let hasSideEffects = 0; 174fe6060f1SDimitry Andric} 175fe6060f1SDimitry Andric 176fe6060f1SDimitry Andricdef G_FCMGT : AArch64GenericInstruction { 177fe6060f1SDimitry Andric let OutOperandList = (outs type0:$dst); 178fe6060f1SDimitry Andric let InOperandList = (ins type0:$src1, type1:$src2); 179fe6060f1SDimitry Andric let hasSideEffects = 0; 180fe6060f1SDimitry Andric} 181fe6060f1SDimitry Andric 182fe6060f1SDimitry Andricdef G_FCMEQZ : AArch64GenericInstruction { 183fe6060f1SDimitry Andric let OutOperandList = (outs type0:$dst); 184fe6060f1SDimitry Andric let InOperandList = (ins type0:$src); 185fe6060f1SDimitry Andric let hasSideEffects = 0; 186fe6060f1SDimitry Andric} 187fe6060f1SDimitry Andric 188fe6060f1SDimitry Andricdef G_FCMGEZ : AArch64GenericInstruction { 189fe6060f1SDimitry Andric let OutOperandList = (outs type0:$dst); 190fe6060f1SDimitry Andric let InOperandList = (ins type0:$src); 191fe6060f1SDimitry Andric let hasSideEffects = 0; 192fe6060f1SDimitry Andric} 193fe6060f1SDimitry Andric 194fe6060f1SDimitry Andricdef G_FCMGTZ : AArch64GenericInstruction { 195fe6060f1SDimitry Andric let OutOperandList = (outs type0:$dst); 196fe6060f1SDimitry Andric let InOperandList = (ins type0:$src); 197fe6060f1SDimitry Andric let hasSideEffects = 0; 198fe6060f1SDimitry Andric} 199fe6060f1SDimitry Andric 200fe6060f1SDimitry Andricdef G_FCMLEZ : AArch64GenericInstruction { 201fe6060f1SDimitry Andric let OutOperandList = (outs type0:$dst); 202fe6060f1SDimitry Andric let InOperandList = (ins type0:$src); 203fe6060f1SDimitry Andric let hasSideEffects = 0; 204fe6060f1SDimitry Andric} 205fe6060f1SDimitry Andric 206fe6060f1SDimitry Andricdef G_FCMLTZ : AArch64GenericInstruction { 207fe6060f1SDimitry Andric let OutOperandList = (outs type0:$dst); 208fe6060f1SDimitry Andric let InOperandList = (ins type0:$src); 209fe6060f1SDimitry Andric let hasSideEffects = 0; 210e8d8bef9SDimitry Andric} 211e8d8bef9SDimitry Andric 2125f757f3fSDimitry Andricdef G_AARCH64_PREFETCH : AArch64GenericInstruction { 213bdd1243dSDimitry Andric let OutOperandList = (outs); 214bdd1243dSDimitry Andric let InOperandList = (ins type0:$imm, ptype0:$src1); 215bdd1243dSDimitry Andric let hasSideEffects = 1; 216bdd1243dSDimitry Andric} 217bdd1243dSDimitry Andric 2185f757f3fSDimitry Andricdef G_UMULL : AArch64GenericInstruction { 2195f757f3fSDimitry Andric let OutOperandList = (outs type0:$dst); 2205f757f3fSDimitry Andric let InOperandList = (ins type0:$src1, type0:$src2); 2215f757f3fSDimitry Andric let hasSideEffects = 0; 2225f757f3fSDimitry Andric} 2235f757f3fSDimitry Andric 2245f757f3fSDimitry Andricdef G_SMULL : AArch64GenericInstruction { 2255f757f3fSDimitry Andric let OutOperandList = (outs type0:$dst); 2265f757f3fSDimitry Andric let InOperandList = (ins type0:$src1, type0:$src2); 2275f757f3fSDimitry Andric let hasSideEffects = 0; 2285f757f3fSDimitry Andric} 2295f757f3fSDimitry Andric 2307a6dacacSDimitry Andricdef G_UADDLP : AArch64GenericInstruction { 2317a6dacacSDimitry Andric let OutOperandList = (outs type0:$dst); 2327a6dacacSDimitry Andric let InOperandList = (ins type0:$src1); 2337a6dacacSDimitry Andric let hasSideEffects = 0; 2347a6dacacSDimitry Andric} 2357a6dacacSDimitry Andric 2367a6dacacSDimitry Andricdef G_SADDLP : AArch64GenericInstruction { 2377a6dacacSDimitry Andric let OutOperandList = (outs type0:$dst); 2387a6dacacSDimitry Andric let InOperandList = (ins type0:$src1); 2397a6dacacSDimitry Andric let hasSideEffects = 0; 2407a6dacacSDimitry Andric} 2417a6dacacSDimitry Andric 2427a6dacacSDimitry Andricdef G_UADDLV : AArch64GenericInstruction { 2437a6dacacSDimitry Andric let OutOperandList = (outs type0:$dst); 2447a6dacacSDimitry Andric let InOperandList = (ins type0:$src1); 2457a6dacacSDimitry Andric let hasSideEffects = 0; 2467a6dacacSDimitry Andric} 2477a6dacacSDimitry Andric 2487a6dacacSDimitry Andricdef G_SADDLV : AArch64GenericInstruction { 2497a6dacacSDimitry Andric let OutOperandList = (outs type0:$dst); 2507a6dacacSDimitry Andric let InOperandList = (ins type0:$src1); 2517a6dacacSDimitry Andric let hasSideEffects = 0; 2527a6dacacSDimitry Andric} 2537a6dacacSDimitry Andric 2545f757f3fSDimitry Andricdef G_UDOT : AArch64GenericInstruction { 2555f757f3fSDimitry Andric let OutOperandList = (outs type0:$dst); 2565f757f3fSDimitry Andric let InOperandList = (ins type0:$src1, type0:$src2, type0:$src3); 2575f757f3fSDimitry Andric let hasSideEffects = 0; 2585f757f3fSDimitry Andric} 2595f757f3fSDimitry Andric 2605f757f3fSDimitry Andricdef G_SDOT : AArch64GenericInstruction { 2615f757f3fSDimitry Andric let OutOperandList = (outs type0:$dst); 2625f757f3fSDimitry Andric let InOperandList = (ins type0:$src1, type0:$src2, type0:$src3); 2635f757f3fSDimitry Andric let hasSideEffects = 0; 2645f757f3fSDimitry Andric} 2655f757f3fSDimitry Andric 2665f757f3fSDimitry Andric// Generic instruction for the BSP pseudo. It is expanded into BSP, which 2675f757f3fSDimitry Andric// expands into BSL/BIT/BIF after register allocation. 2685f757f3fSDimitry Andricdef G_BSP : AArch64GenericInstruction { 269bdd1243dSDimitry Andric let OutOperandList = (outs type0:$dst); 270bdd1243dSDimitry Andric let InOperandList = (ins type0:$src1, type0:$src2, type0:$src3); 271bdd1243dSDimitry Andric let hasSideEffects = 0; 272bdd1243dSDimitry Andric} 273bdd1243dSDimitry Andric 2745ffd83dbSDimitry Andricdef : GINodeEquiv<G_REV16, AArch64rev16>; 2755ffd83dbSDimitry Andricdef : GINodeEquiv<G_REV32, AArch64rev32>; 2765ffd83dbSDimitry Andricdef : GINodeEquiv<G_REV64, AArch64rev64>; 2775ffd83dbSDimitry Andricdef : GINodeEquiv<G_UZP1, AArch64uzp1>; 2785ffd83dbSDimitry Andricdef : GINodeEquiv<G_UZP2, AArch64uzp2>; 2795ffd83dbSDimitry Andricdef : GINodeEquiv<G_ZIP1, AArch64zip1>; 2805ffd83dbSDimitry Andricdef : GINodeEquiv<G_ZIP2, AArch64zip2>; 2815ffd83dbSDimitry Andricdef : GINodeEquiv<G_DUP, AArch64dup>; 282e8d8bef9SDimitry Andricdef : GINodeEquiv<G_DUPLANE8, AArch64duplane8>; 283e8d8bef9SDimitry Andricdef : GINodeEquiv<G_DUPLANE16, AArch64duplane16>; 284e8d8bef9SDimitry Andricdef : GINodeEquiv<G_DUPLANE32, AArch64duplane32>; 285e8d8bef9SDimitry Andricdef : GINodeEquiv<G_DUPLANE64, AArch64duplane64>; 2865ffd83dbSDimitry Andricdef : GINodeEquiv<G_TRN1, AArch64trn1>; 2875ffd83dbSDimitry Andricdef : GINodeEquiv<G_TRN2, AArch64trn2>; 2885ffd83dbSDimitry Andricdef : GINodeEquiv<G_EXT, AArch64ext>; 289e8d8bef9SDimitry Andricdef : GINodeEquiv<G_VASHR, AArch64vashr>; 290e8d8bef9SDimitry Andricdef : GINodeEquiv<G_VLSHR, AArch64vlshr>; 291e8d8bef9SDimitry Andricdef : GINodeEquiv<G_SITOF, AArch64sitof>; 292e8d8bef9SDimitry Andricdef : GINodeEquiv<G_UITOF, AArch64uitof>; 293e8d8bef9SDimitry Andric 294fe6060f1SDimitry Andricdef : GINodeEquiv<G_FCMEQ, AArch64fcmeq>; 295fe6060f1SDimitry Andricdef : GINodeEquiv<G_FCMGE, AArch64fcmge>; 296fe6060f1SDimitry Andricdef : GINodeEquiv<G_FCMGT, AArch64fcmgt>; 297fe6060f1SDimitry Andric 298fe6060f1SDimitry Andricdef : GINodeEquiv<G_FCMEQZ, AArch64fcmeqz>; 299fe6060f1SDimitry Andricdef : GINodeEquiv<G_FCMGEZ, AArch64fcmgez>; 300fe6060f1SDimitry Andricdef : GINodeEquiv<G_FCMGTZ, AArch64fcmgtz>; 301fe6060f1SDimitry Andricdef : GINodeEquiv<G_FCMLEZ, AArch64fcmlez>; 302fe6060f1SDimitry Andricdef : GINodeEquiv<G_FCMLTZ, AArch64fcmltz>; 303fe6060f1SDimitry Andric 3045f757f3fSDimitry Andricdef : GINodeEquiv<G_BSP, AArch64bsp>; 3055f757f3fSDimitry Andric 3065f757f3fSDimitry Andricdef : GINodeEquiv<G_UMULL, AArch64umull>; 3075f757f3fSDimitry Andricdef : GINodeEquiv<G_SMULL, AArch64smull>; 3085f757f3fSDimitry Andric 3097a6dacacSDimitry Andricdef : GINodeEquiv<G_SADDLP, AArch64saddlp_n>; 3107a6dacacSDimitry Andricdef : GINodeEquiv<G_UADDLP, AArch64uaddlp_n>; 3117a6dacacSDimitry Andric 3127a6dacacSDimitry Andricdef : GINodeEquiv<G_SADDLV, AArch64saddlv>; 3137a6dacacSDimitry Andricdef : GINodeEquiv<G_UADDLV, AArch64uaddlv>; 3147a6dacacSDimitry Andric 3155f757f3fSDimitry Andricdef : GINodeEquiv<G_UDOT, AArch64udot>; 3165f757f3fSDimitry Andricdef : GINodeEquiv<G_SDOT, AArch64sdot>; 317bdd1243dSDimitry Andric 318e8d8bef9SDimitry Andricdef : GINodeEquiv<G_EXTRACT_VECTOR_ELT, vector_extract>; 319e8d8bef9SDimitry Andric 3205f757f3fSDimitry Andricdef : GINodeEquiv<G_AARCH64_PREFETCH, AArch64Prefetch>; 321bdd1243dSDimitry Andric 322e8d8bef9SDimitry Andric// These are patterns that we only use for GlobalISel via the importer. 323e8d8bef9SDimitry Andricdef : Pat<(f32 (fadd (vector_extract (v2f32 FPR64:$Rn), (i64 0)), 324e8d8bef9SDimitry Andric (vector_extract (v2f32 FPR64:$Rn), (i64 1)))), 325e8d8bef9SDimitry Andric (f32 (FADDPv2i32p (v2f32 FPR64:$Rn)))>; 326fe6060f1SDimitry Andric 327fe6060f1SDimitry Andriclet Predicates = [HasNEON] in { 328fe6060f1SDimitry Andric def : Pat<(v2f64 (sint_to_fp v2i32:$src)), 329fe6060f1SDimitry Andric (SCVTFv2f64 (SSHLLv2i32_shift V64:$src, 0))>; 330fe6060f1SDimitry Andric def : Pat<(v2f64 (uint_to_fp v2i32:$src)), 331fe6060f1SDimitry Andric (UCVTFv2f64 (USHLLv2i32_shift V64:$src, 0))>; 332fe6060f1SDimitry Andric def : Pat<(v2f32 (sint_to_fp v2i64:$src)), 333fe6060f1SDimitry Andric (FCVTNv2i32 (SCVTFv2f64 V128:$src))>; 334fe6060f1SDimitry Andric def : Pat<(v2f32 (uint_to_fp v2i64:$src)), 335fe6060f1SDimitry Andric (FCVTNv2i32 (UCVTFv2f64 V128:$src))>; 336fe6060f1SDimitry Andric 337fe6060f1SDimitry Andric def : Pat<(v2i64 (fp_to_sint v2f32:$src)), 338fe6060f1SDimitry Andric (FCVTZSv2f64 (FCVTLv2i32 V64:$src))>; 339fe6060f1SDimitry Andric def : Pat<(v2i64 (fp_to_uint v2f32:$src)), 340fe6060f1SDimitry Andric (FCVTZUv2f64 (FCVTLv2i32 V64:$src))>; 341fe6060f1SDimitry Andric def : Pat<(v2i32 (fp_to_sint v2f64:$src)), 342fe6060f1SDimitry Andric (XTNv2i32 (FCVTZSv2f64 V128:$src))>; 343fe6060f1SDimitry Andric def : Pat<(v2i32 (fp_to_uint v2f64:$src)), 344fe6060f1SDimitry Andric (XTNv2i32 (FCVTZUv2f64 V128:$src))>; 345fe6060f1SDimitry Andric 346fe6060f1SDimitry Andric} 347fe6060f1SDimitry Andric 348fe6060f1SDimitry Andriclet Predicates = [HasNoLSE] in { 349*0fca6ea1SDimitry Andricdef : Pat<(atomic_cmp_swap_i8 GPR64:$addr, GPR32:$desired, GPR32:$new), 350fe6060f1SDimitry Andric (CMP_SWAP_8 GPR64:$addr, GPR32:$desired, GPR32:$new)>; 351fe6060f1SDimitry Andric 352*0fca6ea1SDimitry Andricdef : Pat<(atomic_cmp_swap_i16 GPR64:$addr, GPR32:$desired, GPR32:$new), 353fe6060f1SDimitry Andric (CMP_SWAP_16 GPR64:$addr, GPR32:$desired, GPR32:$new)>; 354fe6060f1SDimitry Andric 355*0fca6ea1SDimitry Andricdef : Pat<(atomic_cmp_swap_i32 GPR64:$addr, GPR32:$desired, GPR32:$new), 356fe6060f1SDimitry Andric (CMP_SWAP_32 GPR64:$addr, GPR32:$desired, GPR32:$new)>; 357fe6060f1SDimitry Andric 358*0fca6ea1SDimitry Andricdef : Pat<(atomic_cmp_swap_i64 GPR64:$addr, GPR64:$desired, GPR64:$new), 359fe6060f1SDimitry Andric (CMP_SWAP_64 GPR64:$addr, GPR64:$desired, GPR64:$new)>; 360fe6060f1SDimitry Andric} 361fe6060f1SDimitry Andric 362fe6060f1SDimitry Andricdef : Pat<(int_aarch64_stlxp GPR64:$lo, GPR64:$hi, GPR64:$addr), 363fe6060f1SDimitry Andric (STLXPX GPR64:$lo, GPR64:$hi, GPR64:$addr)>; 364fe6060f1SDimitry Andricdef : Pat<(int_aarch64_stxp GPR64:$lo, GPR64:$hi, GPR64:$addr), 365fe6060f1SDimitry Andric (STXPX GPR64:$lo, GPR64:$hi, GPR64:$addr)>; 36606c3fb27SDimitry Andric 3675f757f3fSDimitry Andriclet GIIgnoreCopies = 1 in 3685f757f3fSDimitry Andricclass PatIgnoreCopies<dag pattern, dag result> : Pat<pattern, result>, GISelFlags; 3695f757f3fSDimitry Andric 37006c3fb27SDimitry Andricmulticlass SIMDAcrossLanesSignedIntrinsicBHS<string baseOpc, Intrinsic intOp> { 3715f757f3fSDimitry Andric def : PatIgnoreCopies<(i32 (sext (i8 (intOp (v8i8 V64:$Rn))))), 37206c3fb27SDimitry Andric (i32 (SMOVvi8to32 37306c3fb27SDimitry Andric (INSERT_SUBREG (v16i8 (IMPLICIT_DEF)), 37406c3fb27SDimitry Andric (!cast<Instruction>(!strconcat(baseOpc, "v8i8v")) V64:$Rn), bsub), 37506c3fb27SDimitry Andric (i64 0)))>; 3765f757f3fSDimitry Andric def : Pat<(i8 (intOp (v8i8 V64:$Rn))), 3775f757f3fSDimitry Andric (!cast<Instruction>(!strconcat(baseOpc, "v8i8v")) V64:$Rn)>; 3785f757f3fSDimitry Andric 3795f757f3fSDimitry Andric def : PatIgnoreCopies<(i32 (sext (i8 (intOp (v16i8 V128:$Rn))))), 38006c3fb27SDimitry Andric (i32 (SMOVvi8to32 38106c3fb27SDimitry Andric (INSERT_SUBREG (v16i8 (IMPLICIT_DEF)), 38206c3fb27SDimitry Andric (!cast<Instruction>(!strconcat(baseOpc, "v16i8v")) V128:$Rn), bsub), 38306c3fb27SDimitry Andric (i64 0)))>; 3845f757f3fSDimitry Andric def : Pat<(i8 (intOp (v16i8 V128:$Rn))), 3855f757f3fSDimitry Andric (!cast<Instruction>(!strconcat(baseOpc, "v16i8v")) V128:$Rn)>; 38606c3fb27SDimitry Andric 3875f757f3fSDimitry Andric def : PatIgnoreCopies<(i32 (sext (i16 (intOp (v4i16 V64:$Rn))))), 38806c3fb27SDimitry Andric (i32 (SMOVvi16to32 38906c3fb27SDimitry Andric (INSERT_SUBREG (v16i8 (IMPLICIT_DEF)), 39006c3fb27SDimitry Andric (!cast<Instruction>(!strconcat(baseOpc, "v4i16v")) V64:$Rn), hsub), 39106c3fb27SDimitry Andric (i64 0)))>; 3925f757f3fSDimitry Andric def : Pat<(i16 (intOp (v4i16 V64:$Rn))), 3935f757f3fSDimitry Andric (!cast<Instruction>(!strconcat(baseOpc, "v4i16v")) V64:$Rn)>; 3945f757f3fSDimitry Andric 3955f757f3fSDimitry Andric def : PatIgnoreCopies<(i32 (sext (i16 (intOp (v8i16 V128:$Rn))))), 39606c3fb27SDimitry Andric (i32 (SMOVvi16to32 39706c3fb27SDimitry Andric (INSERT_SUBREG (v16i8 (IMPLICIT_DEF)), 39806c3fb27SDimitry Andric (!cast<Instruction>(!strconcat(baseOpc, "v8i16v")) V128:$Rn), hsub), 39906c3fb27SDimitry Andric (i64 0)))>; 4005f757f3fSDimitry Andric def : Pat<(i16 (intOp (v8i16 V128:$Rn))), 4015f757f3fSDimitry Andric (!cast<Instruction>(!strconcat(baseOpc, "v8i16v")) V128:$Rn)>; 40206c3fb27SDimitry Andric 4035f757f3fSDimitry Andric def : PatIgnoreCopies<(i32 (intOp (v4i32 V128:$Rn))), 40406c3fb27SDimitry Andric (i32 (EXTRACT_SUBREG 40506c3fb27SDimitry Andric (INSERT_SUBREG (v16i8 (IMPLICIT_DEF)), 40606c3fb27SDimitry Andric (!cast<Instruction>(!strconcat(baseOpc, "v4i32v")) V128:$Rn), ssub), 40706c3fb27SDimitry Andric ssub))>; 40806c3fb27SDimitry Andric} 40906c3fb27SDimitry Andric 41006c3fb27SDimitry Andricmulticlass SIMDAcrossLanesUnsignedIntrinsicBHS<string baseOpc, 41106c3fb27SDimitry Andric Intrinsic intOp> { 4125f757f3fSDimitry Andric def : PatIgnoreCopies<(i32 (zext (i8 (intOp (v8i8 V64:$Rn))))), 4135f757f3fSDimitry Andric (COPY_TO_REGCLASS 41406c3fb27SDimitry Andric (i32 (EXTRACT_SUBREG 41506c3fb27SDimitry Andric (INSERT_SUBREG (v16i8 (IMPLICIT_DEF)), 41606c3fb27SDimitry Andric (!cast<Instruction>(!strconcat(baseOpc, "v8i8v")) V64:$Rn), bsub), 4175f757f3fSDimitry Andric ssub)), 4185f757f3fSDimitry Andric GPR32)>; 4195f757f3fSDimitry Andric def : Pat<(i8 (intOp (v8i8 V64:$Rn))), 4205f757f3fSDimitry Andric (!cast<Instruction>(!strconcat(baseOpc, "v8i8v")) V64:$Rn)>; 4215f757f3fSDimitry Andric 4225f757f3fSDimitry Andric def : PatIgnoreCopies<(i32 (zext (i8 (intOp (v16i8 V128:$Rn))))), 4235f757f3fSDimitry Andric (COPY_TO_REGCLASS 42406c3fb27SDimitry Andric (i32 (EXTRACT_SUBREG 42506c3fb27SDimitry Andric (INSERT_SUBREG (v16i8 (IMPLICIT_DEF)), 42606c3fb27SDimitry Andric (!cast<Instruction>(!strconcat(baseOpc, "v16i8v")) V128:$Rn), bsub), 4275f757f3fSDimitry Andric ssub)), 4285f757f3fSDimitry Andric GPR32)>; 4295f757f3fSDimitry Andric def : Pat<(i8 (intOp (v16i8 V128:$Rn))), 4305f757f3fSDimitry Andric (!cast<Instruction>(!strconcat(baseOpc, "v16i8v")) V128:$Rn)>; 43106c3fb27SDimitry Andric 4325f757f3fSDimitry Andric 4335f757f3fSDimitry Andric def : PatIgnoreCopies<(i32 (zext (i16 (intOp (v4i16 V64:$Rn))))), 4345f757f3fSDimitry Andric (COPY_TO_REGCLASS 43506c3fb27SDimitry Andric (i32 (EXTRACT_SUBREG 43606c3fb27SDimitry Andric (INSERT_SUBREG (v16i8 (IMPLICIT_DEF)), 43706c3fb27SDimitry Andric (!cast<Instruction>(!strconcat(baseOpc, "v4i16v")) V64:$Rn), hsub), 4385f757f3fSDimitry Andric ssub)), 4395f757f3fSDimitry Andric GPR32)>; 4405f757f3fSDimitry Andric def : Pat<(i16 (intOp (v4i16 V64:$Rn))), 4415f757f3fSDimitry Andric (!cast<Instruction>(!strconcat(baseOpc, "v4i16v")) V64:$Rn)>; 4425f757f3fSDimitry Andric 4435f757f3fSDimitry Andric def : PatIgnoreCopies<(i32 (zext (i16 (intOp (v8i16 V128:$Rn))))), 4445f757f3fSDimitry Andric (COPY_TO_REGCLASS 44506c3fb27SDimitry Andric (i32 (EXTRACT_SUBREG 44606c3fb27SDimitry Andric (INSERT_SUBREG (v16i8 (IMPLICIT_DEF)), 44706c3fb27SDimitry Andric (!cast<Instruction>(!strconcat(baseOpc, "v8i16v")) V128:$Rn), hsub), 4485f757f3fSDimitry Andric ssub)), 4495f757f3fSDimitry Andric GPR32)>; 4505f757f3fSDimitry Andric def : Pat<(i16 (intOp (v8i16 V128:$Rn))), 4515f757f3fSDimitry Andric (!cast<Instruction>(!strconcat(baseOpc, "v8i16v")) V128:$Rn)>; 45206c3fb27SDimitry Andric 4535f757f3fSDimitry Andric def : PatIgnoreCopies<(i32 (intOp (v4i32 V128:$Rn))), 45406c3fb27SDimitry Andric (i32 (EXTRACT_SUBREG 45506c3fb27SDimitry Andric (INSERT_SUBREG (v16i8 (IMPLICIT_DEF)), 45606c3fb27SDimitry Andric (!cast<Instruction>(!strconcat(baseOpc, "v4i32v")) V128:$Rn), ssub), 45706c3fb27SDimitry Andric ssub))>; 45806c3fb27SDimitry Andric} 45906c3fb27SDimitry Andric 46006c3fb27SDimitry Andric 46106c3fb27SDimitry Andricdefm : SIMDAcrossLanesSignedIntrinsicBHS<"ADDV", int_aarch64_neon_saddv>; 46206c3fb27SDimitry Andric// vaddv_[su]32 is special; -> ADDP Vd.2S,Vn.2S,Vm.2S; return Vd.s[0];Vn==Vm 46306c3fb27SDimitry Andricdef : Pat<(i32 (int_aarch64_neon_saddv (v2i32 V64:$Rn))), 46406c3fb27SDimitry Andric (i32 (EXTRACT_SUBREG 46506c3fb27SDimitry Andric (INSERT_SUBREG (v16i8 (IMPLICIT_DEF)), 46606c3fb27SDimitry Andric (ADDPv2i32 V64:$Rn, V64:$Rn), dsub), 46706c3fb27SDimitry Andric ssub))>; 46806c3fb27SDimitry Andric 4695f757f3fSDimitry Andricdef : Pat<(i64 (int_aarch64_neon_saddv (v2i64 V128:$Rn))), 4705f757f3fSDimitry Andric (i64 (EXTRACT_SUBREG 4715f757f3fSDimitry Andric (INSERT_SUBREG (v2i64 (IMPLICIT_DEF)), 4725f757f3fSDimitry Andric (ADDPv2i64p V128:$Rn), dsub), 4735f757f3fSDimitry Andric dsub))>; 4745f757f3fSDimitry Andric 47506c3fb27SDimitry Andricdefm : SIMDAcrossLanesUnsignedIntrinsicBHS<"ADDV", int_aarch64_neon_uaddv>; 47606c3fb27SDimitry Andricdef : Pat<(i32 (int_aarch64_neon_uaddv (v2i32 V64:$Rn))), 47706c3fb27SDimitry Andric (i32 (EXTRACT_SUBREG 47806c3fb27SDimitry Andric (INSERT_SUBREG (v16i8 (IMPLICIT_DEF)), 47906c3fb27SDimitry Andric (ADDPv2i32 V64:$Rn, V64:$Rn), dsub), 48006c3fb27SDimitry Andric ssub))>; 4815f757f3fSDimitry Andricdef : Pat<(i64 (int_aarch64_neon_uaddv (v2i64 V128:$Rn))), 4825f757f3fSDimitry Andric (i64 (EXTRACT_SUBREG 4835f757f3fSDimitry Andric (INSERT_SUBREG (v2i64 (IMPLICIT_DEF)), 4845f757f3fSDimitry Andric (ADDPv2i64p V128:$Rn), dsub), 4855f757f3fSDimitry Andric dsub))>; 48606c3fb27SDimitry Andric 48706c3fb27SDimitry Andricdefm : SIMDAcrossLanesSignedIntrinsicBHS<"SMAXV", int_aarch64_neon_smaxv>; 48806c3fb27SDimitry Andricdef : Pat<(i32 (int_aarch64_neon_smaxv (v2i32 V64:$Rn))), 48906c3fb27SDimitry Andric (i32 (EXTRACT_SUBREG 49006c3fb27SDimitry Andric (INSERT_SUBREG (v16i8 (IMPLICIT_DEF)), 49106c3fb27SDimitry Andric (SMAXPv2i32 V64:$Rn, V64:$Rn), dsub), 49206c3fb27SDimitry Andric ssub))>; 49306c3fb27SDimitry Andric 49406c3fb27SDimitry Andricdefm : SIMDAcrossLanesSignedIntrinsicBHS<"SMINV", int_aarch64_neon_sminv>; 49506c3fb27SDimitry Andricdef : Pat<(i32 (int_aarch64_neon_sminv (v2i32 V64:$Rn))), 49606c3fb27SDimitry Andric (i32 (EXTRACT_SUBREG 49706c3fb27SDimitry Andric (INSERT_SUBREG (v16i8 (IMPLICIT_DEF)), 49806c3fb27SDimitry Andric (SMINPv2i32 V64:$Rn, V64:$Rn), dsub), 49906c3fb27SDimitry Andric ssub))>; 50006c3fb27SDimitry Andric 50106c3fb27SDimitry Andricdefm : SIMDAcrossLanesUnsignedIntrinsicBHS<"UMAXV", int_aarch64_neon_umaxv>; 50206c3fb27SDimitry Andricdef : Pat<(i32 (int_aarch64_neon_umaxv (v2i32 V64:$Rn))), 50306c3fb27SDimitry Andric (i32 (EXTRACT_SUBREG 50406c3fb27SDimitry Andric (INSERT_SUBREG (v16i8 (IMPLICIT_DEF)), 50506c3fb27SDimitry Andric (UMAXPv2i32 V64:$Rn, V64:$Rn), dsub), 50606c3fb27SDimitry Andric ssub))>; 50706c3fb27SDimitry Andric 50806c3fb27SDimitry Andricdefm : SIMDAcrossLanesUnsignedIntrinsicBHS<"UMINV", int_aarch64_neon_uminv>; 50906c3fb27SDimitry Andricdef : Pat<(i32 (int_aarch64_neon_uminv (v2i32 V64:$Rn))), 51006c3fb27SDimitry Andric (i32 (EXTRACT_SUBREG 51106c3fb27SDimitry Andric (INSERT_SUBREG (v16i8 (IMPLICIT_DEF)), 51206c3fb27SDimitry Andric (UMINPv2i32 V64:$Rn, V64:$Rn), dsub), 51306c3fb27SDimitry Andric ssub))>; 5145f757f3fSDimitry Andric 5155f757f3fSDimitry Andric// Match stores from lane 0 to the appropriate subreg's store. 5165f757f3fSDimitry Andricmulticlass VecStoreLane64_0Pat<ComplexPattern UIAddrMode, SDPatternOperator storeop, 5175f757f3fSDimitry Andric ValueType VTy, ValueType STy, 5185f757f3fSDimitry Andric SubRegIndex SubRegIdx, Operand IndexType, 5195f757f3fSDimitry Andric Instruction STR> { 5205f757f3fSDimitry Andric def : Pat<(storeop (STy (vector_extract (VTy VecListOne64:$Vt), (i64 0))), 5215f757f3fSDimitry Andric (UIAddrMode GPR64sp:$Rn, IndexType:$offset)), 5225f757f3fSDimitry Andric (STR (EXTRACT_SUBREG VecListOne64:$Vt, SubRegIdx), 5235f757f3fSDimitry Andric GPR64sp:$Rn, IndexType:$offset)>; 5245f757f3fSDimitry Andric} 5255f757f3fSDimitry Andricmulticlass VecStoreULane64_0Pat<SDPatternOperator StoreOp, 5265f757f3fSDimitry Andric ValueType VTy, ValueType STy, 5275f757f3fSDimitry Andric SubRegIndex SubRegIdx, Instruction STR> { 5285f757f3fSDimitry Andric defm : VecStoreLane64_0Pat<am_unscaled64, StoreOp, VTy, STy, SubRegIdx, simm9, STR>; 5295f757f3fSDimitry Andric} 5305f757f3fSDimitry Andric 5315f757f3fSDimitry Andricmulticlass VecROStoreLane64_0Pat<ROAddrMode ro, SDPatternOperator storeop, 5325f757f3fSDimitry Andric ValueType VecTy, ValueType STy, 5335f757f3fSDimitry Andric SubRegIndex SubRegIdx, 5345f757f3fSDimitry Andric Instruction STRW, Instruction STRX> { 5355f757f3fSDimitry Andric 5365f757f3fSDimitry Andric def : Pat<(storeop (STy (vector_extract (VecTy VecListOne64:$Vt), (i64 0))), 5375f757f3fSDimitry Andric (ro.Wpat GPR64sp:$Rn, GPR32:$Rm, ro.Wext:$extend)), 5385f757f3fSDimitry Andric (STRW (EXTRACT_SUBREG VecListOne64:$Vt, SubRegIdx), 5395f757f3fSDimitry Andric GPR64sp:$Rn, GPR32:$Rm, ro.Wext:$extend)>; 5405f757f3fSDimitry Andric 5415f757f3fSDimitry Andric def : Pat<(storeop (STy (vector_extract (VecTy VecListOne64:$Vt), (i64 0))), 5425f757f3fSDimitry Andric (ro.Xpat GPR64sp:$Rn, GPR64:$Rm, ro.Xext:$extend)), 5435f757f3fSDimitry Andric (STRX (EXTRACT_SUBREG VecListOne64:$Vt, SubRegIdx), 5445f757f3fSDimitry Andric GPR64sp:$Rn, GPR64:$Rm, ro.Xext:$extend)>; 5455f757f3fSDimitry Andric} 5465f757f3fSDimitry Andric 5475f757f3fSDimitry Andriclet AddedComplexity = 19 in { 5485f757f3fSDimitry Andric def : St1Lane128Pat<store, VectorIndexB, v16i8, i8, ST1i8>; 5495f757f3fSDimitry Andric def : St1Lane64Pat<store, VectorIndexB, v8i8, i8, ST1i8>; 5505f757f3fSDimitry Andric 5515f757f3fSDimitry Andric defm : VecStoreLane64_0Pat<am_indexed16, store, v4i16, i16, hsub, uimm12s2, STRHui>; 5525f757f3fSDimitry Andric defm : VecStoreLane64_0Pat<am_indexed32, store, v2i32, i32, ssub, uimm12s4, STRSui>; 5535f757f3fSDimitry Andric 5545f757f3fSDimitry Andric defm : VecStoreULane64_0Pat<store, v4i16, i16, hsub, STURHi>; 5555f757f3fSDimitry Andric defm : VecStoreULane64_0Pat<store, v2i32, i32, ssub, STURSi>; 5565f757f3fSDimitry Andric defm : VecROStoreLane64_0Pat<ro16, store, v4i16, i16, hsub, STRHroW, STRHroX>; 5575f757f3fSDimitry Andric defm : VecROStoreLane64_0Pat<ro32, store, v2i32, i32, ssub, STRSroW, STRSroX>; 5585f757f3fSDimitry Andric} 5595f757f3fSDimitry Andric 5605f757f3fSDimitry Andricdef : Pat<(v8i8 (AArch64dup (i8 (load (am_indexed8 GPR64sp:$Rn))))), 5615f757f3fSDimitry Andric (LD1Rv8b GPR64sp:$Rn)>; 5625f757f3fSDimitry Andricdef : Pat<(v16i8 (AArch64dup (i8 (load GPR64sp:$Rn)))), 5635f757f3fSDimitry Andric (LD1Rv16b GPR64sp:$Rn)>; 5645f757f3fSDimitry Andricdef : Pat<(v4i16 (AArch64dup (i16 (load GPR64sp:$Rn)))), 5655f757f3fSDimitry Andric (LD1Rv4h GPR64sp:$Rn)>; 5665f757f3fSDimitry Andricdef : Pat<(v8i16 (AArch64dup (i16 (load GPR64sp:$Rn)))), 5675f757f3fSDimitry Andric (LD1Rv8h GPR64sp:$Rn)>; 5685f757f3fSDimitry Andricdef : Pat<(v2i32 (AArch64dup (i32 (load GPR64sp:$Rn)))), 5695f757f3fSDimitry Andric (LD1Rv2s GPR64sp:$Rn)>; 5705f757f3fSDimitry Andricdef : Pat<(v4i32 (AArch64dup (i32 (load GPR64sp:$Rn)))), 5715f757f3fSDimitry Andric (LD1Rv4s GPR64sp:$Rn)>; 5725f757f3fSDimitry Andricdef : Pat<(v2i64 (AArch64dup (i64 (load GPR64sp:$Rn)))), 5735f757f3fSDimitry Andric (LD1Rv2d GPR64sp:$Rn)>; 5745f757f3fSDimitry Andricdef : Pat<(v1i64 (AArch64dup (i64 (load GPR64sp:$Rn)))), 5755f757f3fSDimitry Andric (LD1Rv1d GPR64sp:$Rn)>; 576