1268 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 22; RUN: llc -mtriple=aarch64 -verify-machineinstrs %s -o - 2>&1 | FileCheck %s --check-prefixes=CHECK,CHECK-SD3; RUN: llc -mtriple=aarch64 -global-isel -verify-machineinstrs %s -o - | FileCheck %s --check-prefixes=CHECK,CHECK-GI4 5define i16 @sext_i8_to_i16(i8 %a) {6; CHECK-LABEL: sext_i8_to_i16:7; CHECK: // %bb.0: // %entry8; CHECK-NEXT: sxtb w0, w09; CHECK-NEXT: ret10entry:11 %c = sext i8 %a to i1612 ret i16 %c13}14 15define i32 @sext_i8_to_i32(i8 %a) {16; CHECK-LABEL: sext_i8_to_i32:17; CHECK: // %bb.0: // %entry18; CHECK-NEXT: sxtb w0, w019; CHECK-NEXT: ret20entry:21 %c = sext i8 %a to i3222 ret i32 %c23}24 25define i64 @sext_i8_to_i64(i8 %a) {26; CHECK-LABEL: sext_i8_to_i64:27; CHECK: // %bb.0: // %entry28; CHECK-NEXT: // kill: def $w0 killed $w0 def $x029; CHECK-NEXT: sxtb x0, w030; CHECK-NEXT: ret31entry:32 %c = sext i8 %a to i6433 ret i64 %c34}35 36define i10 @sext_i8_to_i10(i8 %a) {37; CHECK-LABEL: sext_i8_to_i10:38; CHECK: // %bb.0: // %entry39; CHECK-NEXT: sxtb w0, w040; CHECK-NEXT: ret41entry:42 %c = sext i8 %a to i1043 ret i10 %c44}45 46define i32 @sext_i16_to_i32(i16 %a) {47; CHECK-LABEL: sext_i16_to_i32:48; CHECK: // %bb.0: // %entry49; CHECK-NEXT: sxth w0, w050; CHECK-NEXT: ret51entry:52 %c = sext i16 %a to i3253 ret i32 %c54}55 56define i64 @sext_i16_to_i64(i16 %a) {57; CHECK-LABEL: sext_i16_to_i64:58; CHECK: // %bb.0: // %entry59; CHECK-NEXT: // kill: def $w0 killed $w0 def $x060; CHECK-NEXT: sxth x0, w061; CHECK-NEXT: ret62entry:63 %c = sext i16 %a to i6464 ret i64 %c65}66 67define i64 @sext_i32_to_i64(i32 %a) {68; CHECK-LABEL: sext_i32_to_i64:69; CHECK: // %bb.0: // %entry70; CHECK-NEXT: // kill: def $w0 killed $w0 def $x071; CHECK-NEXT: sxtw x0, w072; CHECK-NEXT: ret73entry:74 %c = sext i32 %a to i6475 ret i64 %c76}77 78define i16 @sext_i10_to_i16(i10 %a) {79; CHECK-LABEL: sext_i10_to_i16:80; CHECK: // %bb.0: // %entry81; CHECK-NEXT: sbfx w0, w0, #0, #1082; CHECK-NEXT: ret83entry:84 %c = sext i10 %a to i1685 ret i16 %c86}87 88define i32 @sext_i10_to_i32(i10 %a) {89; CHECK-LABEL: sext_i10_to_i32:90; CHECK: // %bb.0: // %entry91; CHECK-NEXT: sbfx w0, w0, #0, #1092; CHECK-NEXT: ret93entry:94 %c = sext i10 %a to i3295 ret i32 %c96}97 98define i64 @sext_i10_to_i64(i10 %a) {99; CHECK-LABEL: sext_i10_to_i64:100; CHECK: // %bb.0: // %entry101; CHECK-NEXT: // kill: def $w0 killed $w0 def $x0102; CHECK-NEXT: sbfx x0, x0, #0, #10103; CHECK-NEXT: ret104entry:105 %c = sext i10 %a to i64106 ret i64 %c107}108 109define <2 x i16> @sext_v2i8_v2i16(<2 x i8> %a) {110; CHECK-LABEL: sext_v2i8_v2i16:111; CHECK: // %bb.0: // %entry112; CHECK-NEXT: shl v0.2s, v0.2s, #24113; CHECK-NEXT: sshr v0.2s, v0.2s, #24114; CHECK-NEXT: ret115entry:116 %c = sext <2 x i8> %a to <2 x i16>117 ret <2 x i16> %c118}119 120define <2 x i32> @sext_v2i8_v2i32(<2 x i8> %a) {121; CHECK-LABEL: sext_v2i8_v2i32:122; CHECK: // %bb.0: // %entry123; CHECK-NEXT: shl v0.2s, v0.2s, #24124; CHECK-NEXT: sshr v0.2s, v0.2s, #24125; CHECK-NEXT: ret126entry:127 %c = sext <2 x i8> %a to <2 x i32>128 ret <2 x i32> %c129}130 131define <2 x i64> @sext_v2i8_v2i64(<2 x i8> %a) {132; CHECK-LABEL: sext_v2i8_v2i64:133; CHECK: // %bb.0: // %entry134; CHECK-NEXT: ushll v0.2d, v0.2s, #0135; CHECK-NEXT: shl v0.2d, v0.2d, #56136; CHECK-NEXT: sshr v0.2d, v0.2d, #56137; CHECK-NEXT: ret138entry:139 %c = sext <2 x i8> %a to <2 x i64>140 ret <2 x i64> %c141}142 143define <2 x i32> @sext_v2i16_v2i32(<2 x i16> %a) {144; CHECK-LABEL: sext_v2i16_v2i32:145; CHECK: // %bb.0: // %entry146; CHECK-NEXT: shl v0.2s, v0.2s, #16147; CHECK-NEXT: sshr v0.2s, v0.2s, #16148; CHECK-NEXT: ret149entry:150 %c = sext <2 x i16> %a to <2 x i32>151 ret <2 x i32> %c152}153 154define <2 x i64> @sext_v2i16_v2i64(<2 x i16> %a) {155; CHECK-LABEL: sext_v2i16_v2i64:156; CHECK: // %bb.0: // %entry157; CHECK-NEXT: ushll v0.2d, v0.2s, #0158; CHECK-NEXT: shl v0.2d, v0.2d, #48159; CHECK-NEXT: sshr v0.2d, v0.2d, #48160; CHECK-NEXT: ret161entry:162 %c = sext <2 x i16> %a to <2 x i64>163 ret <2 x i64> %c164}165 166define <2 x i64> @sext_v2i32_v2i64(<2 x i32> %a) {167; CHECK-LABEL: sext_v2i32_v2i64:168; CHECK: // %bb.0: // %entry169; CHECK-NEXT: sshll v0.2d, v0.2s, #0170; CHECK-NEXT: ret171entry:172 %c = sext <2 x i32> %a to <2 x i64>173 ret <2 x i64> %c174}175 176define <2 x i16> @sext_v2i10_v2i16(<2 x i10> %a) {177; CHECK-LABEL: sext_v2i10_v2i16:178; CHECK: // %bb.0: // %entry179; CHECK-NEXT: shl v0.2s, v0.2s, #22180; CHECK-NEXT: sshr v0.2s, v0.2s, #22181; CHECK-NEXT: ret182entry:183 %c = sext <2 x i10> %a to <2 x i16>184 ret <2 x i16> %c185}186 187define <2 x i32> @sext_v2i10_v2i32(<2 x i10> %a) {188; CHECK-LABEL: sext_v2i10_v2i32:189; CHECK: // %bb.0: // %entry190; CHECK-NEXT: shl v0.2s, v0.2s, #22191; CHECK-NEXT: sshr v0.2s, v0.2s, #22192; CHECK-NEXT: ret193entry:194 %c = sext <2 x i10> %a to <2 x i32>195 ret <2 x i32> %c196}197 198define <2 x i64> @sext_v2i10_v2i64(<2 x i10> %a) {199; CHECK-LABEL: sext_v2i10_v2i64:200; CHECK: // %bb.0: // %entry201; CHECK-NEXT: ushll v0.2d, v0.2s, #0202; CHECK-NEXT: shl v0.2d, v0.2d, #54203; CHECK-NEXT: sshr v0.2d, v0.2d, #54204; CHECK-NEXT: ret205entry:206 %c = sext <2 x i10> %a to <2 x i64>207 ret <2 x i64> %c208}209 210define <3 x i16> @sext_v3i8_v3i16(<3 x i8> %a) {211; CHECK-SD-LABEL: sext_v3i8_v3i16:212; CHECK-SD: // %bb.0: // %entry213; CHECK-SD-NEXT: fmov s0, w0214; CHECK-SD-NEXT: mov v0.h[1], w1215; CHECK-SD-NEXT: mov v0.h[2], w2216; CHECK-SD-NEXT: shl v0.4h, v0.4h, #8217; CHECK-SD-NEXT: sshr v0.4h, v0.4h, #8218; CHECK-SD-NEXT: ret219;220; CHECK-GI-LABEL: sext_v3i8_v3i16:221; CHECK-GI: // %bb.0: // %entry222; CHECK-GI-NEXT: lsl w8, w0, #8223; CHECK-GI-NEXT: lsl w9, w1, #8224; CHECK-GI-NEXT: sbfx w8, w8, #8, #8225; CHECK-GI-NEXT: sbfx w9, w9, #8, #8226; CHECK-GI-NEXT: fmov s0, w8227; CHECK-GI-NEXT: lsl w8, w2, #8228; CHECK-GI-NEXT: sbfx w8, w8, #8, #8229; CHECK-GI-NEXT: mov v0.h[1], w9230; CHECK-GI-NEXT: mov v0.h[2], w8231; CHECK-GI-NEXT: // kill: def $d0 killed $d0 killed $q0232; CHECK-GI-NEXT: ret233entry:234 %c = sext <3 x i8> %a to <3 x i16>235 ret <3 x i16> %c236}237 238define <3 x i32> @sext_v3i8_v3i32(<3 x i8> %a) {239; CHECK-SD-LABEL: sext_v3i8_v3i32:240; CHECK-SD: // %bb.0: // %entry241; CHECK-SD-NEXT: fmov s0, w0242; CHECK-SD-NEXT: mov v0.h[1], w1243; CHECK-SD-NEXT: mov v0.h[2], w2244; CHECK-SD-NEXT: ushll v0.4s, v0.4h, #0245; CHECK-SD-NEXT: shl v0.4s, v0.4s, #24246; CHECK-SD-NEXT: sshr v0.4s, v0.4s, #24247; CHECK-SD-NEXT: ret248;249; CHECK-GI-LABEL: sext_v3i8_v3i32:250; CHECK-GI: // %bb.0: // %entry251; CHECK-GI-NEXT: sxtb w8, w0252; CHECK-GI-NEXT: sxtb w9, w1253; CHECK-GI-NEXT: fmov s0, w8254; CHECK-GI-NEXT: sxtb w8, w2255; CHECK-GI-NEXT: mov v0.s[1], w9256; CHECK-GI-NEXT: mov v0.s[2], w8257; CHECK-GI-NEXT: ret258entry:259 %c = sext <3 x i8> %a to <3 x i32>260 ret <3 x i32> %c261}262 263define <3 x i64> @sext_v3i8_v3i64(<3 x i8> %a) {264; CHECK-SD-LABEL: sext_v3i8_v3i64:265; CHECK-SD: // %bb.0: // %entry266; CHECK-SD-NEXT: fmov s0, w0267; CHECK-SD-NEXT: fmov s1, w2268; CHECK-SD-NEXT: mov v0.s[1], w1269; CHECK-SD-NEXT: ushll v1.2d, v1.2s, #0270; CHECK-SD-NEXT: shl v2.2d, v1.2d, #56271; CHECK-SD-NEXT: ushll v0.2d, v0.2s, #0272; CHECK-SD-NEXT: sshr v2.2d, v2.2d, #56273; CHECK-SD-NEXT: shl v0.2d, v0.2d, #56274; CHECK-SD-NEXT: // kill: def $d2 killed $d2 killed $q2275; CHECK-SD-NEXT: sshr v0.2d, v0.2d, #56276; CHECK-SD-NEXT: ext v1.16b, v0.16b, v0.16b, #8277; CHECK-SD-NEXT: // kill: def $d0 killed $d0 killed $q0278; CHECK-SD-NEXT: // kill: def $d1 killed $d1 killed $q1279; CHECK-SD-NEXT: ret280;281; CHECK-GI-LABEL: sext_v3i8_v3i64:282; CHECK-GI: // %bb.0: // %entry283; CHECK-GI-NEXT: // kill: def $w0 killed $w0 def $x0284; CHECK-GI-NEXT: // kill: def $w1 killed $w1 def $x1285; CHECK-GI-NEXT: // kill: def $w2 killed $w2 def $x2286; CHECK-GI-NEXT: sxtb x8, w0287; CHECK-GI-NEXT: sxtb x9, w1288; CHECK-GI-NEXT: sxtb x10, w2289; CHECK-GI-NEXT: fmov d0, x8290; CHECK-GI-NEXT: fmov d1, x9291; CHECK-GI-NEXT: fmov d2, x10292; CHECK-GI-NEXT: ret293entry:294 %c = sext <3 x i8> %a to <3 x i64>295 ret <3 x i64> %c296}297 298define <3 x i32> @sext_v3i16_v3i32(<3 x i16> %a) {299; CHECK-SD-LABEL: sext_v3i16_v3i32:300; CHECK-SD: // %bb.0: // %entry301; CHECK-SD-NEXT: sshll v0.4s, v0.4h, #0302; CHECK-SD-NEXT: ret303;304; CHECK-GI-LABEL: sext_v3i16_v3i32:305; CHECK-GI: // %bb.0: // %entry306; CHECK-GI-NEXT: // kill: def $d0 killed $d0 def $q0307; CHECK-GI-NEXT: smov w8, v0.h[0]308; CHECK-GI-NEXT: smov w9, v0.h[1]309; CHECK-GI-NEXT: fmov s1, w8310; CHECK-GI-NEXT: smov w8, v0.h[2]311; CHECK-GI-NEXT: mov v1.s[1], w9312; CHECK-GI-NEXT: mov v1.s[2], w8313; CHECK-GI-NEXT: mov v0.16b, v1.16b314; CHECK-GI-NEXT: ret315entry:316 %c = sext <3 x i16> %a to <3 x i32>317 ret <3 x i32> %c318}319 320define <3 x i64> @sext_v3i16_v3i64(<3 x i16> %a) {321; CHECK-SD-LABEL: sext_v3i16_v3i64:322; CHECK-SD: // %bb.0: // %entry323; CHECK-SD-NEXT: sshll v2.4s, v0.4h, #0324; CHECK-SD-NEXT: sshll v0.2d, v2.2s, #0325; CHECK-SD-NEXT: sshll2 v2.2d, v2.4s, #0326; CHECK-SD-NEXT: // kill: def $d2 killed $d2 killed $q2327; CHECK-SD-NEXT: ext v1.16b, v0.16b, v0.16b, #8328; CHECK-SD-NEXT: // kill: def $d0 killed $d0 killed $q0329; CHECK-SD-NEXT: // kill: def $d1 killed $d1 killed $q1330; CHECK-SD-NEXT: ret331;332; CHECK-GI-LABEL: sext_v3i16_v3i64:333; CHECK-GI: // %bb.0: // %entry334; CHECK-GI-NEXT: // kill: def $d0 killed $d0 def $q0335; 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, x8339; CHECK-GI-NEXT: fmov d1, x9340; CHECK-GI-NEXT: fmov d2, x10341; CHECK-GI-NEXT: ret342entry:343 %c = sext <3 x i16> %a to <3 x i64>344 ret <3 x i64> %c345}346 347define <3 x i64> @sext_v3i32_v3i64(<3 x i32> %a) {348; CHECK-SD-LABEL: sext_v3i32_v3i64:349; CHECK-SD: // %bb.0: // %entry350; CHECK-SD-NEXT: sshll v3.2d, v0.2s, #0351; CHECK-SD-NEXT: sshll2 v2.2d, v0.4s, #0352; CHECK-SD-NEXT: // kill: def $d2 killed $d2 killed $q2353; CHECK-SD-NEXT: fmov d0, d3354; CHECK-SD-NEXT: ext v1.16b, v3.16b, v3.16b, #8355; CHECK-SD-NEXT: // kill: def $d1 killed $d1 killed $q1356; CHECK-SD-NEXT: ret357;358; CHECK-GI-LABEL: sext_v3i32_v3i64:359; CHECK-GI: // %bb.0: // %entry360; 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, x8364; CHECK-GI-NEXT: fmov d1, x9365; CHECK-GI-NEXT: fmov d2, x10366; CHECK-GI-NEXT: ret367entry:368 %c = sext <3 x i32> %a to <3 x i64>369 ret <3 x i64> %c370}371 372define <3 x i16> @sext_v3i10_v3i16(<3 x i10> %a) {373; CHECK-SD-LABEL: sext_v3i10_v3i16:374; CHECK-SD: // %bb.0: // %entry375; CHECK-SD-NEXT: fmov s0, w0376; CHECK-SD-NEXT: mov v0.h[1], w1377; CHECK-SD-NEXT: mov v0.h[2], w2378; CHECK-SD-NEXT: shl v0.4h, v0.4h, #6379; CHECK-SD-NEXT: sshr v0.4h, v0.4h, #6380; CHECK-SD-NEXT: ret381;382; CHECK-GI-LABEL: sext_v3i10_v3i16:383; CHECK-GI: // %bb.0: // %entry384; CHECK-GI-NEXT: lsl w8, w0, #6385; CHECK-GI-NEXT: lsl w9, w1, #6386; CHECK-GI-NEXT: sbfx w8, w8, #6, #10387; CHECK-GI-NEXT: sbfx w9, w9, #6, #10388; CHECK-GI-NEXT: fmov s0, w8389; CHECK-GI-NEXT: lsl w8, w2, #6390; CHECK-GI-NEXT: sbfx w8, w8, #6, #10391; CHECK-GI-NEXT: mov v0.h[1], w9392; CHECK-GI-NEXT: mov v0.h[2], w8393; CHECK-GI-NEXT: // kill: def $d0 killed $d0 killed $q0394; CHECK-GI-NEXT: ret395entry:396 %c = sext <3 x i10> %a to <3 x i16>397 ret <3 x i16> %c398}399 400define <3 x i32> @sext_v3i10_v3i32(<3 x i10> %a) {401; CHECK-SD-LABEL: sext_v3i10_v3i32:402; CHECK-SD: // %bb.0: // %entry403; CHECK-SD-NEXT: fmov s0, w0404; CHECK-SD-NEXT: mov v0.h[1], w1405; CHECK-SD-NEXT: mov v0.h[2], w2406; CHECK-SD-NEXT: ushll v0.4s, v0.4h, #0407; CHECK-SD-NEXT: shl v0.4s, v0.4s, #22408; CHECK-SD-NEXT: sshr v0.4s, v0.4s, #22409; CHECK-SD-NEXT: ret410;411; CHECK-GI-LABEL: sext_v3i10_v3i32:412; CHECK-GI: // %bb.0: // %entry413; CHECK-GI-NEXT: sbfx w8, w0, #0, #10414; CHECK-GI-NEXT: sbfx w9, w1, #0, #10415; CHECK-GI-NEXT: fmov s0, w8416; CHECK-GI-NEXT: sbfx w8, w2, #0, #10417; CHECK-GI-NEXT: mov v0.s[1], w9418; CHECK-GI-NEXT: mov v0.s[2], w8419; CHECK-GI-NEXT: ret420entry:421 %c = sext <3 x i10> %a to <3 x i32>422 ret <3 x i32> %c423}424 425define <3 x i64> @sext_v3i10_v3i64(<3 x i10> %a) {426; CHECK-SD-LABEL: sext_v3i10_v3i64:427; CHECK-SD: // %bb.0: // %entry428; CHECK-SD-NEXT: fmov s0, w0429; CHECK-SD-NEXT: fmov s1, w2430; CHECK-SD-NEXT: mov v0.s[1], w1431; CHECK-SD-NEXT: ushll v1.2d, v1.2s, #0432; CHECK-SD-NEXT: shl v2.2d, v1.2d, #54433; CHECK-SD-NEXT: ushll v0.2d, v0.2s, #0434; CHECK-SD-NEXT: sshr v2.2d, v2.2d, #54435; CHECK-SD-NEXT: shl v0.2d, v0.2d, #54436; CHECK-SD-NEXT: // kill: def $d2 killed $d2 killed $q2437; CHECK-SD-NEXT: sshr v0.2d, v0.2d, #54438; CHECK-SD-NEXT: ext v1.16b, v0.16b, v0.16b, #8439; CHECK-SD-NEXT: // kill: def $d0 killed $d0 killed $q0440; CHECK-SD-NEXT: // kill: def $d1 killed $d1 killed $q1441; CHECK-SD-NEXT: ret442;443; CHECK-GI-LABEL: sext_v3i10_v3i64:444; CHECK-GI: // %bb.0: // %entry445; CHECK-GI-NEXT: // kill: def $w0 killed $w0 def $x0446; CHECK-GI-NEXT: // kill: def $w1 killed $w1 def $x1447; CHECK-GI-NEXT: // kill: def $w2 killed $w2 def $x2448; CHECK-GI-NEXT: sbfx x8, x0, #0, #10449; CHECK-GI-NEXT: sbfx x9, x1, #0, #10450; CHECK-GI-NEXT: sbfx x10, x2, #0, #10451; CHECK-GI-NEXT: fmov d0, x8452; CHECK-GI-NEXT: fmov d1, x9453; CHECK-GI-NEXT: fmov d2, x10454; CHECK-GI-NEXT: ret455entry:456 %c = sext <3 x i10> %a to <3 x i64>457 ret <3 x i64> %c458}459 460define <4 x i16> @sext_v4i8_v4i16(<4 x i8> %a) {461; CHECK-LABEL: sext_v4i8_v4i16:462; CHECK: // %bb.0: // %entry463; CHECK-NEXT: shl v0.4h, v0.4h, #8464; CHECK-NEXT: sshr v0.4h, v0.4h, #8465; CHECK-NEXT: ret466entry:467 %c = sext <4 x i8> %a to <4 x i16>468 ret <4 x i16> %c469}470 471define <4 x i32> @sext_v4i8_v4i32(<4 x i8> %a) {472; CHECK-LABEL: sext_v4i8_v4i32:473; CHECK: // %bb.0: // %entry474; CHECK-NEXT: ushll v0.4s, v0.4h, #0475; CHECK-NEXT: shl v0.4s, v0.4s, #24476; CHECK-NEXT: sshr v0.4s, v0.4s, #24477; CHECK-NEXT: ret478entry:479 %c = sext <4 x i8> %a to <4 x i32>480 ret <4 x i32> %c481}482 483define <4 x i64> @sext_v4i8_v4i64(<4 x i8> %a) {484; CHECK-SD-LABEL: sext_v4i8_v4i64:485; CHECK-SD: // %bb.0: // %entry486; CHECK-SD-NEXT: ushll v0.4s, v0.4h, #0487; CHECK-SD-NEXT: ushll v1.2d, v0.2s, #0488; CHECK-SD-NEXT: ushll2 v0.2d, v0.4s, #0489; CHECK-SD-NEXT: shl v0.2d, v0.2d, #56490; CHECK-SD-NEXT: shl v2.2d, v1.2d, #56491; CHECK-SD-NEXT: sshr v1.2d, v0.2d, #56492; CHECK-SD-NEXT: sshr v0.2d, v2.2d, #56493; CHECK-SD-NEXT: ret494;495; CHECK-GI-LABEL: sext_v4i8_v4i64:496; CHECK-GI: // %bb.0: // %entry497; CHECK-GI-NEXT: ushll v0.4s, v0.4h, #0498; CHECK-GI-NEXT: ushll v1.2d, v0.2s, #0499; CHECK-GI-NEXT: ushll2 v0.2d, v0.4s, #0500; CHECK-GI-NEXT: shl v1.2d, v1.2d, #56501; CHECK-GI-NEXT: shl v2.2d, v0.2d, #56502; CHECK-GI-NEXT: sshr v0.2d, v1.2d, #56503; CHECK-GI-NEXT: sshr v1.2d, v2.2d, #56504; CHECK-GI-NEXT: ret505entry:506 %c = sext <4 x i8> %a to <4 x i64>507 ret <4 x i64> %c508}509 510define <4 x i32> @sext_v4i16_v4i32(<4 x i16> %a) {511; CHECK-LABEL: sext_v4i16_v4i32:512; CHECK: // %bb.0: // %entry513; CHECK-NEXT: sshll v0.4s, v0.4h, #0514; CHECK-NEXT: ret515entry:516 %c = sext <4 x i16> %a to <4 x i32>517 ret <4 x i32> %c518}519 520define <4 x i64> @sext_v4i16_v4i64(<4 x i16> %a) {521; CHECK-SD-LABEL: sext_v4i16_v4i64:522; CHECK-SD: // %bb.0: // %entry523; CHECK-SD-NEXT: sshll v0.4s, v0.4h, #0524; CHECK-SD-NEXT: sshll2 v1.2d, v0.4s, #0525; CHECK-SD-NEXT: sshll v0.2d, v0.2s, #0526; CHECK-SD-NEXT: ret527;528; CHECK-GI-LABEL: sext_v4i16_v4i64:529; CHECK-GI: // %bb.0: // %entry530; CHECK-GI-NEXT: sshll v1.4s, v0.4h, #0531; CHECK-GI-NEXT: sshll v0.2d, v1.2s, #0532; CHECK-GI-NEXT: sshll2 v1.2d, v1.4s, #0533; CHECK-GI-NEXT: ret534entry:535 %c = sext <4 x i16> %a to <4 x i64>536 ret <4 x i64> %c537}538 539define <4 x i64> @sext_v4i32_v4i64(<4 x i32> %a) {540; CHECK-SD-LABEL: sext_v4i32_v4i64:541; CHECK-SD: // %bb.0: // %entry542; CHECK-SD-NEXT: sshll2 v1.2d, v0.4s, #0543; CHECK-SD-NEXT: sshll v0.2d, v0.2s, #0544; CHECK-SD-NEXT: ret545;546; CHECK-GI-LABEL: sext_v4i32_v4i64:547; CHECK-GI: // %bb.0: // %entry548; CHECK-GI-NEXT: sshll v2.2d, v0.2s, #0549; CHECK-GI-NEXT: sshll2 v1.2d, v0.4s, #0550; CHECK-GI-NEXT: mov v0.16b, v2.16b551; CHECK-GI-NEXT: ret552entry:553 %c = sext <4 x i32> %a to <4 x i64>554 ret <4 x i64> %c555}556 557define <4 x i16> @sext_v4i10_v4i16(<4 x i10> %a) {558; CHECK-LABEL: sext_v4i10_v4i16:559; CHECK: // %bb.0: // %entry560; CHECK-NEXT: shl v0.4h, v0.4h, #6561; CHECK-NEXT: sshr v0.4h, v0.4h, #6562; CHECK-NEXT: ret563entry:564 %c = sext <4 x i10> %a to <4 x i16>565 ret <4 x i16> %c566}567 568define <4 x i32> @sext_v4i10_v4i32(<4 x i10> %a) {569; CHECK-LABEL: sext_v4i10_v4i32:570; CHECK: // %bb.0: // %entry571; CHECK-NEXT: ushll v0.4s, v0.4h, #0572; CHECK-NEXT: shl v0.4s, v0.4s, #22573; CHECK-NEXT: sshr v0.4s, v0.4s, #22574; CHECK-NEXT: ret575entry:576 %c = sext <4 x i10> %a to <4 x i32>577 ret <4 x i32> %c578}579 580define <4 x i64> @sext_v4i10_v4i64(<4 x i10> %a) {581; CHECK-SD-LABEL: sext_v4i10_v4i64:582; CHECK-SD: // %bb.0: // %entry583; CHECK-SD-NEXT: ushll v0.4s, v0.4h, #0584; CHECK-SD-NEXT: ushll v1.2d, v0.2s, #0585; CHECK-SD-NEXT: ushll2 v0.2d, v0.4s, #0586; CHECK-SD-NEXT: shl v0.2d, v0.2d, #54587; CHECK-SD-NEXT: shl v2.2d, v1.2d, #54588; CHECK-SD-NEXT: sshr v1.2d, v0.2d, #54589; CHECK-SD-NEXT: sshr v0.2d, v2.2d, #54590; CHECK-SD-NEXT: ret591;592; CHECK-GI-LABEL: sext_v4i10_v4i64:593; CHECK-GI: // %bb.0: // %entry594; CHECK-GI-NEXT: ushll v0.4s, v0.4h, #0595; CHECK-GI-NEXT: ushll v1.2d, v0.2s, #0596; CHECK-GI-NEXT: ushll2 v0.2d, v0.4s, #0597; CHECK-GI-NEXT: shl v1.2d, v1.2d, #54598; CHECK-GI-NEXT: shl v2.2d, v0.2d, #54599; CHECK-GI-NEXT: sshr v0.2d, v1.2d, #54600; CHECK-GI-NEXT: sshr v1.2d, v2.2d, #54601; CHECK-GI-NEXT: ret602entry:603 %c = sext <4 x i10> %a to <4 x i64>604 ret <4 x i64> %c605}606 607define <8 x i16> @sext_v8i8_v8i16(<8 x i8> %a) {608; CHECK-LABEL: sext_v8i8_v8i16:609; CHECK: // %bb.0: // %entry610; CHECK-NEXT: sshll v0.8h, v0.8b, #0611; CHECK-NEXT: ret612entry:613 %c = sext <8 x i8> %a to <8 x i16>614 ret <8 x i16> %c615}616 617define <8 x i32> @sext_v8i8_v8i32(<8 x i8> %a) {618; CHECK-SD-LABEL: sext_v8i8_v8i32:619; CHECK-SD: // %bb.0: // %entry620; CHECK-SD-NEXT: sshll v0.8h, v0.8b, #0621; CHECK-SD-NEXT: sshll2 v1.4s, v0.8h, #0622; CHECK-SD-NEXT: sshll v0.4s, v0.4h, #0623; CHECK-SD-NEXT: ret624;625; CHECK-GI-LABEL: sext_v8i8_v8i32:626; CHECK-GI: // %bb.0: // %entry627; CHECK-GI-NEXT: sshll v1.8h, v0.8b, #0628; CHECK-GI-NEXT: sshll v0.4s, v1.4h, #0629; CHECK-GI-NEXT: sshll2 v1.4s, v1.8h, #0630; CHECK-GI-NEXT: ret631entry:632 %c = sext <8 x i8> %a to <8 x i32>633 ret <8 x i32> %c634}635 636define <8 x i64> @sext_v8i8_v8i64(<8 x i8> %a) {637; CHECK-SD-LABEL: sext_v8i8_v8i64:638; CHECK-SD: // %bb.0: // %entry639; CHECK-SD-NEXT: sshll v0.8h, v0.8b, #0640; CHECK-SD-NEXT: sshll v1.4s, v0.4h, #0641; CHECK-SD-NEXT: sshll2 v2.4s, v0.8h, #0642; CHECK-SD-NEXT: sshll v0.2d, v1.2s, #0643; CHECK-SD-NEXT: sshll2 v3.2d, v2.4s, #0644; CHECK-SD-NEXT: sshll2 v1.2d, v1.4s, #0645; CHECK-SD-NEXT: sshll v2.2d, v2.2s, #0646; CHECK-SD-NEXT: ret647;648; CHECK-GI-LABEL: sext_v8i8_v8i64:649; CHECK-GI: // %bb.0: // %entry650; CHECK-GI-NEXT: sshll v0.8h, v0.8b, #0651; CHECK-GI-NEXT: sshll v1.4s, v0.4h, #0652; CHECK-GI-NEXT: sshll2 v3.4s, v0.8h, #0653; CHECK-GI-NEXT: sshll v0.2d, v1.2s, #0654; CHECK-GI-NEXT: sshll2 v1.2d, v1.4s, #0655; CHECK-GI-NEXT: sshll v2.2d, v3.2s, #0656; CHECK-GI-NEXT: sshll2 v3.2d, v3.4s, #0657; CHECK-GI-NEXT: ret658entry:659 %c = sext <8 x i8> %a to <8 x i64>660 ret <8 x i64> %c661}662 663define <8 x i32> @sext_v8i16_v8i32(<8 x i16> %a) {664; CHECK-SD-LABEL: sext_v8i16_v8i32:665; CHECK-SD: // %bb.0: // %entry666; CHECK-SD-NEXT: sshll2 v1.4s, v0.8h, #0667; CHECK-SD-NEXT: sshll v0.4s, v0.4h, #0668; CHECK-SD-NEXT: ret669;670; CHECK-GI-LABEL: sext_v8i16_v8i32:671; CHECK-GI: // %bb.0: // %entry672; CHECK-GI-NEXT: sshll v2.4s, v0.4h, #0673; CHECK-GI-NEXT: sshll2 v1.4s, v0.8h, #0674; CHECK-GI-NEXT: mov v0.16b, v2.16b675; CHECK-GI-NEXT: ret676entry:677 %c = sext <8 x i16> %a to <8 x i32>678 ret <8 x i32> %c679}680 681define <8 x i64> @sext_v8i16_v8i64(<8 x i16> %a) {682; CHECK-SD-LABEL: sext_v8i16_v8i64:683; CHECK-SD: // %bb.0: // %entry684; CHECK-SD-NEXT: sshll v1.4s, v0.4h, #0685; CHECK-SD-NEXT: sshll2 v2.4s, v0.8h, #0686; CHECK-SD-NEXT: sshll v0.2d, v1.2s, #0687; CHECK-SD-NEXT: sshll2 v3.2d, v2.4s, #0688; CHECK-SD-NEXT: sshll2 v1.2d, v1.4s, #0689; CHECK-SD-NEXT: sshll v2.2d, v2.2s, #0690; CHECK-SD-NEXT: ret691;692; CHECK-GI-LABEL: sext_v8i16_v8i64:693; CHECK-GI: // %bb.0: // %entry694; CHECK-GI-NEXT: sshll v1.4s, v0.4h, #0695; CHECK-GI-NEXT: sshll2 v3.4s, v0.8h, #0696; CHECK-GI-NEXT: sshll v0.2d, v1.2s, #0697; CHECK-GI-NEXT: sshll2 v1.2d, v1.4s, #0698; CHECK-GI-NEXT: sshll v2.2d, v3.2s, #0699; CHECK-GI-NEXT: sshll2 v3.2d, v3.4s, #0700; CHECK-GI-NEXT: ret701entry:702 %c = sext <8 x i16> %a to <8 x i64>703 ret <8 x i64> %c704}705 706define <8 x i64> @sext_v8i32_v8i64(<8 x i32> %a) {707; CHECK-SD-LABEL: sext_v8i32_v8i64:708; CHECK-SD: // %bb.0: // %entry709; CHECK-SD-NEXT: sshll v5.2d, v0.2s, #0710; CHECK-SD-NEXT: sshll2 v4.2d, v0.4s, #0711; CHECK-SD-NEXT: sshll2 v3.2d, v1.4s, #0712; CHECK-SD-NEXT: sshll v2.2d, v1.2s, #0713; CHECK-SD-NEXT: mov v0.16b, v5.16b714; CHECK-SD-NEXT: mov v1.16b, v4.16b715; CHECK-SD-NEXT: ret716;717; CHECK-GI-LABEL: sext_v8i32_v8i64:718; CHECK-GI: // %bb.0: // %entry719; CHECK-GI-NEXT: sshll v4.2d, v0.2s, #0720; CHECK-GI-NEXT: sshll2 v5.2d, v0.4s, #0721; CHECK-GI-NEXT: sshll v2.2d, v1.2s, #0722; CHECK-GI-NEXT: sshll2 v3.2d, v1.4s, #0723; CHECK-GI-NEXT: mov v0.16b, v4.16b724; CHECK-GI-NEXT: mov v1.16b, v5.16b725; CHECK-GI-NEXT: ret726entry:727 %c = sext <8 x i32> %a to <8 x i64>728 ret <8 x i64> %c729}730 731define <8 x i16> @sext_v8i10_v8i16(<8 x i10> %a) {732; CHECK-LABEL: sext_v8i10_v8i16:733; CHECK: // %bb.0: // %entry734; CHECK-NEXT: shl v0.8h, v0.8h, #6735; CHECK-NEXT: sshr v0.8h, v0.8h, #6736; CHECK-NEXT: ret737entry:738 %c = sext <8 x i10> %a to <8 x i16>739 ret <8 x i16> %c740}741 742define <8 x i32> @sext_v8i10_v8i32(<8 x i10> %a) {743; CHECK-SD-LABEL: sext_v8i10_v8i32:744; CHECK-SD: // %bb.0: // %entry745; CHECK-SD-NEXT: ushll v1.4s, v0.4h, #0746; CHECK-SD-NEXT: ushll2 v0.4s, v0.8h, #0747; CHECK-SD-NEXT: shl v0.4s, v0.4s, #22748; CHECK-SD-NEXT: shl v2.4s, v1.4s, #22749; CHECK-SD-NEXT: sshr v1.4s, v0.4s, #22750; CHECK-SD-NEXT: sshr v0.4s, v2.4s, #22751; CHECK-SD-NEXT: ret752;753; CHECK-GI-LABEL: sext_v8i10_v8i32:754; CHECK-GI: // %bb.0: // %entry755; CHECK-GI-NEXT: ushll v1.4s, v0.4h, #0756; CHECK-GI-NEXT: ushll2 v0.4s, v0.8h, #0757; CHECK-GI-NEXT: shl v1.4s, v1.4s, #22758; CHECK-GI-NEXT: shl v2.4s, v0.4s, #22759; CHECK-GI-NEXT: sshr v0.4s, v1.4s, #22760; CHECK-GI-NEXT: sshr v1.4s, v2.4s, #22761; CHECK-GI-NEXT: ret762entry:763 %c = sext <8 x i10> %a to <8 x i32>764 ret <8 x i32> %c765}766 767define <8 x i64> @sext_v8i10_v8i64(<8 x i10> %a) {768; CHECK-SD-LABEL: sext_v8i10_v8i64:769; CHECK-SD: // %bb.0: // %entry770; CHECK-SD-NEXT: ushll v1.4s, v0.4h, #0771; CHECK-SD-NEXT: ushll2 v0.4s, v0.8h, #0772; CHECK-SD-NEXT: ushll v2.2d, v1.2s, #0773; CHECK-SD-NEXT: ushll v3.2d, v0.2s, #0774; CHECK-SD-NEXT: ushll2 v1.2d, v1.4s, #0775; CHECK-SD-NEXT: ushll2 v0.2d, v0.4s, #0776; CHECK-SD-NEXT: shl v2.2d, v2.2d, #54777; CHECK-SD-NEXT: shl v1.2d, v1.2d, #54778; CHECK-SD-NEXT: shl v5.2d, v3.2d, #54779; CHECK-SD-NEXT: shl v4.2d, v0.2d, #54780; CHECK-SD-NEXT: sshr v0.2d, v2.2d, #54781; CHECK-SD-NEXT: sshr v1.2d, v1.2d, #54782; CHECK-SD-NEXT: sshr v2.2d, v5.2d, #54783; CHECK-SD-NEXT: sshr v3.2d, v4.2d, #54784; CHECK-SD-NEXT: ret785;786; CHECK-GI-LABEL: sext_v8i10_v8i64:787; CHECK-GI: // %bb.0: // %entry788; CHECK-GI-NEXT: ushll v1.4s, v0.4h, #0789; CHECK-GI-NEXT: ushll2 v0.4s, v0.8h, #0790; CHECK-GI-NEXT: ushll v2.2d, v1.2s, #0791; CHECK-GI-NEXT: ushll2 v1.2d, v1.4s, #0792; CHECK-GI-NEXT: ushll v3.2d, v0.2s, #0793; CHECK-GI-NEXT: ushll2 v0.2d, v0.4s, #0794; CHECK-GI-NEXT: shl v2.2d, v2.2d, #54795; CHECK-GI-NEXT: shl v1.2d, v1.2d, #54796; CHECK-GI-NEXT: shl v3.2d, v3.2d, #54797; CHECK-GI-NEXT: shl v4.2d, v0.2d, #54798; CHECK-GI-NEXT: sshr v0.2d, v2.2d, #54799; CHECK-GI-NEXT: sshr v1.2d, v1.2d, #54800; CHECK-GI-NEXT: sshr v2.2d, v3.2d, #54801; CHECK-GI-NEXT: sshr v3.2d, v4.2d, #54802; CHECK-GI-NEXT: ret803entry:804 %c = sext <8 x i10> %a to <8 x i64>805 ret <8 x i64> %c806}807 808define <16 x i16> @sext_v16i8_v16i16(<16 x i8> %a) {809; CHECK-SD-LABEL: sext_v16i8_v16i16:810; CHECK-SD: // %bb.0: // %entry811; CHECK-SD-NEXT: sshll2 v1.8h, v0.16b, #0812; CHECK-SD-NEXT: sshll v0.8h, v0.8b, #0813; CHECK-SD-NEXT: ret814;815; CHECK-GI-LABEL: sext_v16i8_v16i16:816; CHECK-GI: // %bb.0: // %entry817; CHECK-GI-NEXT: sshll v2.8h, v0.8b, #0818; CHECK-GI-NEXT: sshll2 v1.8h, v0.16b, #0819; CHECK-GI-NEXT: mov v0.16b, v2.16b820; CHECK-GI-NEXT: ret821entry:822 %c = sext <16 x i8> %a to <16 x i16>823 ret <16 x i16> %c824}825 826define <16 x i32> @sext_v16i8_v16i32(<16 x i8> %a) {827; CHECK-SD-LABEL: sext_v16i8_v16i32:828; CHECK-SD: // %bb.0: // %entry829; CHECK-SD-NEXT: sshll v1.8h, v0.8b, #0830; CHECK-SD-NEXT: sshll2 v2.8h, v0.16b, #0831; CHECK-SD-NEXT: sshll v0.4s, v1.4h, #0832; CHECK-SD-NEXT: sshll2 v3.4s, v2.8h, #0833; CHECK-SD-NEXT: sshll2 v1.4s, v1.8h, #0834; CHECK-SD-NEXT: sshll v2.4s, v2.4h, #0835; CHECK-SD-NEXT: ret836;837; CHECK-GI-LABEL: sext_v16i8_v16i32:838; CHECK-GI: // %bb.0: // %entry839; CHECK-GI-NEXT: sshll v1.8h, v0.8b, #0840; CHECK-GI-NEXT: sshll2 v3.8h, v0.16b, #0841; CHECK-GI-NEXT: sshll v0.4s, v1.4h, #0842; CHECK-GI-NEXT: sshll2 v1.4s, v1.8h, #0843; CHECK-GI-NEXT: sshll v2.4s, v3.4h, #0844; CHECK-GI-NEXT: sshll2 v3.4s, v3.8h, #0845; CHECK-GI-NEXT: ret846entry:847 %c = sext <16 x i8> %a to <16 x i32>848 ret <16 x i32> %c849}850 851define <16 x i64> @sext_v16i8_v16i64(<16 x i8> %a) {852; CHECK-SD-LABEL: sext_v16i8_v16i64:853; CHECK-SD: // %bb.0: // %entry854; CHECK-SD-NEXT: sshll v1.8h, v0.8b, #0855; CHECK-SD-NEXT: sshll2 v0.8h, v0.16b, #0856; CHECK-SD-NEXT: sshll v2.4s, v1.4h, #0857; CHECK-SD-NEXT: sshll2 v4.4s, v1.8h, #0858; CHECK-SD-NEXT: sshll v5.4s, v0.4h, #0859; CHECK-SD-NEXT: sshll2 v6.4s, v0.8h, #0860; CHECK-SD-NEXT: sshll2 v1.2d, v2.4s, #0861; CHECK-SD-NEXT: sshll v0.2d, v2.2s, #0862; CHECK-SD-NEXT: sshll2 v3.2d, v4.4s, #0863; CHECK-SD-NEXT: sshll v2.2d, v4.2s, #0864; CHECK-SD-NEXT: sshll v4.2d, v5.2s, #0865; CHECK-SD-NEXT: sshll2 v7.2d, v6.4s, #0866; CHECK-SD-NEXT: sshll2 v5.2d, v5.4s, #0867; CHECK-SD-NEXT: sshll v6.2d, v6.2s, #0868; CHECK-SD-NEXT: ret869;870; CHECK-GI-LABEL: sext_v16i8_v16i64:871; CHECK-GI: // %bb.0: // %entry872; CHECK-GI-NEXT: sshll v1.8h, v0.8b, #0873; CHECK-GI-NEXT: sshll2 v0.8h, v0.16b, #0874; CHECK-GI-NEXT: sshll v2.4s, v1.4h, #0875; CHECK-GI-NEXT: sshll2 v3.4s, v1.8h, #0876; CHECK-GI-NEXT: sshll v5.4s, v0.4h, #0877; CHECK-GI-NEXT: sshll2 v7.4s, v0.8h, #0878; CHECK-GI-NEXT: sshll v0.2d, v2.2s, #0879; CHECK-GI-NEXT: sshll2 v1.2d, v2.4s, #0880; CHECK-GI-NEXT: sshll v2.2d, v3.2s, #0881; CHECK-GI-NEXT: sshll2 v3.2d, v3.4s, #0882; CHECK-GI-NEXT: sshll v4.2d, v5.2s, #0883; CHECK-GI-NEXT: sshll2 v5.2d, v5.4s, #0884; CHECK-GI-NEXT: sshll v6.2d, v7.2s, #0885; CHECK-GI-NEXT: sshll2 v7.2d, v7.4s, #0886; CHECK-GI-NEXT: ret887entry:888 %c = sext <16 x i8> %a to <16 x i64>889 ret <16 x i64> %c890}891 892define <16 x i32> @sext_v16i16_v16i32(<16 x i16> %a) {893; CHECK-SD-LABEL: sext_v16i16_v16i32:894; CHECK-SD: // %bb.0: // %entry895; CHECK-SD-NEXT: sshll v5.4s, v0.4h, #0896; CHECK-SD-NEXT: sshll2 v4.4s, v0.8h, #0897; CHECK-SD-NEXT: sshll2 v3.4s, v1.8h, #0898; CHECK-SD-NEXT: sshll v2.4s, v1.4h, #0899; CHECK-SD-NEXT: mov v0.16b, v5.16b900; CHECK-SD-NEXT: mov v1.16b, v4.16b901; CHECK-SD-NEXT: ret902;903; CHECK-GI-LABEL: sext_v16i16_v16i32:904; CHECK-GI: // %bb.0: // %entry905; CHECK-GI-NEXT: sshll v4.4s, v0.4h, #0906; CHECK-GI-NEXT: sshll2 v5.4s, v0.8h, #0907; CHECK-GI-NEXT: sshll v2.4s, v1.4h, #0908; CHECK-GI-NEXT: sshll2 v3.4s, v1.8h, #0909; CHECK-GI-NEXT: mov v0.16b, v4.16b910; CHECK-GI-NEXT: mov v1.16b, v5.16b911; CHECK-GI-NEXT: ret912entry:913 %c = sext <16 x i16> %a to <16 x i32>914 ret <16 x i32> %c915}916 917define <16 x i64> @sext_v16i16_v16i64(<16 x i16> %a) {918; CHECK-SD-LABEL: sext_v16i16_v16i64:919; CHECK-SD: // %bb.0: // %entry920; CHECK-SD-NEXT: sshll v2.4s, v0.4h, #0921; CHECK-SD-NEXT: sshll2 v4.4s, v0.8h, #0922; CHECK-SD-NEXT: sshll v5.4s, v1.4h, #0923; CHECK-SD-NEXT: sshll2 v6.4s, v1.8h, #0924; CHECK-SD-NEXT: sshll2 v1.2d, v2.4s, #0925; CHECK-SD-NEXT: sshll v0.2d, v2.2s, #0926; CHECK-SD-NEXT: sshll2 v3.2d, v4.4s, #0927; CHECK-SD-NEXT: sshll v2.2d, v4.2s, #0928; CHECK-SD-NEXT: sshll v4.2d, v5.2s, #0929; CHECK-SD-NEXT: sshll2 v7.2d, v6.4s, #0930; CHECK-SD-NEXT: sshll2 v5.2d, v5.4s, #0931; CHECK-SD-NEXT: sshll v6.2d, v6.2s, #0932; CHECK-SD-NEXT: ret933;934; CHECK-GI-LABEL: sext_v16i16_v16i64:935; CHECK-GI: // %bb.0: // %entry936; CHECK-GI-NEXT: sshll v2.4s, v0.4h, #0937; CHECK-GI-NEXT: sshll2 v3.4s, v0.8h, #0938; CHECK-GI-NEXT: sshll v5.4s, v1.4h, #0939; CHECK-GI-NEXT: sshll2 v7.4s, v1.8h, #0940; CHECK-GI-NEXT: sshll v0.2d, v2.2s, #0941; CHECK-GI-NEXT: sshll2 v1.2d, v2.4s, #0942; CHECK-GI-NEXT: sshll v2.2d, v3.2s, #0943; CHECK-GI-NEXT: sshll2 v3.2d, v3.4s, #0944; CHECK-GI-NEXT: sshll v4.2d, v5.2s, #0945; CHECK-GI-NEXT: sshll2 v5.2d, v5.4s, #0946; CHECK-GI-NEXT: sshll v6.2d, v7.2s, #0947; CHECK-GI-NEXT: sshll2 v7.2d, v7.4s, #0948; CHECK-GI-NEXT: ret949entry:950 %c = sext <16 x i16> %a to <16 x i64>951 ret <16 x i64> %c952}953 954define <16 x i64> @sext_v16i32_v16i64(<16 x i32> %a) {955; CHECK-SD-LABEL: sext_v16i32_v16i64:956; CHECK-SD: // %bb.0: // %entry957; CHECK-SD-NEXT: sshll2 v17.2d, v0.4s, #0958; CHECK-SD-NEXT: sshll2 v16.2d, v1.4s, #0959; CHECK-SD-NEXT: sshll v18.2d, v1.2s, #0960; CHECK-SD-NEXT: sshll v0.2d, v0.2s, #0961; CHECK-SD-NEXT: sshll v4.2d, v2.2s, #0962; CHECK-SD-NEXT: sshll2 v5.2d, v2.4s, #0963; CHECK-SD-NEXT: sshll2 v7.2d, v3.4s, #0964; CHECK-SD-NEXT: sshll v6.2d, v3.2s, #0965; CHECK-SD-NEXT: mov v1.16b, v17.16b966; CHECK-SD-NEXT: mov v2.16b, v18.16b967; CHECK-SD-NEXT: mov v3.16b, v16.16b968; CHECK-SD-NEXT: ret969;970; CHECK-GI-LABEL: sext_v16i32_v16i64:971; CHECK-GI: // %bb.0: // %entry972; CHECK-GI-NEXT: sshll v16.2d, v0.2s, #0973; CHECK-GI-NEXT: sshll2 v17.2d, v0.4s, #0974; CHECK-GI-NEXT: sshll v18.2d, v1.2s, #0975; CHECK-GI-NEXT: sshll2 v19.2d, v1.4s, #0976; CHECK-GI-NEXT: sshll v4.2d, v2.2s, #0977; CHECK-GI-NEXT: sshll2 v5.2d, v2.4s, #0978; CHECK-GI-NEXT: sshll v6.2d, v3.2s, #0979; CHECK-GI-NEXT: sshll2 v7.2d, v3.4s, #0980; CHECK-GI-NEXT: mov v0.16b, v16.16b981; CHECK-GI-NEXT: mov v1.16b, v17.16b982; CHECK-GI-NEXT: mov v2.16b, v18.16b983; CHECK-GI-NEXT: mov v3.16b, v19.16b984; CHECK-GI-NEXT: ret985entry:986 %c = sext <16 x i32> %a to <16 x i64>987 ret <16 x i64> %c988}989 990define <16 x i16> @sext_v16i10_v16i16(<16 x i10> %a) {991; CHECK-SD-LABEL: sext_v16i10_v16i16:992; CHECK-SD: // %bb.0: // %entry993; CHECK-SD-NEXT: ldr w8, [sp]994; CHECK-SD-NEXT: fmov s1, w0995; CHECK-SD-NEXT: ldr w9, [sp, #8]996; CHECK-SD-NEXT: fmov s0, w8997; CHECK-SD-NEXT: ldr w8, [sp, #16]998; CHECK-SD-NEXT: mov v1.h[1], w1999; CHECK-SD-NEXT: mov v0.h[1], w91000; CHECK-SD-NEXT: mov v1.h[2], w21001; CHECK-SD-NEXT: mov v0.h[2], w81002; CHECK-SD-NEXT: ldr w8, [sp, #24]1003; CHECK-SD-NEXT: mov v1.h[3], w31004; CHECK-SD-NEXT: mov v0.h[3], w81005; CHECK-SD-NEXT: ldr w8, [sp, #32]1006; CHECK-SD-NEXT: mov v1.h[4], w41007; CHECK-SD-NEXT: mov v0.h[4], w81008; CHECK-SD-NEXT: ldr w8, [sp, #40]1009; CHECK-SD-NEXT: mov v1.h[5], w51010; CHECK-SD-NEXT: mov v0.h[5], w81011; CHECK-SD-NEXT: ldr w8, [sp, #48]1012; CHECK-SD-NEXT: mov v1.h[6], w61013; CHECK-SD-NEXT: mov v0.h[6], w81014; CHECK-SD-NEXT: ldr w8, [sp, #56]1015; CHECK-SD-NEXT: mov v1.h[7], w71016; CHECK-SD-NEXT: mov v0.h[7], w81017; CHECK-SD-NEXT: shl v1.8h, v1.8h, #61018; CHECK-SD-NEXT: shl v2.8h, v0.8h, #61019; CHECK-SD-NEXT: sshr v0.8h, v1.8h, #61020; CHECK-SD-NEXT: sshr v1.8h, v2.8h, #61021; CHECK-SD-NEXT: ret1022;1023; CHECK-GI-LABEL: sext_v16i10_v16i16:1024; CHECK-GI: // %bb.0: // %entry1025; CHECK-GI-NEXT: ldr w8, [sp]1026; CHECK-GI-NEXT: fmov s0, w01027; CHECK-GI-NEXT: ldr w9, [sp, #8]1028; CHECK-GI-NEXT: fmov s1, w81029; CHECK-GI-NEXT: ldr w8, [sp, #16]1030; CHECK-GI-NEXT: mov v0.h[1], w11031; CHECK-GI-NEXT: mov v1.h[1], w91032; CHECK-GI-NEXT: mov v0.h[2], w21033; CHECK-GI-NEXT: mov v1.h[2], w81034; CHECK-GI-NEXT: ldr w8, [sp, #24]1035; CHECK-GI-NEXT: mov v0.h[3], w31036; CHECK-GI-NEXT: mov v1.h[3], w81037; CHECK-GI-NEXT: ldr w8, [sp, #32]1038; CHECK-GI-NEXT: mov v0.h[4], w41039; CHECK-GI-NEXT: mov v1.h[4], w81040; CHECK-GI-NEXT: ldr w8, [sp, #40]1041; CHECK-GI-NEXT: mov v0.h[5], w51042; CHECK-GI-NEXT: mov v1.h[5], w81043; CHECK-GI-NEXT: ldr w8, [sp, #48]1044; CHECK-GI-NEXT: mov v0.h[6], w61045; CHECK-GI-NEXT: mov v1.h[6], w81046; CHECK-GI-NEXT: ldr w8, [sp, #56]1047; CHECK-GI-NEXT: mov v0.h[7], w71048; CHECK-GI-NEXT: mov v1.h[7], w81049; CHECK-GI-NEXT: shl v0.8h, v0.8h, #61050; CHECK-GI-NEXT: shl v1.8h, v1.8h, #61051; CHECK-GI-NEXT: sshr v0.8h, v0.8h, #61052; CHECK-GI-NEXT: sshr v1.8h, v1.8h, #61053; CHECK-GI-NEXT: ret1054entry:1055 %c = sext <16 x i10> %a to <16 x i16>1056 ret <16 x i16> %c1057}1058 1059define <16 x i32> @sext_v16i10_v16i32(<16 x i10> %a) {1060; CHECK-SD-LABEL: sext_v16i10_v16i32:1061; CHECK-SD: // %bb.0: // %entry1062; CHECK-SD-NEXT: ldr w8, [sp, #32]1063; CHECK-SD-NEXT: ldr w9, [sp]1064; CHECK-SD-NEXT: fmov s0, w01065; CHECK-SD-NEXT: fmov s1, w41066; CHECK-SD-NEXT: ldr w10, [sp, #40]1067; CHECK-SD-NEXT: ldr w11, [sp, #8]1068; CHECK-SD-NEXT: fmov s2, w91069; CHECK-SD-NEXT: fmov s3, w81070; CHECK-SD-NEXT: ldr w8, [sp, #48]1071; CHECK-SD-NEXT: mov v0.h[1], w11072; CHECK-SD-NEXT: ldr w9, [sp, #16]1073; CHECK-SD-NEXT: mov v1.h[1], w51074; CHECK-SD-NEXT: mov v2.h[1], w111075; CHECK-SD-NEXT: mov v3.h[1], w101076; CHECK-SD-NEXT: mov v0.h[2], w21077; CHECK-SD-NEXT: mov v1.h[2], w61078; CHECK-SD-NEXT: mov v2.h[2], w91079; CHECK-SD-NEXT: mov v3.h[2], w81080; CHECK-SD-NEXT: ldr w8, [sp, #56]1081; CHECK-SD-NEXT: ldr w9, [sp, #24]1082; CHECK-SD-NEXT: mov v0.h[3], w31083; CHECK-SD-NEXT: mov v1.h[3], w71084; CHECK-SD-NEXT: mov v2.h[3], w91085; CHECK-SD-NEXT: mov v3.h[3], w81086; CHECK-SD-NEXT: ushll v0.4s, v0.4h, #01087; CHECK-SD-NEXT: ushll v1.4s, v1.4h, #01088; CHECK-SD-NEXT: ushll v2.4s, v2.4h, #01089; CHECK-SD-NEXT: ushll v3.4s, v3.4h, #01090; CHECK-SD-NEXT: shl v0.4s, v0.4s, #221091; CHECK-SD-NEXT: shl v1.4s, v1.4s, #221092; CHECK-SD-NEXT: shl v2.4s, v2.4s, #221093; CHECK-SD-NEXT: shl v3.4s, v3.4s, #221094; CHECK-SD-NEXT: sshr v0.4s, v0.4s, #221095; CHECK-SD-NEXT: sshr v1.4s, v1.4s, #221096; CHECK-SD-NEXT: sshr v2.4s, v2.4s, #221097; CHECK-SD-NEXT: sshr v3.4s, v3.4s, #221098; CHECK-SD-NEXT: ret1099;1100; CHECK-GI-LABEL: sext_v16i10_v16i32:1101; CHECK-GI: // %bb.0: // %entry1102; CHECK-GI-NEXT: ldr w8, [sp]1103; CHECK-GI-NEXT: ldr w9, [sp, #32]1104; CHECK-GI-NEXT: fmov s0, w01105; CHECK-GI-NEXT: fmov s1, w41106; CHECK-GI-NEXT: ldr w10, [sp, #8]1107; CHECK-GI-NEXT: ldr w11, [sp, #40]1108; CHECK-GI-NEXT: fmov s2, w81109; CHECK-GI-NEXT: fmov s3, w91110; CHECK-GI-NEXT: ldr w8, [sp, #16]1111; CHECK-GI-NEXT: mov v0.h[1], w11112; CHECK-GI-NEXT: ldr w9, [sp, #48]1113; CHECK-GI-NEXT: mov v1.h[1], w51114; CHECK-GI-NEXT: mov v2.h[1], w101115; CHECK-GI-NEXT: mov v3.h[1], w111116; CHECK-GI-NEXT: mov v0.h[2], w21117; CHECK-GI-NEXT: mov v1.h[2], w61118; CHECK-GI-NEXT: mov v2.h[2], w81119; CHECK-GI-NEXT: mov v3.h[2], w91120; CHECK-GI-NEXT: ldr w8, [sp, #24]1121; CHECK-GI-NEXT: ldr w9, [sp, #56]1122; CHECK-GI-NEXT: mov v0.h[3], w31123; CHECK-GI-NEXT: mov v1.h[3], w71124; CHECK-GI-NEXT: mov v2.h[3], w81125; CHECK-GI-NEXT: mov v3.h[3], w91126; CHECK-GI-NEXT: ushll v0.4s, v0.4h, #01127; CHECK-GI-NEXT: ushll v1.4s, v1.4h, #01128; CHECK-GI-NEXT: ushll v2.4s, v2.4h, #01129; CHECK-GI-NEXT: ushll v3.4s, v3.4h, #01130; CHECK-GI-NEXT: shl v0.4s, v0.4s, #221131; CHECK-GI-NEXT: shl v1.4s, v1.4s, #221132; CHECK-GI-NEXT: shl v2.4s, v2.4s, #221133; CHECK-GI-NEXT: shl v3.4s, v3.4s, #221134; CHECK-GI-NEXT: sshr v0.4s, v0.4s, #221135; CHECK-GI-NEXT: sshr v1.4s, v1.4s, #221136; CHECK-GI-NEXT: sshr v2.4s, v2.4s, #221137; CHECK-GI-NEXT: sshr v3.4s, v3.4s, #221138; CHECK-GI-NEXT: ret1139entry:1140 %c = sext <16 x i10> %a to <16 x i32>1141 ret <16 x i32> %c1142}1143 1144define <16 x i64> @sext_v16i10_v16i64(<16 x i10> %a) {1145; CHECK-SD-LABEL: sext_v16i10_v16i64:1146; CHECK-SD: // %bb.0: // %entry1147; CHECK-SD-NEXT: fmov s0, w21148; CHECK-SD-NEXT: fmov s1, w01149; CHECK-SD-NEXT: ldr s2, [sp]1150; CHECK-SD-NEXT: fmov s3, w41151; CHECK-SD-NEXT: fmov s4, w61152; CHECK-SD-NEXT: add x8, sp, #81153; 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], w11157; CHECK-SD-NEXT: mov v0.s[1], w31158; CHECK-SD-NEXT: ld1 { v2.s }[1], [x8]1159; CHECK-SD-NEXT: mov v3.s[1], w51160; CHECK-SD-NEXT: mov v4.s[1], w71161; CHECK-SD-NEXT: add x8, sp, #241162; CHECK-SD-NEXT: add x9, sp, #401163; CHECK-SD-NEXT: add x10, sp, #561164; 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, #01168; CHECK-SD-NEXT: ushll v1.2d, v1.2s, #01169; CHECK-SD-NEXT: ushll v0.2d, v0.2s, #01170; CHECK-SD-NEXT: ushll v3.2d, v3.2s, #01171; CHECK-SD-NEXT: ushll v4.2d, v4.2s, #01172; CHECK-SD-NEXT: ushll v5.2d, v5.2s, #01173; CHECK-SD-NEXT: ushll v6.2d, v6.2s, #01174; CHECK-SD-NEXT: ushll v7.2d, v7.2s, #01175; CHECK-SD-NEXT: shl v17.2d, v2.2d, #541176; CHECK-SD-NEXT: shl v1.2d, v1.2d, #541177; CHECK-SD-NEXT: shl v16.2d, v0.2d, #541178; CHECK-SD-NEXT: shl v3.2d, v3.2d, #541179; CHECK-SD-NEXT: shl v4.2d, v4.2d, #541180; CHECK-SD-NEXT: shl v5.2d, v5.2d, #541181; CHECK-SD-NEXT: shl v6.2d, v6.2d, #541182; CHECK-SD-NEXT: shl v7.2d, v7.2d, #541183; CHECK-SD-NEXT: sshr v0.2d, v1.2d, #541184; CHECK-SD-NEXT: sshr v1.2d, v16.2d, #541185; CHECK-SD-NEXT: sshr v2.2d, v3.2d, #541186; CHECK-SD-NEXT: sshr v3.2d, v4.2d, #541187; CHECK-SD-NEXT: sshr v4.2d, v17.2d, #541188; CHECK-SD-NEXT: sshr v5.2d, v5.2d, #541189; CHECK-SD-NEXT: sshr v6.2d, v6.2d, #541190; CHECK-SD-NEXT: sshr v7.2d, v7.2d, #541191; CHECK-SD-NEXT: ret1192;1193; CHECK-GI-LABEL: sext_v16i10_v16i64:1194; CHECK-GI: // %bb.0: // %entry1195; CHECK-GI-NEXT: fmov s7, w01196; CHECK-GI-NEXT: fmov s17, w21197; CHECK-GI-NEXT: ldr s0, [sp]1198; CHECK-GI-NEXT: fmov s18, w41199; CHECK-GI-NEXT: fmov s19, w61200; CHECK-GI-NEXT: ldr s1, [sp, #8]1201; CHECK-GI-NEXT: ldr s2, [sp, #16]1202; CHECK-GI-NEXT: ldr s3, [sp, #24]1203; CHECK-GI-NEXT: ldr s4, [sp, #32]1204; CHECK-GI-NEXT: ldr s5, [sp, #40]1205; CHECK-GI-NEXT: ldr s6, [sp, #48]1206; CHECK-GI-NEXT: ldr s16, [sp, #56]1207; CHECK-GI-NEXT: mov v7.s[1], w11208; CHECK-GI-NEXT: mov v17.s[1], w31209; CHECK-GI-NEXT: mov v18.s[1], w51210; CHECK-GI-NEXT: mov v19.s[1], w71211; CHECK-GI-NEXT: mov v0.s[1], v1.s[0]1212; CHECK-GI-NEXT: mov v2.s[1], v3.s[0]1213; CHECK-GI-NEXT: mov v4.s[1], v5.s[0]1214; CHECK-GI-NEXT: mov v6.s[1], v16.s[0]1215; CHECK-GI-NEXT: ushll v1.2d, v7.2s, #01216; CHECK-GI-NEXT: ushll v3.2d, v17.2s, #01217; CHECK-GI-NEXT: ushll v5.2d, v18.2s, #01218; CHECK-GI-NEXT: ushll v7.2d, v19.2s, #01219; CHECK-GI-NEXT: ushll v0.2d, v0.2s, #01220; CHECK-GI-NEXT: ushll v2.2d, v2.2s, #01221; CHECK-GI-NEXT: ushll v4.2d, v4.2s, #01222; CHECK-GI-NEXT: ushll v6.2d, v6.2s, #01223; CHECK-GI-NEXT: shl v1.2d, v1.2d, #541224; CHECK-GI-NEXT: shl v3.2d, v3.2d, #541225; CHECK-GI-NEXT: shl v5.2d, v5.2d, #541226; CHECK-GI-NEXT: shl v7.2d, v7.2d, #541227; CHECK-GI-NEXT: shl v16.2d, v0.2d, #541228; CHECK-GI-NEXT: shl v17.2d, v2.2d, #541229; CHECK-GI-NEXT: shl v18.2d, v4.2d, #541230; CHECK-GI-NEXT: shl v19.2d, v6.2d, #541231; CHECK-GI-NEXT: sshr v0.2d, v1.2d, #541232; CHECK-GI-NEXT: sshr v1.2d, v3.2d, #541233; CHECK-GI-NEXT: sshr v2.2d, v5.2d, #541234; CHECK-GI-NEXT: sshr v3.2d, v7.2d, #541235; CHECK-GI-NEXT: sshr v4.2d, v16.2d, #541236; CHECK-GI-NEXT: sshr v5.2d, v17.2d, #541237; CHECK-GI-NEXT: sshr v6.2d, v18.2d, #541238; CHECK-GI-NEXT: sshr v7.2d, v19.2d, #541239; CHECK-GI-NEXT: ret1240entry:1241 %c = sext <16 x i10> %a to <16 x i64>1242 ret <16 x i64> %c1243}1244 1245define <2 x i128> @sext_v2i64_v2i128(<2 x i64> %a) {1246; CHECK-SD-LABEL: sext_v2i64_v2i128:1247; CHECK-SD: // %bb.0: // %entry1248; CHECK-SD-NEXT: mov x2, v0.d[1]1249; CHECK-SD-NEXT: fmov x0, d01250; CHECK-SD-NEXT: asr x1, x0, #631251; CHECK-SD-NEXT: asr x3, x2, #631252; CHECK-SD-NEXT: ret1253;1254; CHECK-GI-LABEL: sext_v2i64_v2i128:1255; CHECK-GI: // %bb.0: // %entry1256; CHECK-GI-NEXT: mov d1, v0.d[1]1257; CHECK-GI-NEXT: fmov x8, d01258; CHECK-GI-NEXT: fmov x0, d01259; CHECK-GI-NEXT: asr x1, x8, #631260; CHECK-GI-NEXT: fmov x9, d11261; CHECK-GI-NEXT: fmov x2, d11262; CHECK-GI-NEXT: asr x3, x9, #631263; CHECK-GI-NEXT: ret1264entry:1265 %c = sext <2 x i64> %a to <2 x i128>1266 ret <2 x i128> %c1267}1268