879 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 -global-isel-abort=2 -verify-machineinstrs %s -o - 2>&1 | FileCheck %s --check-prefixes=CHECK,CHECK-GI4 5; CHECK-GI: warning: Instruction selection used fallback path for trunc_v16i10_v16i166; CHECK-GI-NEXT: warning: Instruction selection used fallback path for trunc_v16i10_v16i327; CHECK-GI-NEXT: warning: Instruction selection used fallback path for trunc_v16i10_v16i648 9define i8 @trunc_i8_to_i16(i16 %a) {10; CHECK-LABEL: trunc_i8_to_i16:11; CHECK: // %bb.0: // %entry12; CHECK-NEXT: ret13entry:14 %c = trunc i16 %a to i815 ret i8 %c16}17 18define i8 @trunc_i8_to_i32(i32 %a) {19; CHECK-LABEL: trunc_i8_to_i32:20; CHECK: // %bb.0: // %entry21; CHECK-NEXT: ret22entry:23 %c = trunc i32 %a to i824 ret i8 %c25}26 27define i8 @trunc_i8_to_i64(i64 %a) {28; CHECK-LABEL: trunc_i8_to_i64:29; CHECK: // %bb.0: // %entry30; CHECK-NEXT: // kill: def $w0 killed $w0 killed $x031; CHECK-NEXT: ret32entry:33 %c = trunc i64 %a to i834 ret i8 %c35}36 37define i8 @trunc_i8_to_i10(i10 %a) {38; CHECK-LABEL: trunc_i8_to_i10:39; CHECK: // %bb.0: // %entry40; CHECK-NEXT: ret41entry:42 %c = trunc i10 %a to i843 ret i8 %c44}45 46define i16 @trunc_i16_to_i32(i32 %a) {47; CHECK-LABEL: trunc_i16_to_i32:48; CHECK: // %bb.0: // %entry49; CHECK-NEXT: ret50entry:51 %c = trunc i32 %a to i1652 ret i16 %c53}54 55define i16 @trunc_i16_to_i64(i64 %a) {56; CHECK-LABEL: trunc_i16_to_i64:57; CHECK: // %bb.0: // %entry58; CHECK-NEXT: // kill: def $w0 killed $w0 killed $x059; CHECK-NEXT: ret60entry:61 %c = trunc i64 %a to i1662 ret i16 %c63}64 65define i32 @trunc_i32_to_i64(i64 %a) {66; CHECK-LABEL: trunc_i32_to_i64:67; CHECK: // %bb.0: // %entry68; CHECK-NEXT: // kill: def $w0 killed $w0 killed $x069; CHECK-NEXT: ret70entry:71 %c = trunc i64 %a to i3272 ret i32 %c73}74 75define i10 @trunc_i10_to_i16(i16 %a) {76; CHECK-LABEL: trunc_i10_to_i16:77; CHECK: // %bb.0: // %entry78; CHECK-NEXT: ret79entry:80 %c = trunc i16 %a to i1081 ret i10 %c82}83 84define i10 @trunc_i10_to_i32(i32 %a) {85; CHECK-LABEL: trunc_i10_to_i32:86; CHECK: // %bb.0: // %entry87; CHECK-NEXT: ret88entry:89 %c = trunc i32 %a to i1090 ret i10 %c91}92 93define i10 @trunc_i10_to_i64(i64 %a) {94; CHECK-LABEL: trunc_i10_to_i64:95; CHECK: // %bb.0: // %entry96; CHECK-NEXT: // kill: def $w0 killed $w0 killed $x097; CHECK-NEXT: ret98entry:99 %c = trunc i64 %a to i10100 ret i10 %c101}102 103define <2 x i8> @trunc_v2i8_v2i16(<2 x i16> %a) {104; CHECK-LABEL: trunc_v2i8_v2i16:105; CHECK: // %bb.0: // %entry106; CHECK-NEXT: ret107entry:108 %c = trunc <2 x i16> %a to <2 x i8>109 ret <2 x i8> %c110}111 112define <2 x i8> @trunc_v2i8_v2i32(<2 x i32> %a) {113; CHECK-LABEL: trunc_v2i8_v2i32:114; CHECK: // %bb.0: // %entry115; CHECK-NEXT: ret116entry:117 %c = trunc <2 x i32> %a to <2 x i8>118 ret <2 x i8> %c119}120 121define <2 x i8> @trunc_v2i8_v2i64(<2 x i64> %a) {122; CHECK-LABEL: trunc_v2i8_v2i64:123; CHECK: // %bb.0: // %entry124; CHECK-NEXT: xtn v0.2s, v0.2d125; CHECK-NEXT: ret126entry:127 %c = trunc <2 x i64> %a to <2 x i8>128 ret <2 x i8> %c129}130 131define <2 x i16> @trunc_v2i16_v2i32(<2 x i32> %a) {132; CHECK-LABEL: trunc_v2i16_v2i32:133; CHECK: // %bb.0: // %entry134; CHECK-NEXT: ret135entry:136 %c = trunc <2 x i32> %a to <2 x i16>137 ret <2 x i16> %c138}139 140define <2 x i16> @trunc_v2i16_v2i64(<2 x i64> %a) {141; CHECK-LABEL: trunc_v2i16_v2i64:142; CHECK: // %bb.0: // %entry143; CHECK-NEXT: xtn v0.2s, v0.2d144; CHECK-NEXT: ret145entry:146 %c = trunc <2 x i64> %a to <2 x i16>147 ret <2 x i16> %c148}149 150define <2 x i32> @trunc_v2i32_v2i64(<2 x i64> %a) {151; CHECK-LABEL: trunc_v2i32_v2i64:152; CHECK: // %bb.0: // %entry153; CHECK-NEXT: xtn v0.2s, v0.2d154; CHECK-NEXT: ret155entry:156 %c = trunc <2 x i64> %a to <2 x i32>157 ret <2 x i32> %c158}159 160define <2 x i10> @trunc_v2i10_v2i16(<2 x i16> %a) {161; CHECK-LABEL: trunc_v2i10_v2i16:162; CHECK: // %bb.0: // %entry163; CHECK-NEXT: ret164entry:165 %c = trunc <2 x i16> %a to <2 x i10>166 ret <2 x i10> %c167}168 169define <2 x i10> @trunc_v2i10_v2i32(<2 x i32> %a) {170; CHECK-LABEL: trunc_v2i10_v2i32:171; CHECK: // %bb.0: // %entry172; CHECK-NEXT: ret173entry:174 %c = trunc <2 x i32> %a to <2 x i10>175 ret <2 x i10> %c176}177 178define <2 x i10> @trunc_v2i10_v2i64(<2 x i64> %a) {179; CHECK-LABEL: trunc_v2i10_v2i64:180; CHECK: // %bb.0: // %entry181; CHECK-NEXT: xtn v0.2s, v0.2d182; CHECK-NEXT: ret183entry:184 %c = trunc <2 x i64> %a to <2 x i10>185 ret <2 x i10> %c186}187 188define <3 x i8> @trunc_v3i8_v3i16(<3 x i16> %a) {189; CHECK-LABEL: trunc_v3i8_v3i16:190; CHECK: // %bb.0: // %entry191; CHECK-NEXT: // kill: def $d0 killed $d0 def $q0192; CHECK-NEXT: umov w0, v0.h[0]193; CHECK-NEXT: umov w1, v0.h[1]194; CHECK-NEXT: umov w2, v0.h[2]195; CHECK-NEXT: ret196entry:197 %c = trunc <3 x i16> %a to <3 x i8>198 ret <3 x i8> %c199}200 201define <3 x i8> @trunc_v3i8_v3i32(<3 x i32> %a) {202; CHECK-SD-LABEL: trunc_v3i8_v3i32:203; CHECK-SD: // %bb.0: // %entry204; CHECK-SD-NEXT: xtn v0.4h, v0.4s205; CHECK-SD-NEXT: umov w0, v0.h[0]206; CHECK-SD-NEXT: umov w1, v0.h[1]207; CHECK-SD-NEXT: umov w2, v0.h[2]208; CHECK-SD-NEXT: ret209;210; CHECK-GI-LABEL: trunc_v3i8_v3i32:211; CHECK-GI: // %bb.0: // %entry212; CHECK-GI-NEXT: mov s1, v0.s[1]213; CHECK-GI-NEXT: mov s2, v0.s[2]214; CHECK-GI-NEXT: fmov w0, s0215; CHECK-GI-NEXT: fmov w1, s1216; CHECK-GI-NEXT: fmov w2, s2217; CHECK-GI-NEXT: ret218entry:219 %c = trunc <3 x i32> %a to <3 x i8>220 ret <3 x i8> %c221}222 223define <3 x i8> @trunc_v3i8_v3i64(<3 x i64> %a) {224; CHECK-SD-LABEL: trunc_v3i8_v3i64:225; CHECK-SD: // %bb.0: // %entry226; CHECK-SD-NEXT: // kill: def $d0 killed $d0 def $q0227; CHECK-SD-NEXT: // kill: def $d1 killed $d1 def $q1228; CHECK-SD-NEXT: // kill: def $d2 killed $d2 def $q2229; CHECK-SD-NEXT: mov v0.d[1], v1.d[0]230; CHECK-SD-NEXT: xtn v1.2s, v2.2d231; CHECK-SD-NEXT: xtn v0.2s, v0.2d232; CHECK-SD-NEXT: fmov w2, s1233; CHECK-SD-NEXT: mov w1, v0.s[1]234; CHECK-SD-NEXT: fmov w0, s0235; CHECK-SD-NEXT: ret236;237; CHECK-GI-LABEL: trunc_v3i8_v3i64:238; CHECK-GI: // %bb.0: // %entry239; CHECK-GI-NEXT: fmov x0, d0240; CHECK-GI-NEXT: fmov x1, d1241; CHECK-GI-NEXT: fmov x2, d2242; CHECK-GI-NEXT: // kill: def $w0 killed $w0 killed $x0243; CHECK-GI-NEXT: // kill: def $w1 killed $w1 killed $x1244; CHECK-GI-NEXT: // kill: def $w2 killed $w2 killed $x2245; CHECK-GI-NEXT: ret246entry:247 %c = trunc <3 x i64> %a to <3 x i8>248 ret <3 x i8> %c249}250 251define <3 x i16> @trunc_v3i16_v3i32(<3 x i32> %a) {252; CHECK-LABEL: trunc_v3i16_v3i32:253; CHECK: // %bb.0: // %entry254; CHECK-NEXT: xtn v0.4h, v0.4s255; CHECK-NEXT: ret256entry:257 %c = trunc <3 x i32> %a to <3 x i16>258 ret <3 x i16> %c259}260 261define <3 x i16> @trunc_v3i16_v3i64(<3 x i64> %a) {262; CHECK-SD-LABEL: trunc_v3i16_v3i64:263; CHECK-SD: // %bb.0: // %entry264; CHECK-SD-NEXT: // kill: def $d0 killed $d0 def $q0265; CHECK-SD-NEXT: // kill: def $d1 killed $d1 def $q1266; CHECK-SD-NEXT: // kill: def $d2 killed $d2 def $q2267; CHECK-SD-NEXT: mov v0.d[1], v1.d[0]268; CHECK-SD-NEXT: uzp1 v0.4s, v0.4s, v2.4s269; CHECK-SD-NEXT: xtn v0.4h, v0.4s270; CHECK-SD-NEXT: ret271;272; CHECK-GI-LABEL: trunc_v3i16_v3i64:273; CHECK-GI: // %bb.0: // %entry274; CHECK-GI-NEXT: fmov x8, d0275; CHECK-GI-NEXT: fmov x9, d1276; CHECK-GI-NEXT: fmov s0, w8277; CHECK-GI-NEXT: fmov x8, d2278; CHECK-GI-NEXT: mov v0.h[1], w9279; CHECK-GI-NEXT: mov v0.h[2], w8280; CHECK-GI-NEXT: // kill: def $d0 killed $d0 killed $q0281; CHECK-GI-NEXT: ret282entry:283 %c = trunc <3 x i64> %a to <3 x i16>284 ret <3 x i16> %c285}286 287define <3 x i32> @trunc_v3i32_v3i64(<3 x i64> %a) {288; CHECK-SD-LABEL: trunc_v3i32_v3i64:289; CHECK-SD: // %bb.0: // %entry290; CHECK-SD-NEXT: // kill: def $d0 killed $d0 def $q0291; CHECK-SD-NEXT: // kill: def $d1 killed $d1 def $q1292; CHECK-SD-NEXT: // kill: def $d2 killed $d2 def $q2293; CHECK-SD-NEXT: mov v0.d[1], v1.d[0]294; CHECK-SD-NEXT: uzp1 v0.4s, v0.4s, v2.4s295; CHECK-SD-NEXT: ret296;297; CHECK-GI-LABEL: trunc_v3i32_v3i64:298; CHECK-GI: // %bb.0: // %entry299; CHECK-GI-NEXT: fmov x8, d0300; CHECK-GI-NEXT: fmov x9, d1301; CHECK-GI-NEXT: fmov s0, w8302; CHECK-GI-NEXT: fmov x8, d2303; CHECK-GI-NEXT: mov v0.s[1], w9304; CHECK-GI-NEXT: mov v0.s[2], w8305; CHECK-GI-NEXT: ret306entry:307 %c = trunc <3 x i64> %a to <3 x i32>308 ret <3 x i32> %c309}310 311define <3 x i10> @trunc_v3i10_v3i16(<3 x i16> %a) {312; CHECK-LABEL: trunc_v3i10_v3i16:313; CHECK: // %bb.0: // %entry314; CHECK-NEXT: // kill: def $d0 killed $d0 def $q0315; CHECK-NEXT: umov w0, v0.h[0]316; CHECK-NEXT: umov w1, v0.h[1]317; CHECK-NEXT: umov w2, v0.h[2]318; CHECK-NEXT: ret319entry:320 %c = trunc <3 x i16> %a to <3 x i10>321 ret <3 x i10> %c322}323 324define <3 x i10> @trunc_v3i10_v3i32(<3 x i32> %a) {325; CHECK-SD-LABEL: trunc_v3i10_v3i32:326; CHECK-SD: // %bb.0: // %entry327; CHECK-SD-NEXT: xtn v0.4h, v0.4s328; CHECK-SD-NEXT: umov w0, v0.h[0]329; CHECK-SD-NEXT: umov w1, v0.h[1]330; CHECK-SD-NEXT: umov w2, v0.h[2]331; CHECK-SD-NEXT: ret332;333; CHECK-GI-LABEL: trunc_v3i10_v3i32:334; CHECK-GI: // %bb.0: // %entry335; CHECK-GI-NEXT: mov s1, v0.s[1]336; CHECK-GI-NEXT: mov s2, v0.s[2]337; CHECK-GI-NEXT: fmov w0, s0338; CHECK-GI-NEXT: fmov w1, s1339; CHECK-GI-NEXT: fmov w2, s2340; CHECK-GI-NEXT: ret341entry:342 %c = trunc <3 x i32> %a to <3 x i10>343 ret <3 x i10> %c344}345 346define <3 x i10> @trunc_v3i10_v3i64(<3 x i64> %a) {347; CHECK-SD-LABEL: trunc_v3i10_v3i64:348; CHECK-SD: // %bb.0: // %entry349; CHECK-SD-NEXT: // kill: def $d0 killed $d0 def $q0350; CHECK-SD-NEXT: // kill: def $d1 killed $d1 def $q1351; CHECK-SD-NEXT: // kill: def $d2 killed $d2 def $q2352; CHECK-SD-NEXT: mov v0.d[1], v1.d[0]353; CHECK-SD-NEXT: xtn v1.2s, v2.2d354; CHECK-SD-NEXT: xtn v0.2s, v0.2d355; CHECK-SD-NEXT: fmov w2, s1356; CHECK-SD-NEXT: mov w1, v0.s[1]357; CHECK-SD-NEXT: fmov w0, s0358; CHECK-SD-NEXT: ret359;360; CHECK-GI-LABEL: trunc_v3i10_v3i64:361; CHECK-GI: // %bb.0: // %entry362; CHECK-GI-NEXT: fmov x0, d0363; CHECK-GI-NEXT: fmov x1, d1364; CHECK-GI-NEXT: fmov x2, d2365; CHECK-GI-NEXT: // kill: def $w0 killed $w0 killed $x0366; CHECK-GI-NEXT: // kill: def $w1 killed $w1 killed $x1367; CHECK-GI-NEXT: // kill: def $w2 killed $w2 killed $x2368; CHECK-GI-NEXT: ret369entry:370 %c = trunc <3 x i64> %a to <3 x i10>371 ret <3 x i10> %c372}373 374define <4 x i8> @trunc_v4i8_v4i16(<4 x i16> %a) {375; CHECK-LABEL: trunc_v4i8_v4i16:376; CHECK: // %bb.0: // %entry377; CHECK-NEXT: ret378entry:379 %c = trunc <4 x i16> %a to <4 x i8>380 ret <4 x i8> %c381}382 383define <4 x i8> @trunc_v4i8_v4i32(<4 x i32> %a) {384; CHECK-LABEL: trunc_v4i8_v4i32:385; CHECK: // %bb.0: // %entry386; CHECK-NEXT: xtn v0.4h, v0.4s387; CHECK-NEXT: ret388entry:389 %c = trunc <4 x i32> %a to <4 x i8>390 ret <4 x i8> %c391}392 393define <4 x i8> @trunc_v4i8_v4i64(<4 x i64> %a) {394; CHECK-LABEL: trunc_v4i8_v4i64:395; CHECK: // %bb.0: // %entry396; CHECK-NEXT: uzp1 v0.4s, v0.4s, v1.4s397; CHECK-NEXT: xtn v0.4h, v0.4s398; CHECK-NEXT: ret399entry:400 %c = trunc <4 x i64> %a to <4 x i8>401 ret <4 x i8> %c402}403 404define <4 x i16> @trunc_v4i16_v4i32(<4 x i32> %a) {405; CHECK-LABEL: trunc_v4i16_v4i32:406; CHECK: // %bb.0: // %entry407; CHECK-NEXT: xtn v0.4h, v0.4s408; CHECK-NEXT: ret409entry:410 %c = trunc <4 x i32> %a to <4 x i16>411 ret <4 x i16> %c412}413 414define <4 x i16> @trunc_v4i16_v4i64(<4 x i64> %a) {415; CHECK-LABEL: trunc_v4i16_v4i64:416; CHECK: // %bb.0: // %entry417; CHECK-NEXT: uzp1 v0.4s, v0.4s, v1.4s418; CHECK-NEXT: xtn v0.4h, v0.4s419; CHECK-NEXT: ret420entry:421 %c = trunc <4 x i64> %a to <4 x i16>422 ret <4 x i16> %c423}424 425define <4 x i32> @trunc_v4i32_v4i64(<4 x i64> %a) {426; CHECK-LABEL: trunc_v4i32_v4i64:427; CHECK: // %bb.0: // %entry428; CHECK-NEXT: uzp1 v0.4s, v0.4s, v1.4s429; CHECK-NEXT: ret430entry:431 %c = trunc <4 x i64> %a to <4 x i32>432 ret <4 x i32> %c433}434 435define <4 x i10> @trunc_v4i10_v4i16(<4 x i16> %a) {436; CHECK-LABEL: trunc_v4i10_v4i16:437; CHECK: // %bb.0: // %entry438; CHECK-NEXT: ret439entry:440 %c = trunc <4 x i16> %a to <4 x i10>441 ret <4 x i10> %c442}443 444define <4 x i10> @trunc_v4i10_v4i32(<4 x i32> %a) {445; CHECK-LABEL: trunc_v4i10_v4i32:446; CHECK: // %bb.0: // %entry447; CHECK-NEXT: xtn v0.4h, v0.4s448; CHECK-NEXT: ret449entry:450 %c = trunc <4 x i32> %a to <4 x i10>451 ret <4 x i10> %c452}453 454define <4 x i10> @trunc_v4i10_v4i64(<4 x i64> %a) {455; CHECK-LABEL: trunc_v4i10_v4i64:456; CHECK: // %bb.0: // %entry457; CHECK-NEXT: uzp1 v0.4s, v0.4s, v1.4s458; CHECK-NEXT: xtn v0.4h, v0.4s459; CHECK-NEXT: ret460entry:461 %c = trunc <4 x i64> %a to <4 x i10>462 ret <4 x i10> %c463}464 465define <8 x i8> @trunc_v8i8_v8i16(<8 x i16> %a) {466; CHECK-LABEL: trunc_v8i8_v8i16:467; CHECK: // %bb.0: // %entry468; CHECK-NEXT: xtn v0.8b, v0.8h469; CHECK-NEXT: ret470entry:471 %c = trunc <8 x i16> %a to <8 x i8>472 ret <8 x i8> %c473}474 475define <8 x i8> @trunc_v8i8_v8i32(<8 x i32> %a) {476; CHECK-LABEL: trunc_v8i8_v8i32:477; CHECK: // %bb.0: // %entry478; CHECK-NEXT: uzp1 v0.8h, v0.8h, v1.8h479; CHECK-NEXT: xtn v0.8b, v0.8h480; CHECK-NEXT: ret481entry:482 %c = trunc <8 x i32> %a to <8 x i8>483 ret <8 x i8> %c484}485 486define <8 x i8> @trunc_v8i8_v8i64(<8 x i64> %a) {487; CHECK-SD-LABEL: trunc_v8i8_v8i64:488; CHECK-SD: // %bb.0: // %entry489; CHECK-SD-NEXT: uzp1 v2.4s, v2.4s, v3.4s490; CHECK-SD-NEXT: uzp1 v0.4s, v0.4s, v1.4s491; CHECK-SD-NEXT: uzp1 v0.8h, v0.8h, v2.8h492; CHECK-SD-NEXT: xtn v0.8b, v0.8h493; CHECK-SD-NEXT: ret494;495; CHECK-GI-LABEL: trunc_v8i8_v8i64:496; CHECK-GI: // %bb.0: // %entry497; CHECK-GI-NEXT: uzp1 v0.4s, v0.4s, v1.4s498; CHECK-GI-NEXT: uzp1 v1.4s, v2.4s, v3.4s499; CHECK-GI-NEXT: uzp1 v0.8h, v0.8h, v1.8h500; CHECK-GI-NEXT: xtn v0.8b, v0.8h501; CHECK-GI-NEXT: ret502entry:503 %c = trunc <8 x i64> %a to <8 x i8>504 ret <8 x i8> %c505}506 507define <8 x i16> @trunc_v8i16_v8i32(<8 x i32> %a) {508; CHECK-LABEL: trunc_v8i16_v8i32:509; CHECK: // %bb.0: // %entry510; CHECK-NEXT: uzp1 v0.8h, v0.8h, v1.8h511; CHECK-NEXT: ret512entry:513 %c = trunc <8 x i32> %a to <8 x i16>514 ret <8 x i16> %c515}516 517define <8 x i16> @trunc_v8i16_v8i64(<8 x i64> %a) {518; CHECK-SD-LABEL: trunc_v8i16_v8i64:519; CHECK-SD: // %bb.0: // %entry520; CHECK-SD-NEXT: uzp1 v2.4s, v2.4s, v3.4s521; CHECK-SD-NEXT: uzp1 v0.4s, v0.4s, v1.4s522; CHECK-SD-NEXT: uzp1 v0.8h, v0.8h, v2.8h523; CHECK-SD-NEXT: ret524;525; CHECK-GI-LABEL: trunc_v8i16_v8i64:526; CHECK-GI: // %bb.0: // %entry527; CHECK-GI-NEXT: uzp1 v0.4s, v0.4s, v1.4s528; CHECK-GI-NEXT: uzp1 v1.4s, v2.4s, v3.4s529; CHECK-GI-NEXT: uzp1 v0.8h, v0.8h, v1.8h530; CHECK-GI-NEXT: ret531entry:532 %c = trunc <8 x i64> %a to <8 x i16>533 ret <8 x i16> %c534}535 536define <8 x i32> @trunc_v8i32_v8i64(<8 x i64> %a) {537; CHECK-SD-LABEL: trunc_v8i32_v8i64:538; CHECK-SD: // %bb.0: // %entry539; CHECK-SD-NEXT: uzp1 v2.4s, v2.4s, v3.4s540; CHECK-SD-NEXT: uzp1 v0.4s, v0.4s, v1.4s541; CHECK-SD-NEXT: mov v1.16b, v2.16b542; CHECK-SD-NEXT: ret543;544; CHECK-GI-LABEL: trunc_v8i32_v8i64:545; CHECK-GI: // %bb.0: // %entry546; CHECK-GI-NEXT: uzp1 v0.4s, v0.4s, v1.4s547; CHECK-GI-NEXT: uzp1 v1.4s, v2.4s, v3.4s548; CHECK-GI-NEXT: ret549entry:550 %c = trunc <8 x i64> %a to <8 x i32>551 ret <8 x i32> %c552}553 554define <8 x i10> @trunc_v8i10_v8i16(<8 x i16> %a) {555; CHECK-LABEL: trunc_v8i10_v8i16:556; CHECK: // %bb.0: // %entry557; CHECK-NEXT: ret558entry:559 %c = trunc <8 x i16> %a to <8 x i10>560 ret <8 x i10> %c561}562 563define <8 x i10> @trunc_v8i10_v8i32(<8 x i32> %a) {564; CHECK-LABEL: trunc_v8i10_v8i32:565; CHECK: // %bb.0: // %entry566; CHECK-NEXT: uzp1 v0.8h, v0.8h, v1.8h567; CHECK-NEXT: ret568entry:569 %c = trunc <8 x i32> %a to <8 x i10>570 ret <8 x i10> %c571}572 573define <8 x i10> @trunc_v8i10_v8i64(<8 x i64> %a) {574; CHECK-SD-LABEL: trunc_v8i10_v8i64:575; CHECK-SD: // %bb.0: // %entry576; CHECK-SD-NEXT: uzp1 v2.4s, v2.4s, v3.4s577; CHECK-SD-NEXT: uzp1 v0.4s, v0.4s, v1.4s578; CHECK-SD-NEXT: uzp1 v0.8h, v0.8h, v2.8h579; CHECK-SD-NEXT: ret580;581; CHECK-GI-LABEL: trunc_v8i10_v8i64:582; CHECK-GI: // %bb.0: // %entry583; CHECK-GI-NEXT: uzp1 v0.4s, v0.4s, v1.4s584; CHECK-GI-NEXT: uzp1 v1.4s, v2.4s, v3.4s585; CHECK-GI-NEXT: uzp1 v0.8h, v0.8h, v1.8h586; CHECK-GI-NEXT: ret587entry:588 %c = trunc <8 x i64> %a to <8 x i10>589 ret <8 x i10> %c590}591 592define <16 x i8> @trunc_v16i8_v16i16(<16 x i16> %a) {593; CHECK-LABEL: trunc_v16i8_v16i16:594; CHECK: // %bb.0: // %entry595; CHECK-NEXT: uzp1 v0.16b, v0.16b, v1.16b596; CHECK-NEXT: ret597entry:598 %c = trunc <16 x i16> %a to <16 x i8>599 ret <16 x i8> %c600}601 602define <16 x i8> @trunc_v16i8_v16i32(<16 x i32> %a) {603; CHECK-SD-LABEL: trunc_v16i8_v16i32:604; CHECK-SD: // %bb.0: // %entry605; CHECK-SD-NEXT: uzp1 v2.8h, v2.8h, v3.8h606; CHECK-SD-NEXT: uzp1 v0.8h, v0.8h, v1.8h607; CHECK-SD-NEXT: uzp1 v0.16b, v0.16b, v2.16b608; CHECK-SD-NEXT: ret609;610; CHECK-GI-LABEL: trunc_v16i8_v16i32:611; CHECK-GI: // %bb.0: // %entry612; CHECK-GI-NEXT: uzp1 v0.8h, v0.8h, v1.8h613; CHECK-GI-NEXT: uzp1 v1.8h, v2.8h, v3.8h614; CHECK-GI-NEXT: uzp1 v0.16b, v0.16b, v1.16b615; CHECK-GI-NEXT: ret616entry:617 %c = trunc <16 x i32> %a to <16 x i8>618 ret <16 x i8> %c619}620 621define <16 x i8> @trunc_v16i8_v16i64(<16 x i64> %a) {622; CHECK-SD-LABEL: trunc_v16i8_v16i64:623; CHECK-SD: // %bb.0: // %entry624; CHECK-SD-NEXT: uzp1 v6.4s, v6.4s, v7.4s625; CHECK-SD-NEXT: uzp1 v4.4s, v4.4s, v5.4s626; CHECK-SD-NEXT: uzp1 v2.4s, v2.4s, v3.4s627; CHECK-SD-NEXT: uzp1 v0.4s, v0.4s, v1.4s628; CHECK-SD-NEXT: uzp1 v1.8h, v4.8h, v6.8h629; CHECK-SD-NEXT: uzp1 v0.8h, v0.8h, v2.8h630; CHECK-SD-NEXT: uzp1 v0.16b, v0.16b, v1.16b631; CHECK-SD-NEXT: ret632;633; CHECK-GI-LABEL: trunc_v16i8_v16i64:634; CHECK-GI: // %bb.0: // %entry635; CHECK-GI-NEXT: uzp1 v0.4s, v0.4s, v1.4s636; CHECK-GI-NEXT: uzp1 v1.4s, v2.4s, v3.4s637; CHECK-GI-NEXT: uzp1 v2.4s, v4.4s, v5.4s638; CHECK-GI-NEXT: uzp1 v3.4s, v6.4s, v7.4s639; CHECK-GI-NEXT: uzp1 v0.8h, v0.8h, v1.8h640; CHECK-GI-NEXT: uzp1 v1.8h, v2.8h, v3.8h641; CHECK-GI-NEXT: uzp1 v0.16b, v0.16b, v1.16b642; CHECK-GI-NEXT: ret643entry:644 %c = trunc <16 x i64> %a to <16 x i8>645 ret <16 x i8> %c646}647 648define <16 x i16> @trunc_v16i16_v16i32(<16 x i32> %a) {649; CHECK-SD-LABEL: trunc_v16i16_v16i32:650; CHECK-SD: // %bb.0: // %entry651; CHECK-SD-NEXT: uzp1 v2.8h, v2.8h, v3.8h652; CHECK-SD-NEXT: uzp1 v0.8h, v0.8h, v1.8h653; CHECK-SD-NEXT: mov v1.16b, v2.16b654; CHECK-SD-NEXT: ret655;656; CHECK-GI-LABEL: trunc_v16i16_v16i32:657; CHECK-GI: // %bb.0: // %entry658; CHECK-GI-NEXT: uzp1 v0.8h, v0.8h, v1.8h659; CHECK-GI-NEXT: uzp1 v1.8h, v2.8h, v3.8h660; CHECK-GI-NEXT: ret661entry:662 %c = trunc <16 x i32> %a to <16 x i16>663 ret <16 x i16> %c664}665 666define <16 x i16> @trunc_v16i16_v16i64(<16 x i64> %a) {667; CHECK-SD-LABEL: trunc_v16i16_v16i64:668; CHECK-SD: // %bb.0: // %entry669; CHECK-SD-NEXT: uzp1 v2.4s, v2.4s, v3.4s670; CHECK-SD-NEXT: uzp1 v0.4s, v0.4s, v1.4s671; CHECK-SD-NEXT: uzp1 v1.4s, v6.4s, v7.4s672; CHECK-SD-NEXT: uzp1 v3.4s, v4.4s, v5.4s673; CHECK-SD-NEXT: uzp1 v0.8h, v0.8h, v2.8h674; CHECK-SD-NEXT: uzp1 v1.8h, v3.8h, v1.8h675; CHECK-SD-NEXT: ret676;677; CHECK-GI-LABEL: trunc_v16i16_v16i64:678; CHECK-GI: // %bb.0: // %entry679; CHECK-GI-NEXT: uzp1 v0.4s, v0.4s, v1.4s680; CHECK-GI-NEXT: uzp1 v1.4s, v2.4s, v3.4s681; CHECK-GI-NEXT: uzp1 v2.4s, v4.4s, v5.4s682; CHECK-GI-NEXT: uzp1 v3.4s, v6.4s, v7.4s683; CHECK-GI-NEXT: uzp1 v0.8h, v0.8h, v1.8h684; CHECK-GI-NEXT: uzp1 v1.8h, v2.8h, v3.8h685; CHECK-GI-NEXT: ret686entry:687 %c = trunc <16 x i64> %a to <16 x i16>688 ret <16 x i16> %c689}690 691define <16 x i32> @trunc_v16i32_v16i64(<16 x i64> %a) {692; CHECK-LABEL: trunc_v16i32_v16i64:693; CHECK: // %bb.0: // %entry694; CHECK-NEXT: uzp1 v0.4s, v0.4s, v1.4s695; CHECK-NEXT: uzp1 v1.4s, v2.4s, v3.4s696; CHECK-NEXT: uzp1 v2.4s, v4.4s, v5.4s697; CHECK-NEXT: uzp1 v3.4s, v6.4s, v7.4s698; CHECK-NEXT: ret699entry:700 %c = trunc <16 x i64> %a to <16 x i32>701 ret <16 x i32> %c702}703 704define <16 x i10> @trunc_v16i10_v16i16(<16 x i16> %a) {705; CHECK-LABEL: trunc_v16i10_v16i16:706; CHECK: // %bb.0: // %entry707; CHECK-NEXT: umov w9, v1.h[0]708; CHECK-NEXT: umov w10, v1.h[1]709; CHECK-NEXT: umov w11, v0.h[0]710; CHECK-NEXT: umov w12, v0.h[1]711; CHECK-NEXT: umov w13, v1.h[2]712; CHECK-NEXT: umov w14, v0.h[2]713; CHECK-NEXT: umov w15, v1.h[3]714; CHECK-NEXT: umov w16, v0.h[3]715; CHECK-NEXT: umov w17, v0.h[4]716; CHECK-NEXT: umov w18, v1.h[5]717; CHECK-NEXT: and x9, x9, #0x3ff718; CHECK-NEXT: and x11, x11, #0x3ff719; CHECK-NEXT: bfi x9, x10, #10, #10720; CHECK-NEXT: umov w10, v1.h[4]721; CHECK-NEXT: bfi x11, x12, #10, #10722; CHECK-NEXT: umov w12, v1.h[7]723; CHECK-NEXT: bfi x9, x13, #20, #10724; CHECK-NEXT: umov w13, v0.h[7]725; CHECK-NEXT: bfi x11, x14, #20, #10726; CHECK-NEXT: umov w14, v1.h[6]727; CHECK-NEXT: bfi x9, x15, #30, #10728; CHECK-NEXT: umov w15, v0.h[5]729; CHECK-NEXT: bfi x11, x16, #30, #10730; CHECK-NEXT: and w10, w10, #0x3ff731; CHECK-NEXT: umov w16, v0.h[6]732; CHECK-NEXT: orr x9, x9, x10, lsl #40733; CHECK-NEXT: lsl w10, w12, #6734; CHECK-NEXT: and w12, w17, #0x3ff735; CHECK-NEXT: orr x11, x11, x12, lsl #40736; CHECK-NEXT: lsl w12, w13, #6737; CHECK-NEXT: and w13, w18, #0x3ff738; CHECK-NEXT: orr x9, x9, x13, lsl #50739; CHECK-NEXT: and w13, w15, #0x3ff740; CHECK-NEXT: bfxil w10, w14, #4, #6741; CHECK-NEXT: orr x11, x11, x13, lsl #50742; CHECK-NEXT: bfxil w12, w16, #4, #6743; CHECK-NEXT: strh w10, [x8, #18]744; CHECK-NEXT: orr x9, x9, x14, lsl #60745; CHECK-NEXT: orr x10, x11, x16, lsl #60746; CHECK-NEXT: strh w12, [x8, #8]747; CHECK-NEXT: stur x9, [x8, #10]748; CHECK-NEXT: str x10, [x8]749; CHECK-NEXT: ret750entry:751 %c = trunc <16 x i16> %a to <16 x i10>752 ret <16 x i10> %c753}754 755define <16 x i10> @trunc_v16i10_v16i32(<16 x i32> %a) {756; CHECK-LABEL: trunc_v16i10_v16i32:757; CHECK: // %bb.0: // %entry758; CHECK-NEXT: xtn v2.4h, v2.4s759; CHECK-NEXT: xtn v0.4h, v0.4s760; CHECK-NEXT: xtn v3.4h, v3.4s761; CHECK-NEXT: xtn v1.4h, v1.4s762; CHECK-NEXT: umov w9, v2.h[0]763; CHECK-NEXT: umov w10, v2.h[1]764; CHECK-NEXT: umov w11, v0.h[0]765; CHECK-NEXT: umov w12, v0.h[1]766; CHECK-NEXT: umov w13, v2.h[2]767; CHECK-NEXT: umov w14, v0.h[2]768; CHECK-NEXT: umov w15, v2.h[3]769; CHECK-NEXT: umov w16, v0.h[3]770; CHECK-NEXT: umov w17, v1.h[0]771; CHECK-NEXT: umov w18, v3.h[1]772; CHECK-NEXT: and x9, x9, #0x3ff773; CHECK-NEXT: and x11, x11, #0x3ff774; CHECK-NEXT: bfi x9, x10, #10, #10775; CHECK-NEXT: umov w10, v3.h[0]776; CHECK-NEXT: bfi x11, x12, #10, #10777; CHECK-NEXT: umov w12, v3.h[3]778; CHECK-NEXT: bfi x9, x13, #20, #10779; CHECK-NEXT: umov w13, v1.h[3]780; CHECK-NEXT: bfi x11, x14, #20, #10781; CHECK-NEXT: umov w14, v3.h[2]782; CHECK-NEXT: bfi x9, x15, #30, #10783; CHECK-NEXT: umov w15, v1.h[1]784; CHECK-NEXT: bfi x11, x16, #30, #10785; CHECK-NEXT: and w10, w10, #0x3ff786; CHECK-NEXT: umov w16, v1.h[2]787; CHECK-NEXT: orr x9, x9, x10, lsl #40788; CHECK-NEXT: lsl w10, w12, #6789; CHECK-NEXT: and w12, w17, #0x3ff790; CHECK-NEXT: orr x11, x11, x12, lsl #40791; CHECK-NEXT: lsl w12, w13, #6792; CHECK-NEXT: and w13, w18, #0x3ff793; CHECK-NEXT: orr x9, x9, x13, lsl #50794; CHECK-NEXT: and w13, w15, #0x3ff795; CHECK-NEXT: bfxil w10, w14, #4, #6796; CHECK-NEXT: orr x11, x11, x13, lsl #50797; CHECK-NEXT: bfxil w12, w16, #4, #6798; CHECK-NEXT: strh w10, [x8, #18]799; CHECK-NEXT: orr x9, x9, x14, lsl #60800; CHECK-NEXT: orr x10, x11, x16, lsl #60801; CHECK-NEXT: strh w12, [x8, #8]802; CHECK-NEXT: stur x9, [x8, #10]803; CHECK-NEXT: str x10, [x8]804; CHECK-NEXT: ret805entry:806 %c = trunc <16 x i32> %a to <16 x i10>807 ret <16 x i10> %c808}809 810define <16 x i10> @trunc_v16i10_v16i64(<16 x i64> %a) {811; CHECK-LABEL: trunc_v16i10_v16i64:812; CHECK: // %bb.0: // %entry813; CHECK-NEXT: uzp1 v4.4s, v4.4s, v5.4s814; CHECK-NEXT: uzp1 v0.4s, v0.4s, v1.4s815; CHECK-NEXT: uzp1 v2.4s, v2.4s, v3.4s816; CHECK-NEXT: xtn v1.4h, v4.4s817; CHECK-NEXT: xtn v0.4h, v0.4s818; CHECK-NEXT: uzp1 v4.4s, v6.4s, v7.4s819; CHECK-NEXT: xtn v2.4h, v2.4s820; CHECK-NEXT: umov w9, v1.h[0]821; CHECK-NEXT: umov w10, v1.h[1]822; CHECK-NEXT: umov w11, v0.h[0]823; CHECK-NEXT: xtn v3.4h, v4.4s824; CHECK-NEXT: umov w12, v0.h[1]825; CHECK-NEXT: umov w13, v1.h[2]826; CHECK-NEXT: umov w14, v0.h[2]827; CHECK-NEXT: umov w15, v1.h[3]828; CHECK-NEXT: umov w16, v0.h[3]829; CHECK-NEXT: umov w17, v2.h[0]830; CHECK-NEXT: and x9, x9, #0x3ff831; CHECK-NEXT: and x11, x11, #0x3ff832; CHECK-NEXT: bfi x9, x10, #10, #10833; CHECK-NEXT: umov w10, v3.h[0]834; CHECK-NEXT: bfi x11, x12, #10, #10835; CHECK-NEXT: umov w12, v3.h[3]836; CHECK-NEXT: umov w18, v3.h[1]837; CHECK-NEXT: bfi x9, x13, #20, #10838; CHECK-NEXT: umov w13, v2.h[3]839; CHECK-NEXT: bfi x11, x14, #20, #10840; CHECK-NEXT: umov w14, v3.h[2]841; CHECK-NEXT: bfi x9, x15, #30, #10842; CHECK-NEXT: umov w15, v2.h[1]843; CHECK-NEXT: bfi x11, x16, #30, #10844; CHECK-NEXT: and w10, w10, #0x3ff845; CHECK-NEXT: umov w16, v2.h[2]846; CHECK-NEXT: orr x9, x9, x10, lsl #40847; CHECK-NEXT: lsl w10, w12, #6848; CHECK-NEXT: and w12, w17, #0x3ff849; CHECK-NEXT: orr x11, x11, x12, lsl #40850; CHECK-NEXT: lsl w12, w13, #6851; CHECK-NEXT: and w13, w18, #0x3ff852; CHECK-NEXT: orr x9, x9, x13, lsl #50853; CHECK-NEXT: and w13, w15, #0x3ff854; CHECK-NEXT: bfxil w10, w14, #4, #6855; CHECK-NEXT: orr x11, x11, x13, lsl #50856; CHECK-NEXT: bfxil w12, w16, #4, #6857; CHECK-NEXT: strh w10, [x8, #18]858; CHECK-NEXT: orr x9, x9, x14, lsl #60859; CHECK-NEXT: orr x10, x11, x16, lsl #60860; CHECK-NEXT: strh w12, [x8, #8]861; CHECK-NEXT: stur x9, [x8, #10]862; CHECK-NEXT: str x10, [x8]863; CHECK-NEXT: ret864entry:865 %c = trunc <16 x i64> %a to <16 x i10>866 ret <16 x i10> %c867}868 869define <2 x i64> @trunc_v2i64_v2i128(<2 x i128> %a) {870; CHECK-LABEL: trunc_v2i64_v2i128:871; CHECK: // %bb.0: // %entry872; CHECK-NEXT: fmov d0, x0873; CHECK-NEXT: mov v0.d[1], x2874; CHECK-NEXT: ret875entry:876 %c = trunc <2 x i128> %a to <2 x i64>877 ret <2 x i64> %c878}879