1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 2 2; RUN: llc -mtriple=aarch64 -verify-machineinstrs %s -o - 2>&1 | FileCheck %s --check-prefixes=CHECK,CHECK-SD 3; RUN: llc -mtriple=aarch64 -global-isel -verify-machineinstrs %s -o - | FileCheck %s --check-prefixes=CHECK,CHECK-GI 4 5define i16 @sext_i8_to_i16(i8 %a) { 6; CHECK-LABEL: sext_i8_to_i16: 7; CHECK: // %bb.0: // %entry 8; CHECK-NEXT: sxtb w0, w0 9; CHECK-NEXT: ret 10entry: 11 %c = sext i8 %a to i16 12 ret i16 %c 13} 14 15define i32 @sext_i8_to_i32(i8 %a) { 16; CHECK-LABEL: sext_i8_to_i32: 17; CHECK: // %bb.0: // %entry 18; CHECK-NEXT: sxtb w0, w0 19; CHECK-NEXT: ret 20entry: 21 %c = sext i8 %a to i32 22 ret i32 %c 23} 24 25define i64 @sext_i8_to_i64(i8 %a) { 26; CHECK-LABEL: sext_i8_to_i64: 27; CHECK: // %bb.0: // %entry 28; CHECK-NEXT: // kill: def $w0 killed $w0 def $x0 29; CHECK-NEXT: sxtb x0, w0 30; CHECK-NEXT: ret 31entry: 32 %c = sext i8 %a to i64 33 ret i64 %c 34} 35 36define i10 @sext_i8_to_i10(i8 %a) { 37; CHECK-LABEL: sext_i8_to_i10: 38; CHECK: // %bb.0: // %entry 39; CHECK-NEXT: sxtb w0, w0 40; CHECK-NEXT: ret 41entry: 42 %c = sext i8 %a to i10 43 ret i10 %c 44} 45 46define i32 @sext_i16_to_i32(i16 %a) { 47; CHECK-LABEL: sext_i16_to_i32: 48; CHECK: // %bb.0: // %entry 49; CHECK-NEXT: sxth w0, w0 50; CHECK-NEXT: ret 51entry: 52 %c = sext i16 %a to i32 53 ret i32 %c 54} 55 56define i64 @sext_i16_to_i64(i16 %a) { 57; CHECK-LABEL: sext_i16_to_i64: 58; CHECK: // %bb.0: // %entry 59; CHECK-NEXT: // kill: def $w0 killed $w0 def $x0 60; CHECK-NEXT: sxth x0, w0 61; CHECK-NEXT: ret 62entry: 63 %c = sext i16 %a to i64 64 ret i64 %c 65} 66 67define i64 @sext_i32_to_i64(i32 %a) { 68; CHECK-LABEL: sext_i32_to_i64: 69; CHECK: // %bb.0: // %entry 70; CHECK-NEXT: // kill: def $w0 killed $w0 def $x0 71; CHECK-NEXT: sxtw x0, w0 72; CHECK-NEXT: ret 73entry: 74 %c = sext i32 %a to i64 75 ret i64 %c 76} 77 78define i16 @sext_i10_to_i16(i10 %a) { 79; CHECK-LABEL: sext_i10_to_i16: 80; CHECK: // %bb.0: // %entry 81; CHECK-NEXT: sbfx w0, w0, #0, #10 82; CHECK-NEXT: ret 83entry: 84 %c = sext i10 %a to i16 85 ret i16 %c 86} 87 88define i32 @sext_i10_to_i32(i10 %a) { 89; CHECK-LABEL: sext_i10_to_i32: 90; CHECK: // %bb.0: // %entry 91; CHECK-NEXT: sbfx w0, w0, #0, #10 92; CHECK-NEXT: ret 93entry: 94 %c = sext i10 %a to i32 95 ret i32 %c 96} 97 98define i64 @sext_i10_to_i64(i10 %a) { 99; CHECK-LABEL: sext_i10_to_i64: 100; CHECK: // %bb.0: // %entry 101; CHECK-NEXT: // kill: def $w0 killed $w0 def $x0 102; CHECK-NEXT: sbfx x0, x0, #0, #10 103; CHECK-NEXT: ret 104entry: 105 %c = sext i10 %a to i64 106 ret i64 %c 107} 108 109define <2 x i16> @sext_v2i8_v2i16(<2 x i8> %a) { 110; CHECK-LABEL: sext_v2i8_v2i16: 111; CHECK: // %bb.0: // %entry 112; CHECK-NEXT: shl v0.2s, v0.2s, #24 113; CHECK-NEXT: sshr v0.2s, v0.2s, #24 114; CHECK-NEXT: ret 115entry: 116 %c = sext <2 x i8> %a to <2 x i16> 117 ret <2 x i16> %c 118} 119 120define <2 x i32> @sext_v2i8_v2i32(<2 x i8> %a) { 121; CHECK-LABEL: sext_v2i8_v2i32: 122; CHECK: // %bb.0: // %entry 123; CHECK-NEXT: shl v0.2s, v0.2s, #24 124; CHECK-NEXT: sshr v0.2s, v0.2s, #24 125; CHECK-NEXT: ret 126entry: 127 %c = sext <2 x i8> %a to <2 x i32> 128 ret <2 x i32> %c 129} 130 131define <2 x i64> @sext_v2i8_v2i64(<2 x i8> %a) { 132; CHECK-LABEL: sext_v2i8_v2i64: 133; CHECK: // %bb.0: // %entry 134; CHECK-NEXT: ushll v0.2d, v0.2s, #0 135; CHECK-NEXT: shl v0.2d, v0.2d, #56 136; CHECK-NEXT: sshr v0.2d, v0.2d, #56 137; CHECK-NEXT: ret 138entry: 139 %c = sext <2 x i8> %a to <2 x i64> 140 ret <2 x i64> %c 141} 142 143define <2 x i32> @sext_v2i16_v2i32(<2 x i16> %a) { 144; CHECK-LABEL: sext_v2i16_v2i32: 145; CHECK: // %bb.0: // %entry 146; CHECK-NEXT: shl v0.2s, v0.2s, #16 147; CHECK-NEXT: sshr v0.2s, v0.2s, #16 148; CHECK-NEXT: ret 149entry: 150 %c = sext <2 x i16> %a to <2 x i32> 151 ret <2 x i32> %c 152} 153 154define <2 x i64> @sext_v2i16_v2i64(<2 x i16> %a) { 155; CHECK-LABEL: sext_v2i16_v2i64: 156; CHECK: // %bb.0: // %entry 157; CHECK-NEXT: ushll v0.2d, v0.2s, #0 158; CHECK-NEXT: shl v0.2d, v0.2d, #48 159; CHECK-NEXT: sshr v0.2d, v0.2d, #48 160; CHECK-NEXT: ret 161entry: 162 %c = sext <2 x i16> %a to <2 x i64> 163 ret <2 x i64> %c 164} 165 166define <2 x i64> @sext_v2i32_v2i64(<2 x i32> %a) { 167; CHECK-LABEL: sext_v2i32_v2i64: 168; CHECK: // %bb.0: // %entry 169; CHECK-NEXT: sshll v0.2d, v0.2s, #0 170; CHECK-NEXT: ret 171entry: 172 %c = sext <2 x i32> %a to <2 x i64> 173 ret <2 x i64> %c 174} 175 176define <2 x i16> @sext_v2i10_v2i16(<2 x i10> %a) { 177; CHECK-LABEL: sext_v2i10_v2i16: 178; CHECK: // %bb.0: // %entry 179; CHECK-NEXT: shl v0.2s, v0.2s, #22 180; CHECK-NEXT: sshr v0.2s, v0.2s, #22 181; CHECK-NEXT: ret 182entry: 183 %c = sext <2 x i10> %a to <2 x i16> 184 ret <2 x i16> %c 185} 186 187define <2 x i32> @sext_v2i10_v2i32(<2 x i10> %a) { 188; CHECK-LABEL: sext_v2i10_v2i32: 189; CHECK: // %bb.0: // %entry 190; CHECK-NEXT: shl v0.2s, v0.2s, #22 191; CHECK-NEXT: sshr v0.2s, v0.2s, #22 192; CHECK-NEXT: ret 193entry: 194 %c = sext <2 x i10> %a to <2 x i32> 195 ret <2 x i32> %c 196} 197 198define <2 x i64> @sext_v2i10_v2i64(<2 x i10> %a) { 199; CHECK-LABEL: sext_v2i10_v2i64: 200; CHECK: // %bb.0: // %entry 201; CHECK-NEXT: ushll v0.2d, v0.2s, #0 202; CHECK-NEXT: shl v0.2d, v0.2d, #54 203; CHECK-NEXT: sshr v0.2d, v0.2d, #54 204; CHECK-NEXT: ret 205entry: 206 %c = sext <2 x i10> %a to <2 x i64> 207 ret <2 x i64> %c 208} 209 210define <3 x i16> @sext_v3i8_v3i16(<3 x i8> %a) { 211; CHECK-SD-LABEL: sext_v3i8_v3i16: 212; CHECK-SD: // %bb.0: // %entry 213; CHECK-SD-NEXT: fmov s0, w0 214; CHECK-SD-NEXT: mov v0.h[1], w1 215; CHECK-SD-NEXT: mov v0.h[2], w2 216; CHECK-SD-NEXT: shl v0.4h, v0.4h, #8 217; CHECK-SD-NEXT: sshr v0.4h, v0.4h, #8 218; CHECK-SD-NEXT: ret 219; 220; CHECK-GI-LABEL: sext_v3i8_v3i16: 221; CHECK-GI: // %bb.0: // %entry 222; CHECK-GI-NEXT: lsl w8, w0, #8 223; CHECK-GI-NEXT: lsl w9, w1, #8 224; CHECK-GI-NEXT: sbfx w8, w8, #8, #8 225; CHECK-GI-NEXT: sbfx w9, w9, #8, #8 226; CHECK-GI-NEXT: fmov s0, w8 227; CHECK-GI-NEXT: lsl w8, w2, #8 228; CHECK-GI-NEXT: sbfx w8, w8, #8, #8 229; CHECK-GI-NEXT: mov v0.h[1], w9 230; CHECK-GI-NEXT: mov v0.h[2], w8 231; CHECK-GI-NEXT: // kill: def $d0 killed $d0 killed $q0 232; CHECK-GI-NEXT: ret 233entry: 234 %c = sext <3 x i8> %a to <3 x i16> 235 ret <3 x i16> %c 236} 237 238define <3 x i32> @sext_v3i8_v3i32(<3 x i8> %a) { 239; CHECK-SD-LABEL: sext_v3i8_v3i32: 240; CHECK-SD: // %bb.0: // %entry 241; CHECK-SD-NEXT: fmov s0, w0 242; CHECK-SD-NEXT: mov v0.h[1], w1 243; CHECK-SD-NEXT: mov v0.h[2], w2 244; CHECK-SD-NEXT: ushll v0.4s, v0.4h, #0 245; CHECK-SD-NEXT: shl v0.4s, v0.4s, #24 246; CHECK-SD-NEXT: sshr v0.4s, v0.4s, #24 247; CHECK-SD-NEXT: ret 248; 249; CHECK-GI-LABEL: sext_v3i8_v3i32: 250; CHECK-GI: // %bb.0: // %entry 251; CHECK-GI-NEXT: sxtb w8, w0 252; CHECK-GI-NEXT: mov v0.s[0], w8 253; CHECK-GI-NEXT: sxtb w8, w1 254; CHECK-GI-NEXT: mov v0.s[1], w8 255; CHECK-GI-NEXT: sxtb w8, w2 256; CHECK-GI-NEXT: mov v0.s[2], w8 257; CHECK-GI-NEXT: ret 258entry: 259 %c = sext <3 x i8> %a to <3 x i32> 260 ret <3 x i32> %c 261} 262 263define <3 x i64> @sext_v3i8_v3i64(<3 x i8> %a) { 264; CHECK-SD-LABEL: sext_v3i8_v3i64: 265; CHECK-SD: // %bb.0: // %entry 266; CHECK-SD-NEXT: fmov s0, w0 267; CHECK-SD-NEXT: fmov s1, w2 268; CHECK-SD-NEXT: mov v0.s[1], w1 269; CHECK-SD-NEXT: ushll v1.2d, v1.2s, #0 270; CHECK-SD-NEXT: shl v2.2d, v1.2d, #56 271; CHECK-SD-NEXT: ushll v0.2d, v0.2s, #0 272; CHECK-SD-NEXT: sshr v2.2d, v2.2d, #56 273; CHECK-SD-NEXT: shl v0.2d, v0.2d, #56 274; CHECK-SD-NEXT: // kill: def $d2 killed $d2 killed $q2 275; CHECK-SD-NEXT: sshr v0.2d, v0.2d, #56 276; CHECK-SD-NEXT: ext v1.16b, v0.16b, v0.16b, #8 277; CHECK-SD-NEXT: // kill: def $d0 killed $d0 killed $q0 278; CHECK-SD-NEXT: // kill: def $d1 killed $d1 killed $q1 279; CHECK-SD-NEXT: ret 280; 281; CHECK-GI-LABEL: sext_v3i8_v3i64: 282; CHECK-GI: // %bb.0: // %entry 283; CHECK-GI-NEXT: // kill: def $w0 killed $w0 def $x0 284; CHECK-GI-NEXT: // kill: def $w1 killed $w1 def $x1 285; CHECK-GI-NEXT: // kill: def $w2 killed $w2 def $x2 286; CHECK-GI-NEXT: sxtb x8, w0 287; CHECK-GI-NEXT: sxtb x9, w1 288; CHECK-GI-NEXT: sxtb x10, w2 289; CHECK-GI-NEXT: fmov d0, x8 290; CHECK-GI-NEXT: fmov d1, x9 291; CHECK-GI-NEXT: fmov d2, x10 292; CHECK-GI-NEXT: ret 293entry: 294 %c = sext <3 x i8> %a to <3 x i64> 295 ret <3 x i64> %c 296} 297 298define <3 x i32> @sext_v3i16_v3i32(<3 x i16> %a) { 299; CHECK-SD-LABEL: sext_v3i16_v3i32: 300; CHECK-SD: // %bb.0: // %entry 301; CHECK-SD-NEXT: sshll v0.4s, v0.4h, #0 302; CHECK-SD-NEXT: ret 303; 304; CHECK-GI-LABEL: sext_v3i16_v3i32: 305; CHECK-GI: // %bb.0: // %entry 306; CHECK-GI-NEXT: // kill: def $d0 killed $d0 def $q0 307; CHECK-GI-NEXT: smov w8, v0.h[0] 308; CHECK-GI-NEXT: smov w9, v0.h[1] 309; CHECK-GI-NEXT: mov v1.s[0], w8 310; CHECK-GI-NEXT: smov w8, v0.h[2] 311; CHECK-GI-NEXT: mov v1.s[1], w9 312; CHECK-GI-NEXT: mov v1.s[2], w8 313; CHECK-GI-NEXT: mov v0.16b, v1.16b 314; CHECK-GI-NEXT: ret 315entry: 316 %c = sext <3 x i16> %a to <3 x i32> 317 ret <3 x i32> %c 318} 319 320define <3 x i64> @sext_v3i16_v3i64(<3 x i16> %a) { 321; CHECK-SD-LABEL: sext_v3i16_v3i64: 322; CHECK-SD: // %bb.0: // %entry 323; CHECK-SD-NEXT: sshll v2.4s, v0.4h, #0 324; CHECK-SD-NEXT: sshll v0.2d, v2.2s, #0 325; CHECK-SD-NEXT: sshll2 v2.2d, v2.4s, #0 326; CHECK-SD-NEXT: // kill: def $d2 killed $d2 killed $q2 327; CHECK-SD-NEXT: ext v1.16b, v0.16b, v0.16b, #8 328; CHECK-SD-NEXT: // kill: def $d0 killed $d0 killed $q0 329; CHECK-SD-NEXT: // kill: def $d1 killed $d1 killed $q1 330; CHECK-SD-NEXT: ret 331; 332; CHECK-GI-LABEL: sext_v3i16_v3i64: 333; CHECK-GI: // %bb.0: // %entry 334; CHECK-GI-NEXT: // kill: def $d0 killed $d0 def $q0 335; CHECK-GI-NEXT: smov x8, v0.h[0] 336; CHECK-GI-NEXT: smov x9, v0.h[1] 337; CHECK-GI-NEXT: smov x10, v0.h[2] 338; CHECK-GI-NEXT: fmov d0, x8 339; CHECK-GI-NEXT: fmov d1, x9 340; CHECK-GI-NEXT: fmov d2, x10 341; CHECK-GI-NEXT: ret 342entry: 343 %c = sext <3 x i16> %a to <3 x i64> 344 ret <3 x i64> %c 345} 346 347define <3 x i64> @sext_v3i32_v3i64(<3 x i32> %a) { 348; CHECK-SD-LABEL: sext_v3i32_v3i64: 349; CHECK-SD: // %bb.0: // %entry 350; CHECK-SD-NEXT: sshll v3.2d, v0.2s, #0 351; CHECK-SD-NEXT: sshll2 v2.2d, v0.4s, #0 352; CHECK-SD-NEXT: // kill: def $d2 killed $d2 killed $q2 353; CHECK-SD-NEXT: fmov d0, d3 354; CHECK-SD-NEXT: ext v1.16b, v3.16b, v3.16b, #8 355; CHECK-SD-NEXT: // kill: def $d1 killed $d1 killed $q1 356; CHECK-SD-NEXT: ret 357; 358; CHECK-GI-LABEL: sext_v3i32_v3i64: 359; CHECK-GI: // %bb.0: // %entry 360; CHECK-GI-NEXT: smov x8, v0.s[0] 361; CHECK-GI-NEXT: smov x9, v0.s[1] 362; CHECK-GI-NEXT: smov x10, v0.s[2] 363; CHECK-GI-NEXT: fmov d0, x8 364; CHECK-GI-NEXT: fmov d1, x9 365; CHECK-GI-NEXT: fmov d2, x10 366; CHECK-GI-NEXT: ret 367entry: 368 %c = sext <3 x i32> %a to <3 x i64> 369 ret <3 x i64> %c 370} 371 372define <3 x i16> @sext_v3i10_v3i16(<3 x i10> %a) { 373; CHECK-SD-LABEL: sext_v3i10_v3i16: 374; CHECK-SD: // %bb.0: // %entry 375; CHECK-SD-NEXT: fmov s0, w0 376; CHECK-SD-NEXT: mov v0.h[1], w1 377; CHECK-SD-NEXT: mov v0.h[2], w2 378; CHECK-SD-NEXT: shl v0.4h, v0.4h, #6 379; CHECK-SD-NEXT: sshr v0.4h, v0.4h, #6 380; CHECK-SD-NEXT: ret 381; 382; CHECK-GI-LABEL: sext_v3i10_v3i16: 383; CHECK-GI: // %bb.0: // %entry 384; CHECK-GI-NEXT: lsl w8, w0, #6 385; CHECK-GI-NEXT: lsl w9, w1, #6 386; CHECK-GI-NEXT: sbfx w8, w8, #6, #10 387; CHECK-GI-NEXT: sbfx w9, w9, #6, #10 388; CHECK-GI-NEXT: fmov s0, w8 389; CHECK-GI-NEXT: lsl w8, w2, #6 390; CHECK-GI-NEXT: sbfx w8, w8, #6, #10 391; CHECK-GI-NEXT: mov v0.h[1], w9 392; CHECK-GI-NEXT: mov v0.h[2], w8 393; CHECK-GI-NEXT: // kill: def $d0 killed $d0 killed $q0 394; CHECK-GI-NEXT: ret 395entry: 396 %c = sext <3 x i10> %a to <3 x i16> 397 ret <3 x i16> %c 398} 399 400define <3 x i32> @sext_v3i10_v3i32(<3 x i10> %a) { 401; CHECK-SD-LABEL: sext_v3i10_v3i32: 402; CHECK-SD: // %bb.0: // %entry 403; CHECK-SD-NEXT: fmov s0, w0 404; CHECK-SD-NEXT: mov v0.h[1], w1 405; CHECK-SD-NEXT: mov v0.h[2], w2 406; CHECK-SD-NEXT: ushll v0.4s, v0.4h, #0 407; CHECK-SD-NEXT: shl v0.4s, v0.4s, #22 408; CHECK-SD-NEXT: sshr v0.4s, v0.4s, #22 409; CHECK-SD-NEXT: ret 410; 411; CHECK-GI-LABEL: sext_v3i10_v3i32: 412; CHECK-GI: // %bb.0: // %entry 413; CHECK-GI-NEXT: sbfx w8, w0, #0, #10 414; CHECK-GI-NEXT: mov v0.s[0], w8 415; CHECK-GI-NEXT: sbfx w8, w1, #0, #10 416; CHECK-GI-NEXT: mov v0.s[1], w8 417; CHECK-GI-NEXT: sbfx w8, w2, #0, #10 418; CHECK-GI-NEXT: mov v0.s[2], w8 419; CHECK-GI-NEXT: ret 420entry: 421 %c = sext <3 x i10> %a to <3 x i32> 422 ret <3 x i32> %c 423} 424 425define <3 x i64> @sext_v3i10_v3i64(<3 x i10> %a) { 426; CHECK-SD-LABEL: sext_v3i10_v3i64: 427; CHECK-SD: // %bb.0: // %entry 428; CHECK-SD-NEXT: fmov s0, w0 429; CHECK-SD-NEXT: fmov s1, w2 430; CHECK-SD-NEXT: mov v0.s[1], w1 431; CHECK-SD-NEXT: ushll v1.2d, v1.2s, #0 432; CHECK-SD-NEXT: shl v2.2d, v1.2d, #54 433; CHECK-SD-NEXT: ushll v0.2d, v0.2s, #0 434; CHECK-SD-NEXT: sshr v2.2d, v2.2d, #54 435; CHECK-SD-NEXT: shl v0.2d, v0.2d, #54 436; CHECK-SD-NEXT: // kill: def $d2 killed $d2 killed $q2 437; CHECK-SD-NEXT: sshr v0.2d, v0.2d, #54 438; CHECK-SD-NEXT: ext v1.16b, v0.16b, v0.16b, #8 439; CHECK-SD-NEXT: // kill: def $d0 killed $d0 killed $q0 440; CHECK-SD-NEXT: // kill: def $d1 killed $d1 killed $q1 441; CHECK-SD-NEXT: ret 442; 443; CHECK-GI-LABEL: sext_v3i10_v3i64: 444; CHECK-GI: // %bb.0: // %entry 445; CHECK-GI-NEXT: // kill: def $w0 killed $w0 def $x0 446; CHECK-GI-NEXT: // kill: def $w1 killed $w1 def $x1 447; CHECK-GI-NEXT: // kill: def $w2 killed $w2 def $x2 448; CHECK-GI-NEXT: sbfx x8, x0, #0, #10 449; CHECK-GI-NEXT: sbfx x9, x1, #0, #10 450; CHECK-GI-NEXT: sbfx x10, x2, #0, #10 451; CHECK-GI-NEXT: fmov d0, x8 452; CHECK-GI-NEXT: fmov d1, x9 453; CHECK-GI-NEXT: fmov d2, x10 454; CHECK-GI-NEXT: ret 455entry: 456 %c = sext <3 x i10> %a to <3 x i64> 457 ret <3 x i64> %c 458} 459 460define <4 x i16> @sext_v4i8_v4i16(<4 x i8> %a) { 461; CHECK-LABEL: sext_v4i8_v4i16: 462; CHECK: // %bb.0: // %entry 463; CHECK-NEXT: shl v0.4h, v0.4h, #8 464; CHECK-NEXT: sshr v0.4h, v0.4h, #8 465; CHECK-NEXT: ret 466entry: 467 %c = sext <4 x i8> %a to <4 x i16> 468 ret <4 x i16> %c 469} 470 471define <4 x i32> @sext_v4i8_v4i32(<4 x i8> %a) { 472; CHECK-LABEL: sext_v4i8_v4i32: 473; CHECK: // %bb.0: // %entry 474; CHECK-NEXT: ushll v0.4s, v0.4h, #0 475; CHECK-NEXT: shl v0.4s, v0.4s, #24 476; CHECK-NEXT: sshr v0.4s, v0.4s, #24 477; CHECK-NEXT: ret 478entry: 479 %c = sext <4 x i8> %a to <4 x i32> 480 ret <4 x i32> %c 481} 482 483define <4 x i64> @sext_v4i8_v4i64(<4 x i8> %a) { 484; CHECK-SD-LABEL: sext_v4i8_v4i64: 485; CHECK-SD: // %bb.0: // %entry 486; CHECK-SD-NEXT: ushll v0.4s, v0.4h, #0 487; CHECK-SD-NEXT: ushll v1.2d, v0.2s, #0 488; CHECK-SD-NEXT: ushll2 v0.2d, v0.4s, #0 489; CHECK-SD-NEXT: shl v0.2d, v0.2d, #56 490; CHECK-SD-NEXT: shl v2.2d, v1.2d, #56 491; CHECK-SD-NEXT: sshr v1.2d, v0.2d, #56 492; CHECK-SD-NEXT: sshr v0.2d, v2.2d, #56 493; CHECK-SD-NEXT: ret 494; 495; CHECK-GI-LABEL: sext_v4i8_v4i64: 496; CHECK-GI: // %bb.0: // %entry 497; CHECK-GI-NEXT: ushll v0.4s, v0.4h, #0 498; CHECK-GI-NEXT: ushll v1.2d, v0.2s, #0 499; CHECK-GI-NEXT: ushll2 v0.2d, v0.4s, #0 500; CHECK-GI-NEXT: shl v1.2d, v1.2d, #56 501; CHECK-GI-NEXT: shl v2.2d, v0.2d, #56 502; CHECK-GI-NEXT: sshr v0.2d, v1.2d, #56 503; CHECK-GI-NEXT: sshr v1.2d, v2.2d, #56 504; CHECK-GI-NEXT: ret 505entry: 506 %c = sext <4 x i8> %a to <4 x i64> 507 ret <4 x i64> %c 508} 509 510define <4 x i32> @sext_v4i16_v4i32(<4 x i16> %a) { 511; CHECK-LABEL: sext_v4i16_v4i32: 512; CHECK: // %bb.0: // %entry 513; CHECK-NEXT: sshll v0.4s, v0.4h, #0 514; CHECK-NEXT: ret 515entry: 516 %c = sext <4 x i16> %a to <4 x i32> 517 ret <4 x i32> %c 518} 519 520define <4 x i64> @sext_v4i16_v4i64(<4 x i16> %a) { 521; CHECK-SD-LABEL: sext_v4i16_v4i64: 522; CHECK-SD: // %bb.0: // %entry 523; CHECK-SD-NEXT: sshll v0.4s, v0.4h, #0 524; CHECK-SD-NEXT: sshll2 v1.2d, v0.4s, #0 525; CHECK-SD-NEXT: sshll v0.2d, v0.2s, #0 526; CHECK-SD-NEXT: ret 527; 528; CHECK-GI-LABEL: sext_v4i16_v4i64: 529; CHECK-GI: // %bb.0: // %entry 530; CHECK-GI-NEXT: sshll v1.4s, v0.4h, #0 531; CHECK-GI-NEXT: sshll v0.2d, v1.2s, #0 532; CHECK-GI-NEXT: sshll2 v1.2d, v1.4s, #0 533; CHECK-GI-NEXT: ret 534entry: 535 %c = sext <4 x i16> %a to <4 x i64> 536 ret <4 x i64> %c 537} 538 539define <4 x i64> @sext_v4i32_v4i64(<4 x i32> %a) { 540; CHECK-SD-LABEL: sext_v4i32_v4i64: 541; CHECK-SD: // %bb.0: // %entry 542; CHECK-SD-NEXT: sshll2 v1.2d, v0.4s, #0 543; CHECK-SD-NEXT: sshll v0.2d, v0.2s, #0 544; CHECK-SD-NEXT: ret 545; 546; CHECK-GI-LABEL: sext_v4i32_v4i64: 547; CHECK-GI: // %bb.0: // %entry 548; CHECK-GI-NEXT: sshll v2.2d, v0.2s, #0 549; CHECK-GI-NEXT: sshll2 v1.2d, v0.4s, #0 550; CHECK-GI-NEXT: mov v0.16b, v2.16b 551; CHECK-GI-NEXT: ret 552entry: 553 %c = sext <4 x i32> %a to <4 x i64> 554 ret <4 x i64> %c 555} 556 557define <4 x i16> @sext_v4i10_v4i16(<4 x i10> %a) { 558; CHECK-LABEL: sext_v4i10_v4i16: 559; CHECK: // %bb.0: // %entry 560; CHECK-NEXT: shl v0.4h, v0.4h, #6 561; CHECK-NEXT: sshr v0.4h, v0.4h, #6 562; CHECK-NEXT: ret 563entry: 564 %c = sext <4 x i10> %a to <4 x i16> 565 ret <4 x i16> %c 566} 567 568define <4 x i32> @sext_v4i10_v4i32(<4 x i10> %a) { 569; CHECK-LABEL: sext_v4i10_v4i32: 570; CHECK: // %bb.0: // %entry 571; CHECK-NEXT: ushll v0.4s, v0.4h, #0 572; CHECK-NEXT: shl v0.4s, v0.4s, #22 573; CHECK-NEXT: sshr v0.4s, v0.4s, #22 574; CHECK-NEXT: ret 575entry: 576 %c = sext <4 x i10> %a to <4 x i32> 577 ret <4 x i32> %c 578} 579 580define <4 x i64> @sext_v4i10_v4i64(<4 x i10> %a) { 581; CHECK-SD-LABEL: sext_v4i10_v4i64: 582; CHECK-SD: // %bb.0: // %entry 583; CHECK-SD-NEXT: ushll v0.4s, v0.4h, #0 584; CHECK-SD-NEXT: ushll v1.2d, v0.2s, #0 585; CHECK-SD-NEXT: ushll2 v0.2d, v0.4s, #0 586; CHECK-SD-NEXT: shl v0.2d, v0.2d, #54 587; CHECK-SD-NEXT: shl v2.2d, v1.2d, #54 588; CHECK-SD-NEXT: sshr v1.2d, v0.2d, #54 589; CHECK-SD-NEXT: sshr v0.2d, v2.2d, #54 590; CHECK-SD-NEXT: ret 591; 592; CHECK-GI-LABEL: sext_v4i10_v4i64: 593; CHECK-GI: // %bb.0: // %entry 594; CHECK-GI-NEXT: ushll v0.4s, v0.4h, #0 595; CHECK-GI-NEXT: ushll v1.2d, v0.2s, #0 596; CHECK-GI-NEXT: ushll2 v0.2d, v0.4s, #0 597; CHECK-GI-NEXT: shl v1.2d, v1.2d, #54 598; CHECK-GI-NEXT: shl v2.2d, v0.2d, #54 599; CHECK-GI-NEXT: sshr v0.2d, v1.2d, #54 600; CHECK-GI-NEXT: sshr v1.2d, v2.2d, #54 601; CHECK-GI-NEXT: ret 602entry: 603 %c = sext <4 x i10> %a to <4 x i64> 604 ret <4 x i64> %c 605} 606 607define <8 x i16> @sext_v8i8_v8i16(<8 x i8> %a) { 608; CHECK-LABEL: sext_v8i8_v8i16: 609; CHECK: // %bb.0: // %entry 610; CHECK-NEXT: sshll v0.8h, v0.8b, #0 611; CHECK-NEXT: ret 612entry: 613 %c = sext <8 x i8> %a to <8 x i16> 614 ret <8 x i16> %c 615} 616 617define <8 x i32> @sext_v8i8_v8i32(<8 x i8> %a) { 618; CHECK-SD-LABEL: sext_v8i8_v8i32: 619; CHECK-SD: // %bb.0: // %entry 620; CHECK-SD-NEXT: sshll v0.8h, v0.8b, #0 621; CHECK-SD-NEXT: sshll2 v1.4s, v0.8h, #0 622; CHECK-SD-NEXT: sshll v0.4s, v0.4h, #0 623; CHECK-SD-NEXT: ret 624; 625; CHECK-GI-LABEL: sext_v8i8_v8i32: 626; CHECK-GI: // %bb.0: // %entry 627; CHECK-GI-NEXT: sshll v1.8h, v0.8b, #0 628; CHECK-GI-NEXT: sshll v0.4s, v1.4h, #0 629; CHECK-GI-NEXT: sshll2 v1.4s, v1.8h, #0 630; CHECK-GI-NEXT: ret 631entry: 632 %c = sext <8 x i8> %a to <8 x i32> 633 ret <8 x i32> %c 634} 635 636define <8 x i64> @sext_v8i8_v8i64(<8 x i8> %a) { 637; CHECK-SD-LABEL: sext_v8i8_v8i64: 638; CHECK-SD: // %bb.0: // %entry 639; CHECK-SD-NEXT: sshll v0.8h, v0.8b, #0 640; CHECK-SD-NEXT: sshll v1.4s, v0.4h, #0 641; CHECK-SD-NEXT: sshll2 v2.4s, v0.8h, #0 642; CHECK-SD-NEXT: sshll v0.2d, v1.2s, #0 643; CHECK-SD-NEXT: sshll2 v3.2d, v2.4s, #0 644; CHECK-SD-NEXT: sshll2 v1.2d, v1.4s, #0 645; CHECK-SD-NEXT: sshll v2.2d, v2.2s, #0 646; CHECK-SD-NEXT: ret 647; 648; CHECK-GI-LABEL: sext_v8i8_v8i64: 649; CHECK-GI: // %bb.0: // %entry 650; CHECK-GI-NEXT: sshll v0.8h, v0.8b, #0 651; CHECK-GI-NEXT: sshll v1.4s, v0.4h, #0 652; CHECK-GI-NEXT: sshll2 v3.4s, v0.8h, #0 653; CHECK-GI-NEXT: sshll v0.2d, v1.2s, #0 654; CHECK-GI-NEXT: sshll2 v1.2d, v1.4s, #0 655; CHECK-GI-NEXT: sshll v2.2d, v3.2s, #0 656; CHECK-GI-NEXT: sshll2 v3.2d, v3.4s, #0 657; CHECK-GI-NEXT: ret 658entry: 659 %c = sext <8 x i8> %a to <8 x i64> 660 ret <8 x i64> %c 661} 662 663define <8 x i32> @sext_v8i16_v8i32(<8 x i16> %a) { 664; CHECK-SD-LABEL: sext_v8i16_v8i32: 665; CHECK-SD: // %bb.0: // %entry 666; CHECK-SD-NEXT: sshll2 v1.4s, v0.8h, #0 667; CHECK-SD-NEXT: sshll v0.4s, v0.4h, #0 668; CHECK-SD-NEXT: ret 669; 670; CHECK-GI-LABEL: sext_v8i16_v8i32: 671; CHECK-GI: // %bb.0: // %entry 672; CHECK-GI-NEXT: sshll v2.4s, v0.4h, #0 673; CHECK-GI-NEXT: sshll2 v1.4s, v0.8h, #0 674; CHECK-GI-NEXT: mov v0.16b, v2.16b 675; CHECK-GI-NEXT: ret 676entry: 677 %c = sext <8 x i16> %a to <8 x i32> 678 ret <8 x i32> %c 679} 680 681define <8 x i64> @sext_v8i16_v8i64(<8 x i16> %a) { 682; CHECK-SD-LABEL: sext_v8i16_v8i64: 683; CHECK-SD: // %bb.0: // %entry 684; CHECK-SD-NEXT: sshll v1.4s, v0.4h, #0 685; CHECK-SD-NEXT: sshll2 v2.4s, v0.8h, #0 686; CHECK-SD-NEXT: sshll v0.2d, v1.2s, #0 687; CHECK-SD-NEXT: sshll2 v3.2d, v2.4s, #0 688; CHECK-SD-NEXT: sshll2 v1.2d, v1.4s, #0 689; CHECK-SD-NEXT: sshll v2.2d, v2.2s, #0 690; CHECK-SD-NEXT: ret 691; 692; CHECK-GI-LABEL: sext_v8i16_v8i64: 693; CHECK-GI: // %bb.0: // %entry 694; CHECK-GI-NEXT: sshll v1.4s, v0.4h, #0 695; CHECK-GI-NEXT: sshll2 v3.4s, v0.8h, #0 696; CHECK-GI-NEXT: sshll v0.2d, v1.2s, #0 697; CHECK-GI-NEXT: sshll2 v1.2d, v1.4s, #0 698; CHECK-GI-NEXT: sshll v2.2d, v3.2s, #0 699; CHECK-GI-NEXT: sshll2 v3.2d, v3.4s, #0 700; CHECK-GI-NEXT: ret 701entry: 702 %c = sext <8 x i16> %a to <8 x i64> 703 ret <8 x i64> %c 704} 705 706define <8 x i64> @sext_v8i32_v8i64(<8 x i32> %a) { 707; CHECK-SD-LABEL: sext_v8i32_v8i64: 708; CHECK-SD: // %bb.0: // %entry 709; CHECK-SD-NEXT: sshll v5.2d, v0.2s, #0 710; CHECK-SD-NEXT: sshll2 v4.2d, v0.4s, #0 711; CHECK-SD-NEXT: sshll2 v3.2d, v1.4s, #0 712; CHECK-SD-NEXT: sshll v2.2d, v1.2s, #0 713; CHECK-SD-NEXT: mov v0.16b, v5.16b 714; CHECK-SD-NEXT: mov v1.16b, v4.16b 715; CHECK-SD-NEXT: ret 716; 717; CHECK-GI-LABEL: sext_v8i32_v8i64: 718; CHECK-GI: // %bb.0: // %entry 719; CHECK-GI-NEXT: sshll v4.2d, v0.2s, #0 720; CHECK-GI-NEXT: sshll2 v5.2d, v0.4s, #0 721; CHECK-GI-NEXT: sshll v2.2d, v1.2s, #0 722; CHECK-GI-NEXT: sshll2 v3.2d, v1.4s, #0 723; CHECK-GI-NEXT: mov v0.16b, v4.16b 724; CHECK-GI-NEXT: mov v1.16b, v5.16b 725; CHECK-GI-NEXT: ret 726entry: 727 %c = sext <8 x i32> %a to <8 x i64> 728 ret <8 x i64> %c 729} 730 731define <8 x i16> @sext_v8i10_v8i16(<8 x i10> %a) { 732; CHECK-LABEL: sext_v8i10_v8i16: 733; CHECK: // %bb.0: // %entry 734; CHECK-NEXT: shl v0.8h, v0.8h, #6 735; CHECK-NEXT: sshr v0.8h, v0.8h, #6 736; CHECK-NEXT: ret 737entry: 738 %c = sext <8 x i10> %a to <8 x i16> 739 ret <8 x i16> %c 740} 741 742define <8 x i32> @sext_v8i10_v8i32(<8 x i10> %a) { 743; CHECK-SD-LABEL: sext_v8i10_v8i32: 744; CHECK-SD: // %bb.0: // %entry 745; CHECK-SD-NEXT: ushll v1.4s, v0.4h, #0 746; CHECK-SD-NEXT: ushll2 v0.4s, v0.8h, #0 747; CHECK-SD-NEXT: shl v0.4s, v0.4s, #22 748; CHECK-SD-NEXT: shl v2.4s, v1.4s, #22 749; CHECK-SD-NEXT: sshr v1.4s, v0.4s, #22 750; CHECK-SD-NEXT: sshr v0.4s, v2.4s, #22 751; CHECK-SD-NEXT: ret 752; 753; CHECK-GI-LABEL: sext_v8i10_v8i32: 754; CHECK-GI: // %bb.0: // %entry 755; CHECK-GI-NEXT: ushll v1.4s, v0.4h, #0 756; CHECK-GI-NEXT: ushll2 v0.4s, v0.8h, #0 757; CHECK-GI-NEXT: shl v1.4s, v1.4s, #22 758; CHECK-GI-NEXT: shl v2.4s, v0.4s, #22 759; CHECK-GI-NEXT: sshr v0.4s, v1.4s, #22 760; CHECK-GI-NEXT: sshr v1.4s, v2.4s, #22 761; CHECK-GI-NEXT: ret 762entry: 763 %c = sext <8 x i10> %a to <8 x i32> 764 ret <8 x i32> %c 765} 766 767define <8 x i64> @sext_v8i10_v8i64(<8 x i10> %a) { 768; CHECK-SD-LABEL: sext_v8i10_v8i64: 769; CHECK-SD: // %bb.0: // %entry 770; CHECK-SD-NEXT: ushll v1.4s, v0.4h, #0 771; CHECK-SD-NEXT: ushll2 v0.4s, v0.8h, #0 772; CHECK-SD-NEXT: ushll v2.2d, v1.2s, #0 773; CHECK-SD-NEXT: ushll v3.2d, v0.2s, #0 774; CHECK-SD-NEXT: ushll2 v1.2d, v1.4s, #0 775; CHECK-SD-NEXT: ushll2 v0.2d, v0.4s, #0 776; CHECK-SD-NEXT: shl v2.2d, v2.2d, #54 777; CHECK-SD-NEXT: shl v1.2d, v1.2d, #54 778; CHECK-SD-NEXT: shl v5.2d, v3.2d, #54 779; CHECK-SD-NEXT: shl v4.2d, v0.2d, #54 780; CHECK-SD-NEXT: sshr v0.2d, v2.2d, #54 781; CHECK-SD-NEXT: sshr v1.2d, v1.2d, #54 782; CHECK-SD-NEXT: sshr v2.2d, v5.2d, #54 783; CHECK-SD-NEXT: sshr v3.2d, v4.2d, #54 784; CHECK-SD-NEXT: ret 785; 786; CHECK-GI-LABEL: sext_v8i10_v8i64: 787; CHECK-GI: // %bb.0: // %entry 788; CHECK-GI-NEXT: ushll v1.4s, v0.4h, #0 789; CHECK-GI-NEXT: ushll2 v0.4s, v0.8h, #0 790; CHECK-GI-NEXT: ushll v2.2d, v1.2s, #0 791; CHECK-GI-NEXT: ushll2 v1.2d, v1.4s, #0 792; CHECK-GI-NEXT: ushll v3.2d, v0.2s, #0 793; CHECK-GI-NEXT: ushll2 v0.2d, v0.4s, #0 794; CHECK-GI-NEXT: shl v2.2d, v2.2d, #54 795; CHECK-GI-NEXT: shl v1.2d, v1.2d, #54 796; CHECK-GI-NEXT: shl v3.2d, v3.2d, #54 797; CHECK-GI-NEXT: shl v4.2d, v0.2d, #54 798; CHECK-GI-NEXT: sshr v0.2d, v2.2d, #54 799; CHECK-GI-NEXT: sshr v1.2d, v1.2d, #54 800; CHECK-GI-NEXT: sshr v2.2d, v3.2d, #54 801; CHECK-GI-NEXT: sshr v3.2d, v4.2d, #54 802; CHECK-GI-NEXT: ret 803entry: 804 %c = sext <8 x i10> %a to <8 x i64> 805 ret <8 x i64> %c 806} 807 808define <16 x i16> @sext_v16i8_v16i16(<16 x i8> %a) { 809; CHECK-SD-LABEL: sext_v16i8_v16i16: 810; CHECK-SD: // %bb.0: // %entry 811; CHECK-SD-NEXT: sshll2 v1.8h, v0.16b, #0 812; CHECK-SD-NEXT: sshll v0.8h, v0.8b, #0 813; CHECK-SD-NEXT: ret 814; 815; CHECK-GI-LABEL: sext_v16i8_v16i16: 816; CHECK-GI: // %bb.0: // %entry 817; CHECK-GI-NEXT: sshll v2.8h, v0.8b, #0 818; CHECK-GI-NEXT: sshll2 v1.8h, v0.16b, #0 819; CHECK-GI-NEXT: mov v0.16b, v2.16b 820; CHECK-GI-NEXT: ret 821entry: 822 %c = sext <16 x i8> %a to <16 x i16> 823 ret <16 x i16> %c 824} 825 826define <16 x i32> @sext_v16i8_v16i32(<16 x i8> %a) { 827; CHECK-SD-LABEL: sext_v16i8_v16i32: 828; CHECK-SD: // %bb.0: // %entry 829; CHECK-SD-NEXT: sshll v1.8h, v0.8b, #0 830; CHECK-SD-NEXT: sshll2 v2.8h, v0.16b, #0 831; CHECK-SD-NEXT: sshll v0.4s, v1.4h, #0 832; CHECK-SD-NEXT: sshll2 v3.4s, v2.8h, #0 833; CHECK-SD-NEXT: sshll2 v1.4s, v1.8h, #0 834; CHECK-SD-NEXT: sshll v2.4s, v2.4h, #0 835; CHECK-SD-NEXT: ret 836; 837; CHECK-GI-LABEL: sext_v16i8_v16i32: 838; CHECK-GI: // %bb.0: // %entry 839; CHECK-GI-NEXT: sshll v1.8h, v0.8b, #0 840; CHECK-GI-NEXT: sshll2 v3.8h, v0.16b, #0 841; CHECK-GI-NEXT: sshll v0.4s, v1.4h, #0 842; CHECK-GI-NEXT: sshll2 v1.4s, v1.8h, #0 843; CHECK-GI-NEXT: sshll v2.4s, v3.4h, #0 844; CHECK-GI-NEXT: sshll2 v3.4s, v3.8h, #0 845; CHECK-GI-NEXT: ret 846entry: 847 %c = sext <16 x i8> %a to <16 x i32> 848 ret <16 x i32> %c 849} 850 851define <16 x i64> @sext_v16i8_v16i64(<16 x i8> %a) { 852; CHECK-SD-LABEL: sext_v16i8_v16i64: 853; CHECK-SD: // %bb.0: // %entry 854; CHECK-SD-NEXT: sshll v1.8h, v0.8b, #0 855; CHECK-SD-NEXT: sshll2 v0.8h, v0.16b, #0 856; CHECK-SD-NEXT: sshll v2.4s, v1.4h, #0 857; CHECK-SD-NEXT: sshll2 v4.4s, v1.8h, #0 858; CHECK-SD-NEXT: sshll v5.4s, v0.4h, #0 859; CHECK-SD-NEXT: sshll2 v6.4s, v0.8h, #0 860; CHECK-SD-NEXT: sshll2 v1.2d, v2.4s, #0 861; CHECK-SD-NEXT: sshll v0.2d, v2.2s, #0 862; CHECK-SD-NEXT: sshll2 v3.2d, v4.4s, #0 863; CHECK-SD-NEXT: sshll v2.2d, v4.2s, #0 864; CHECK-SD-NEXT: sshll v4.2d, v5.2s, #0 865; CHECK-SD-NEXT: sshll2 v7.2d, v6.4s, #0 866; CHECK-SD-NEXT: sshll2 v5.2d, v5.4s, #0 867; CHECK-SD-NEXT: sshll v6.2d, v6.2s, #0 868; CHECK-SD-NEXT: ret 869; 870; CHECK-GI-LABEL: sext_v16i8_v16i64: 871; CHECK-GI: // %bb.0: // %entry 872; CHECK-GI-NEXT: sshll v1.8h, v0.8b, #0 873; CHECK-GI-NEXT: sshll2 v0.8h, v0.16b, #0 874; CHECK-GI-NEXT: sshll v2.4s, v1.4h, #0 875; CHECK-GI-NEXT: sshll2 v3.4s, v1.8h, #0 876; CHECK-GI-NEXT: sshll v5.4s, v0.4h, #0 877; CHECK-GI-NEXT: sshll2 v7.4s, v0.8h, #0 878; CHECK-GI-NEXT: sshll v0.2d, v2.2s, #0 879; CHECK-GI-NEXT: sshll2 v1.2d, v2.4s, #0 880; CHECK-GI-NEXT: sshll v2.2d, v3.2s, #0 881; CHECK-GI-NEXT: sshll2 v3.2d, v3.4s, #0 882; CHECK-GI-NEXT: sshll v4.2d, v5.2s, #0 883; CHECK-GI-NEXT: sshll2 v5.2d, v5.4s, #0 884; CHECK-GI-NEXT: sshll v6.2d, v7.2s, #0 885; CHECK-GI-NEXT: sshll2 v7.2d, v7.4s, #0 886; CHECK-GI-NEXT: ret 887entry: 888 %c = sext <16 x i8> %a to <16 x i64> 889 ret <16 x i64> %c 890} 891 892define <16 x i32> @sext_v16i16_v16i32(<16 x i16> %a) { 893; CHECK-SD-LABEL: sext_v16i16_v16i32: 894; CHECK-SD: // %bb.0: // %entry 895; CHECK-SD-NEXT: sshll v5.4s, v0.4h, #0 896; CHECK-SD-NEXT: sshll2 v4.4s, v0.8h, #0 897; CHECK-SD-NEXT: sshll2 v3.4s, v1.8h, #0 898; CHECK-SD-NEXT: sshll v2.4s, v1.4h, #0 899; CHECK-SD-NEXT: mov v0.16b, v5.16b 900; CHECK-SD-NEXT: mov v1.16b, v4.16b 901; CHECK-SD-NEXT: ret 902; 903; CHECK-GI-LABEL: sext_v16i16_v16i32: 904; CHECK-GI: // %bb.0: // %entry 905; CHECK-GI-NEXT: sshll v4.4s, v0.4h, #0 906; CHECK-GI-NEXT: sshll2 v5.4s, v0.8h, #0 907; CHECK-GI-NEXT: sshll v2.4s, v1.4h, #0 908; CHECK-GI-NEXT: sshll2 v3.4s, v1.8h, #0 909; CHECK-GI-NEXT: mov v0.16b, v4.16b 910; CHECK-GI-NEXT: mov v1.16b, v5.16b 911; CHECK-GI-NEXT: ret 912entry: 913 %c = sext <16 x i16> %a to <16 x i32> 914 ret <16 x i32> %c 915} 916 917define <16 x i64> @sext_v16i16_v16i64(<16 x i16> %a) { 918; CHECK-SD-LABEL: sext_v16i16_v16i64: 919; CHECK-SD: // %bb.0: // %entry 920; CHECK-SD-NEXT: sshll v2.4s, v0.4h, #0 921; CHECK-SD-NEXT: sshll2 v4.4s, v0.8h, #0 922; CHECK-SD-NEXT: sshll v5.4s, v1.4h, #0 923; CHECK-SD-NEXT: sshll2 v6.4s, v1.8h, #0 924; CHECK-SD-NEXT: sshll2 v1.2d, v2.4s, #0 925; CHECK-SD-NEXT: sshll v0.2d, v2.2s, #0 926; CHECK-SD-NEXT: sshll2 v3.2d, v4.4s, #0 927; CHECK-SD-NEXT: sshll v2.2d, v4.2s, #0 928; CHECK-SD-NEXT: sshll v4.2d, v5.2s, #0 929; CHECK-SD-NEXT: sshll2 v7.2d, v6.4s, #0 930; CHECK-SD-NEXT: sshll2 v5.2d, v5.4s, #0 931; CHECK-SD-NEXT: sshll v6.2d, v6.2s, #0 932; CHECK-SD-NEXT: ret 933; 934; CHECK-GI-LABEL: sext_v16i16_v16i64: 935; CHECK-GI: // %bb.0: // %entry 936; CHECK-GI-NEXT: sshll v2.4s, v0.4h, #0 937; CHECK-GI-NEXT: sshll2 v3.4s, v0.8h, #0 938; CHECK-GI-NEXT: sshll v5.4s, v1.4h, #0 939; CHECK-GI-NEXT: sshll2 v7.4s, v1.8h, #0 940; CHECK-GI-NEXT: sshll v0.2d, v2.2s, #0 941; CHECK-GI-NEXT: sshll2 v1.2d, v2.4s, #0 942; CHECK-GI-NEXT: sshll v2.2d, v3.2s, #0 943; CHECK-GI-NEXT: sshll2 v3.2d, v3.4s, #0 944; CHECK-GI-NEXT: sshll v4.2d, v5.2s, #0 945; CHECK-GI-NEXT: sshll2 v5.2d, v5.4s, #0 946; CHECK-GI-NEXT: sshll v6.2d, v7.2s, #0 947; CHECK-GI-NEXT: sshll2 v7.2d, v7.4s, #0 948; CHECK-GI-NEXT: ret 949entry: 950 %c = sext <16 x i16> %a to <16 x i64> 951 ret <16 x i64> %c 952} 953 954define <16 x i64> @sext_v16i32_v16i64(<16 x i32> %a) { 955; CHECK-SD-LABEL: sext_v16i32_v16i64: 956; CHECK-SD: // %bb.0: // %entry 957; CHECK-SD-NEXT: sshll2 v17.2d, v0.4s, #0 958; CHECK-SD-NEXT: sshll2 v16.2d, v1.4s, #0 959; CHECK-SD-NEXT: sshll v18.2d, v1.2s, #0 960; CHECK-SD-NEXT: sshll v0.2d, v0.2s, #0 961; CHECK-SD-NEXT: sshll v4.2d, v2.2s, #0 962; CHECK-SD-NEXT: sshll2 v5.2d, v2.4s, #0 963; CHECK-SD-NEXT: sshll2 v7.2d, v3.4s, #0 964; CHECK-SD-NEXT: sshll v6.2d, v3.2s, #0 965; CHECK-SD-NEXT: mov v1.16b, v17.16b 966; CHECK-SD-NEXT: mov v2.16b, v18.16b 967; CHECK-SD-NEXT: mov v3.16b, v16.16b 968; CHECK-SD-NEXT: ret 969; 970; CHECK-GI-LABEL: sext_v16i32_v16i64: 971; CHECK-GI: // %bb.0: // %entry 972; CHECK-GI-NEXT: sshll v16.2d, v0.2s, #0 973; CHECK-GI-NEXT: sshll2 v17.2d, v0.4s, #0 974; CHECK-GI-NEXT: sshll v18.2d, v1.2s, #0 975; CHECK-GI-NEXT: sshll2 v19.2d, v1.4s, #0 976; CHECK-GI-NEXT: sshll v4.2d, v2.2s, #0 977; CHECK-GI-NEXT: sshll2 v5.2d, v2.4s, #0 978; CHECK-GI-NEXT: sshll v6.2d, v3.2s, #0 979; CHECK-GI-NEXT: sshll2 v7.2d, v3.4s, #0 980; CHECK-GI-NEXT: mov v0.16b, v16.16b 981; CHECK-GI-NEXT: mov v1.16b, v17.16b 982; CHECK-GI-NEXT: mov v2.16b, v18.16b 983; CHECK-GI-NEXT: mov v3.16b, v19.16b 984; CHECK-GI-NEXT: ret 985entry: 986 %c = sext <16 x i32> %a to <16 x i64> 987 ret <16 x i64> %c 988} 989 990define <16 x i16> @sext_v16i10_v16i16(<16 x i10> %a) { 991; CHECK-SD-LABEL: sext_v16i10_v16i16: 992; CHECK-SD: // %bb.0: // %entry 993; CHECK-SD-NEXT: ldr w8, [sp] 994; CHECK-SD-NEXT: fmov s1, w0 995; CHECK-SD-NEXT: ldr w9, [sp, #8] 996; CHECK-SD-NEXT: fmov s0, w8 997; CHECK-SD-NEXT: ldr w8, [sp, #16] 998; CHECK-SD-NEXT: mov v1.h[1], w1 999; CHECK-SD-NEXT: mov v0.h[1], w9 1000; CHECK-SD-NEXT: mov v1.h[2], w2 1001; CHECK-SD-NEXT: mov v0.h[2], w8 1002; CHECK-SD-NEXT: ldr w8, [sp, #24] 1003; CHECK-SD-NEXT: mov v1.h[3], w3 1004; CHECK-SD-NEXT: mov v0.h[3], w8 1005; CHECK-SD-NEXT: ldr w8, [sp, #32] 1006; CHECK-SD-NEXT: mov v1.h[4], w4 1007; CHECK-SD-NEXT: mov v0.h[4], w8 1008; CHECK-SD-NEXT: ldr w8, [sp, #40] 1009; CHECK-SD-NEXT: mov v1.h[5], w5 1010; CHECK-SD-NEXT: mov v0.h[5], w8 1011; CHECK-SD-NEXT: ldr w8, [sp, #48] 1012; CHECK-SD-NEXT: mov v1.h[6], w6 1013; CHECK-SD-NEXT: mov v0.h[6], w8 1014; CHECK-SD-NEXT: ldr w8, [sp, #56] 1015; CHECK-SD-NEXT: mov v1.h[7], w7 1016; CHECK-SD-NEXT: mov v0.h[7], w8 1017; CHECK-SD-NEXT: shl v1.8h, v1.8h, #6 1018; CHECK-SD-NEXT: shl v2.8h, v0.8h, #6 1019; CHECK-SD-NEXT: sshr v0.8h, v1.8h, #6 1020; CHECK-SD-NEXT: sshr v1.8h, v2.8h, #6 1021; CHECK-SD-NEXT: ret 1022; 1023; CHECK-GI-LABEL: sext_v16i10_v16i16: 1024; CHECK-GI: // %bb.0: // %entry 1025; CHECK-GI-NEXT: ldr w8, [sp] 1026; CHECK-GI-NEXT: fmov s0, w0 1027; CHECK-GI-NEXT: ldr w9, [sp, #8] 1028; CHECK-GI-NEXT: fmov s1, w8 1029; CHECK-GI-NEXT: ldr w8, [sp, #16] 1030; CHECK-GI-NEXT: mov v0.h[1], w1 1031; CHECK-GI-NEXT: mov v1.h[1], w9 1032; CHECK-GI-NEXT: mov v0.h[2], w2 1033; CHECK-GI-NEXT: mov v1.h[2], w8 1034; CHECK-GI-NEXT: ldr w8, [sp, #24] 1035; CHECK-GI-NEXT: mov v0.h[3], w3 1036; CHECK-GI-NEXT: mov v1.h[3], w8 1037; CHECK-GI-NEXT: ldr w8, [sp, #32] 1038; CHECK-GI-NEXT: mov v0.h[4], w4 1039; CHECK-GI-NEXT: mov v1.h[4], w8 1040; CHECK-GI-NEXT: ldr w8, [sp, #40] 1041; CHECK-GI-NEXT: mov v0.h[5], w5 1042; CHECK-GI-NEXT: mov v1.h[5], w8 1043; CHECK-GI-NEXT: ldr w8, [sp, #48] 1044; CHECK-GI-NEXT: mov v0.h[6], w6 1045; CHECK-GI-NEXT: mov v1.h[6], w8 1046; CHECK-GI-NEXT: ldr w8, [sp, #56] 1047; CHECK-GI-NEXT: mov v0.h[7], w7 1048; CHECK-GI-NEXT: mov v1.h[7], w8 1049; CHECK-GI-NEXT: shl v0.8h, v0.8h, #6 1050; CHECK-GI-NEXT: shl v1.8h, v1.8h, #6 1051; CHECK-GI-NEXT: sshr v0.8h, v0.8h, #6 1052; CHECK-GI-NEXT: sshr v1.8h, v1.8h, #6 1053; CHECK-GI-NEXT: ret 1054entry: 1055 %c = sext <16 x i10> %a to <16 x i16> 1056 ret <16 x i16> %c 1057} 1058 1059define <16 x i32> @sext_v16i10_v16i32(<16 x i10> %a) { 1060; CHECK-SD-LABEL: sext_v16i10_v16i32: 1061; CHECK-SD: // %bb.0: // %entry 1062; CHECK-SD-NEXT: ldr w8, [sp, #32] 1063; CHECK-SD-NEXT: ldr w9, [sp] 1064; CHECK-SD-NEXT: fmov s0, w0 1065; CHECK-SD-NEXT: fmov s1, w4 1066; CHECK-SD-NEXT: ldr w10, [sp, #40] 1067; CHECK-SD-NEXT: ldr w11, [sp, #8] 1068; CHECK-SD-NEXT: fmov s2, w9 1069; CHECK-SD-NEXT: fmov s3, w8 1070; CHECK-SD-NEXT: ldr w8, [sp, #48] 1071; CHECK-SD-NEXT: mov v0.h[1], w1 1072; CHECK-SD-NEXT: ldr w9, [sp, #16] 1073; CHECK-SD-NEXT: mov v1.h[1], w5 1074; CHECK-SD-NEXT: mov v2.h[1], w11 1075; CHECK-SD-NEXT: mov v3.h[1], w10 1076; CHECK-SD-NEXT: mov v0.h[2], w2 1077; CHECK-SD-NEXT: mov v1.h[2], w6 1078; CHECK-SD-NEXT: mov v2.h[2], w9 1079; CHECK-SD-NEXT: mov v3.h[2], w8 1080; CHECK-SD-NEXT: ldr w8, [sp, #56] 1081; CHECK-SD-NEXT: ldr w9, [sp, #24] 1082; CHECK-SD-NEXT: mov v0.h[3], w3 1083; CHECK-SD-NEXT: mov v1.h[3], w7 1084; CHECK-SD-NEXT: mov v2.h[3], w9 1085; CHECK-SD-NEXT: mov v3.h[3], w8 1086; CHECK-SD-NEXT: ushll v0.4s, v0.4h, #0 1087; CHECK-SD-NEXT: ushll v1.4s, v1.4h, #0 1088; CHECK-SD-NEXT: ushll v2.4s, v2.4h, #0 1089; CHECK-SD-NEXT: ushll v3.4s, v3.4h, #0 1090; CHECK-SD-NEXT: shl v0.4s, v0.4s, #22 1091; CHECK-SD-NEXT: shl v1.4s, v1.4s, #22 1092; CHECK-SD-NEXT: shl v2.4s, v2.4s, #22 1093; CHECK-SD-NEXT: shl v3.4s, v3.4s, #22 1094; CHECK-SD-NEXT: sshr v0.4s, v0.4s, #22 1095; CHECK-SD-NEXT: sshr v1.4s, v1.4s, #22 1096; CHECK-SD-NEXT: sshr v2.4s, v2.4s, #22 1097; CHECK-SD-NEXT: sshr v3.4s, v3.4s, #22 1098; CHECK-SD-NEXT: ret 1099; 1100; CHECK-GI-LABEL: sext_v16i10_v16i32: 1101; CHECK-GI: // %bb.0: // %entry 1102; CHECK-GI-NEXT: ldr w8, [sp] 1103; CHECK-GI-NEXT: ldr w9, [sp, #32] 1104; CHECK-GI-NEXT: fmov s0, w0 1105; CHECK-GI-NEXT: fmov s1, w4 1106; CHECK-GI-NEXT: ldr w10, [sp, #8] 1107; CHECK-GI-NEXT: ldr w11, [sp, #40] 1108; CHECK-GI-NEXT: fmov s2, w8 1109; CHECK-GI-NEXT: fmov s3, w9 1110; CHECK-GI-NEXT: ldr w8, [sp, #16] 1111; CHECK-GI-NEXT: mov v0.h[1], w1 1112; CHECK-GI-NEXT: ldr w9, [sp, #48] 1113; CHECK-GI-NEXT: mov v1.h[1], w5 1114; CHECK-GI-NEXT: mov v2.h[1], w10 1115; CHECK-GI-NEXT: mov v3.h[1], w11 1116; CHECK-GI-NEXT: mov v0.h[2], w2 1117; CHECK-GI-NEXT: mov v1.h[2], w6 1118; CHECK-GI-NEXT: mov v2.h[2], w8 1119; CHECK-GI-NEXT: mov v3.h[2], w9 1120; CHECK-GI-NEXT: ldr w8, [sp, #24] 1121; CHECK-GI-NEXT: ldr w9, [sp, #56] 1122; CHECK-GI-NEXT: mov v0.h[3], w3 1123; CHECK-GI-NEXT: mov v1.h[3], w7 1124; CHECK-GI-NEXT: mov v2.h[3], w8 1125; CHECK-GI-NEXT: mov v3.h[3], w9 1126; CHECK-GI-NEXT: ushll v0.4s, v0.4h, #0 1127; CHECK-GI-NEXT: ushll v1.4s, v1.4h, #0 1128; CHECK-GI-NEXT: ushll v2.4s, v2.4h, #0 1129; CHECK-GI-NEXT: ushll v3.4s, v3.4h, #0 1130; CHECK-GI-NEXT: shl v0.4s, v0.4s, #22 1131; CHECK-GI-NEXT: shl v1.4s, v1.4s, #22 1132; CHECK-GI-NEXT: shl v2.4s, v2.4s, #22 1133; CHECK-GI-NEXT: shl v3.4s, v3.4s, #22 1134; CHECK-GI-NEXT: sshr v0.4s, v0.4s, #22 1135; CHECK-GI-NEXT: sshr v1.4s, v1.4s, #22 1136; CHECK-GI-NEXT: sshr v2.4s, v2.4s, #22 1137; CHECK-GI-NEXT: sshr v3.4s, v3.4s, #22 1138; CHECK-GI-NEXT: ret 1139entry: 1140 %c = sext <16 x i10> %a to <16 x i32> 1141 ret <16 x i32> %c 1142} 1143 1144define <16 x i64> @sext_v16i10_v16i64(<16 x i10> %a) { 1145; CHECK-SD-LABEL: sext_v16i10_v16i64: 1146; CHECK-SD: // %bb.0: // %entry 1147; CHECK-SD-NEXT: fmov s0, w2 1148; CHECK-SD-NEXT: fmov s1, w0 1149; CHECK-SD-NEXT: ldr s2, [sp] 1150; CHECK-SD-NEXT: fmov s3, w4 1151; CHECK-SD-NEXT: fmov s4, w6 1152; CHECK-SD-NEXT: add x8, sp, #8 1153; CHECK-SD-NEXT: ldr s5, [sp, #16] 1154; CHECK-SD-NEXT: ldr s6, [sp, #32] 1155; CHECK-SD-NEXT: ldr s7, [sp, #48] 1156; CHECK-SD-NEXT: mov v1.s[1], w1 1157; CHECK-SD-NEXT: mov v0.s[1], w3 1158; CHECK-SD-NEXT: ld1 { v2.s }[1], [x8] 1159; CHECK-SD-NEXT: mov v3.s[1], w5 1160; CHECK-SD-NEXT: mov v4.s[1], w7 1161; CHECK-SD-NEXT: add x8, sp, #24 1162; CHECK-SD-NEXT: add x9, sp, #40 1163; CHECK-SD-NEXT: add x10, sp, #56 1164; CHECK-SD-NEXT: ld1 { v5.s }[1], [x8] 1165; CHECK-SD-NEXT: ld1 { v6.s }[1], [x9] 1166; CHECK-SD-NEXT: ld1 { v7.s }[1], [x10] 1167; CHECK-SD-NEXT: ushll v2.2d, v2.2s, #0 1168; CHECK-SD-NEXT: ushll v1.2d, v1.2s, #0 1169; CHECK-SD-NEXT: ushll v0.2d, v0.2s, #0 1170; CHECK-SD-NEXT: ushll v3.2d, v3.2s, #0 1171; CHECK-SD-NEXT: ushll v4.2d, v4.2s, #0 1172; CHECK-SD-NEXT: ushll v5.2d, v5.2s, #0 1173; CHECK-SD-NEXT: ushll v6.2d, v6.2s, #0 1174; CHECK-SD-NEXT: ushll v7.2d, v7.2s, #0 1175; CHECK-SD-NEXT: shl v17.2d, v2.2d, #54 1176; CHECK-SD-NEXT: shl v1.2d, v1.2d, #54 1177; CHECK-SD-NEXT: shl v16.2d, v0.2d, #54 1178; CHECK-SD-NEXT: shl v3.2d, v3.2d, #54 1179; CHECK-SD-NEXT: shl v4.2d, v4.2d, #54 1180; CHECK-SD-NEXT: shl v5.2d, v5.2d, #54 1181; CHECK-SD-NEXT: shl v6.2d, v6.2d, #54 1182; CHECK-SD-NEXT: shl v7.2d, v7.2d, #54 1183; CHECK-SD-NEXT: sshr v0.2d, v1.2d, #54 1184; CHECK-SD-NEXT: sshr v1.2d, v16.2d, #54 1185; CHECK-SD-NEXT: sshr v2.2d, v3.2d, #54 1186; CHECK-SD-NEXT: sshr v3.2d, v4.2d, #54 1187; CHECK-SD-NEXT: sshr v4.2d, v17.2d, #54 1188; CHECK-SD-NEXT: sshr v5.2d, v5.2d, #54 1189; CHECK-SD-NEXT: sshr v6.2d, v6.2d, #54 1190; CHECK-SD-NEXT: sshr v7.2d, v7.2d, #54 1191; CHECK-SD-NEXT: ret 1192; 1193; CHECK-GI-LABEL: sext_v16i10_v16i64: 1194; CHECK-GI: // %bb.0: // %entry 1195; CHECK-GI-NEXT: mov v1.s[0], w0 1196; CHECK-GI-NEXT: mov v2.s[0], w2 1197; CHECK-GI-NEXT: ldr s0, [sp] 1198; CHECK-GI-NEXT: mov v3.s[0], w4 1199; CHECK-GI-NEXT: mov v4.s[0], w6 1200; CHECK-GI-NEXT: ldr s5, [sp, #8] 1201; CHECK-GI-NEXT: ldr s6, [sp, #16] 1202; CHECK-GI-NEXT: ldr s7, [sp, #24] 1203; CHECK-GI-NEXT: ldr s16, [sp, #32] 1204; CHECK-GI-NEXT: ldr s17, [sp, #40] 1205; CHECK-GI-NEXT: ldr s18, [sp, #48] 1206; CHECK-GI-NEXT: ldr s19, [sp, #56] 1207; CHECK-GI-NEXT: mov v1.s[1], w1 1208; CHECK-GI-NEXT: mov v0.s[1], v5.s[0] 1209; CHECK-GI-NEXT: mov v2.s[1], w3 1210; CHECK-GI-NEXT: mov v3.s[1], w5 1211; CHECK-GI-NEXT: mov v4.s[1], w7 1212; CHECK-GI-NEXT: mov v6.s[1], v7.s[0] 1213; CHECK-GI-NEXT: mov v16.s[1], v17.s[0] 1214; CHECK-GI-NEXT: mov v18.s[1], v19.s[0] 1215; CHECK-GI-NEXT: ushll v0.2d, v0.2s, #0 1216; CHECK-GI-NEXT: ushll v1.2d, v1.2s, #0 1217; CHECK-GI-NEXT: ushll v2.2d, v2.2s, #0 1218; CHECK-GI-NEXT: ushll v3.2d, v3.2s, #0 1219; CHECK-GI-NEXT: ushll v4.2d, v4.2s, #0 1220; CHECK-GI-NEXT: ushll v5.2d, v6.2s, #0 1221; CHECK-GI-NEXT: ushll v6.2d, v16.2s, #0 1222; CHECK-GI-NEXT: ushll v7.2d, v18.2s, #0 1223; CHECK-GI-NEXT: shl v0.2d, v0.2d, #54 1224; CHECK-GI-NEXT: shl v1.2d, v1.2d, #54 1225; CHECK-GI-NEXT: shl v2.2d, v2.2d, #54 1226; CHECK-GI-NEXT: shl v3.2d, v3.2d, #54 1227; CHECK-GI-NEXT: shl v16.2d, v4.2d, #54 1228; CHECK-GI-NEXT: shl v5.2d, v5.2d, #54 1229; CHECK-GI-NEXT: shl v6.2d, v6.2d, #54 1230; CHECK-GI-NEXT: shl v7.2d, v7.2d, #54 1231; CHECK-GI-NEXT: sshr v4.2d, v0.2d, #54 1232; CHECK-GI-NEXT: sshr v0.2d, v1.2d, #54 1233; CHECK-GI-NEXT: sshr v1.2d, v2.2d, #54 1234; CHECK-GI-NEXT: sshr v2.2d, v3.2d, #54 1235; CHECK-GI-NEXT: sshr v3.2d, v16.2d, #54 1236; CHECK-GI-NEXT: sshr v5.2d, v5.2d, #54 1237; CHECK-GI-NEXT: sshr v6.2d, v6.2d, #54 1238; CHECK-GI-NEXT: sshr v7.2d, v7.2d, #54 1239; CHECK-GI-NEXT: ret 1240entry: 1241 %c = sext <16 x i10> %a to <16 x i64> 1242 ret <16 x i64> %c 1243} 1244