xref: /llvm-project/llvm/test/CodeGen/ARM/neon-vmovn.ll (revision 9d4c59754110647f8cc8cdd4fef3114843c91d17)
16505124aSDavid Green; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
26505124aSDavid Green; RUN: llc -mtriple=armv8-arm-none-eabi -verify-machineinstrs %s -o - | FileCheck %s
36505124aSDavid Green; RUN: llc -mtriple=armebv8-arm-none-eabi -verify-machineinstrs %s -o - | FileCheck %s --check-prefix=CHECKBE
46505124aSDavid Green
56505124aSDavid Green; This is the same as Thumb2/mve-vmovn.ll, testing the same patterns for neon
66505124aSDavid Green; under both both LE and BE. The vmovn instruction is very different between
76505124aSDavid Green; mve and neon, so these tests are not necessarily expected to generate a (neon)
86505124aSDavid Green; vmovn.
96505124aSDavid Green
106505124aSDavid Greendefine arm_aapcs_vfpcc <8 x i16> @vmovn32_trunc1(<4 x i32> %src1, <4 x i32> %src2) {
116505124aSDavid Green; CHECK-LABEL: vmovn32_trunc1:
126505124aSDavid Green; CHECK:       @ %bb.0: @ %entry
136505124aSDavid Green; CHECK-NEXT:    vzip.32 q0, q1
146505124aSDavid Green; CHECK-NEXT:    vmovn.i32 d17, q1
156505124aSDavid Green; CHECK-NEXT:    vmovn.i32 d16, q0
166505124aSDavid Green; CHECK-NEXT:    vorr q0, q8, q8
176505124aSDavid Green; CHECK-NEXT:    bx lr
186505124aSDavid Green;
196505124aSDavid Green; CHECKBE-LABEL: vmovn32_trunc1:
206505124aSDavid Green; CHECKBE:       @ %bb.0: @ %entry
216505124aSDavid Green; CHECKBE-NEXT:    vrev64.32 q8, q1
226505124aSDavid Green; CHECKBE-NEXT:    vrev64.32 q9, q0
236505124aSDavid Green; CHECKBE-NEXT:    vzip.32 q9, q8
246505124aSDavid Green; CHECKBE-NEXT:    vmovn.i32 d17, q8
256505124aSDavid Green; CHECKBE-NEXT:    vmovn.i32 d16, q9
266505124aSDavid Green; CHECKBE-NEXT:    vrev64.16 q0, q8
276505124aSDavid Green; CHECKBE-NEXT:    bx lr
286505124aSDavid Greenentry:
296505124aSDavid Green  %strided.vec = shufflevector <4 x i32> %src1, <4 x i32> %src2, <8 x i32> <i32 0, i32 4, i32 1, i32 5, i32 2, i32 6, i32 3, i32 7>
306505124aSDavid Green  %out = trunc <8 x i32> %strided.vec to <8 x i16>
316505124aSDavid Green  ret <8 x i16> %out
326505124aSDavid Green}
336505124aSDavid Green
346505124aSDavid Greendefine arm_aapcs_vfpcc <8 x i16> @vmovn32_trunc2(<4 x i32> %src1, <4 x i32> %src2) {
356505124aSDavid Green; CHECK-LABEL: vmovn32_trunc2:
366505124aSDavid Green; CHECK:       @ %bb.0: @ %entry
376505124aSDavid Green; CHECK-NEXT:    vzip.32 q1, q0
386505124aSDavid Green; CHECK-NEXT:    vmovn.i32 d1, q0
396505124aSDavid Green; CHECK-NEXT:    vmovn.i32 d0, q1
406505124aSDavid Green; CHECK-NEXT:    bx lr
416505124aSDavid Green;
426505124aSDavid Green; CHECKBE-LABEL: vmovn32_trunc2:
436505124aSDavid Green; CHECKBE:       @ %bb.0: @ %entry
446505124aSDavid Green; CHECKBE-NEXT:    vrev64.32 q8, q0
456505124aSDavid Green; CHECKBE-NEXT:    vrev64.32 q9, q1
466505124aSDavid Green; CHECKBE-NEXT:    vzip.32 q9, q8
476505124aSDavid Green; CHECKBE-NEXT:    vmovn.i32 d17, q8
486505124aSDavid Green; CHECKBE-NEXT:    vmovn.i32 d16, q9
496505124aSDavid Green; CHECKBE-NEXT:    vrev64.16 q0, q8
506505124aSDavid Green; CHECKBE-NEXT:    bx lr
516505124aSDavid Greenentry:
526505124aSDavid Green  %strided.vec = shufflevector <4 x i32> %src1, <4 x i32> %src2, <8 x i32> <i32 4, i32 0, i32 5, i32 1, i32 6, i32 2, i32 7, i32 3>
536505124aSDavid Green  %out = trunc <8 x i32> %strided.vec to <8 x i16>
546505124aSDavid Green  ret <8 x i16> %out
556505124aSDavid Green}
566505124aSDavid Green
576505124aSDavid Greendefine arm_aapcs_vfpcc <16 x i8> @vmovn16_trunc1(<8 x i16> %src1, <8 x i16> %src2) {
586505124aSDavid Green; CHECK-LABEL: vmovn16_trunc1:
596505124aSDavid Green; CHECK:       @ %bb.0: @ %entry
606505124aSDavid Green; CHECK-NEXT:    vzip.16 q0, q1
616505124aSDavid Green; CHECK-NEXT:    vmovn.i16 d17, q1
626505124aSDavid Green; CHECK-NEXT:    vmovn.i16 d16, q0
636505124aSDavid Green; CHECK-NEXT:    vorr q0, q8, q8
646505124aSDavid Green; CHECK-NEXT:    bx lr
656505124aSDavid Green;
666505124aSDavid Green; CHECKBE-LABEL: vmovn16_trunc1:
676505124aSDavid Green; CHECKBE:       @ %bb.0: @ %entry
686505124aSDavid Green; CHECKBE-NEXT:    vrev64.16 q8, q1
696505124aSDavid Green; CHECKBE-NEXT:    vrev64.16 q9, q0
706505124aSDavid Green; CHECKBE-NEXT:    vzip.16 q9, q8
716505124aSDavid Green; CHECKBE-NEXT:    vmovn.i16 d17, q8
726505124aSDavid Green; CHECKBE-NEXT:    vmovn.i16 d16, q9
736505124aSDavid Green; CHECKBE-NEXT:    vrev64.8 q0, q8
746505124aSDavid Green; CHECKBE-NEXT:    bx lr
756505124aSDavid Greenentry:
766505124aSDavid Green  %strided.vec = shufflevector <8 x i16> %src1, <8 x i16> %src2, <16 x i32> <i32 0, i32 8, i32 1, i32 9, i32 2, i32 10, i32 3, i32 11, i32 4, i32 12, i32 5, i32 13, i32 6, i32 14, i32 7, i32 15>
776505124aSDavid Green  %out = trunc <16 x i16> %strided.vec to <16 x i8>
786505124aSDavid Green  ret <16 x i8> %out
796505124aSDavid Green}
806505124aSDavid Green
816505124aSDavid Greendefine arm_aapcs_vfpcc <16 x i8> @vmovn16_trunc2(<8 x i16> %src1, <8 x i16> %src2) {
826505124aSDavid Green; CHECK-LABEL: vmovn16_trunc2:
836505124aSDavid Green; CHECK:       @ %bb.0: @ %entry
846505124aSDavid Green; CHECK-NEXT:    vzip.16 q1, q0
856505124aSDavid Green; CHECK-NEXT:    vmovn.i16 d1, q0
866505124aSDavid Green; CHECK-NEXT:    vmovn.i16 d0, q1
876505124aSDavid Green; CHECK-NEXT:    bx lr
886505124aSDavid Green;
896505124aSDavid Green; CHECKBE-LABEL: vmovn16_trunc2:
906505124aSDavid Green; CHECKBE:       @ %bb.0: @ %entry
916505124aSDavid Green; CHECKBE-NEXT:    vrev64.16 q8, q0
926505124aSDavid Green; CHECKBE-NEXT:    vrev64.16 q9, q1
936505124aSDavid Green; CHECKBE-NEXT:    vzip.16 q9, q8
946505124aSDavid Green; CHECKBE-NEXT:    vmovn.i16 d17, q8
956505124aSDavid Green; CHECKBE-NEXT:    vmovn.i16 d16, q9
966505124aSDavid Green; CHECKBE-NEXT:    vrev64.8 q0, q8
976505124aSDavid Green; CHECKBE-NEXT:    bx lr
986505124aSDavid Greenentry:
996505124aSDavid Green  %strided.vec = shufflevector <8 x i16> %src1, <8 x i16> %src2, <16 x i32> <i32 8, i32 0, i32 9, i32 1, i32 10, i32 2, i32 11, i32 3, i32 12, i32 4, i32 13, i32 5, i32 14, i32 6, i32 15, i32 7>
1006505124aSDavid Green  %out = trunc <16 x i16> %strided.vec to <16 x i8>
1016505124aSDavid Green  ret <16 x i8> %out
1026505124aSDavid Green}
1036505124aSDavid Green
1046505124aSDavid Green
1056505124aSDavid Greendefine arm_aapcs_vfpcc <2 x i64> @vmovn64_t1(<2 x i64> %src1, <2 x i64> %src2) {
1066505124aSDavid Green; CHECK-LABEL: vmovn64_t1:
1076505124aSDavid Green; CHECK:       @ %bb.0: @ %entry
1086505124aSDavid Green; CHECK-NEXT:    vmov.f64 d1, d2
1096505124aSDavid Green; CHECK-NEXT:    bx lr
1106505124aSDavid Green;
1116505124aSDavid Green; CHECKBE-LABEL: vmovn64_t1:
1126505124aSDavid Green; CHECKBE:       @ %bb.0: @ %entry
1136505124aSDavid Green; CHECKBE-NEXT:    vmov.f64 d1, d2
1146505124aSDavid Green; CHECKBE-NEXT:    bx lr
1156505124aSDavid Greenentry:
1166505124aSDavid Green  %out = shufflevector <2 x i64> %src1, <2 x i64> %src2, <2 x i32> <i32 0, i32 2>
1176505124aSDavid Green  ret <2 x i64> %out
1186505124aSDavid Green}
1196505124aSDavid Green
1206505124aSDavid Greendefine arm_aapcs_vfpcc <2 x i64> @vmovn64_t2(<2 x i64> %src1, <2 x i64> %src2) {
1216505124aSDavid Green; CHECK-LABEL: vmovn64_t2:
1226505124aSDavid Green; CHECK:       @ %bb.0: @ %entry
1236505124aSDavid Green; CHECK-NEXT:    vorr d3, d0, d0
1246505124aSDavid Green; CHECK-NEXT:    vorr q0, q1, q1
1256505124aSDavid Green; CHECK-NEXT:    bx lr
1266505124aSDavid Green;
1276505124aSDavid Green; CHECKBE-LABEL: vmovn64_t2:
1286505124aSDavid Green; CHECKBE:       @ %bb.0: @ %entry
1296505124aSDavid Green; CHECKBE-NEXT:    vorr d3, d0, d0
1306505124aSDavid Green; CHECKBE-NEXT:    vorr q0, q1, q1
1316505124aSDavid Green; CHECKBE-NEXT:    bx lr
1326505124aSDavid Greenentry:
1336505124aSDavid Green  %out = shufflevector <2 x i64> %src1, <2 x i64> %src2, <2 x i32> <i32 2, i32 0>
1346505124aSDavid Green  ret <2 x i64> %out
1356505124aSDavid Green}
1366505124aSDavid Green
1376505124aSDavid Greendefine arm_aapcs_vfpcc <2 x i64> @vmovn64_b1(<2 x i64> %src1, <2 x i64> %src2) {
1386505124aSDavid Green; CHECK-LABEL: vmovn64_b1:
1396505124aSDavid Green; CHECK:       @ %bb.0: @ %entry
1406505124aSDavid Green; CHECK-NEXT:    vmov.f64 d1, d3
1416505124aSDavid Green; CHECK-NEXT:    bx lr
1426505124aSDavid Green;
1436505124aSDavid Green; CHECKBE-LABEL: vmovn64_b1:
1446505124aSDavid Green; CHECKBE:       @ %bb.0: @ %entry
1456505124aSDavid Green; CHECKBE-NEXT:    vmov.f64 d1, d3
1466505124aSDavid Green; CHECKBE-NEXT:    bx lr
1476505124aSDavid Greenentry:
1486505124aSDavid Green  %out = shufflevector <2 x i64> %src1, <2 x i64> %src2, <2 x i32> <i32 0, i32 3>
1496505124aSDavid Green  ret <2 x i64> %out
1506505124aSDavid Green}
1516505124aSDavid Green
1526505124aSDavid Greendefine arm_aapcs_vfpcc <2 x i64> @vmovn64_b2(<2 x i64> %src1, <2 x i64> %src2) {
1536505124aSDavid Green; CHECK-LABEL: vmovn64_b2:
1546505124aSDavid Green; CHECK:       @ %bb.0: @ %entry
1556505124aSDavid Green; CHECK-NEXT:    vmov.f64 d16, d3
1566505124aSDavid Green; CHECK-NEXT:    vorr d17, d0, d0
1576505124aSDavid Green; CHECK-NEXT:    vorr q0, q8, q8
1586505124aSDavid Green; CHECK-NEXT:    bx lr
1596505124aSDavid Green;
1606505124aSDavid Green; CHECKBE-LABEL: vmovn64_b2:
1616505124aSDavid Green; CHECKBE:       @ %bb.0: @ %entry
1626505124aSDavid Green; CHECKBE-NEXT:    vmov.f64 d16, d3
1636505124aSDavid Green; CHECKBE-NEXT:    vorr d17, d0, d0
1646505124aSDavid Green; CHECKBE-NEXT:    vorr q0, q8, q8
1656505124aSDavid Green; CHECKBE-NEXT:    bx lr
1666505124aSDavid Greenentry:
1676505124aSDavid Green  %out = shufflevector <2 x i64> %src1, <2 x i64> %src2, <2 x i32> <i32 3, i32 0>
1686505124aSDavid Green  ret <2 x i64> %out
1696505124aSDavid Green}
1706505124aSDavid Green
1716505124aSDavid Greendefine arm_aapcs_vfpcc <2 x i64> @vmovn64_b3(<2 x i64> %src1, <2 x i64> %src2) {
1726505124aSDavid Green; CHECK-LABEL: vmovn64_b3:
1736505124aSDavid Green; CHECK:       @ %bb.0: @ %entry
1746505124aSDavid Green; CHECK-NEXT:    vmov.f64 d0, d1
1756505124aSDavid Green; CHECK-NEXT:    vmov.f64 d1, d2
1766505124aSDavid Green; CHECK-NEXT:    bx lr
1776505124aSDavid Green;
1786505124aSDavid Green; CHECKBE-LABEL: vmovn64_b3:
1796505124aSDavid Green; CHECKBE:       @ %bb.0: @ %entry
1806505124aSDavid Green; CHECKBE-NEXT:    vmov.f64 d0, d1
1816505124aSDavid Green; CHECKBE-NEXT:    vmov.f64 d1, d2
1826505124aSDavid Green; CHECKBE-NEXT:    bx lr
1836505124aSDavid Greenentry:
1846505124aSDavid Green  %out = shufflevector <2 x i64> %src1, <2 x i64> %src2, <2 x i32> <i32 1, i32 2>
1856505124aSDavid Green  ret <2 x i64> %out
1866505124aSDavid Green}
1876505124aSDavid Green
1886505124aSDavid Greendefine arm_aapcs_vfpcc <2 x i64> @vmovn64_b4(<2 x i64> %src1, <2 x i64> %src2) {
1896505124aSDavid Green; CHECK-LABEL: vmovn64_b4:
1906505124aSDavid Green; CHECK:       @ %bb.0: @ %entry
1916505124aSDavid Green; CHECK-NEXT:    vorr d3, d1, d1
1926505124aSDavid Green; CHECK-NEXT:    vorr q0, q1, q1
1936505124aSDavid Green; CHECK-NEXT:    bx lr
1946505124aSDavid Green;
1956505124aSDavid Green; CHECKBE-LABEL: vmovn64_b4:
1966505124aSDavid Green; CHECKBE:       @ %bb.0: @ %entry
1976505124aSDavid Green; CHECKBE-NEXT:    vorr d3, d1, d1
1986505124aSDavid Green; CHECKBE-NEXT:    vorr q0, q1, q1
1996505124aSDavid Green; CHECKBE-NEXT:    bx lr
2006505124aSDavid Greenentry:
2016505124aSDavid Green  %out = shufflevector <2 x i64> %src1, <2 x i64> %src2, <2 x i32> <i32 2, i32 1>
2026505124aSDavid Green  ret <2 x i64> %out
2036505124aSDavid Green}
2046505124aSDavid Green
2056505124aSDavid Green
2066505124aSDavid Green
2076505124aSDavid Greendefine arm_aapcs_vfpcc <4 x i32> @vmovn32_t1(<4 x i32> %src1, <4 x i32> %src2) {
2086505124aSDavid Green; CHECK-LABEL: vmovn32_t1:
2096505124aSDavid Green; CHECK:       @ %bb.0: @ %entry
2106505124aSDavid Green; CHECK-NEXT:    vtrn.32 q0, q1
2116505124aSDavid Green; CHECK-NEXT:    bx lr
2126505124aSDavid Green;
2136505124aSDavid Green; CHECKBE-LABEL: vmovn32_t1:
2146505124aSDavid Green; CHECKBE:       @ %bb.0: @ %entry
2156505124aSDavid Green; CHECKBE-NEXT:    vrev64.32 q8, q1
2166505124aSDavid Green; CHECKBE-NEXT:    vrev64.32 q9, q0
2176505124aSDavid Green; CHECKBE-NEXT:    vtrn.32 q9, q8
2186505124aSDavid Green; CHECKBE-NEXT:    vrev64.32 q0, q9
2196505124aSDavid Green; CHECKBE-NEXT:    bx lr
2206505124aSDavid Greenentry:
2216505124aSDavid Green  %out = shufflevector <4 x i32> %src1, <4 x i32> %src2, <4 x i32> <i32 0, i32 4, i32 2, i32 6>
2226505124aSDavid Green  ret <4 x i32> %out
2236505124aSDavid Green}
2246505124aSDavid Green
2256505124aSDavid Greendefine arm_aapcs_vfpcc <4 x i32> @vmovn32_t2(<4 x i32> %src1, <4 x i32> %src2) {
2266505124aSDavid Green; CHECK-LABEL: vmovn32_t2:
2276505124aSDavid Green; CHECK:       @ %bb.0: @ %entry
2286505124aSDavid Green; CHECK-NEXT:    vtrn.32 q1, q0
2296505124aSDavid Green; CHECK-NEXT:    vorr q0, q1, q1
2306505124aSDavid Green; CHECK-NEXT:    bx lr
2316505124aSDavid Green;
2326505124aSDavid Green; CHECKBE-LABEL: vmovn32_t2:
2336505124aSDavid Green; CHECKBE:       @ %bb.0: @ %entry
2346505124aSDavid Green; CHECKBE-NEXT:    vrev64.32 q8, q0
2356505124aSDavid Green; CHECKBE-NEXT:    vrev64.32 q9, q1
2366505124aSDavid Green; CHECKBE-NEXT:    vtrn.32 q9, q8
2376505124aSDavid Green; CHECKBE-NEXT:    vrev64.32 q0, q9
2386505124aSDavid Green; CHECKBE-NEXT:    bx lr
2396505124aSDavid Greenentry:
2406505124aSDavid Green  %out = shufflevector <4 x i32> %src1, <4 x i32> %src2, <4 x i32> <i32 4, i32 0, i32 6, i32 2>
2416505124aSDavid Green  ret <4 x i32> %out
2426505124aSDavid Green}
2436505124aSDavid Green
2446505124aSDavid Greendefine arm_aapcs_vfpcc <4 x i32> @vmovn32_b1(<4 x i32> %src1, <4 x i32> %src2) {
2456505124aSDavid Green; CHECK-LABEL: vmovn32_b1:
2466505124aSDavid Green; CHECK:       @ %bb.0: @ %entry
2476505124aSDavid Green; CHECK-NEXT:    vrev64.32 q8, q0
2486505124aSDavid Green; CHECK-NEXT:    vtrn.32 q8, q1
2496505124aSDavid Green; CHECK-NEXT:    vorr q0, q1, q1
2506505124aSDavid Green; CHECK-NEXT:    bx lr
2516505124aSDavid Green;
2526505124aSDavid Green; CHECKBE-LABEL: vmovn32_b1:
2536505124aSDavid Green; CHECKBE:       @ %bb.0: @ %entry
2546505124aSDavid Green; CHECKBE-NEXT:    vrev64.32 q8, q0
2556505124aSDavid Green; CHECKBE-NEXT:    vrev64.32 q9, q1
2566505124aSDavid Green; CHECKBE-NEXT:    vrev64.32 q8, q8
2576505124aSDavid Green; CHECKBE-NEXT:    vtrn.32 q8, q9
2586505124aSDavid Green; CHECKBE-NEXT:    vrev64.32 q0, q9
2596505124aSDavid Green; CHECKBE-NEXT:    bx lr
2606505124aSDavid Greenentry:
2616505124aSDavid Green  %out = shufflevector <4 x i32> %src1, <4 x i32> %src2, <4 x i32> <i32 0, i32 5, i32 2, i32 7>
2626505124aSDavid Green  ret <4 x i32> %out
2636505124aSDavid Green}
2646505124aSDavid Green
2656505124aSDavid Greendefine arm_aapcs_vfpcc <4 x i32> @vmovn32_b2(<4 x i32> %src1, <4 x i32> %src2) {
2666505124aSDavid Green; CHECK-LABEL: vmovn32_b2:
2676505124aSDavid Green; CHECK:       @ %bb.0: @ %entry
2686505124aSDavid Green; CHECK-NEXT:    vext.32 q8, q0, q0, #1
2696505124aSDavid Green; CHECK-NEXT:    vtrn.32 q8, q1
2706505124aSDavid Green; CHECK-NEXT:    vext.32 q0, q1, q1, #1
2716505124aSDavid Green; CHECK-NEXT:    bx lr
2726505124aSDavid Green;
2736505124aSDavid Green; CHECKBE-LABEL: vmovn32_b2:
2746505124aSDavid Green; CHECKBE:       @ %bb.0: @ %entry
2756505124aSDavid Green; CHECKBE-NEXT:    vrev64.32 q8, q0
2766505124aSDavid Green; CHECKBE-NEXT:    vrev64.32 q9, q1
2776505124aSDavid Green; CHECKBE-NEXT:    vext.32 q8, q8, q8, #1
2786505124aSDavid Green; CHECKBE-NEXT:    vtrn.32 q8, q9
2796505124aSDavid Green; CHECKBE-NEXT:    vext.32 q8, q9, q9, #1
2806505124aSDavid Green; CHECKBE-NEXT:    vrev64.32 q0, q8
2816505124aSDavid Green; CHECKBE-NEXT:    bx lr
2826505124aSDavid Greenentry:
2836505124aSDavid Green  %out = shufflevector <4 x i32> %src1, <4 x i32> %src2, <4 x i32> <i32 5, i32 0, i32 7, i32 2>
2846505124aSDavid Green  ret <4 x i32> %out
2856505124aSDavid Green}
2866505124aSDavid Green
2876505124aSDavid Greendefine arm_aapcs_vfpcc <4 x i32> @vmovn32_b3(<4 x i32> %src1, <4 x i32> %src2) {
2886505124aSDavid Green; CHECK-LABEL: vmovn32_b3:
2896505124aSDavid Green; CHECK:       @ %bb.0: @ %entry
2906505124aSDavid Green; CHECK-NEXT:    vorr q8, q0, q0
2916505124aSDavid Green; CHECK-NEXT:    vtrn.32 q8, q1
2926505124aSDavid Green; CHECK-NEXT:    vtrn.32 q0, q8
2936505124aSDavid Green; CHECK-NEXT:    vorr q0, q8, q8
2946505124aSDavid Green; CHECK-NEXT:    bx lr
2956505124aSDavid Green;
2966505124aSDavid Green; CHECKBE-LABEL: vmovn32_b3:
2976505124aSDavid Green; CHECKBE:       @ %bb.0: @ %entry
2986505124aSDavid Green; CHECKBE-NEXT:    vrev64.32 q9, q0
2996505124aSDavid Green; CHECKBE-NEXT:    vrev64.32 q8, q1
3006505124aSDavid Green; CHECKBE-NEXT:    vorr q10, q9, q9
3016505124aSDavid Green; CHECKBE-NEXT:    vtrn.32 q10, q8
3026505124aSDavid Green; CHECKBE-NEXT:    vtrn.32 q9, q10
3036505124aSDavid Green; CHECKBE-NEXT:    vrev64.32 q0, q10
3046505124aSDavid Green; CHECKBE-NEXT:    bx lr
3056505124aSDavid Greenentry:
3066505124aSDavid Green  %out = shufflevector <4 x i32> %src1, <4 x i32> %src2, <4 x i32> <i32 1, i32 4, i32 3, i32 6>
3076505124aSDavid Green  ret <4 x i32> %out
3086505124aSDavid Green}
3096505124aSDavid Green
3106505124aSDavid Greendefine arm_aapcs_vfpcc <4 x i32> @vmovn32_b4(<4 x i32> %src1, <4 x i32> %src2) {
3116505124aSDavid Green; CHECK-LABEL: vmovn32_b4:
3126505124aSDavid Green; CHECK:       @ %bb.0: @ %entry
3136505124aSDavid Green; CHECK-NEXT:    vorr q8, q0, q0
3146505124aSDavid Green; CHECK-NEXT:    vtrn.32 q8, q1
3156505124aSDavid Green; CHECK-NEXT:    vtrn.32 q8, q0
3166505124aSDavid Green; CHECK-NEXT:    bx lr
3176505124aSDavid Green;
3186505124aSDavid Green; CHECKBE-LABEL: vmovn32_b4:
3196505124aSDavid Green; CHECKBE:       @ %bb.0: @ %entry
3206505124aSDavid Green; CHECKBE-NEXT:    vrev64.32 q9, q0
3216505124aSDavid Green; CHECKBE-NEXT:    vrev64.32 q8, q1
3226505124aSDavid Green; CHECKBE-NEXT:    vorr q10, q9, q9
3236505124aSDavid Green; CHECKBE-NEXT:    vtrn.32 q10, q8
3246505124aSDavid Green; CHECKBE-NEXT:    vtrn.32 q10, q9
3256505124aSDavid Green; CHECKBE-NEXT:    vrev64.32 q0, q9
3266505124aSDavid Green; CHECKBE-NEXT:    bx lr
3276505124aSDavid Greenentry:
3286505124aSDavid Green  %out = shufflevector <4 x i32> %src1, <4 x i32> %src2, <4 x i32> <i32 4, i32 1, i32 6, i32 3>
3296505124aSDavid Green  ret <4 x i32> %out
3306505124aSDavid Green}
3316505124aSDavid Green
3326505124aSDavid Green
3336505124aSDavid Green
3346505124aSDavid Green
3356505124aSDavid Greendefine arm_aapcs_vfpcc <8 x i16> @vmovn16_t1(<8 x i16> %src1, <8 x i16> %src2) {
3366505124aSDavid Green; CHECK-LABEL: vmovn16_t1:
3376505124aSDavid Green; CHECK:       @ %bb.0: @ %entry
3386505124aSDavid Green; CHECK-NEXT:    vtrn.16 q0, q1
3396505124aSDavid Green; CHECK-NEXT:    bx lr
3406505124aSDavid Green;
3416505124aSDavid Green; CHECKBE-LABEL: vmovn16_t1:
3426505124aSDavid Green; CHECKBE:       @ %bb.0: @ %entry
3436505124aSDavid Green; CHECKBE-NEXT:    vrev64.16 q8, q1
3446505124aSDavid Green; CHECKBE-NEXT:    vrev64.16 q9, q0
3456505124aSDavid Green; CHECKBE-NEXT:    vtrn.16 q9, q8
3466505124aSDavid Green; CHECKBE-NEXT:    vrev64.16 q0, q9
3476505124aSDavid Green; CHECKBE-NEXT:    bx lr
3486505124aSDavid Greenentry:
3496505124aSDavid Green  %out = shufflevector <8 x i16> %src1, <8 x i16> %src2, <8 x i32> <i32 0, i32 8, i32 2, i32 10, i32 4, i32 12, i32 6, i32 14>
3506505124aSDavid Green  ret <8 x i16> %out
3516505124aSDavid Green}
3526505124aSDavid Green
3536505124aSDavid Greendefine arm_aapcs_vfpcc <8 x i16> @vmovn16_t2(<8 x i16> %src1, <8 x i16> %src2) {
3546505124aSDavid Green; CHECK-LABEL: vmovn16_t2:
3556505124aSDavid Green; CHECK:       @ %bb.0: @ %entry
3566505124aSDavid Green; CHECK-NEXT:    vtrn.16 q1, q0
3576505124aSDavid Green; CHECK-NEXT:    vorr q0, q1, q1
3586505124aSDavid Green; CHECK-NEXT:    bx lr
3596505124aSDavid Green;
3606505124aSDavid Green; CHECKBE-LABEL: vmovn16_t2:
3616505124aSDavid Green; CHECKBE:       @ %bb.0: @ %entry
3626505124aSDavid Green; CHECKBE-NEXT:    vrev64.16 q8, q0
3636505124aSDavid Green; CHECKBE-NEXT:    vrev64.16 q9, q1
3646505124aSDavid Green; CHECKBE-NEXT:    vtrn.16 q9, q8
3656505124aSDavid Green; CHECKBE-NEXT:    vrev64.16 q0, q9
3666505124aSDavid Green; CHECKBE-NEXT:    bx lr
3676505124aSDavid Greenentry:
3686505124aSDavid Green  %out = shufflevector <8 x i16> %src1, <8 x i16> %src2, <8 x i32> <i32 8, i32 0, i32 10, i32 2, i32 12, i32 4, i32 14, i32 6>
3696505124aSDavid Green  ret <8 x i16> %out
3706505124aSDavid Green}
3716505124aSDavid Green
3726505124aSDavid Greendefine arm_aapcs_vfpcc <8 x i16> @vmovn16_b1(<8 x i16> %src1, <8 x i16> %src2) {
3736505124aSDavid Green; CHECK-LABEL: vmovn16_b1:
3746505124aSDavid Green; CHECK:       @ %bb.0: @ %entry
3756505124aSDavid Green; CHECK-NEXT:    vrev32.16 d16, d1
3766505124aSDavid Green; CHECK-NEXT:    vrev32.16 d17, d0
3776505124aSDavid Green; CHECK-NEXT:    vtrn.16 d16, d3
3786505124aSDavid Green; CHECK-NEXT:    vtrn.16 d17, d2
3796505124aSDavid Green; CHECK-NEXT:    vorr q0, q1, q1
3806505124aSDavid Green; CHECK-NEXT:    bx lr
3816505124aSDavid Green;
3826505124aSDavid Green; CHECKBE-LABEL: vmovn16_b1:
3836505124aSDavid Green; CHECKBE:       @ %bb.0: @ %entry
3846505124aSDavid Green; CHECKBE-NEXT:    vrev64.16 d16, d1
3856505124aSDavid Green; CHECKBE-NEXT:    vrev64.16 d17, d0
3866505124aSDavid Green; CHECKBE-NEXT:    vrev64.16 d19, d3
3876505124aSDavid Green; CHECKBE-NEXT:    vrev32.16 d16, d16
3886505124aSDavid Green; CHECKBE-NEXT:    vrev64.16 d18, d2
3896505124aSDavid Green; CHECKBE-NEXT:    vrev32.16 d17, d17
3906505124aSDavid Green; CHECKBE-NEXT:    vtrn.16 d16, d19
3916505124aSDavid Green; CHECKBE-NEXT:    vtrn.16 d17, d18
3926505124aSDavid Green; CHECKBE-NEXT:    vrev64.16 q0, q9
3936505124aSDavid Green; CHECKBE-NEXT:    bx lr
3946505124aSDavid Greenentry:
3956505124aSDavid Green  %out = shufflevector <8 x i16> %src1, <8 x i16> %src2, <8 x i32> <i32 0, i32 9, i32 2, i32 11, i32 4, i32 13, i32 6, i32 15>
3966505124aSDavid Green  ret <8 x i16> %out
3976505124aSDavid Green}
3986505124aSDavid Green
3996505124aSDavid Greendefine arm_aapcs_vfpcc <8 x i16> @vmovn16_b2(<8 x i16> %src1, <8 x i16> %src2) {
4006505124aSDavid Green; CHECK-LABEL: vmovn16_b2:
4016505124aSDavid Green; CHECK:       @ %bb.0: @ %entry
4026505124aSDavid Green; CHECK-NEXT:    vorr d17, d3, d3
4036505124aSDavid Green; CHECK-NEXT:    vtrn.16 d17, d1
4046505124aSDavid Green; CHECK-NEXT:    vorr d16, d2, d2
4056505124aSDavid Green; CHECK-NEXT:    vtrn.16 d16, d0
4066505124aSDavid Green; CHECK-NEXT:    vtrn.16 d3, d17
4076505124aSDavid Green; CHECK-NEXT:    vtrn.16 d2, d16
4086505124aSDavid Green; CHECK-NEXT:    vorr q0, q8, q8
4096505124aSDavid Green; CHECK-NEXT:    bx lr
4106505124aSDavid Green;
4116505124aSDavid Green; CHECKBE-LABEL: vmovn16_b2:
4126505124aSDavid Green; CHECKBE:       @ %bb.0: @ %entry
4136505124aSDavid Green; CHECKBE-NEXT:    vrev64.16 d17, d3
4146505124aSDavid Green; CHECKBE-NEXT:    vorr d21, d17, d17
4156505124aSDavid Green; CHECKBE-NEXT:    vrev64.16 d16, d1
4166505124aSDavid Green; CHECKBE-NEXT:    vrev64.16 d19, d2
4176505124aSDavid Green; CHECKBE-NEXT:    vrev64.16 d18, d0
4186505124aSDavid Green; CHECKBE-NEXT:    vtrn.16 d21, d16
4196505124aSDavid Green; CHECKBE-NEXT:    vorr d20, d19, d19
4206505124aSDavid Green; CHECKBE-NEXT:    vtrn.16 d20, d18
4216505124aSDavid Green; CHECKBE-NEXT:    vtrn.16 d17, d21
4226505124aSDavid Green; CHECKBE-NEXT:    vtrn.16 d19, d20
4236505124aSDavid Green; CHECKBE-NEXT:    vrev64.16 q0, q10
4246505124aSDavid Green; CHECKBE-NEXT:    bx lr
4256505124aSDavid Greenentry:
4266505124aSDavid Green  %out = shufflevector <8 x i16> %src1, <8 x i16> %src2, <8 x i32> <i32 9, i32 0, i32 11, i32 2, i32 13, i32 4, i32 15, i32 6>
4276505124aSDavid Green  ret <8 x i16> %out
4286505124aSDavid Green}
4296505124aSDavid Green
4306505124aSDavid Greendefine arm_aapcs_vfpcc <8 x i16> @vmovn16_b3(<8 x i16> %src1, <8 x i16> %src2) {
4316505124aSDavid Green; CHECK-LABEL: vmovn16_b3:
4326505124aSDavid Green; CHECK:       @ %bb.0: @ %entry
4336505124aSDavid Green; CHECK-NEXT:    vorr d17, d1, d1
4346505124aSDavid Green; CHECK-NEXT:    vtrn.16 d17, d3
4356505124aSDavid Green; CHECK-NEXT:    vorr d16, d0, d0
4366505124aSDavid Green; CHECK-NEXT:    vtrn.16 d16, d2
4376505124aSDavid Green; CHECK-NEXT:    vtrn.16 d1, d17
4386505124aSDavid Green; CHECK-NEXT:    vtrn.16 d0, d16
4396505124aSDavid Green; CHECK-NEXT:    vorr q0, q8, q8
4406505124aSDavid Green; CHECK-NEXT:    bx lr
4416505124aSDavid Green;
4426505124aSDavid Green; CHECKBE-LABEL: vmovn16_b3:
4436505124aSDavid Green; CHECKBE:       @ %bb.0: @ %entry
4446505124aSDavid Green; CHECKBE-NEXT:    vrev64.16 d17, d1
4456505124aSDavid Green; CHECKBE-NEXT:    vorr d21, d17, d17
4466505124aSDavid Green; CHECKBE-NEXT:    vrev64.16 d16, d3
4476505124aSDavid Green; CHECKBE-NEXT:    vrev64.16 d19, d0
4486505124aSDavid Green; CHECKBE-NEXT:    vrev64.16 d18, d2
4496505124aSDavid Green; CHECKBE-NEXT:    vtrn.16 d21, d16
4506505124aSDavid Green; CHECKBE-NEXT:    vorr d20, d19, d19
4516505124aSDavid Green; CHECKBE-NEXT:    vtrn.16 d20, d18
4526505124aSDavid Green; CHECKBE-NEXT:    vtrn.16 d17, d21
4536505124aSDavid Green; CHECKBE-NEXT:    vtrn.16 d19, d20
4546505124aSDavid Green; CHECKBE-NEXT:    vrev64.16 q0, q10
4556505124aSDavid Green; CHECKBE-NEXT:    bx lr
4566505124aSDavid Greenentry:
4576505124aSDavid Green  %out = shufflevector <8 x i16> %src1, <8 x i16> %src2, <8 x i32> <i32 1, i32 8, i32 3, i32 10, i32 5, i32 12, i32 7, i32 14>
4586505124aSDavid Green  ret <8 x i16> %out
4596505124aSDavid Green}
4606505124aSDavid Green
4616505124aSDavid Greendefine arm_aapcs_vfpcc <8 x i16> @vmovn16_b4(<8 x i16> %src1, <8 x i16> %src2) {
4626505124aSDavid Green; CHECK-LABEL: vmovn16_b4:
4636505124aSDavid Green; CHECK:       @ %bb.0: @ %entry
4646505124aSDavid Green; CHECK-NEXT:    vrev32.16 d16, d3
4656505124aSDavid Green; CHECK-NEXT:    vrev32.16 d17, d2
4666505124aSDavid Green; CHECK-NEXT:    vtrn.16 d16, d1
4676505124aSDavid Green; CHECK-NEXT:    vtrn.16 d17, d0
4686505124aSDavid Green; CHECK-NEXT:    bx lr
4696505124aSDavid Green;
4706505124aSDavid Green; CHECKBE-LABEL: vmovn16_b4:
4716505124aSDavid Green; CHECKBE:       @ %bb.0: @ %entry
4726505124aSDavid Green; CHECKBE-NEXT:    vrev64.16 d16, d3
4736505124aSDavid Green; CHECKBE-NEXT:    vrev64.16 d17, d2
4746505124aSDavid Green; CHECKBE-NEXT:    vrev64.16 d19, d1
4756505124aSDavid Green; CHECKBE-NEXT:    vrev32.16 d16, d16
4766505124aSDavid Green; CHECKBE-NEXT:    vrev64.16 d18, d0
4776505124aSDavid Green; CHECKBE-NEXT:    vrev32.16 d17, d17
4786505124aSDavid Green; CHECKBE-NEXT:    vtrn.16 d16, d19
4796505124aSDavid Green; CHECKBE-NEXT:    vtrn.16 d17, d18
4806505124aSDavid Green; CHECKBE-NEXT:    vrev64.16 q0, q9
4816505124aSDavid Green; CHECKBE-NEXT:    bx lr
4826505124aSDavid Greenentry:
4836505124aSDavid Green  %out = shufflevector <8 x i16> %src1, <8 x i16> %src2, <8 x i32> <i32 8, i32 1, i32 10, i32 3, i32 12, i32 5, i32 14, i32 7>
4846505124aSDavid Green  ret <8 x i16> %out
4856505124aSDavid Green}
4866505124aSDavid Green
4876505124aSDavid Green
4886505124aSDavid Greendefine arm_aapcs_vfpcc <16 x i8> @vmovn8_b1(<16 x i8> %src1, <16 x i8> %src2) {
4896505124aSDavid Green; CHECK-LABEL: vmovn8_b1:
4906505124aSDavid Green; CHECK:       @ %bb.0: @ %entry
4916505124aSDavid Green; CHECK-NEXT:    vtrn.8 q0, q1
4926505124aSDavid Green; CHECK-NEXT:    bx lr
4936505124aSDavid Green;
4946505124aSDavid Green; CHECKBE-LABEL: vmovn8_b1:
4956505124aSDavid Green; CHECKBE:       @ %bb.0: @ %entry
4966505124aSDavid Green; CHECKBE-NEXT:    vrev64.8 q8, q1
4976505124aSDavid Green; CHECKBE-NEXT:    vrev64.8 q9, q0
4986505124aSDavid Green; CHECKBE-NEXT:    vtrn.8 q9, q8
4996505124aSDavid Green; CHECKBE-NEXT:    vrev64.8 q0, q9
5006505124aSDavid Green; CHECKBE-NEXT:    bx lr
5016505124aSDavid Greenentry:
5026505124aSDavid Green  %out = shufflevector <16 x i8> %src1, <16 x i8> %src2, <16 x i32> <i32 0, i32 16, i32 2, i32 18, i32 4, i32 20, i32 6, i32 22, i32 8, i32 24, i32 10, i32 26, i32 12, i32 28, i32 14, i32 30>
5036505124aSDavid Green  ret <16 x i8> %out
5046505124aSDavid Green}
5056505124aSDavid Green
5066505124aSDavid Greendefine arm_aapcs_vfpcc <16 x i8> @vmovn8_b2(<16 x i8> %src1, <16 x i8> %src2) {
5076505124aSDavid Green; CHECK-LABEL: vmovn8_b2:
5086505124aSDavid Green; CHECK:       @ %bb.0: @ %entry
5096505124aSDavid Green; CHECK-NEXT:    vtrn.8 q1, q0
5106505124aSDavid Green; CHECK-NEXT:    vorr q0, q1, q1
5116505124aSDavid Green; CHECK-NEXT:    bx lr
5126505124aSDavid Green;
5136505124aSDavid Green; CHECKBE-LABEL: vmovn8_b2:
5146505124aSDavid Green; CHECKBE:       @ %bb.0: @ %entry
5156505124aSDavid Green; CHECKBE-NEXT:    vrev64.8 q8, q0
5166505124aSDavid Green; CHECKBE-NEXT:    vrev64.8 q9, q1
5176505124aSDavid Green; CHECKBE-NEXT:    vtrn.8 q9, q8
5186505124aSDavid Green; CHECKBE-NEXT:    vrev64.8 q0, q9
5196505124aSDavid Green; CHECKBE-NEXT:    bx lr
5206505124aSDavid Greenentry:
5216505124aSDavid Green  %out = shufflevector <16 x i8> %src1, <16 x i8> %src2, <16 x i32> <i32 16, i32 0, i32 18, i32 2, i32 20, i32 4, i32 22, i32 6, i32 24, i32 8, i32 26, i32 10, i32 28, i32 12, i32 30, i32 14>
5226505124aSDavid Green  ret <16 x i8> %out
5236505124aSDavid Green}
5246505124aSDavid Green
5256505124aSDavid Greendefine arm_aapcs_vfpcc <16 x i8> @vmovn8_t1(<16 x i8> %src1, <16 x i8> %src2) {
5266505124aSDavid Green; CHECK-LABEL: vmovn8_t1:
5276505124aSDavid Green; CHECK:       @ %bb.0: @ %entry
5286505124aSDavid Green; CHECK-NEXT:    vorr q2, q0, q0
5296505124aSDavid Green; CHECK-NEXT:    vldr d16, .LCPI24_0
5306505124aSDavid Green; CHECK-NEXT:    vorr d6, d3, d3
5316505124aSDavid Green; CHECK-NEXT:    vtbl.8 d1, {d5, d6}, d16
5326505124aSDavid Green; CHECK-NEXT:    vorr d5, d2, d2
5336505124aSDavid Green; CHECK-NEXT:    vtbl.8 d0, {d4, d5}, d16
5346505124aSDavid Green; CHECK-NEXT:    bx lr
5356505124aSDavid Green; CHECK-NEXT:    .p2align 3
5366505124aSDavid Green; CHECK-NEXT:  @ %bb.1:
5376505124aSDavid Green; CHECK-NEXT:  .LCPI24_0:
5386505124aSDavid Green; CHECK-NEXT:    .byte 0 @ 0x0
5396505124aSDavid Green; CHECK-NEXT:    .byte 9 @ 0x9
5406505124aSDavid Green; CHECK-NEXT:    .byte 2 @ 0x2
5416505124aSDavid Green; CHECK-NEXT:    .byte 11 @ 0xb
5426505124aSDavid Green; CHECK-NEXT:    .byte 4 @ 0x4
5436505124aSDavid Green; CHECK-NEXT:    .byte 13 @ 0xd
5446505124aSDavid Green; CHECK-NEXT:    .byte 6 @ 0x6
5456505124aSDavid Green; CHECK-NEXT:    .byte 15 @ 0xf
5466505124aSDavid Green;
5476505124aSDavid Green; CHECKBE-LABEL: vmovn8_t1:
5486505124aSDavid Green; CHECKBE:       @ %bb.0: @ %entry
5496505124aSDavid Green; CHECKBE-NEXT:    vldr d16, .LCPI24_0
5506505124aSDavid Green; CHECKBE-NEXT:    vrev64.8 d19, d3
5516505124aSDavid Green; CHECKBE-NEXT:    vrev64.8 d21, d2
5526505124aSDavid Green; CHECKBE-NEXT:    vrev64.8 d18, d1
5536505124aSDavid Green; CHECKBE-NEXT:    vrev64.8 d16, d16
5546505124aSDavid Green; CHECKBE-NEXT:    vrev64.8 d20, d0
5556505124aSDavid Green; CHECKBE-NEXT:    vtbl.8 d19, {d18, d19}, d16
5566505124aSDavid Green; CHECKBE-NEXT:    vtbl.8 d18, {d20, d21}, d16
5576505124aSDavid Green; CHECKBE-NEXT:    vrev64.8 q0, q9
5586505124aSDavid Green; CHECKBE-NEXT:    bx lr
5596505124aSDavid Green; CHECKBE-NEXT:    .p2align 3
5606505124aSDavid Green; CHECKBE-NEXT:  @ %bb.1:
5616505124aSDavid Green; CHECKBE-NEXT:  .LCPI24_0:
5626505124aSDavid Green; CHECKBE-NEXT:    .byte 0 @ 0x0
5636505124aSDavid Green; CHECKBE-NEXT:    .byte 9 @ 0x9
5646505124aSDavid Green; CHECKBE-NEXT:    .byte 2 @ 0x2
5656505124aSDavid Green; CHECKBE-NEXT:    .byte 11 @ 0xb
5666505124aSDavid Green; CHECKBE-NEXT:    .byte 4 @ 0x4
5676505124aSDavid Green; CHECKBE-NEXT:    .byte 13 @ 0xd
5686505124aSDavid Green; CHECKBE-NEXT:    .byte 6 @ 0x6
5696505124aSDavid Green; CHECKBE-NEXT:    .byte 15 @ 0xf
5706505124aSDavid Greenentry:
5716505124aSDavid Green  %out = shufflevector <16 x i8> %src1, <16 x i8> %src2, <16 x i32> <i32 0, i32 17, i32 2, i32 19, i32 4, i32 21, i32 6, i32 23, i32 8, i32 25, i32 10, i32 27, i32 12, i32 29, i32 14, i32 31>
5726505124aSDavid Green  ret <16 x i8> %out
5736505124aSDavid Green}
5746505124aSDavid Green
5756505124aSDavid Greendefine arm_aapcs_vfpcc <16 x i8> @vmovn8_t2(<16 x i8> %src1, <16 x i8> %src2) {
5766505124aSDavid Green; CHECK-LABEL: vmovn8_t2:
5776505124aSDavid Green; CHECK:       @ %bb.0: @ %entry
5786505124aSDavid Green; CHECK-NEXT:    @ kill: def $q1 killed $q1 def $d2_d3_d4
5796505124aSDavid Green; CHECK-NEXT:    vldr d18, .LCPI25_0
5806505124aSDavid Green; CHECK-NEXT:    vorr d4, d1, d1
5816505124aSDavid Green; CHECK-NEXT:    vtbl.8 d17, {d3, d4}, d18
5826505124aSDavid Green; CHECK-NEXT:    vorr d3, d0, d0
5836505124aSDavid Green; CHECK-NEXT:    vtbl.8 d16, {d2, d3}, d18
5846505124aSDavid Green; CHECK-NEXT:    vorr q0, q8, q8
5856505124aSDavid Green; CHECK-NEXT:    bx lr
5866505124aSDavid Green; CHECK-NEXT:    .p2align 3
5876505124aSDavid Green; CHECK-NEXT:  @ %bb.1:
5886505124aSDavid Green; CHECK-NEXT:  .LCPI25_0:
5896505124aSDavid Green; CHECK-NEXT:    .byte 1 @ 0x1
5906505124aSDavid Green; CHECK-NEXT:    .byte 8 @ 0x8
5916505124aSDavid Green; CHECK-NEXT:    .byte 3 @ 0x3
5926505124aSDavid Green; CHECK-NEXT:    .byte 10 @ 0xa
5936505124aSDavid Green; CHECK-NEXT:    .byte 5 @ 0x5
5946505124aSDavid Green; CHECK-NEXT:    .byte 12 @ 0xc
5956505124aSDavid Green; CHECK-NEXT:    .byte 7 @ 0x7
5966505124aSDavid Green; CHECK-NEXT:    .byte 14 @ 0xe
5976505124aSDavid Green;
5986505124aSDavid Green; CHECKBE-LABEL: vmovn8_t2:
5996505124aSDavid Green; CHECKBE:       @ %bb.0: @ %entry
6006505124aSDavid Green; CHECKBE-NEXT:    vldr d16, .LCPI25_0
6016505124aSDavid Green; CHECKBE-NEXT:    vrev64.8 d19, d1
6026505124aSDavid Green; CHECKBE-NEXT:    vrev64.8 d21, d0
6036505124aSDavid Green; CHECKBE-NEXT:    vrev64.8 d18, d3
6046505124aSDavid Green; CHECKBE-NEXT:    vrev64.8 d16, d16
6056505124aSDavid Green; CHECKBE-NEXT:    vrev64.8 d20, d2
6066505124aSDavid Green; CHECKBE-NEXT:    vtbl.8 d19, {d18, d19}, d16
6076505124aSDavid Green; CHECKBE-NEXT:    vtbl.8 d18, {d20, d21}, d16
6086505124aSDavid Green; CHECKBE-NEXT:    vrev64.8 q0, q9
6096505124aSDavid Green; CHECKBE-NEXT:    bx lr
6106505124aSDavid Green; CHECKBE-NEXT:    .p2align 3
6116505124aSDavid Green; CHECKBE-NEXT:  @ %bb.1:
6126505124aSDavid Green; CHECKBE-NEXT:  .LCPI25_0:
6136505124aSDavid Green; CHECKBE-NEXT:    .byte 1 @ 0x1
6146505124aSDavid Green; CHECKBE-NEXT:    .byte 8 @ 0x8
6156505124aSDavid Green; CHECKBE-NEXT:    .byte 3 @ 0x3
6166505124aSDavid Green; CHECKBE-NEXT:    .byte 10 @ 0xa
6176505124aSDavid Green; CHECKBE-NEXT:    .byte 5 @ 0x5
6186505124aSDavid Green; CHECKBE-NEXT:    .byte 12 @ 0xc
6196505124aSDavid Green; CHECKBE-NEXT:    .byte 7 @ 0x7
6206505124aSDavid Green; CHECKBE-NEXT:    .byte 14 @ 0xe
6216505124aSDavid Greenentry:
6226505124aSDavid Green  %out = shufflevector <16 x i8> %src1, <16 x i8> %src2, <16 x i32> <i32 17, i32 0, i32 19, i32 2, i32 21, i32 4, i32 23, i32 6, i32 25, i32 8, i32 27, i32 10, i32 29, i32 12, i32 31, i32 14>
6236505124aSDavid Green  ret <16 x i8> %out
6246505124aSDavid Green}
6256505124aSDavid Green
6266505124aSDavid Greendefine arm_aapcs_vfpcc <16 x i8> @vmovn8_t3(<16 x i8> %src1, <16 x i8> %src2) {
6276505124aSDavid Green; CHECK-LABEL: vmovn8_t3:
6286505124aSDavid Green; CHECK:       @ %bb.0: @ %entry
6296505124aSDavid Green; CHECK-NEXT:    vorr q2, q0, q0
6306505124aSDavid Green; CHECK-NEXT:    vldr d16, .LCPI26_0
6316505124aSDavid Green; CHECK-NEXT:    vorr d6, d3, d3
6326505124aSDavid Green; CHECK-NEXT:    vtbl.8 d1, {d5, d6}, d16
6336505124aSDavid Green; CHECK-NEXT:    vorr d5, d2, d2
6346505124aSDavid Green; CHECK-NEXT:    vtbl.8 d0, {d4, d5}, d16
6356505124aSDavid Green; CHECK-NEXT:    bx lr
6366505124aSDavid Green; CHECK-NEXT:    .p2align 3
6376505124aSDavid Green; CHECK-NEXT:  @ %bb.1:
6386505124aSDavid Green; CHECK-NEXT:  .LCPI26_0:
6396505124aSDavid Green; CHECK-NEXT:    .byte 1 @ 0x1
6406505124aSDavid Green; CHECK-NEXT:    .byte 8 @ 0x8
6416505124aSDavid Green; CHECK-NEXT:    .byte 3 @ 0x3
6426505124aSDavid Green; CHECK-NEXT:    .byte 10 @ 0xa
6436505124aSDavid Green; CHECK-NEXT:    .byte 5 @ 0x5
6446505124aSDavid Green; CHECK-NEXT:    .byte 12 @ 0xc
6456505124aSDavid Green; CHECK-NEXT:    .byte 7 @ 0x7
6466505124aSDavid Green; CHECK-NEXT:    .byte 14 @ 0xe
6476505124aSDavid Green;
6486505124aSDavid Green; CHECKBE-LABEL: vmovn8_t3:
6496505124aSDavid Green; CHECKBE:       @ %bb.0: @ %entry
6506505124aSDavid Green; CHECKBE-NEXT:    vldr d16, .LCPI26_0
6516505124aSDavid Green; CHECKBE-NEXT:    vrev64.8 d19, d3
6526505124aSDavid Green; CHECKBE-NEXT:    vrev64.8 d21, d2
6536505124aSDavid Green; CHECKBE-NEXT:    vrev64.8 d18, d1
6546505124aSDavid Green; CHECKBE-NEXT:    vrev64.8 d16, d16
6556505124aSDavid Green; CHECKBE-NEXT:    vrev64.8 d20, d0
6566505124aSDavid Green; CHECKBE-NEXT:    vtbl.8 d19, {d18, d19}, d16
6576505124aSDavid Green; CHECKBE-NEXT:    vtbl.8 d18, {d20, d21}, d16
6586505124aSDavid Green; CHECKBE-NEXT:    vrev64.8 q0, q9
6596505124aSDavid Green; CHECKBE-NEXT:    bx lr
6606505124aSDavid Green; CHECKBE-NEXT:    .p2align 3
6616505124aSDavid Green; CHECKBE-NEXT:  @ %bb.1:
6626505124aSDavid Green; CHECKBE-NEXT:  .LCPI26_0:
6636505124aSDavid Green; CHECKBE-NEXT:    .byte 1 @ 0x1
6646505124aSDavid Green; CHECKBE-NEXT:    .byte 8 @ 0x8
6656505124aSDavid Green; CHECKBE-NEXT:    .byte 3 @ 0x3
6666505124aSDavid Green; CHECKBE-NEXT:    .byte 10 @ 0xa
6676505124aSDavid Green; CHECKBE-NEXT:    .byte 5 @ 0x5
6686505124aSDavid Green; CHECKBE-NEXT:    .byte 12 @ 0xc
6696505124aSDavid Green; CHECKBE-NEXT:    .byte 7 @ 0x7
6706505124aSDavid Green; CHECKBE-NEXT:    .byte 14 @ 0xe
6716505124aSDavid Greenentry:
6726505124aSDavid Green  %out = shufflevector <16 x i8> %src1, <16 x i8> %src2, <16 x i32> <i32 1, i32 16, i32 3, i32 18, i32 5, i32 20, i32 7, i32 22, i32 9, i32 24, i32 11, i32 26, i32 13, i32 28, i32 15, i32 30>
6736505124aSDavid Green  ret <16 x i8> %out
6746505124aSDavid Green}
6756505124aSDavid Green
6766505124aSDavid Greendefine arm_aapcs_vfpcc <16 x i8> @vmovn8_t4(<16 x i8> %src1, <16 x i8> %src2) {
6776505124aSDavid Green; CHECK-LABEL: vmovn8_t4:
6786505124aSDavid Green; CHECK:       @ %bb.0: @ %entry
6796505124aSDavid Green; CHECK-NEXT:    @ kill: def $q1 killed $q1 def $d2_d3_d4
6806505124aSDavid Green; CHECK-NEXT:    vldr d18, .LCPI27_0
6816505124aSDavid Green; CHECK-NEXT:    vorr d4, d1, d1
6826505124aSDavid Green; CHECK-NEXT:    vtbl.8 d17, {d3, d4}, d18
6836505124aSDavid Green; CHECK-NEXT:    vorr d3, d0, d0
6846505124aSDavid Green; CHECK-NEXT:    vtbl.8 d16, {d2, d3}, d18
6856505124aSDavid Green; CHECK-NEXT:    vorr q0, q8, q8
6866505124aSDavid Green; CHECK-NEXT:    bx lr
6876505124aSDavid Green; CHECK-NEXT:    .p2align 3
6886505124aSDavid Green; CHECK-NEXT:  @ %bb.1:
6896505124aSDavid Green; CHECK-NEXT:  .LCPI27_0:
6906505124aSDavid Green; CHECK-NEXT:    .byte 0 @ 0x0
6916505124aSDavid Green; CHECK-NEXT:    .byte 9 @ 0x9
6926505124aSDavid Green; CHECK-NEXT:    .byte 2 @ 0x2
6936505124aSDavid Green; CHECK-NEXT:    .byte 11 @ 0xb
6946505124aSDavid Green; CHECK-NEXT:    .byte 4 @ 0x4
6956505124aSDavid Green; CHECK-NEXT:    .byte 13 @ 0xd
6966505124aSDavid Green; CHECK-NEXT:    .byte 6 @ 0x6
6976505124aSDavid Green; CHECK-NEXT:    .byte 15 @ 0xf
6986505124aSDavid Green;
6996505124aSDavid Green; CHECKBE-LABEL: vmovn8_t4:
7006505124aSDavid Green; CHECKBE:       @ %bb.0: @ %entry
7016505124aSDavid Green; CHECKBE-NEXT:    vldr d16, .LCPI27_0
7026505124aSDavid Green; CHECKBE-NEXT:    vrev64.8 d19, d1
7036505124aSDavid Green; CHECKBE-NEXT:    vrev64.8 d21, d0
7046505124aSDavid Green; CHECKBE-NEXT:    vrev64.8 d18, d3
7056505124aSDavid Green; CHECKBE-NEXT:    vrev64.8 d16, d16
7066505124aSDavid Green; CHECKBE-NEXT:    vrev64.8 d20, d2
7076505124aSDavid Green; CHECKBE-NEXT:    vtbl.8 d19, {d18, d19}, d16
7086505124aSDavid Green; CHECKBE-NEXT:    vtbl.8 d18, {d20, d21}, d16
7096505124aSDavid Green; CHECKBE-NEXT:    vrev64.8 q0, q9
7106505124aSDavid Green; CHECKBE-NEXT:    bx lr
7116505124aSDavid Green; CHECKBE-NEXT:    .p2align 3
7126505124aSDavid Green; CHECKBE-NEXT:  @ %bb.1:
7136505124aSDavid Green; CHECKBE-NEXT:  .LCPI27_0:
7146505124aSDavid Green; CHECKBE-NEXT:    .byte 0 @ 0x0
7156505124aSDavid Green; CHECKBE-NEXT:    .byte 9 @ 0x9
7166505124aSDavid Green; CHECKBE-NEXT:    .byte 2 @ 0x2
7176505124aSDavid Green; CHECKBE-NEXT:    .byte 11 @ 0xb
7186505124aSDavid Green; CHECKBE-NEXT:    .byte 4 @ 0x4
7196505124aSDavid Green; CHECKBE-NEXT:    .byte 13 @ 0xd
7206505124aSDavid Green; CHECKBE-NEXT:    .byte 6 @ 0x6
7216505124aSDavid Green; CHECKBE-NEXT:    .byte 15 @ 0xf
7226505124aSDavid Greenentry:
7236505124aSDavid Green  %out = shufflevector <16 x i8> %src1, <16 x i8> %src2, <16 x i32> <i32 16, i32 1, i32 18, i32 3, i32 20, i32 5, i32 22, i32 7, i32 24, i32 9, i32 26, i32 11, i32 28, i32 13, i32 30, i32 15>
7246505124aSDavid Green  ret <16 x i8> %out
7256505124aSDavid Green}
7266505124aSDavid Green
7276505124aSDavid Greendefine arm_aapcs_vfpcc <16 x i8> @test(<8 x i16> %src1, <8 x i16> %src2) {
7286505124aSDavid Green; CHECK-LABEL: test:
7296505124aSDavid Green; CHECK:       @ %bb.0: @ %entry
7306505124aSDavid Green; CHECK-NEXT:    vtrn.8 q0, q1
7316505124aSDavid Green; CHECK-NEXT:    bx lr
7326505124aSDavid Green;
7336505124aSDavid Green; CHECKBE-LABEL: test:
7346505124aSDavid Green; CHECKBE:       @ %bb.0: @ %entry
735*9d4c5975SDavid Green; CHECKBE-NEXT:    vrev64.16 q8, q1
736*9d4c5975SDavid Green; CHECKBE-NEXT:    vrev64.16 q9, q0
7376505124aSDavid Green; CHECKBE-NEXT:    vtrn.8 q9, q8
7386505124aSDavid Green; CHECKBE-NEXT:    vrev64.8 q0, q9
7396505124aSDavid Green; CHECKBE-NEXT:    bx lr
7406505124aSDavid Greenentry:
7416505124aSDavid Green  %a0 = extractelement <8 x i16> %src1, i32 0
7426505124aSDavid Green  %a1 = extractelement <8 x i16> %src1, i32 1
7436505124aSDavid Green  %a2 = extractelement <8 x i16> %src1, i32 2
7446505124aSDavid Green  %a3 = extractelement <8 x i16> %src1, i32 3
7456505124aSDavid Green  %a4 = extractelement <8 x i16> %src1, i32 4
7466505124aSDavid Green  %a5 = extractelement <8 x i16> %src1, i32 5
7476505124aSDavid Green  %a6 = extractelement <8 x i16> %src1, i32 6
7486505124aSDavid Green  %a7 = extractelement <8 x i16> %src1, i32 7
7496505124aSDavid Green
7506505124aSDavid Green  %b0 = extractelement <8 x i16> %src2, i32 0
7516505124aSDavid Green  %b1 = extractelement <8 x i16> %src2, i32 1
7526505124aSDavid Green  %b2 = extractelement <8 x i16> %src2, i32 2
7536505124aSDavid Green  %b3 = extractelement <8 x i16> %src2, i32 3
7546505124aSDavid Green  %b4 = extractelement <8 x i16> %src2, i32 4
7556505124aSDavid Green  %b5 = extractelement <8 x i16> %src2, i32 5
7566505124aSDavid Green  %b6 = extractelement <8 x i16> %src2, i32 6
7576505124aSDavid Green  %b7 = extractelement <8 x i16> %src2, i32 7
7586505124aSDavid Green
7596505124aSDavid Green  %s0 = trunc i16 %a0 to i8
7606505124aSDavid Green  %s1 = trunc i16 %a1 to i8
7616505124aSDavid Green  %s2 = trunc i16 %a2 to i8
7626505124aSDavid Green  %s3 = trunc i16 %a3 to i8
7636505124aSDavid Green  %s4 = trunc i16 %a4 to i8
7646505124aSDavid Green  %s5 = trunc i16 %a5 to i8
7656505124aSDavid Green  %s6 = trunc i16 %a6 to i8
7666505124aSDavid Green  %s7 = trunc i16 %a7 to i8
7676505124aSDavid Green  %t0 = trunc i16 %b0 to i8
7686505124aSDavid Green  %t1 = trunc i16 %b1 to i8
7696505124aSDavid Green  %t2 = trunc i16 %b2 to i8
7706505124aSDavid Green  %t3 = trunc i16 %b3 to i8
7716505124aSDavid Green  %t4 = trunc i16 %b4 to i8
7726505124aSDavid Green  %t5 = trunc i16 %b5 to i8
7736505124aSDavid Green  %t6 = trunc i16 %b6 to i8
7746505124aSDavid Green  %t7 = trunc i16 %b7 to i8
7756505124aSDavid Green
7766505124aSDavid Green  %r0 = insertelement <16 x i8> undef, i8 %s0, i32 0
7776505124aSDavid Green  %r1 = insertelement <16 x i8> %r0, i8 %s1, i32 2
7786505124aSDavid Green  %r2 = insertelement <16 x i8> %r1, i8 %s2, i32 4
7796505124aSDavid Green  %r3 = insertelement <16 x i8> %r2, i8 %s3, i32 6
7806505124aSDavid Green  %r4 = insertelement <16 x i8> %r3, i8 %s4, i32 8
7816505124aSDavid Green  %r5 = insertelement <16 x i8> %r4, i8 %s5, i32 10
7826505124aSDavid Green  %r6 = insertelement <16 x i8> %r5, i8 %s6, i32 12
7836505124aSDavid Green  %r7 = insertelement <16 x i8> %r6, i8 %s7, i32 14
7846505124aSDavid Green  %r10 = insertelement <16 x i8> %r7, i8 %t0, i32 1
7856505124aSDavid Green  %r11 = insertelement <16 x i8> %r10, i8 %t1, i32 3
7866505124aSDavid Green  %r12 = insertelement <16 x i8> %r11, i8 %t2, i32 5
7876505124aSDavid Green  %r13 = insertelement <16 x i8> %r12, i8 %t3, i32 7
7886505124aSDavid Green  %r14 = insertelement <16 x i8> %r13, i8 %t4, i32 9
7896505124aSDavid Green  %r15 = insertelement <16 x i8> %r14, i8 %t5, i32 11
7906505124aSDavid Green  %r16 = insertelement <16 x i8> %r15, i8 %t6, i32 13
7916505124aSDavid Green  %r17 = insertelement <16 x i8> %r16, i8 %t7, i32 15
7926505124aSDavid Green
7936505124aSDavid Green  ret <16 x i8> %r17
7946505124aSDavid Green}
795