xref: /llvm-project/llvm/test/CodeGen/PowerPC/vec-promote.ll (revision b922a3621116b404d868af8b74cab25ab78555be)
11ceaec3eSKai Luo; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 2
21ceaec3eSKai Luo; RUN: llc -mtriple=powerpc64-unknown-unknown -verify-machineinstrs -mcpu=pwr8 \
31ceaec3eSKai Luo; RUN:   < %s | FileCheck %s --check-prefix=CHECK-BE
41ceaec3eSKai Luo; RUN: llc -mtriple=powerpc64le-unknown-unknown -verify-machineinstrs -mcpu=pwr8 \
51ceaec3eSKai Luo; RUN:   < %s | FileCheck %s --check-prefix=CHECK-LE
61ceaec3eSKai Luo
71ceaec3eSKai Luodefine noundef <2 x double> @vec_promote_double_zeroed(ptr nocapture noundef readonly %p) {
81ceaec3eSKai Luo; CHECK-BE-LABEL: vec_promote_double_zeroed:
91ceaec3eSKai Luo; CHECK-BE:       # %bb.0: # %entry
101ceaec3eSKai Luo; CHECK-BE-NEXT:    lfd 0, 0(3)
111ceaec3eSKai Luo; CHECK-BE-NEXT:    xxlxor 1, 1, 1
121ceaec3eSKai Luo; CHECK-BE-NEXT:    xxmrghd 34, 0, 1
131ceaec3eSKai Luo; CHECK-BE-NEXT:    blr
141ceaec3eSKai Luo;
151ceaec3eSKai Luo; CHECK-LE-LABEL: vec_promote_double_zeroed:
161ceaec3eSKai Luo; CHECK-LE:       # %bb.0: # %entry
171ceaec3eSKai Luo; CHECK-LE-NEXT:    lfd 0, 0(3)
181ceaec3eSKai Luo; CHECK-LE-NEXT:    xxlxor 1, 1, 1
191ceaec3eSKai Luo; CHECK-LE-NEXT:    xxmrghd 34, 1, 0
201ceaec3eSKai Luo; CHECK-LE-NEXT:    blr
211ceaec3eSKai Luoentry:
221ceaec3eSKai Luo  %0 = load double, ptr %p, align 8
231ceaec3eSKai Luo  %vecins.i = insertelement <2 x double> <double poison, double 0.0>, double %0, i64 0
241ceaec3eSKai Luo  ret <2 x double> %vecins.i
251ceaec3eSKai Luo}
261ceaec3eSKai Luo
271ceaec3eSKai Luodefine noundef <2 x double> @vec_promote_double(ptr nocapture noundef readonly %p) {
281ceaec3eSKai Luo; CHECK-BE-LABEL: vec_promote_double:
291ceaec3eSKai Luo; CHECK-BE:       # %bb.0: # %entry
301ceaec3eSKai Luo; CHECK-BE-NEXT:    lxvdsx 34, 0, 3
311ceaec3eSKai Luo; CHECK-BE-NEXT:    blr
321ceaec3eSKai Luo;
331ceaec3eSKai Luo; CHECK-LE-LABEL: vec_promote_double:
341ceaec3eSKai Luo; CHECK-LE:       # %bb.0: # %entry
351ceaec3eSKai Luo; CHECK-LE-NEXT:    lxvdsx 34, 0, 3
361ceaec3eSKai Luo; CHECK-LE-NEXT:    blr
371ceaec3eSKai Luoentry:
381ceaec3eSKai Luo  %0 = load double, ptr %p, align 8
391ceaec3eSKai Luo  %vecins.i = insertelement <2 x double> poison, double %0, i64 0
401ceaec3eSKai Luo  ret <2 x double> %vecins.i
411ceaec3eSKai Luo}
421ceaec3eSKai Luo
431ceaec3eSKai Luodefine noundef <4 x float> @vec_promote_float_zeroed(ptr nocapture noundef readonly %p) {
441ceaec3eSKai Luo; CHECK-BE-LABEL: vec_promote_float_zeroed:
451ceaec3eSKai Luo; CHECK-BE:       # %bb.0: # %entry
46*b922a362SQiu Chaofan; CHECK-BE-NEXT:    lfs 0, 0(3)
47*b922a362SQiu Chaofan; CHECK-BE-NEXT:    xxlxor 1, 1, 1
48*b922a362SQiu Chaofan; CHECK-BE-NEXT:    xxmrghd 0, 0, 1
49*b922a362SQiu Chaofan; CHECK-BE-NEXT:    xxspltd 1, 1, 0
50*b922a362SQiu Chaofan; CHECK-BE-NEXT:    xvcvdpsp 34, 0
51*b922a362SQiu Chaofan; CHECK-BE-NEXT:    xvcvdpsp 35, 1
52*b922a362SQiu Chaofan; CHECK-BE-NEXT:    vmrgew 2, 2, 3
531ceaec3eSKai Luo; CHECK-BE-NEXT:    blr
541ceaec3eSKai Luo;
551ceaec3eSKai Luo; CHECK-LE-LABEL: vec_promote_float_zeroed:
561ceaec3eSKai Luo; CHECK-LE:       # %bb.0: # %entry
57*b922a362SQiu Chaofan; CHECK-LE-NEXT:    lfs 0, 0(3)
58*b922a362SQiu Chaofan; CHECK-LE-NEXT:    xxlxor 1, 1, 1
59*b922a362SQiu Chaofan; CHECK-LE-NEXT:    xxmrghd 0, 1, 0
60*b922a362SQiu Chaofan; CHECK-LE-NEXT:    xxspltd 1, 1, 0
61*b922a362SQiu Chaofan; CHECK-LE-NEXT:    xvcvdpsp 34, 0
62*b922a362SQiu Chaofan; CHECK-LE-NEXT:    xvcvdpsp 35, 1
63*b922a362SQiu Chaofan; CHECK-LE-NEXT:    vmrgew 2, 3, 2
641ceaec3eSKai Luo; CHECK-LE-NEXT:    blr
651ceaec3eSKai Luoentry:
661ceaec3eSKai Luo  %0 = load float, ptr %p, align 8
671ceaec3eSKai Luo  %vecins.i = insertelement <4 x float> <float poison, float 0.0, float 0.0, float 0.0>, float %0, i64 0
681ceaec3eSKai Luo  ret <4 x float> %vecins.i
691ceaec3eSKai Luo}
701ceaec3eSKai Luo
711ceaec3eSKai Luodefine noundef <4 x float> @vec_promote_float(ptr nocapture noundef readonly %p) {
721ceaec3eSKai Luo; CHECK-BE-LABEL: vec_promote_float:
731ceaec3eSKai Luo; CHECK-BE:       # %bb.0: # %entry
741ceaec3eSKai Luo; CHECK-BE-NEXT:    lfiwzx 0, 0, 3
751ceaec3eSKai Luo; CHECK-BE-NEXT:    xxspltw 34, 0, 1
761ceaec3eSKai Luo; CHECK-BE-NEXT:    blr
771ceaec3eSKai Luo;
781ceaec3eSKai Luo; CHECK-LE-LABEL: vec_promote_float:
791ceaec3eSKai Luo; CHECK-LE:       # %bb.0: # %entry
801ceaec3eSKai Luo; CHECK-LE-NEXT:    lfiwzx 0, 0, 3
811ceaec3eSKai Luo; CHECK-LE-NEXT:    xxspltw 34, 0, 1
821ceaec3eSKai Luo; CHECK-LE-NEXT:    blr
831ceaec3eSKai Luoentry:
841ceaec3eSKai Luo  %0 = load float, ptr %p, align 8
851ceaec3eSKai Luo  %vecins.i = insertelement <4 x float> poison, float %0, i64 0
861ceaec3eSKai Luo  ret <4 x float> %vecins.i
871ceaec3eSKai Luo}
881ceaec3eSKai Luo
891ceaec3eSKai Luodefine noundef <2 x i64> @vec_promote_long_long_zeroed(ptr nocapture noundef readonly %p) {
901ceaec3eSKai Luo; CHECK-BE-LABEL: vec_promote_long_long_zeroed:
911ceaec3eSKai Luo; CHECK-BE:       # %bb.0: # %entry
921ceaec3eSKai Luo; CHECK-BE-NEXT:    ld 3, 0(3)
931ceaec3eSKai Luo; CHECK-BE-NEXT:    li 4, 0
941ceaec3eSKai Luo; CHECK-BE-NEXT:    mtfprd 0, 4
951ceaec3eSKai Luo; CHECK-BE-NEXT:    mtfprd 1, 3
961ceaec3eSKai Luo; CHECK-BE-NEXT:    xxmrghd 34, 1, 0
971ceaec3eSKai Luo; CHECK-BE-NEXT:    blr
981ceaec3eSKai Luo;
991ceaec3eSKai Luo; CHECK-LE-LABEL: vec_promote_long_long_zeroed:
1001ceaec3eSKai Luo; CHECK-LE:       # %bb.0: # %entry
1011ceaec3eSKai Luo; CHECK-LE-NEXT:    ld 3, 0(3)
1021ceaec3eSKai Luo; CHECK-LE-NEXT:    li 4, 0
1031ceaec3eSKai Luo; CHECK-LE-NEXT:    mtfprd 0, 4
1041ceaec3eSKai Luo; CHECK-LE-NEXT:    mtfprd 1, 3
1051ceaec3eSKai Luo; CHECK-LE-NEXT:    xxmrghd 34, 0, 1
1061ceaec3eSKai Luo; CHECK-LE-NEXT:    blr
1071ceaec3eSKai Luoentry:
1081ceaec3eSKai Luo  %0 = load i64, ptr %p, align 8
1091ceaec3eSKai Luo  %vecins.i = insertelement <2 x i64> <i64 poison, i64 0>, i64 %0, i64 0
1101ceaec3eSKai Luo  ret <2 x i64> %vecins.i
1111ceaec3eSKai Luo}
1121ceaec3eSKai Luo
1131ceaec3eSKai Luodefine noundef <2 x i64> @vec_promote_long_long(ptr nocapture noundef readonly %p) {
1141ceaec3eSKai Luo; CHECK-BE-LABEL: vec_promote_long_long:
1151ceaec3eSKai Luo; CHECK-BE:       # %bb.0: # %entry
1161ceaec3eSKai Luo; CHECK-BE-NEXT:    lxvdsx 34, 0, 3
1171ceaec3eSKai Luo; CHECK-BE-NEXT:    blr
1181ceaec3eSKai Luo;
1191ceaec3eSKai Luo; CHECK-LE-LABEL: vec_promote_long_long:
1201ceaec3eSKai Luo; CHECK-LE:       # %bb.0: # %entry
1211ceaec3eSKai Luo; CHECK-LE-NEXT:    lxvdsx 34, 0, 3
1221ceaec3eSKai Luo; CHECK-LE-NEXT:    blr
1231ceaec3eSKai Luoentry:
1241ceaec3eSKai Luo  %0 = load i64, ptr %p, align 8
1251ceaec3eSKai Luo  %vecins.i = insertelement <2 x i64> poison, i64 %0, i64 0
1261ceaec3eSKai Luo  ret <2 x i64> %vecins.i
1271ceaec3eSKai Luo}
1281ceaec3eSKai Luo
1291ceaec3eSKai Luodefine noundef <4 x i32> @vec_promote_int_zeroed(ptr nocapture noundef readonly %p) {
1301ceaec3eSKai Luo; CHECK-BE-LABEL: vec_promote_int_zeroed:
1311ceaec3eSKai Luo; CHECK-BE:       # %bb.0: # %entry
1321ceaec3eSKai Luo; CHECK-BE-NEXT:    lwz 3, 0(3)
1331ceaec3eSKai Luo; CHECK-BE-NEXT:    li 4, 0
1341ceaec3eSKai Luo; CHECK-BE-NEXT:    li 5, 0
135*b922a362SQiu Chaofan; CHECK-BE-NEXT:    rldimi 4, 4, 32, 0
136*b922a362SQiu Chaofan; CHECK-BE-NEXT:    rldimi 5, 3, 32, 0
137*b922a362SQiu Chaofan; CHECK-BE-NEXT:    mtfprd 1, 4
138*b922a362SQiu Chaofan; CHECK-BE-NEXT:    mtfprd 0, 5
1391ceaec3eSKai Luo; CHECK-BE-NEXT:    xxmrghd 34, 0, 1
1401ceaec3eSKai Luo; CHECK-BE-NEXT:    blr
1411ceaec3eSKai Luo;
1421ceaec3eSKai Luo; CHECK-LE-LABEL: vec_promote_int_zeroed:
1431ceaec3eSKai Luo; CHECK-LE:       # %bb.0: # %entry
1441ceaec3eSKai Luo; CHECK-LE-NEXT:    lwz 3, 0(3)
1451ceaec3eSKai Luo; CHECK-LE-NEXT:    li 4, 0
1461ceaec3eSKai Luo; CHECK-LE-NEXT:    rldimi 3, 4, 32, 0
1471ceaec3eSKai Luo; CHECK-LE-NEXT:    rldimi 4, 4, 32, 0
1481ceaec3eSKai Luo; CHECK-LE-NEXT:    mtfprd 0, 3
1491ceaec3eSKai Luo; CHECK-LE-NEXT:    mtfprd 1, 4
1501ceaec3eSKai Luo; CHECK-LE-NEXT:    xxmrghd 34, 1, 0
1511ceaec3eSKai Luo; CHECK-LE-NEXT:    blr
1521ceaec3eSKai Luoentry:
1531ceaec3eSKai Luo  %0 = load i32, ptr %p, align 4
1541ceaec3eSKai Luo  %vecins.i = insertelement <4 x i32> <i32 poison, i32 0, i32 0, i32 0>, i32 %0, i64 0
1551ceaec3eSKai Luo  ret <4 x i32> %vecins.i
1561ceaec3eSKai Luo}
1571ceaec3eSKai Luo
1581ceaec3eSKai Luodefine noundef <4 x i32> @vec_promote_int(ptr nocapture noundef readonly %p) {
1591ceaec3eSKai Luo; CHECK-BE-LABEL: vec_promote_int:
1601ceaec3eSKai Luo; CHECK-BE:       # %bb.0: # %entry
1611ceaec3eSKai Luo; CHECK-BE-NEXT:    lfiwzx 0, 0, 3
1621ceaec3eSKai Luo; CHECK-BE-NEXT:    xxspltw 34, 0, 1
1631ceaec3eSKai Luo; CHECK-BE-NEXT:    blr
1641ceaec3eSKai Luo;
1651ceaec3eSKai Luo; CHECK-LE-LABEL: vec_promote_int:
1661ceaec3eSKai Luo; CHECK-LE:       # %bb.0: # %entry
1671ceaec3eSKai Luo; CHECK-LE-NEXT:    lfiwzx 0, 0, 3
1681ceaec3eSKai Luo; CHECK-LE-NEXT:    xxspltw 34, 0, 1
1691ceaec3eSKai Luo; CHECK-LE-NEXT:    blr
1701ceaec3eSKai Luoentry:
1711ceaec3eSKai Luo  %0 = load i32, ptr %p, align 4
1721ceaec3eSKai Luo  %vecins.i = insertelement <4 x i32> poison, i32 %0, i64 0
1731ceaec3eSKai Luo  ret <4 x i32> %vecins.i
1741ceaec3eSKai Luo}
1751ceaec3eSKai Luo
1761ceaec3eSKai Luodefine noundef <8 x i16> @vec_promote_short_zeroed(ptr nocapture noundef readonly %p) {
1771ceaec3eSKai Luo; CHECK-BE-LABEL: vec_promote_short_zeroed:
1781ceaec3eSKai Luo; CHECK-BE:       # %bb.0: # %entry
1791ceaec3eSKai Luo; CHECK-BE-NEXT:    addis 4, 2, .LCPI8_0@toc@ha
1801ceaec3eSKai Luo; CHECK-BE-NEXT:    lhz 3, 0(3)
1811ceaec3eSKai Luo; CHECK-BE-NEXT:    addi 4, 4, .LCPI8_0@toc@l
1821ceaec3eSKai Luo; CHECK-BE-NEXT:    mtvsrwz 36, 3
183*b922a362SQiu Chaofan; CHECK-BE-NEXT:    lxvw4x 34, 0, 4
184*b922a362SQiu Chaofan; CHECK-BE-NEXT:    li 4, 0
185*b922a362SQiu Chaofan; CHECK-BE-NEXT:    mtvsrwz 35, 4
1861ceaec3eSKai Luo; CHECK-BE-NEXT:    vperm 2, 4, 3, 2
1871ceaec3eSKai Luo; CHECK-BE-NEXT:    blr
1881ceaec3eSKai Luo;
1891ceaec3eSKai Luo; CHECK-LE-LABEL: vec_promote_short_zeroed:
1901ceaec3eSKai Luo; CHECK-LE:       # %bb.0: # %entry
1911ceaec3eSKai Luo; CHECK-LE-NEXT:    addis 4, 2, .LCPI8_0@toc@ha
1921ceaec3eSKai Luo; CHECK-LE-NEXT:    lhz 3, 0(3)
1931ceaec3eSKai Luo; CHECK-LE-NEXT:    addi 4, 4, .LCPI8_0@toc@l
194*b922a362SQiu Chaofan; CHECK-LE-NEXT:    mtvsrd 36, 3
1951ceaec3eSKai Luo; CHECK-LE-NEXT:    lxvd2x 0, 0, 4
1961ceaec3eSKai Luo; CHECK-LE-NEXT:    li 4, 0
197*b922a362SQiu Chaofan; CHECK-LE-NEXT:    mtvsrd 35, 4
198*b922a362SQiu Chaofan; CHECK-LE-NEXT:    xxswapd 34, 0
199*b922a362SQiu Chaofan; CHECK-LE-NEXT:    vperm 2, 3, 4, 2
2001ceaec3eSKai Luo; CHECK-LE-NEXT:    blr
2011ceaec3eSKai Luoentry:
2021ceaec3eSKai Luo  %0 = load i16, ptr %p, align 2
2031ceaec3eSKai Luo  %vecins.i = insertelement <8 x i16> <i16 poison, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0>, i16 %0, i64 0
2041ceaec3eSKai Luo  ret <8 x i16> %vecins.i
2051ceaec3eSKai Luo}
2061ceaec3eSKai Luo
2071ceaec3eSKai Luodefine noundef <8 x i16> @vec_promote_short(ptr nocapture noundef readonly %p) {
2081ceaec3eSKai Luo; CHECK-BE-LABEL: vec_promote_short:
2091ceaec3eSKai Luo; CHECK-BE:       # %bb.0: # %entry
2101ceaec3eSKai Luo; CHECK-BE-NEXT:    lhzx 3, 0, 3
2111ceaec3eSKai Luo; CHECK-BE-NEXT:    mtvsrwz 34, 3
2121ceaec3eSKai Luo; CHECK-BE-NEXT:    vsplth 2, 2, 3
2131ceaec3eSKai Luo; CHECK-BE-NEXT:    blr
2141ceaec3eSKai Luo;
2151ceaec3eSKai Luo; CHECK-LE-LABEL: vec_promote_short:
2161ceaec3eSKai Luo; CHECK-LE:       # %bb.0: # %entry
2171ceaec3eSKai Luo; CHECK-LE-NEXT:    lhzx 3, 0, 3
2181ceaec3eSKai Luo; CHECK-LE-NEXT:    mtvsrwz 34, 3
2191ceaec3eSKai Luo; CHECK-LE-NEXT:    vsplth 2, 2, 3
2201ceaec3eSKai Luo; CHECK-LE-NEXT:    blr
2211ceaec3eSKai Luoentry:
2221ceaec3eSKai Luo  %0 = load i16, ptr %p, align 2
2231ceaec3eSKai Luo  %vecins.i = insertelement <8 x i16> poison, i16 %0, i64 0
2241ceaec3eSKai Luo  ret <8 x i16> %vecins.i
2251ceaec3eSKai Luo}
2261ceaec3eSKai Luo
2271ceaec3eSKai Luodefine noundef <16 x i8> @vec_promote_char_zeroed(ptr nocapture noundef readonly %p) {
2281ceaec3eSKai Luo; CHECK-BE-LABEL: vec_promote_char_zeroed:
2291ceaec3eSKai Luo; CHECK-BE:       # %bb.0: # %entry
2301ceaec3eSKai Luo; CHECK-BE-NEXT:    addis 4, 2, .LCPI10_0@toc@ha
2311ceaec3eSKai Luo; CHECK-BE-NEXT:    lbz 3, 0(3)
2321ceaec3eSKai Luo; CHECK-BE-NEXT:    addi 4, 4, .LCPI10_0@toc@l
2331ceaec3eSKai Luo; CHECK-BE-NEXT:    mtvsrwz 36, 3
234*b922a362SQiu Chaofan; CHECK-BE-NEXT:    lxvw4x 34, 0, 4
235*b922a362SQiu Chaofan; CHECK-BE-NEXT:    li 4, 0
236*b922a362SQiu Chaofan; CHECK-BE-NEXT:    mtvsrwz 35, 4
2371ceaec3eSKai Luo; CHECK-BE-NEXT:    vperm 2, 4, 3, 2
2381ceaec3eSKai Luo; CHECK-BE-NEXT:    blr
2391ceaec3eSKai Luo;
2401ceaec3eSKai Luo; CHECK-LE-LABEL: vec_promote_char_zeroed:
2411ceaec3eSKai Luo; CHECK-LE:       # %bb.0: # %entry
2421ceaec3eSKai Luo; CHECK-LE-NEXT:    addis 4, 2, .LCPI10_0@toc@ha
2431ceaec3eSKai Luo; CHECK-LE-NEXT:    lbz 3, 0(3)
2441ceaec3eSKai Luo; CHECK-LE-NEXT:    addi 4, 4, .LCPI10_0@toc@l
245*b922a362SQiu Chaofan; CHECK-LE-NEXT:    mtvsrd 36, 3
2461ceaec3eSKai Luo; CHECK-LE-NEXT:    lxvd2x 0, 0, 4
2471ceaec3eSKai Luo; CHECK-LE-NEXT:    li 4, 0
248*b922a362SQiu Chaofan; CHECK-LE-NEXT:    mtvsrd 35, 4
249*b922a362SQiu Chaofan; CHECK-LE-NEXT:    xxswapd 34, 0
250*b922a362SQiu Chaofan; CHECK-LE-NEXT:    vperm 2, 3, 4, 2
2511ceaec3eSKai Luo; CHECK-LE-NEXT:    blr
2521ceaec3eSKai Luoentry:
2531ceaec3eSKai Luo  %0 = load i8, ptr %p, align 1
2541ceaec3eSKai Luo  %vecins.i = insertelement <16 x i8> <i8 poison, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0>, i8 %0, i64 0
2551ceaec3eSKai Luo  ret <16 x i8> %vecins.i
2561ceaec3eSKai Luo}
2571ceaec3eSKai Luo
2581ceaec3eSKai Luodefine noundef <16 x i8> @vec_promote_char(ptr nocapture noundef readonly %p) {
2591ceaec3eSKai Luo; CHECK-BE-LABEL: vec_promote_char:
2601ceaec3eSKai Luo; CHECK-BE:       # %bb.0: # %entry
2611ceaec3eSKai Luo; CHECK-BE-NEXT:    lbzx 3, 0, 3
2621ceaec3eSKai Luo; CHECK-BE-NEXT:    mtvsrwz 34, 3
2631ceaec3eSKai Luo; CHECK-BE-NEXT:    vspltb 2, 2, 7
2641ceaec3eSKai Luo; CHECK-BE-NEXT:    blr
2651ceaec3eSKai Luo;
2661ceaec3eSKai Luo; CHECK-LE-LABEL: vec_promote_char:
2671ceaec3eSKai Luo; CHECK-LE:       # %bb.0: # %entry
2681ceaec3eSKai Luo; CHECK-LE-NEXT:    lbzx 3, 0, 3
2691ceaec3eSKai Luo; CHECK-LE-NEXT:    mtvsrwz 34, 3
2701ceaec3eSKai Luo; CHECK-LE-NEXT:    vspltb 2, 2, 7
2711ceaec3eSKai Luo; CHECK-LE-NEXT:    blr
2721ceaec3eSKai Luoentry:
2731ceaec3eSKai Luo  %0 = load i8, ptr %p, align 1
2741ceaec3eSKai Luo  %vecins.i = insertelement <16 x i8> poison, i8 %0, i64 0
2751ceaec3eSKai Luo  ret <16 x i8> %vecins.i
2761ceaec3eSKai Luo}
277