1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc -mcpu=pwr9 -ppc-asm-full-reg-names -ppc-vsr-nums-as-vr \
3; RUN:   -mtriple=powerpc64-unknown-unknown < %s | FileCheck -allow-deprecated-dag-overlap %s \
4; RUN:   -check-prefix=P9BE -implicit-check-not frsp
5; RUN: llc -mcpu=pwr9 -ppc-asm-full-reg-names -ppc-vsr-nums-as-vr \
6; RUN:   -mtriple=powerpc64le-unknown-unknown < %s | FileCheck -allow-deprecated-dag-overlap %s \
7; RUN:   -check-prefix=P9LE -implicit-check-not frsp
8; RUN: llc -mcpu=pwr8 -ppc-asm-full-reg-names -ppc-vsr-nums-as-vr \
9; RUN:   -mtriple=powerpc64-unknown-unknown < %s | FileCheck -allow-deprecated-dag-overlap %s \
10; RUN:   -check-prefix=P8BE -implicit-check-not frsp
11; RUN: llc -mcpu=pwr8 -ppc-asm-full-reg-names -ppc-vsr-nums-as-vr \
12; RUN:   -mtriple=powerpc64le-unknown-unknown < %s | FileCheck -allow-deprecated-dag-overlap %s \
13; RUN:   -check-prefix=P8LE -implicit-check-not frsp
14
15; This test case comes from the following C test case (included as it may be
16; slightly more readable than the LLVM IR.
17
18;/*  This test case provides various ways of building vectors to ensure we
19;    produce optimal code for all cases. The cases are (for each type):
20;    - All zeros
21;    - All ones
22;    - Splat of a constant
23;    - From different values already in registers
24;    - From different constants
25;    - From different values in memory
26;    - Splat of a value in register
27;    - Splat of a value in memory
28;    - Inserting element into existing vector
29;    - Inserting element from existing vector into existing vector
30;
31;    With conversions (float <-> int)
32;    - Splat of a constant
33;    - From different values already in registers
34;    - From different constants
35;    - From different values in memory
36;    - Splat of a value in register
37;    - Splat of a value in memory
38;    - Inserting element into existing vector
39;    - Inserting element from existing vector into existing vector
40;*/
41;
42;/*=================================== int ===================================*/
43;// P8: xxlxor                                                                //
44;// P9: xxlxor                                                                //
45;vector int allZeroi() {                                                      //
46;  return (vector int)0;                                                      //
47;}                                                                            //
48;// P8: vspltisb -1                                                           //
49;// P9: xxspltisb 255                                                         //
50;vector int allOnei() {                                                       //
51;  return (vector int)-1;                                                     //
52;}                                                                            //
53;// P8: vspltisw 1                                                            //
54;// P9: vspltisw 1                                                            //
55;vector int spltConst1i() {                                                   //
56;  return (vector int)1;                                                      //
57;}                                                                            //
58;// P8: vspltisw -15; vsrw                                                    //
59;// P9: vspltisw -15; vsrw                                                    //
60;vector int spltConst16ki() {                                                 //
61;  return (vector int)((1<<15) - 1);                                          //
62;}                                                                            //
63;// P8: vspltisw -16; vsrw                                                    //
64;// P9: vspltisw -16; vsrw                                                    //
65;vector int spltConst32ki() {                                                 //
66;  return (vector int)((1<<16) - 1);                                          //
67;}                                                                            //
68;// P8: 4 x mtvsrwz, 2 x xxmrgh, vmrgow                                       //
69;// P9: 2 x mtvsrdd, vmrgow                                                   //
70;vector int fromRegsi(int a, int b, int c, int d) {                           //
71;  return (vector int){ a, b, c, d };                                         //
72;}                                                                            //
73;// P8: lxvd2x, xxswapd                                                       //
74;// P9: lxvx (or even lxv)                                                    //
75;vector int fromDiffConstsi() {                                               //
76;  return (vector int) { 242, -113, 889, 19 };                                //
77;}                                                                            //
78;// P8: lxvd2x, xxswapd                                                       //
79;// P9: lxvx                                                                  //
80;vector int fromDiffMemConsAi(int *arr) {                                     //
81;  return (vector int) { arr[0], arr[1], arr[2], arr[3] };                    //
82;}                                                                            //
83;// P8: 2 x lxvd2x, 2 x xxswapd, vperm                                        //
84;// P9: 2 x lxvx, vperm                                                       //
85;vector int fromDiffMemConsDi(int *arr) {                                     //
86;  return (vector int) { arr[3], arr[2], arr[1], arr[0] };                    //
87;}                                                                            //
88;// P8: sldi 2, lxvd2x, xxswapd                                               //
89;// P9: sldi 2, lxvx                                                          //
90;vector int fromDiffMemVarAi(int *arr, int elem) {                            //
91;  return (vector int) { arr[elem], arr[elem+1], arr[elem+2], arr[elem+3] };  //
92;}                                                                            //
93;// P8: sldi 2, 2 x lxvd2x, 2 x xxswapd, vperm                                //
94;// P9: sldi 2, 2 x lxvx, vperm                                               //
95;vector int fromDiffMemVarDi(int *arr, int elem) {                            //
96;  return (vector int) { arr[elem], arr[elem-1], arr[elem-2], arr[elem-3] };  //
97;}                                                                            //
98;// P8: 4 x lwz, 4 x mtvsrwz, 2 x xxmrghd, vmrgow                             //
99;// P9: 4 x lwz, 2 x mtvsrdd, vmrgow                                          //
100;vector int fromRandMemConsi(int *arr) {                                      //
101;  return (vector int) { arr[4], arr[18], arr[2], arr[88] };                  //
102;}                                                                            //
103;// P8: sldi 2, 4 x lwz, 4 x mtvsrwz, 2 x xxmrghd, vmrgow                     //
104;// P9: sldi 2, add, 4 x lwz, 2 x mtvsrdd, vmrgow                             //
105;vector int fromRandMemVari(int *arr, int elem) {                             //
106;  return (vector int) { arr[elem+4], arr[elem+1], arr[elem+2], arr[elem+8] };//
107;}                                                                            //
108;// P8: mtvsrwz, xxspltw                                                      //
109;// P9: mtvsrws                                                               //
110;vector int spltRegVali(int val) {                                            //
111;  return (vector int) val;                                                   //
112;}                                                                            //
113;// P8: (LE) lfiwzx, xxpermdi, xxspltw (BE): lfiwzx, xxsldwi, xxspltw         //
114;// P9: (LE) lfiwzx, xxpermdi, xxspltw (BE): lfiwzx, xxsldwi, xxspltw         //
115;vector int spltMemVali(int *ptr) {                                           //
116;  return (vector int)*ptr;                                                   //
117;}                                                                            //
118;// P8: vspltisw                                                              //
119;// P9: vspltisw                                                              //
120;vector int spltCnstConvftoi() {                                              //
121;  return (vector int) 4.74f;                                                 //
122;}                                                                            //
123;// P8: 2 x xxmrghd, 2 x xvcvspsxws, vmrgew                                   //
124;// P9: 2 x xxmrghd, 2 x xvcvspsxws, vmrgew                                   //
125;vector int fromRegsConvftoi(float a, float b, float c, float d) {            //
126;  return (vector int) { a, b, c, d };                                        //
127;}                                                                            //
128;// P8: lxvd2x, xxswapd                                                       //
129;// P9: lxvx (even lxv)                                                       //
130;vector int fromDiffConstsConvftoi() {                                        //
131;  return (vector int) { 24.46f, 234.f, 988.19f, 422.39f };                   //
132;}                                                                            //
133;// P8: lxvd2x, xxswapd, xvcvspsxws                                           //
134;// P9: lxvx, xvcvspsxws                                                      //
135;vector int fromDiffMemConsAConvftoi(float *ptr) {                            //
136;  return (vector int) { ptr[0], ptr[1], ptr[2], ptr[3] };                    //
137;}                                                                            //
138;// P8: 2 x lxvd2x, 2 x xxswapd, vperm, xvcvspsxws                            //
139;// P9: 2 x lxvx, vperm, xvcvspsxws                                           //
140;vector int fromDiffMemConsDConvftoi(float *ptr) {                            //
141;  return (vector int) { ptr[3], ptr[2], ptr[1], ptr[0] };                    //
142;}                                                                            //
143;// P8: 4 x lxsspx, 2 x xxmrghd, 2 x xvcvspsxws, vmrgew                       //
144;// P9: 4 x lxssp, 2 x xxmrghd, 2 x xvcvspsxws, vmrgew                        //
145;// Note: if the consecutive loads learns to handle pre-inc, this can be:     //
146;//       sldi 2, load, xvcvspuxws                                            //
147;vector int fromDiffMemVarAConvftoi(float *arr, int elem) {                   //
148;  return (vector int) { arr[elem], arr[elem+1], arr[elem+2], arr[elem+3] };  //
149;}                                                                            //
150;// P8: 4 x lxsspx, 2 x xxmrghd, 2 x xvcvspsxws, vmrgew                       //
151;// P9: 4 x lxssp, 2 x xxmrghd, 2 x xvcvspsxws, vmrgew                        //
152;// Note: if the consecutive loads learns to handle pre-inc, this can be:     //
153;//       sldi 2, 2 x load, vperm, xvcvspuxws                                 //
154;vector int fromDiffMemVarDConvftoi(float *arr, int elem) {                   //
155;  return (vector int) { arr[elem], arr[elem-1], arr[elem-2], arr[elem-3] };  //
156;}                                                                            //
157;// P8: xscvdpsxws, xxspltw                                                   //
158;// P9: xscvdpsxws, xxspltw                                                   //
159;vector int spltRegValConvftoi(float val) {                                   //
160;  return (vector int) val;                                                   //
161;}                                                                            //
162;// P8: lxsspx, xscvdpsxws, xxspltw                                           //
163;// P9: lxvwsx, xvcvspsxws                                                    //
164;vector int spltMemValConvftoi(float *ptr) {                                  //
165;  return (vector int)*ptr;                                                   //
166;}                                                                            //
167;// P8: vspltisw                                                              //
168;// P9: vspltisw                                                              //
169;vector int spltCnstConvdtoi() {                                              //
170;  return (vector int) 4.74;                                                  //
171;}                                                                            //
172;// P8: 2 x xxmrghd, 2 x xvcvspsxws, vmrgew                                   //
173;// P9: 2 x xxmrghd, 2 x xvcvspsxws, vmrgew                                   //
174;vector int fromRegsConvdtoi(double a, double b, double c, double d) {        //
175;  return (vector int) { a, b, c, d };                                        //
176;}                                                                            //
177;// P8: lxvd2x, xxswapd                                                       //
178;// P9: lxvx (even lxv)                                                       //
179;vector int fromDiffConstsConvdtoi() {                                        //
180;  return (vector int) { 24.46, 234., 988.19, 422.39 };                       //
181;}                                                                            //
182;// P8: 2 x lxvd2x, 2 x xxswapd, xxmrgld, xxmrghd, 2 x xvcvspsxws, vmrgew     //
183;// P9: 2 x lxvx, 2 x xxswapd, xxmrgld, xxmrghd, 2 x xvcvspsxws, vmrgew       //
184;vector int fromDiffMemConsAConvdtoi(double *ptr) {                           //
185;  return (vector int) { ptr[0], ptr[1], ptr[2], ptr[3] };                    //
186;}                                                                            //
187;// P8: 4 x lxsdx, 2 x xxmrghd, 2 x xvcvspsxws, vmrgew                        //
188;// P9: 4 x lfd, 2 x xxmrghd, 2 x xvcvspsxws, vmrgew                          //
189;vector int fromDiffMemConsDConvdtoi(double *ptr) {                           //
190;  return (vector int) { ptr[3], ptr[2], ptr[1], ptr[0] };                    //
191;}                                                                            //
192;// P8: lfdux, 3 x lxsdx, 2 x xxmrghd, 2 x xvcvspsxws, vmrgew                 //
193;// P9: lfdux, 3 x lfd, 2 x xxmrghd, 2 x xvcvspsxws, vmrgew                   //
194;vector int fromDiffMemVarAConvdtoi(double *arr, int elem) {                  //
195;  return (vector int) { arr[elem], arr[elem+1], arr[elem+2], arr[elem+3] };  //
196;}                                                                            //
197;// P8: lfdux, 3 x lxsdx, 2 x xxmrghd, 2 x xvcvspsxws, vmrgew                 //
198;// P9: lfdux, 3 x lfd, 2 x xxmrghd, 2 x xvcvspsxws, vmrgew                   //
199;vector int fromDiffMemVarDConvdtoi(double *arr, int elem) {                  //
200;  return (vector int) { arr[elem], arr[elem-1], arr[elem-2], arr[elem-3] };  //
201;}                                                                            //
202;// P8: xscvdpsxws, xxspltw                                                   //
203;// P9: xscvdpsxws, xxspltw                                                   //
204;vector int spltRegValConvdtoi(double val) {                                  //
205;  return (vector int) val;                                                   //
206;}                                                                            //
207;// P8: lxsdx, xscvdpsxws, xxspltw                                            //
208;// P9: lxssp, xscvdpsxws, xxspltw                                            //
209;vector int spltMemValConvdtoi(double *ptr) {                                 //
210;  return (vector int)*ptr;                                                   //
211;}                                                                            //
212;/*=================================== int ===================================*/
213;/*=============================== unsigned int ==============================*/
214;// P8: xxlxor                                                                //
215;// P9: xxlxor                                                                //
216;vector unsigned int allZeroui() {                                            //
217;  return (vector unsigned int)0;                                             //
218;}                                                                            //
219;// P8: vspltisb -1                                                           //
220;// P9: xxspltisb 255                                                         //
221;vector unsigned int allOneui() {                                             //
222;  return (vector unsigned int)-1;                                            //
223;}                                                                            //
224;// P8: vspltisw 1                                                            //
225;// P9: vspltisw 1                                                            //
226;vector unsigned int spltConst1ui() {                                         //
227;  return (vector unsigned int)1;                                             //
228;}                                                                            //
229;// P8: vspltisw -15; vsrw                                                    //
230;// P9: vspltisw -15; vsrw                                                    //
231;vector unsigned int spltConst16kui() {                                       //
232;  return (vector unsigned int)((1<<15) - 1);                                 //
233;}                                                                            //
234;// P8: vspltisw -16; vsrw                                                    //
235;// P9: vspltisw -16; vsrw                                                    //
236;vector unsigned int spltConst32kui() {                                       //
237;  return (vector unsigned int)((1<<16) - 1);                                 //
238;}                                                                            //
239;// P8: 4 x mtvsrwz, 2 x xxmrghd, vmrgow                                      //
240;// P9: 2 x mtvsrdd, vmrgow                                                   //
241;vector unsigned int fromRegsui(unsigned int a, unsigned int b,               //
242;                              unsigned int c, unsigned int d) {              //
243;  return (vector unsigned int){ a, b, c, d };                                //
244;}                                                                            //
245;// P8: lxvd2x, xxswapd                                                       //
246;// P9: lxvx (or even lxv)                                                    //
247;vector unsigned int fromDiffConstsui() {                                     //
248;  return (vector unsigned int) { 242, -113, 889, 19 };                       //
249;}                                                                            //
250;// P8: lxvd2x, xxswapd                                                       //
251;// P9: lxvx                                                                  //
252;vector unsigned int fromDiffMemConsAui(unsigned int *arr) {                  //
253;  return (vector unsigned int) { arr[0], arr[1], arr[2], arr[3] };           //
254;}                                                                            //
255;// P8: 2 x lxvd2x, 2 x xxswapd, vperm                                        //
256;// P9: 2 x lxvx, vperm                                                       //
257;vector unsigned int fromDiffMemConsDui(unsigned int *arr) {                  //
258;  return (vector unsigned int) { arr[3], arr[2], arr[1], arr[0] };           //
259;}                                                                            //
260;// P8: sldi 2, lxvd2x, xxswapd                                               //
261;// P9: sldi 2, lxvx                                                          //
262;vector unsigned int fromDiffMemVarAui(unsigned int *arr, int elem) {         //
263;  return (vector unsigned int) { arr[elem], arr[elem+1],                     //
264;                                 arr[elem+2], arr[elem+3] };                 //
265;}                                                                            //
266;// P8: sldi 2, 2 x lxvd2x, 2 x xxswapd, vperm                                //
267;// P9: sldi 2, 2 x lxvx, vperm                                               //
268;vector unsigned int fromDiffMemVarDui(unsigned int *arr, int elem) {         //
269;  return (vector unsigned int) { arr[elem], arr[elem-1],                     //
270;                                 arr[elem-2], arr[elem-3] };                 //
271;}                                                                            //
272;// P8: 4 x lwz, 4 x mtvsrwz, 2 x xxmrghd, vmrgow                             //
273;// P9: 4 x lwz, 2 x mtvsrdd, vmrgow                                          //
274;vector unsigned int fromRandMemConsui(unsigned int *arr) {                   //
275;  return (vector unsigned int) { arr[4], arr[18], arr[2], arr[88] };         //
276;}                                                                            //
277;// P8: sldi 2, 4 x lwz, 4 x mtvsrwz, 2 x xxmrghd, vmrgow                     //
278;// P9: sldi 2, add, 4 x lwz, 2 x mtvsrdd, vmrgow                             //
279;vector unsigned int fromRandMemVarui(unsigned int *arr, int elem) {          //
280;  return (vector unsigned int) { arr[elem+4], arr[elem+1],                   //
281;                                 arr[elem+2], arr[elem+8] };                 //
282;}                                                                            //
283;// P8: mtvsrwz, xxspltw                                                      //
284;// P9: mtvsrws                                                               //
285;vector unsigned int spltRegValui(unsigned int val) {                         //
286;  return (vector unsigned int) val;                                          //
287;}                                                                            //
288;// P8: (LE) lfiwzx, xxpermdi, xxspltw (BE): lfiwzx, xxsldwi, xxspltw         //
289;// P9: (LE) lfiwzx, xxpermdi, xxspltw (BE): lfiwzx, xxsldwi, xxspltw         //
290;vector unsigned int spltMemValui(unsigned int *ptr) {                        //
291;  return (vector unsigned int)*ptr;                                          //
292;}                                                                            //
293;// P8: vspltisw                                                              //
294;// P9: vspltisw                                                              //
295;vector unsigned int spltCnstConvftoui() {                                    //
296;  return (vector unsigned int) 4.74f;                                        //
297;}                                                                            //
298;// P8: 2 x xxmrghd, 2 x xvcvspuxws, vmrgew                                   //
299;// P9: 2 x xxmrghd, 2 x xvcvspuxws, vmrgew                                   //
300;vector unsigned int fromRegsConvftoui(float a, float b, float c, float d) {  //
301;  return (vector unsigned int) { a, b, c, d };                               //
302;}                                                                            //
303;// P8: lxvd2x, xxswapd                                                       //
304;// P9: lxvx (even lxv)                                                       //
305;vector unsigned int fromDiffConstsConvftoui() {                              //
306;  return (vector unsigned int) { 24.46f, 234.f, 988.19f, 422.39f };          //
307;}                                                                            //
308;// P8: lxvd2x, xxswapd, xvcvspuxws                                           //
309;// P9: lxvx, xvcvspuxws                                                      //
310;vector unsigned int fromDiffMemConsAConvftoui(float *ptr) {                  //
311;  return (vector unsigned int) { ptr[0], ptr[1], ptr[2], ptr[3] };           //
312;}                                                                            //
313;// P8: 2 x lxvd2x, 2 x xxswapd, vperm, xvcvspuxws                            //
314;// P9: 2 x lxvx, vperm, xvcvspuxws                                           //
315;vector unsigned int fromDiffMemConsDConvftoui(float *ptr) {                  //
316;  return (vector unsigned int) { ptr[3], ptr[2], ptr[1], ptr[0] };           //
317;}                                                                            //
318;// P8: lfsux, 3 x lxsspx, 2 x xxmrghd, 2 x xvcvspuxws, vmrgew                //
319;// P9: lfsux, 3 x lfs, 2 x xxmrghd, 2 x xvcvspuxws, vmrgew                   //
320;// Note: if the consecutive loads learns to handle pre-inc, this can be:     //
321;//       sldi 2, load, xvcvspuxws                                            //
322;vector unsigned int fromDiffMemVarAConvftoui(float *arr, int elem) {         //
323;  return (vector unsigned int) { arr[elem], arr[elem+1],                     //
324;                                 arr[elem+2], arr[elem+3] };                 //
325;}                                                                            //
326;// P8: lfsux, 3 x lxsspx, 2 x xxmrghd, 2 x xvcvspuxws, vmrgew                //
327;// P9: lfsux, 3 x lfs, 2 x xxmrghd, 2 x xvcvspuxws, vmrgew                   //
328;// Note: if the consecutive loads learns to handle pre-inc, this can be:     //
329;//       sldi 2, 2 x load, vperm, xvcvspuxws                                 //
330;vector unsigned int fromDiffMemVarDConvftoui(float *arr, int elem) {         //
331;  return (vector unsigned int) { arr[elem], arr[elem-1],                     //
332;                                 arr[elem-2], arr[elem-3] };                 //
333;}                                                                            //
334;// P8: xscvdpuxws, xxspltw                                                   //
335;// P9: xscvdpuxws, xxspltw                                                   //
336;vector unsigned int spltRegValConvftoui(float val) {                         //
337;  return (vector unsigned int) val;                                          //
338;}                                                                            //
339;// P8: lxsspx, xscvdpuxws, xxspltw                                           //
340;// P9: lxvwsx, xvcvspuxws                                                    //
341;vector unsigned int spltMemValConvftoui(float *ptr) {                        //
342;  return (vector unsigned int)*ptr;                                          //
343;}                                                                            //
344;// P8: vspltisw                                                              //
345;// P9: vspltisw                                                              //
346;vector unsigned int spltCnstConvdtoui() {                                    //
347;  return (vector unsigned int) 4.74;                                         //
348;}                                                                            //
349;// P8: 2 x xxmrghd, 2 x xvcvspuxws, vmrgew                                   //
350;// P9: 2 x xxmrghd, 2 x xvcvspuxws, vmrgew                                   //
351;vector unsigned int fromRegsConvdtoui(double a, double b,                    //
352;                                      double c, double d) {                  //
353;  return (vector unsigned int) { a, b, c, d };                               //
354;}                                                                            //
355;// P8: lxvd2x, xxswapd                                                       //
356;// P9: lxvx (even lxv)                                                       //
357;vector unsigned int fromDiffConstsConvdtoui() {                              //
358;  return (vector unsigned int) { 24.46, 234., 988.19, 422.39 };              //
359;}                                                                            //
360;// P8: 2 x lxvd2x, 2 x xxswapd, xxmrgld, xxmrghd, 2 x xvcvspuxws, vmrgew     //
361;// P9: 2 x lxvx, xxmrgld, xxmrghd, 2 x xvcvspuxws, vmrgew                    //
362;vector unsigned int fromDiffMemConsAConvdtoui(double *ptr) {                 //
363;  return (vector unsigned int) { ptr[0], ptr[1], ptr[2], ptr[3] };           //
364;}                                                                            //
365;// P8: 4 x lxsdx, 2 x xxmrghd, 2 x xvcvspuxws, vmrgew                        //
366;// P9: 4 x lfd, 2 x xxmrghd, 2 x xvcvspuxws, vmrgew                          //
367;vector unsigned int fromDiffMemConsDConvdtoui(double *ptr) {                 //
368;  return (vector unsigned int) { ptr[3], ptr[2], ptr[1], ptr[0] };           //
369;}                                                                            //
370;// P8: lfdux, 3 x lxsdx, 2 x xxmrghd, 2 x xvcvspuxws, vmrgew                 //
371;// P9: lfdux, 3 x lfd, 2 x xxmrghd, 2 x xvcvspuxws, vmrgew                   //
372;vector unsigned int fromDiffMemVarAConvdtoui(double *arr, int elem) {        //
373;  return (vector unsigned int) { arr[elem], arr[elem+1],                     //
374;                                 arr[elem+2], arr[elem+3] };                 //
375;}                                                                            //
376;// P8: lfdux, 3 x lxsdx, 2 x xxmrghd, 2 x xvcvspuxws, vmrgew                 //
377;// P9: lfdux, 3 x lfd, 2 x xxmrghd, 2 x xvcvspuxws, vmrgew                   //
378;vector unsigned int fromDiffMemVarDConvdtoui(double *arr, int elem) {        //
379;  return (vector unsigned int) { arr[elem], arr[elem-1],                     //
380;                                 arr[elem-2], arr[elem-3] };                 //
381;}                                                                            //
382;// P8: xscvdpuxws, xxspltw                                                   //
383;// P9: xscvdpuxws, xxspltw                                                   //
384;vector unsigned int spltRegValConvdtoui(double val) {                        //
385;  return (vector unsigned int) val;                                          //
386;}                                                                            //
387;// P8: lxsspx, xscvdpuxws, xxspltw                                           //
388;// P9: lfd, xscvdpuxws, xxspltw                                              //
389;vector unsigned int spltMemValConvdtoui(double *ptr) {                       //
390;  return (vector unsigned int)*ptr;                                          //
391;}                                                                            //
392;/*=============================== unsigned int ==============================*/
393;/*=============================== long long =================================*/
394;// P8: xxlxor                                                                //
395;// P9: xxlxor                                                                //
396;vector long long allZeroll() {                                               //
397;  return (vector long long)0;                                                //
398;}                                                                            //
399;// P8: vspltisb -1                                                           //
400;// P9: xxspltisb 255                                                         //
401;vector long long allOnell() {                                                //
402;  return (vector long long)-1;                                               //
403;}                                                                            //
404;// P8: constant pool load (possible: vmrgew (xxlxor), (vspltisw))            //
405;// P9: constant pool load (possible: vmrgew (xxlxor), (vspltisw))            //
406;vector long long spltConst1ll() {                                            //
407;  return (vector long long)1;                                                //
408;}                                                                            //
409;// P8: constant pool load (possible: vmrgew (xxlxor), (vspltisw, vsrw))      //
410;// P9: constant pool load (possible: vmrgew (xxlxor), (vspltisw, vsrw))      //
411;vector long long spltConst16kll() {                                          //
412;  return (vector long long)((1<<15) - 1);                                    //
413;}                                                                            //
414;// P8: constant pool load (possible: vmrgew (xxlxor), (vspltisw, vsrw))      //
415;// P9: constant pool load (possible: vmrgew (xxlxor), (vspltisw, vsrw))      //
416;vector long long spltConst32kll() {                                          //
417;  return (vector long long)((1<<16) - 1);                                    //
418;}                                                                            //
419;// P8: 2 x mtvsrd, xxmrghd                                                   //
420;// P9: mtvsrdd                                                               //
421;vector long long fromRegsll(long long a, long long b) {                      //
422;  return (vector long long){ a, b };                                         //
423;}                                                                            //
424;// P8: lxvd2x, xxswapd                                                       //
425;// P9: lxvx (or even lxv)                                                    //
426;vector long long fromDiffConstsll() {                                        //
427;  return (vector long long) { 242, -113 };                                   //
428;}                                                                            //
429;// P8: lxvd2x, xxswapd                                                       //
430;// P9: lxvx                                                                  //
431;vector long long fromDiffMemConsAll(long long *arr) {                        //
432;  return (vector long long) { arr[0], arr[1] };                              //
433;}                                                                            //
434;// P8: lxvd2x                                                                //
435;// P9: lxvx, xxswapd (maybe just use lxvd2x)                                 //
436;vector long long fromDiffMemConsDll(long long *arr) {                        //
437;  return (vector long long) { arr[3], arr[2] };                              //
438;}                                                                            //
439;// P8: sldi 3, lxvd2x, xxswapd                                               //
440;// P9: sldi 3, lxvx                                                          //
441;vector long long fromDiffMemVarAll(long long *arr, int elem) {               //
442;  return (vector long long) { arr[elem], arr[elem+1] };                      //
443;}                                                                            //
444;// P8: sldi 3, lxvd2x                                                        //
445;// P9: sldi 3, lxvx, xxswapd (maybe just use lxvd2x)                         //
446;vector long long fromDiffMemVarDll(long long *arr, int elem) {               //
447;  return (vector long long) { arr[elem], arr[elem-1] };                      //
448;}                                                                            //
449;// P8: 2 x ld, 2 x mtvsrd, xxmrghd                                           //
450;// P9: 2 x ld, mtvsrdd                                                       //
451;vector long long fromRandMemConsll(long long *arr) {                         //
452;  return (vector long long) { arr[4], arr[18] };                             //
453;}                                                                            //
454;// P8: sldi 3, add, 2 x ld, 2 x mtvsrd, xxmrghd                              //
455;// P9: sldi 3, add, 2 x ld, mtvsrdd                                          //
456;vector long long fromRandMemVarll(long long *arr, int elem) {                //
457;  return (vector long long) { arr[elem+4], arr[elem+1] };                    //
458;}                                                                            //
459;// P8: mtvsrd, xxspltd                                                       //
460;// P9: mtvsrdd                                                               //
461;vector long long spltRegValll(long long val) {                               //
462;  return (vector long long) val;                                             //
463;}                                                                            //
464;// P8: lxvdsx                                                                //
465;// P9: lxvdsx                                                                //
466;vector long long spltMemValll(long long *ptr) {                              //
467;  return (vector long long)*ptr;                                             //
468;}                                                                            //
469;// P8: constant pool load (possible: vmrgew (xxlxor), (vspltisw))            //
470;// P9: constant pool load (possible: vmrgew (xxlxor), (vspltisw))            //
471;vector long long spltCnstConvftoll() {                                       //
472;  return (vector long long) 4.74f;                                           //
473;}                                                                            //
474;// P8: xxmrghd, xvcvdpsxds                                                   //
475;// P9: xxmrghd, xvcvdpsxds                                                   //
476;vector long long fromRegsConvftoll(float a, float b) {                       //
477;  return (vector long long) { a, b };                                        //
478;}                                                                            //
479;// P8: lxvd2x, xxswapd                                                       //
480;// P9: lxvx (even lxv)                                                       //
481;vector long long fromDiffConstsConvftoll() {                                 //
482;  return (vector long long) { 24.46f, 234.f };                               //
483;}                                                                            //
484;// P8: 2 x lxsspx, xxmrghd, xvcvdpsxds                                       //
485;// P9: 2 x lxssp, xxmrghd, xvcvdpsxds                                        //
486;vector long long fromDiffMemConsAConvftoll(float *ptr) {                     //
487;  return (vector long long) { ptr[0], ptr[1] };                              //
488;}                                                                            //
489;// P8: 2 x lxsspx, xxmrghd, xvcvdpsxds                                       //
490;// P9: 2 x lxssp, xxmrghd, xvcvdpsxds                                        //
491;vector long long fromDiffMemConsDConvftoll(float *ptr) {                     //
492;  return (vector long long) { ptr[3], ptr[2] };                              //
493;}                                                                            //
494;// P8: sldi 2, lfsux, lxsspx, xxmrghd, xvcvdpsxds                            //
495;// P9: sldi 2, lfsux, lfs, xxmrghd, xvcvdpsxds                               //
496;vector long long fromDiffMemVarAConvftoll(float *arr, int elem) {            //
497;  return (vector long long) { arr[elem], arr[elem+1] };                      //
498;}                                                                            //
499;// P8: sldi 2, lfsux, lxsspx, xxmrghd, xvcvdpsxds                            //
500;// P9: sldi 2, lfsux, lfs, xxmrghd, xvcvdpsxds                               //
501;vector long long fromDiffMemVarDConvftoll(float *arr, int elem) {            //
502;  return (vector long long) { arr[elem], arr[elem-1] };                      //
503;}                                                                            //
504;// P8: xscvdpsxds, xxspltd                                                   //
505;// P9: xscvdpsxds, xxspltd                                                   //
506;vector long long spltRegValConvftoll(float val) {                            //
507;  return (vector long long) val;                                             //
508;}                                                                            //
509;// P8: lxsspx, xscvdpsxds, xxspltd                                           //
510;// P9: lfs, xscvdpsxds, xxspltd                                              //
511;vector long long spltMemValConvftoll(float *ptr) {                           //
512;  return (vector long long)*ptr;                                             //
513;}                                                                            //
514;// P8: constant pool load (possible: vmrgew (xxlxor), (vspltisw))            //
515;// P9: constant pool load (possible: vmrgew (xxlxor), (vspltisw))            //
516;vector long long spltCnstConvdtoll() {                                       //
517;  return (vector long long) 4.74;                                            //
518;}                                                                            //
519;// P8: xxmrghd, xvcvdpsxds                                                   //
520;// P9: xxmrghd, xvcvdpsxds                                                   //
521;vector long long fromRegsConvdtoll(double a, double b) {                     //
522;  return (vector long long) { a, b };                                        //
523;}                                                                            //
524;// P8: lxvd2x, xxswapd                                                       //
525;// P9: lxvx (even lxv)                                                       //
526;vector long long fromDiffConstsConvdtoll() {                                 //
527;  return (vector long long) { 24.46, 234. };                                 //
528;}                                                                            //
529;// P8: lxvd2x, xxswapd, xvcvdpsxds                                           //
530;// P9: lxvx, xvcvdpsxds                                                      //
531;vector long long fromDiffMemConsAConvdtoll(double *ptr) {                    //
532;  return (vector long long) { ptr[0], ptr[1] };                              //
533;}                                                                            //
534;// P8: lxvd2x, xvcvdpsxds                                                    //
535;// P9: lxvx, xxswapd, xvcvdpsxds                                             //
536;vector long long fromDiffMemConsDConvdtoll(double *ptr) {                    //
537;  return (vector long long) { ptr[3], ptr[2] };                              //
538;}                                                                            //
539;// P8: sldi 3, lxvd2x, xxswapd, xvcvdpsxds                                   //
540;// P9: sldi 3, lxvx, xvcvdpsxds                                              //
541;vector long long fromDiffMemVarAConvdtoll(double *arr, int elem) {           //
542;  return (vector long long) { arr[elem], arr[elem+1] };                      //
543;}                                                                            //
544;// P8: sldi 3, lxvd2x, xvcvdpsxds                                            //
545;// P9: sldi 3, lxvx, xxswapd, xvcvdpsxds                                     //
546;vector long long fromDiffMemVarDConvdtoll(double *arr, int elem) {           //
547;  return (vector long long) { arr[elem], arr[elem-1] };                      //
548;}                                                                            //
549;// P8: xscvdpsxds, xxspltd                                                   //
550;// P9: xscvdpsxds, xxspltd                                                   //
551;vector long long spltRegValConvdtoll(double val) {                           //
552;  return (vector long long) val;                                             //
553;}                                                                            //
554;// P8: lxvdsx, xvcvdpsxds                                                    //
555;// P9: lxvdsx, xvcvdpsxds                                                    //
556;vector long long spltMemValConvdtoll(double *ptr) {                          //
557;  return (vector long long)*ptr;                                             //
558;}                                                                            //
559;/*=============================== long long =================================*/
560;/*========================== unsigned long long =============================*/
561;// P8: xxlxor                                                                //
562;// P9: xxlxor                                                                //
563;vector unsigned long long allZeroull() {                                     //
564;  return (vector unsigned long long)0;                                       //
565;}                                                                            //
566;// P8: vspltisb -1                                                           //
567;// P9: xxspltisb 255                                                         //
568;vector unsigned long long allOneull() {                                      //
569;  return (vector unsigned long long)-1;                                      //
570;}                                                                            //
571;// P8: constant pool load (possible: vmrgew (xxlxor), (vspltisw))            //
572;// P9: constant pool load (possible: vmrgew (xxlxor), (vspltisw))            //
573;vector unsigned long long spltConst1ull() {                                  //
574;  return (vector unsigned long long)1;                                       //
575;}                                                                            //
576;// P8: constant pool load (possible: vmrgew (xxlxor), (vspltisw, vsrw))      //
577;// P9: constant pool load (possible: vmrgew (xxlxor), (vspltisw, vsrw))      //
578;vector unsigned long long spltConst16kull() {                                //
579;  return (vector unsigned long long)((1<<15) - 1);                           //
580;}                                                                            //
581;// P8: constant pool load (possible: vmrgew (xxlxor), (vspltisw, vsrw))      //
582;// P9: constant pool load (possible: vmrgew (xxlxor), (vspltisw, vsrw))      //
583;vector unsigned long long spltConst32kull() {                                //
584;  return (vector unsigned long long)((1<<16) - 1);                           //
585;}                                                                            //
586;// P8: 2 x mtvsrd, xxmrghd                                                   //
587;// P9: mtvsrdd                                                               //
588;vector unsigned long long fromRegsull(unsigned long long a,                  //
589;                                      unsigned long long b) {                //
590;  return (vector unsigned long long){ a, b };                                //
591;}                                                                            //
592;// P8: lxvd2x, xxswapd                                                       //
593;// P9: lxvx (or even lxv)                                                    //
594;vector unsigned long long fromDiffConstsull() {                              //
595;  return (vector unsigned long long) { 242, -113 };                          //
596;}                                                                            //
597;// P8: lxvd2x, xxswapd                                                       //
598;// P9: lxvx                                                                  //
599;vector unsigned long long fromDiffMemConsAull(unsigned long long *arr) {     //
600;  return (vector unsigned long long) { arr[0], arr[1] };                     //
601;}                                                                            //
602;// P8: lxvd2x                                                                //
603;// P9: lxvx, xxswapd (maybe just use lxvd2x)                                 //
604;vector unsigned long long fromDiffMemConsDull(unsigned long long *arr) {     //
605;  return (vector unsigned long long) { arr[3], arr[2] };                     //
606;}                                                                            //
607;// P8: sldi 3, lxvd2x, xxswapd                                               //
608;// P9: sldi 3, lxvx                                                          //
609;vector unsigned long long fromDiffMemVarAull(unsigned long long *arr,        //
610;                                             int elem) {                     //
611;  return (vector unsigned long long) { arr[elem], arr[elem+1] };             //
612;}                                                                            //
613;// P8: sldi 3, lxvd2x                                                        //
614;// P9: sldi 3, lxvx, xxswapd (maybe just use lxvd2x)                         //
615;vector unsigned long long fromDiffMemVarDull(unsigned long long *arr,        //
616;                                             int elem) {                     //
617;  return (vector unsigned long long) { arr[elem], arr[elem-1] };             //
618;}                                                                            //
619;// P8: 2 x ld, 2 x mtvsrd, xxmrghd                                           //
620;// P9: 2 x ld, mtvsrdd                                                       //
621;vector unsigned long long fromRandMemConsull(unsigned long long *arr) {      //
622;  return (vector unsigned long long) { arr[4], arr[18] };                    //
623;}                                                                            //
624;// P8: sldi 3, add, 2 x ld, 2 x mtvsrd, xxmrghd                              //
625;// P9: sldi 3, add, 2 x ld, mtvsrdd                                          //
626;vector unsigned long long fromRandMemVarull(unsigned long long *arr,         //
627;                                            int elem) {                      //
628;  return (vector unsigned long long) { arr[elem+4], arr[elem+1] };           //
629;}                                                                            //
630;// P8: mtvsrd, xxspltd                                                       //
631;// P9: mtvsrdd                                                               //
632;vector unsigned long long spltRegValull(unsigned long long val) {            //
633;  return (vector unsigned long long) val;                                    //
634;}                                                                            //
635;// P8: lxvdsx                                                                //
636;// P9: lxvdsx                                                                //
637;vector unsigned long long spltMemValull(unsigned long long *ptr) {           //
638;  return (vector unsigned long long)*ptr;                                    //
639;}                                                                            //
640;// P8: constant pool load (possible: vmrgew (xxlxor), (vspltisw))            //
641;// P9: constant pool load (possible: vmrgew (xxlxor), (vspltisw))            //
642;vector unsigned long long spltCnstConvftoull() {                             //
643;  return (vector unsigned long long) 4.74f;                                  //
644;}                                                                            //
645;// P8: xxmrghd, xvcvdpuxds                                                   //
646;// P9: xxmrghd, xvcvdpuxds                                                   //
647;vector unsigned long long fromRegsConvftoull(float a, float b) {             //
648;  return (vector unsigned long long) { a, b };                               //
649;}                                                                            //
650;// P8: lxvd2x, xxswapd                                                       //
651;// P9: lxvx (even lxv)                                                       //
652;vector unsigned long long fromDiffConstsConvftoull() {                       //
653;  return (vector unsigned long long) { 24.46f, 234.f };                      //
654;}                                                                            //
655;// P8: 2 x lxsspx, xxmrghd, xvcvdpuxds                                       //
656;// P9: 2 x lxssp, xxmrghd, xvcvdpuxds                                        //
657;vector unsigned long long fromDiffMemConsAConvftoull(float *ptr) {           //
658;  return (vector unsigned long long) { ptr[0], ptr[1] };                     //
659;}                                                                            //
660;// P8: 2 x lxsspx, xxmrghd, xvcvdpuxds                                       //
661;// P9: 2 x lxssp, xxmrghd, xvcvdpuxds                                        //
662;vector unsigned long long fromDiffMemConsDConvftoull(float *ptr) {           //
663;  return (vector unsigned long long) { ptr[3], ptr[2] };                     //
664;}                                                                            //
665;// P8: sldi 2, lfsux, lxsspx, xxmrghd, xvcvdpuxds                            //
666;// P9: sldi 2, lfsux, lfs, xxmrghd, xvcvdpuxds                               //
667;vector unsigned long long fromDiffMemVarAConvftoull(float *arr, int elem) {  //
668;  return (vector unsigned long long) { arr[elem], arr[elem+1] };             //
669;}                                                                            //
670;// P8: sldi 2, lfsux, lxsspx, xxmrghd, xvcvdpuxds                            //
671;// P9: sldi 2, lfsux, lfs, xxmrghd, xvcvdpuxds                               //
672;vector unsigned long long fromDiffMemVarDConvftoull(float *arr, int elem) {  //
673;  return (vector unsigned long long) { arr[elem], arr[elem-1] };             //
674;}                                                                            //
675;// P8: xscvdpuxds, xxspltd                                                   //
676;// P9: xscvdpuxds, xxspltd                                                   //
677;vector unsigned long long spltRegValConvftoull(float val) {                  //
678;  return (vector unsigned long long) val;                                    //
679;}                                                                            //
680;// P8: lxsspx, xscvdpuxds, xxspltd                                           //
681;// P9: lfs, xscvdpuxds, xxspltd                                              //
682;vector unsigned long long spltMemValConvftoull(float *ptr) {                 //
683;  return (vector unsigned long long)*ptr;                                    //
684;}                                                                            //
685;// P8: constant pool load (possible: vmrgew (xxlxor), (vspltisw))            //
686;// P9: constant pool load (possible: vmrgew (xxlxor), (vspltisw))            //
687;vector unsigned long long spltCnstConvdtoull() {                             //
688;  return (vector unsigned long long) 4.74;                                   //
689;}                                                                            //
690;// P8: xxmrghd, xvcvdpuxds                                                   //
691;// P9: xxmrghd, xvcvdpuxds                                                   //
692;vector unsigned long long fromRegsConvdtoull(double a, double b) {           //
693;  return (vector unsigned long long) { a, b };                               //
694;}                                                                            //
695;// P8: lxvd2x, xxswapd                                                       //
696;// P9: lxvx (even lxv)                                                       //
697;vector unsigned long long fromDiffConstsConvdtoull() {                       //
698;  return (vector unsigned long long) { 24.46, 234. };                        //
699;}                                                                            //
700;// P8: lxvd2x, xxswapd, xvcvdpuxds                                           //
701;// P9: lxvx, xvcvdpuxds                                                      //
702;vector unsigned long long fromDiffMemConsAConvdtoull(double *ptr) {          //
703;  return (vector unsigned long long) { ptr[0], ptr[1] };                     //
704;}                                                                            //
705;// P8: lxvd2x, xvcvdpuxds                                                    //
706;// P9: lxvx, xxswapd, xvcvdpuxds                                             //
707;vector unsigned long long fromDiffMemConsDConvdtoull(double *ptr) {          //
708;  return (vector unsigned long long) { ptr[3], ptr[2] };                     //
709;}                                                                            //
710;// P8: sldi 3, lxvd2x, xxswapd, xvcvdpuxds                                   //
711;// P9: sldi 3, lxvx, xvcvdpuxds                                              //
712;vector unsigned long long fromDiffMemVarAConvdtoull(double *arr, int elem) { //
713;  return (vector unsigned long long) { arr[elem], arr[elem+1] };             //
714;}                                                                            //
715;// P8: sldi 3, lxvd2x, xvcvdpuxds                                            //
716;// P9: sldi 3, lxvx, xxswapd, xvcvdpuxds                                     //
717;vector unsigned long long fromDiffMemVarDConvdtoull(double *arr, int elem) { //
718;  return (vector unsigned long long) { arr[elem], arr[elem-1] };             //
719;}                                                                            //
720;// P8: xscvdpuxds, xxspltd                                                   //
721;// P9: xscvdpuxds, xxspltd                                                   //
722;vector unsigned long long spltRegValConvdtoull(double val) {                 //
723;  return (vector unsigned long long) val;                                    //
724;}                                                                            //
725;// P8: lxvdsx, xvcvdpuxds                                                    //
726;// P9: lxvdsx, xvcvdpuxds                                                    //
727;vector unsigned long long spltMemValConvdtoull(double *ptr) {                //
728;  return (vector unsigned long long)*ptr;                                    //
729;}                                                                            //
730;/*========================== unsigned long long ==============================*/
731
732; Function Attrs: norecurse nounwind readnone
733define <4 x i32> @allZeroi() {
734; P9BE-LABEL: allZeroi:
735; P9BE:       # %bb.0: # %entry
736; P9BE-NEXT:    xxlxor v2, v2, v2
737; P9BE-NEXT:    blr
738;
739; P9LE-LABEL: allZeroi:
740; P9LE:       # %bb.0: # %entry
741; P9LE-NEXT:    xxlxor v2, v2, v2
742; P9LE-NEXT:    blr
743;
744; P8BE-LABEL: allZeroi:
745; P8BE:       # %bb.0: # %entry
746; P8BE-NEXT:    xxlxor v2, v2, v2
747; P8BE-NEXT:    blr
748;
749; P8LE-LABEL: allZeroi:
750; P8LE:       # %bb.0: # %entry
751; P8LE-NEXT:    xxlxor v2, v2, v2
752; P8LE-NEXT:    blr
753entry:
754  ret <4 x i32> zeroinitializer
755}
756
757; Function Attrs: norecurse nounwind readnone
758define <4 x i32> @allOnei() {
759; P9BE-LABEL: allOnei:
760; P9BE:       # %bb.0: # %entry
761; P9BE-NEXT:    xxspltib v2, 255
762; P9BE-NEXT:    blr
763;
764; P9LE-LABEL: allOnei:
765; P9LE:       # %bb.0: # %entry
766; P9LE-NEXT:    xxspltib v2, 255
767; P9LE-NEXT:    blr
768;
769; P8BE-LABEL: allOnei:
770; P8BE:       # %bb.0: # %entry
771; P8BE-NEXT:    vspltisb v2, -1
772; P8BE-NEXT:    blr
773;
774; P8LE-LABEL: allOnei:
775; P8LE:       # %bb.0: # %entry
776; P8LE-NEXT:    vspltisb v2, -1
777; P8LE-NEXT:    blr
778entry:
779  ret <4 x i32> <i32 -1, i32 -1, i32 -1, i32 -1>
780}
781
782; Function Attrs: norecurse nounwind readnone
783define <4 x i32> @spltConst1i() {
784; P9BE-LABEL: spltConst1i:
785; P9BE:       # %bb.0: # %entry
786; P9BE-NEXT:    vspltisw v2, 1
787; P9BE-NEXT:    blr
788;
789; P9LE-LABEL: spltConst1i:
790; P9LE:       # %bb.0: # %entry
791; P9LE-NEXT:    vspltisw v2, 1
792; P9LE-NEXT:    blr
793;
794; P8BE-LABEL: spltConst1i:
795; P8BE:       # %bb.0: # %entry
796; P8BE-NEXT:    vspltisw v2, 1
797; P8BE-NEXT:    blr
798;
799; P8LE-LABEL: spltConst1i:
800; P8LE:       # %bb.0: # %entry
801; P8LE-NEXT:    vspltisw v2, 1
802; P8LE-NEXT:    blr
803entry:
804  ret <4 x i32> <i32 1, i32 1, i32 1, i32 1>
805}
806
807; Function Attrs: norecurse nounwind readnone
808define <4 x i32> @spltConst16ki() {
809; P9BE-LABEL: spltConst16ki:
810; P9BE:       # %bb.0: # %entry
811; P9BE-NEXT:    vspltisw v2, -15
812; P9BE-NEXT:    vsrw v2, v2, v2
813; P9BE-NEXT:    blr
814;
815; P9LE-LABEL: spltConst16ki:
816; P9LE:       # %bb.0: # %entry
817; P9LE-NEXT:    vspltisw v2, -15
818; P9LE-NEXT:    vsrw v2, v2, v2
819; P9LE-NEXT:    blr
820;
821; P8BE-LABEL: spltConst16ki:
822; P8BE:       # %bb.0: # %entry
823; P8BE-NEXT:    vspltisw v2, -15
824; P8BE-NEXT:    vsrw v2, v2, v2
825; P8BE-NEXT:    blr
826;
827; P8LE-LABEL: spltConst16ki:
828; P8LE:       # %bb.0: # %entry
829; P8LE-NEXT:    vspltisw v2, -15
830; P8LE-NEXT:    vsrw v2, v2, v2
831; P8LE-NEXT:    blr
832entry:
833  ret <4 x i32> <i32 32767, i32 32767, i32 32767, i32 32767>
834}
835
836; Function Attrs: norecurse nounwind readnone
837define <4 x i32> @spltConst32ki() {
838; P9BE-LABEL: spltConst32ki:
839; P9BE:       # %bb.0: # %entry
840; P9BE-NEXT:    vspltisw v2, -16
841; P9BE-NEXT:    vsrw v2, v2, v2
842; P9BE-NEXT:    blr
843;
844; P9LE-LABEL: spltConst32ki:
845; P9LE:       # %bb.0: # %entry
846; P9LE-NEXT:    vspltisw v2, -16
847; P9LE-NEXT:    vsrw v2, v2, v2
848; P9LE-NEXT:    blr
849;
850; P8BE-LABEL: spltConst32ki:
851; P8BE:       # %bb.0: # %entry
852; P8BE-NEXT:    vspltisw v2, -16
853; P8BE-NEXT:    vsrw v2, v2, v2
854; P8BE-NEXT:    blr
855;
856; P8LE-LABEL: spltConst32ki:
857; P8LE:       # %bb.0: # %entry
858; P8LE-NEXT:    vspltisw v2, -16
859; P8LE-NEXT:    vsrw v2, v2, v2
860; P8LE-NEXT:    blr
861entry:
862  ret <4 x i32> <i32 65535, i32 65535, i32 65535, i32 65535>
863}
864
865; Function Attrs: norecurse nounwind readnone
866define <4 x i32> @fromRegsi(i32 signext %a, i32 signext %b, i32 signext %c, i32 signext %d) {
867; P9BE-LABEL: fromRegsi:
868; P9BE:       # %bb.0: # %entry
869; P9BE-NEXT:    rldimi r6, r5, 32, 0
870; P9BE-NEXT:    rldimi r4, r3, 32, 0
871; P9BE-NEXT:    mtvsrdd v2, r4, r6
872; P9BE-NEXT:    blr
873;
874; P9LE-LABEL: fromRegsi:
875; P9LE:       # %bb.0: # %entry
876; P9LE-NEXT:    rldimi r3, r4, 32, 0
877; P9LE-NEXT:    rldimi r5, r6, 32, 0
878; P9LE-NEXT:    mtvsrdd v2, r5, r3
879; P9LE-NEXT:    blr
880;
881; P8BE-LABEL: fromRegsi:
882; P8BE:       # %bb.0: # %entry
883; P8BE-NEXT:    rldimi r6, r5, 32, 0
884; P8BE-NEXT:    rldimi r4, r3, 32, 0
885; P8BE-NEXT:    mtvsrd f0, r6
886; P8BE-NEXT:    mtvsrd f1, r4
887; P8BE-NEXT:    xxmrghd v2, vs1, vs0
888; P8BE-NEXT:    blr
889;
890; P8LE-LABEL: fromRegsi:
891; P8LE:       # %bb.0: # %entry
892; P8LE-NEXT:    rldimi r3, r4, 32, 0
893; P8LE-NEXT:    rldimi r5, r6, 32, 0
894; P8LE-NEXT:    mtvsrd f0, r3
895; P8LE-NEXT:    mtvsrd f1, r5
896; P8LE-NEXT:    xxmrghd v2, vs1, vs0
897; P8LE-NEXT:    blr
898entry:
899  %vecinit = insertelement <4 x i32> undef, i32 %a, i32 0
900  %vecinit1 = insertelement <4 x i32> %vecinit, i32 %b, i32 1
901  %vecinit2 = insertelement <4 x i32> %vecinit1, i32 %c, i32 2
902  %vecinit3 = insertelement <4 x i32> %vecinit2, i32 %d, i32 3
903  ret <4 x i32> %vecinit3
904}
905
906; Function Attrs: norecurse nounwind readnone
907define <4 x i32> @fromDiffConstsi() {
908; P9BE-LABEL: fromDiffConstsi:
909; P9BE:       # %bb.0: # %entry
910; P9BE-NEXT:    addis r3, r2, .LCPI6_0@toc@ha
911; P9BE-NEXT:    addi r3, r3, .LCPI6_0@toc@l
912; P9BE-NEXT:    lxvx v2, 0, r3
913; P9BE-NEXT:    blr
914;
915; P9LE-LABEL: fromDiffConstsi:
916; P9LE:       # %bb.0: # %entry
917; P9LE-NEXT:    addis r3, r2, .LCPI6_0@toc@ha
918; P9LE-NEXT:    addi r3, r3, .LCPI6_0@toc@l
919; P9LE-NEXT:    lxvx v2, 0, r3
920; P9LE-NEXT:    blr
921;
922; P8BE-LABEL: fromDiffConstsi:
923; P8BE:       # %bb.0: # %entry
924; P8BE-NEXT:    addis r3, r2, .LCPI6_0@toc@ha
925; P8BE-NEXT:    addi r3, r3, .LCPI6_0@toc@l
926; P8BE-NEXT:    lxvw4x v2, 0, r3
927; P8BE-NEXT:    blr
928;
929; P8LE-LABEL: fromDiffConstsi:
930; P8LE:       # %bb.0: # %entry
931; P8LE-NEXT:    addis r3, r2, .LCPI6_0@toc@ha
932; P8LE-NEXT:    addi r3, r3, .LCPI6_0@toc@l
933; P8LE-NEXT:    lvx v2, 0, r3
934; P8LE-NEXT:    blr
935entry:
936  ret <4 x i32> <i32 242, i32 -113, i32 889, i32 19>
937}
938
939; Function Attrs: norecurse nounwind readonly
940define <4 x i32> @fromDiffMemConsAi(i32* nocapture readonly %arr) {
941; P9BE-LABEL: fromDiffMemConsAi:
942; P9BE:       # %bb.0: # %entry
943; P9BE-NEXT:    lxv v2, 0(r3)
944; P9BE-NEXT:    blr
945;
946; P9LE-LABEL: fromDiffMemConsAi:
947; P9LE:       # %bb.0: # %entry
948; P9LE-NEXT:    lxv v2, 0(r3)
949; P9LE-NEXT:    blr
950;
951; P8BE-LABEL: fromDiffMemConsAi:
952; P8BE:       # %bb.0: # %entry
953; P8BE-NEXT:    lxvw4x v2, 0, r3
954; P8BE-NEXT:    blr
955;
956; P8LE-LABEL: fromDiffMemConsAi:
957; P8LE:       # %bb.0: # %entry
958; P8LE-NEXT:    lxvd2x vs0, 0, r3
959; P8LE-NEXT:    xxswapd v2, vs0
960; P8LE-NEXT:    blr
961entry:
962  %0 = load i32, i32* %arr, align 4
963  %vecinit = insertelement <4 x i32> undef, i32 %0, i32 0
964  %arrayidx1 = getelementptr inbounds i32, i32* %arr, i64 1
965  %1 = load i32, i32* %arrayidx1, align 4
966  %vecinit2 = insertelement <4 x i32> %vecinit, i32 %1, i32 1
967  %arrayidx3 = getelementptr inbounds i32, i32* %arr, i64 2
968  %2 = load i32, i32* %arrayidx3, align 4
969  %vecinit4 = insertelement <4 x i32> %vecinit2, i32 %2, i32 2
970  %arrayidx5 = getelementptr inbounds i32, i32* %arr, i64 3
971  %3 = load i32, i32* %arrayidx5, align 4
972  %vecinit6 = insertelement <4 x i32> %vecinit4, i32 %3, i32 3
973  ret <4 x i32> %vecinit6
974}
975
976; Function Attrs: norecurse nounwind readonly
977define <4 x i32> @fromDiffMemConsDi(i32* nocapture readonly %arr) {
978; P9BE-LABEL: fromDiffMemConsDi:
979; P9BE:       # %bb.0: # %entry
980; P9BE-NEXT:    lxv v2, 0(r3)
981; P9BE-NEXT:    addis r3, r2, .LCPI8_0@toc@ha
982; P9BE-NEXT:    addi r3, r3, .LCPI8_0@toc@l
983; P9BE-NEXT:    lxvx v3, 0, r3
984; P9BE-NEXT:    vperm v2, v2, v2, v3
985; P9BE-NEXT:    blr
986;
987; P9LE-LABEL: fromDiffMemConsDi:
988; P9LE:       # %bb.0: # %entry
989; P9LE-NEXT:    lxv v2, 0(r3)
990; P9LE-NEXT:    addis r3, r2, .LCPI8_0@toc@ha
991; P9LE-NEXT:    addi r3, r3, .LCPI8_0@toc@l
992; P9LE-NEXT:    lxvx v3, 0, r3
993; P9LE-NEXT:    vperm v2, v2, v2, v3
994; P9LE-NEXT:    blr
995;
996; P8BE-LABEL: fromDiffMemConsDi:
997; P8BE:       # %bb.0: # %entry
998; P8BE-NEXT:    addis r4, r2, .LCPI8_0@toc@ha
999; P8BE-NEXT:    lxvw4x v2, 0, r3
1000; P8BE-NEXT:    addi r4, r4, .LCPI8_0@toc@l
1001; P8BE-NEXT:    lxvw4x v3, 0, r4
1002; P8BE-NEXT:    vperm v2, v2, v2, v3
1003; P8BE-NEXT:    blr
1004;
1005; P8LE-LABEL: fromDiffMemConsDi:
1006; P8LE:       # %bb.0: # %entry
1007; P8LE-NEXT:    lxvd2x vs0, 0, r3
1008; P8LE-NEXT:    addis r4, r2, .LCPI8_0@toc@ha
1009; P8LE-NEXT:    addi r3, r4, .LCPI8_0@toc@l
1010; P8LE-NEXT:    lvx v2, 0, r3
1011; P8LE-NEXT:    xxswapd v3, vs0
1012; P8LE-NEXT:    vperm v2, v3, v3, v2
1013; P8LE-NEXT:    blr
1014entry:
1015  %arrayidx = getelementptr inbounds i32, i32* %arr, i64 3
1016  %0 = load i32, i32* %arrayidx, align 4
1017  %vecinit = insertelement <4 x i32> undef, i32 %0, i32 0
1018  %arrayidx1 = getelementptr inbounds i32, i32* %arr, i64 2
1019  %1 = load i32, i32* %arrayidx1, align 4
1020  %vecinit2 = insertelement <4 x i32> %vecinit, i32 %1, i32 1
1021  %arrayidx3 = getelementptr inbounds i32, i32* %arr, i64 1
1022  %2 = load i32, i32* %arrayidx3, align 4
1023  %vecinit4 = insertelement <4 x i32> %vecinit2, i32 %2, i32 2
1024  %3 = load i32, i32* %arr, align 4
1025  %vecinit6 = insertelement <4 x i32> %vecinit4, i32 %3, i32 3
1026  ret <4 x i32> %vecinit6
1027}
1028
1029; Function Attrs: norecurse nounwind readonly
1030define <4 x i32> @fromDiffMemVarAi(i32* nocapture readonly %arr, i32 signext %elem) {
1031; P9BE-LABEL: fromDiffMemVarAi:
1032; P9BE:       # %bb.0: # %entry
1033; P9BE-NEXT:    sldi r4, r4, 2
1034; P9BE-NEXT:    lxvx v2, r3, r4
1035; P9BE-NEXT:    blr
1036;
1037; P9LE-LABEL: fromDiffMemVarAi:
1038; P9LE:       # %bb.0: # %entry
1039; P9LE-NEXT:    sldi r4, r4, 2
1040; P9LE-NEXT:    lxvx v2, r3, r4
1041; P9LE-NEXT:    blr
1042;
1043; P8BE-LABEL: fromDiffMemVarAi:
1044; P8BE:       # %bb.0: # %entry
1045; P8BE-NEXT:    sldi r4, r4, 2
1046; P8BE-NEXT:    lxvw4x v2, r3, r4
1047; P8BE-NEXT:    blr
1048;
1049; P8LE-LABEL: fromDiffMemVarAi:
1050; P8LE:       # %bb.0: # %entry
1051; P8LE-NEXT:    sldi r4, r4, 2
1052; P8LE-NEXT:    lxvd2x vs0, r3, r4
1053; P8LE-NEXT:    xxswapd v2, vs0
1054; P8LE-NEXT:    blr
1055entry:
1056  %idxprom = sext i32 %elem to i64
1057  %arrayidx = getelementptr inbounds i32, i32* %arr, i64 %idxprom
1058  %0 = load i32, i32* %arrayidx, align 4
1059  %vecinit = insertelement <4 x i32> undef, i32 %0, i32 0
1060  %add = add nsw i32 %elem, 1
1061  %idxprom1 = sext i32 %add to i64
1062  %arrayidx2 = getelementptr inbounds i32, i32* %arr, i64 %idxprom1
1063  %1 = load i32, i32* %arrayidx2, align 4
1064  %vecinit3 = insertelement <4 x i32> %vecinit, i32 %1, i32 1
1065  %add4 = add nsw i32 %elem, 2
1066  %idxprom5 = sext i32 %add4 to i64
1067  %arrayidx6 = getelementptr inbounds i32, i32* %arr, i64 %idxprom5
1068  %2 = load i32, i32* %arrayidx6, align 4
1069  %vecinit7 = insertelement <4 x i32> %vecinit3, i32 %2, i32 2
1070  %add8 = add nsw i32 %elem, 3
1071  %idxprom9 = sext i32 %add8 to i64
1072  %arrayidx10 = getelementptr inbounds i32, i32* %arr, i64 %idxprom9
1073  %3 = load i32, i32* %arrayidx10, align 4
1074  %vecinit11 = insertelement <4 x i32> %vecinit7, i32 %3, i32 3
1075  ret <4 x i32> %vecinit11
1076}
1077
1078; Function Attrs: norecurse nounwind readonly
1079define <4 x i32> @fromDiffMemVarDi(i32* nocapture readonly %arr, i32 signext %elem) {
1080; P9BE-LABEL: fromDiffMemVarDi:
1081; P9BE:       # %bb.0: # %entry
1082; P9BE-NEXT:    sldi r4, r4, 2
1083; P9BE-NEXT:    add r3, r3, r4
1084; P9BE-NEXT:    addi r3, r3, -12
1085; P9BE-NEXT:    lxvx v2, 0, r3
1086; P9BE-NEXT:    addis r3, r2, .LCPI10_0@toc@ha
1087; P9BE-NEXT:    addi r3, r3, .LCPI10_0@toc@l
1088; P9BE-NEXT:    lxvx v3, 0, r3
1089; P9BE-NEXT:    vperm v2, v2, v2, v3
1090; P9BE-NEXT:    blr
1091;
1092; P9LE-LABEL: fromDiffMemVarDi:
1093; P9LE:       # %bb.0: # %entry
1094; P9LE-NEXT:    sldi r4, r4, 2
1095; P9LE-NEXT:    add r3, r3, r4
1096; P9LE-NEXT:    addi r3, r3, -12
1097; P9LE-NEXT:    lxvx v2, 0, r3
1098; P9LE-NEXT:    addis r3, r2, .LCPI10_0@toc@ha
1099; P9LE-NEXT:    addi r3, r3, .LCPI10_0@toc@l
1100; P9LE-NEXT:    lxvx v3, 0, r3
1101; P9LE-NEXT:    vperm v2, v2, v2, v3
1102; P9LE-NEXT:    blr
1103;
1104; P8BE-LABEL: fromDiffMemVarDi:
1105; P8BE:       # %bb.0: # %entry
1106; P8BE-NEXT:    sldi r4, r4, 2
1107; P8BE-NEXT:    addis r5, r2, .LCPI10_0@toc@ha
1108; P8BE-NEXT:    add r3, r3, r4
1109; P8BE-NEXT:    addi r4, r5, .LCPI10_0@toc@l
1110; P8BE-NEXT:    addi r3, r3, -12
1111; P8BE-NEXT:    lxvw4x v3, 0, r4
1112; P8BE-NEXT:    lxvw4x v2, 0, r3
1113; P8BE-NEXT:    vperm v2, v2, v2, v3
1114; P8BE-NEXT:    blr
1115;
1116; P8LE-LABEL: fromDiffMemVarDi:
1117; P8LE:       # %bb.0: # %entry
1118; P8LE-NEXT:    sldi r4, r4, 2
1119; P8LE-NEXT:    addis r5, r2, .LCPI10_0@toc@ha
1120; P8LE-NEXT:    add r3, r3, r4
1121; P8LE-NEXT:    addi r3, r3, -12
1122; P8LE-NEXT:    lxvd2x vs0, 0, r3
1123; P8LE-NEXT:    addi r3, r5, .LCPI10_0@toc@l
1124; P8LE-NEXT:    lvx v3, 0, r3
1125; P8LE-NEXT:    xxswapd v2, vs0
1126; P8LE-NEXT:    vperm v2, v2, v2, v3
1127; P8LE-NEXT:    blr
1128entry:
1129  %idxprom = sext i32 %elem to i64
1130  %arrayidx = getelementptr inbounds i32, i32* %arr, i64 %idxprom
1131  %0 = load i32, i32* %arrayidx, align 4
1132  %vecinit = insertelement <4 x i32> undef, i32 %0, i32 0
1133  %sub = add nsw i32 %elem, -1
1134  %idxprom1 = sext i32 %sub to i64
1135  %arrayidx2 = getelementptr inbounds i32, i32* %arr, i64 %idxprom1
1136  %1 = load i32, i32* %arrayidx2, align 4
1137  %vecinit3 = insertelement <4 x i32> %vecinit, i32 %1, i32 1
1138  %sub4 = add nsw i32 %elem, -2
1139  %idxprom5 = sext i32 %sub4 to i64
1140  %arrayidx6 = getelementptr inbounds i32, i32* %arr, i64 %idxprom5
1141  %2 = load i32, i32* %arrayidx6, align 4
1142  %vecinit7 = insertelement <4 x i32> %vecinit3, i32 %2, i32 2
1143  %sub8 = add nsw i32 %elem, -3
1144  %idxprom9 = sext i32 %sub8 to i64
1145  %arrayidx10 = getelementptr inbounds i32, i32* %arr, i64 %idxprom9
1146  %3 = load i32, i32* %arrayidx10, align 4
1147  %vecinit11 = insertelement <4 x i32> %vecinit7, i32 %3, i32 3
1148  ret <4 x i32> %vecinit11
1149}
1150
1151; Function Attrs: norecurse nounwind readonly
1152define <4 x i32> @fromRandMemConsi(i32* nocapture readonly %arr) {
1153; P9BE-LABEL: fromRandMemConsi:
1154; P9BE:       # %bb.0: # %entry
1155; P9BE-NEXT:    lwz r4, 16(r3)
1156; P9BE-NEXT:    lwz r5, 72(r3)
1157; P9BE-NEXT:    lwz r6, 8(r3)
1158; P9BE-NEXT:    lwz r3, 352(r3)
1159; P9BE-NEXT:    rldimi r3, r6, 32, 0
1160; P9BE-NEXT:    rldimi r5, r4, 32, 0
1161; P9BE-NEXT:    mtvsrdd v2, r5, r3
1162; P9BE-NEXT:    blr
1163;
1164; P9LE-LABEL: fromRandMemConsi:
1165; P9LE:       # %bb.0: # %entry
1166; P9LE-NEXT:    lwz r4, 16(r3)
1167; P9LE-NEXT:    lwz r5, 72(r3)
1168; P9LE-NEXT:    lwz r6, 8(r3)
1169; P9LE-NEXT:    lwz r3, 352(r3)
1170; P9LE-NEXT:    rldimi r4, r5, 32, 0
1171; P9LE-NEXT:    rldimi r6, r3, 32, 0
1172; P9LE-NEXT:    mtvsrdd v2, r6, r4
1173; P9LE-NEXT:    blr
1174;
1175; P8BE-LABEL: fromRandMemConsi:
1176; P8BE:       # %bb.0: # %entry
1177; P8BE-NEXT:    lwz r4, 8(r3)
1178; P8BE-NEXT:    lwz r5, 352(r3)
1179; P8BE-NEXT:    lwz r6, 16(r3)
1180; P8BE-NEXT:    lwz r3, 72(r3)
1181; P8BE-NEXT:    rldimi r5, r4, 32, 0
1182; P8BE-NEXT:    rldimi r3, r6, 32, 0
1183; P8BE-NEXT:    mtvsrd f0, r5
1184; P8BE-NEXT:    mtvsrd f1, r3
1185; P8BE-NEXT:    xxmrghd v2, vs1, vs0
1186; P8BE-NEXT:    blr
1187;
1188; P8LE-LABEL: fromRandMemConsi:
1189; P8LE:       # %bb.0: # %entry
1190; P8LE-NEXT:    lwz r4, 16(r3)
1191; P8LE-NEXT:    lwz r5, 72(r3)
1192; P8LE-NEXT:    lwz r6, 8(r3)
1193; P8LE-NEXT:    lwz r3, 352(r3)
1194; P8LE-NEXT:    rldimi r4, r5, 32, 0
1195; P8LE-NEXT:    rldimi r6, r3, 32, 0
1196; P8LE-NEXT:    mtvsrd f0, r4
1197; P8LE-NEXT:    mtvsrd f1, r6
1198; P8LE-NEXT:    xxmrghd v2, vs1, vs0
1199; P8LE-NEXT:    blr
1200entry:
1201  %arrayidx = getelementptr inbounds i32, i32* %arr, i64 4
1202  %0 = load i32, i32* %arrayidx, align 4
1203  %vecinit = insertelement <4 x i32> undef, i32 %0, i32 0
1204  %arrayidx1 = getelementptr inbounds i32, i32* %arr, i64 18
1205  %1 = load i32, i32* %arrayidx1, align 4
1206  %vecinit2 = insertelement <4 x i32> %vecinit, i32 %1, i32 1
1207  %arrayidx3 = getelementptr inbounds i32, i32* %arr, i64 2
1208  %2 = load i32, i32* %arrayidx3, align 4
1209  %vecinit4 = insertelement <4 x i32> %vecinit2, i32 %2, i32 2
1210  %arrayidx5 = getelementptr inbounds i32, i32* %arr, i64 88
1211  %3 = load i32, i32* %arrayidx5, align 4
1212  %vecinit6 = insertelement <4 x i32> %vecinit4, i32 %3, i32 3
1213  ret <4 x i32> %vecinit6
1214}
1215
1216; Function Attrs: norecurse nounwind readonly
1217define <4 x i32> @fromRandMemVari(i32* nocapture readonly %arr, i32 signext %elem) {
1218; P9BE-LABEL: fromRandMemVari:
1219; P9BE:       # %bb.0: # %entry
1220; P9BE-NEXT:    sldi r4, r4, 2
1221; P9BE-NEXT:    add r3, r3, r4
1222; P9BE-NEXT:    lwz r4, 16(r3)
1223; P9BE-NEXT:    lwz r5, 4(r3)
1224; P9BE-NEXT:    lwz r6, 8(r3)
1225; P9BE-NEXT:    lwz r3, 32(r3)
1226; P9BE-NEXT:    rldimi r3, r6, 32, 0
1227; P9BE-NEXT:    rldimi r5, r4, 32, 0
1228; P9BE-NEXT:    mtvsrdd v2, r5, r3
1229; P9BE-NEXT:    blr
1230;
1231; P9LE-LABEL: fromRandMemVari:
1232; P9LE:       # %bb.0: # %entry
1233; P9LE-NEXT:    sldi r4, r4, 2
1234; P9LE-NEXT:    add r3, r3, r4
1235; P9LE-NEXT:    lwz r4, 16(r3)
1236; P9LE-NEXT:    lwz r5, 4(r3)
1237; P9LE-NEXT:    lwz r6, 8(r3)
1238; P9LE-NEXT:    lwz r3, 32(r3)
1239; P9LE-NEXT:    rldimi r4, r5, 32, 0
1240; P9LE-NEXT:    rldimi r6, r3, 32, 0
1241; P9LE-NEXT:    mtvsrdd v2, r6, r4
1242; P9LE-NEXT:    blr
1243;
1244; P8BE-LABEL: fromRandMemVari:
1245; P8BE:       # %bb.0: # %entry
1246; P8BE-NEXT:    sldi r4, r4, 2
1247; P8BE-NEXT:    add r3, r3, r4
1248; P8BE-NEXT:    lwz r4, 8(r3)
1249; P8BE-NEXT:    lwz r5, 32(r3)
1250; P8BE-NEXT:    lwz r6, 16(r3)
1251; P8BE-NEXT:    lwz r3, 4(r3)
1252; P8BE-NEXT:    rldimi r5, r4, 32, 0
1253; P8BE-NEXT:    rldimi r3, r6, 32, 0
1254; P8BE-NEXT:    mtvsrd f0, r5
1255; P8BE-NEXT:    mtvsrd f1, r3
1256; P8BE-NEXT:    xxmrghd v2, vs1, vs0
1257; P8BE-NEXT:    blr
1258;
1259; P8LE-LABEL: fromRandMemVari:
1260; P8LE:       # %bb.0: # %entry
1261; P8LE-NEXT:    sldi r4, r4, 2
1262; P8LE-NEXT:    add r3, r3, r4
1263; P8LE-NEXT:    lwz r4, 16(r3)
1264; P8LE-NEXT:    lwz r5, 4(r3)
1265; P8LE-NEXT:    lwz r6, 8(r3)
1266; P8LE-NEXT:    lwz r3, 32(r3)
1267; P8LE-NEXT:    rldimi r4, r5, 32, 0
1268; P8LE-NEXT:    rldimi r6, r3, 32, 0
1269; P8LE-NEXT:    mtvsrd f0, r4
1270; P8LE-NEXT:    mtvsrd f1, r6
1271; P8LE-NEXT:    xxmrghd v2, vs1, vs0
1272; P8LE-NEXT:    blr
1273entry:
1274  %add = add nsw i32 %elem, 4
1275  %idxprom = sext i32 %add to i64
1276  %arrayidx = getelementptr inbounds i32, i32* %arr, i64 %idxprom
1277  %0 = load i32, i32* %arrayidx, align 4
1278  %vecinit = insertelement <4 x i32> undef, i32 %0, i32 0
1279  %add1 = add nsw i32 %elem, 1
1280  %idxprom2 = sext i32 %add1 to i64
1281  %arrayidx3 = getelementptr inbounds i32, i32* %arr, i64 %idxprom2
1282  %1 = load i32, i32* %arrayidx3, align 4
1283  %vecinit4 = insertelement <4 x i32> %vecinit, i32 %1, i32 1
1284  %add5 = add nsw i32 %elem, 2
1285  %idxprom6 = sext i32 %add5 to i64
1286  %arrayidx7 = getelementptr inbounds i32, i32* %arr, i64 %idxprom6
1287  %2 = load i32, i32* %arrayidx7, align 4
1288  %vecinit8 = insertelement <4 x i32> %vecinit4, i32 %2, i32 2
1289  %add9 = add nsw i32 %elem, 8
1290  %idxprom10 = sext i32 %add9 to i64
1291  %arrayidx11 = getelementptr inbounds i32, i32* %arr, i64 %idxprom10
1292  %3 = load i32, i32* %arrayidx11, align 4
1293  %vecinit12 = insertelement <4 x i32> %vecinit8, i32 %3, i32 3
1294  ret <4 x i32> %vecinit12
1295}
1296
1297; Function Attrs: norecurse nounwind readnone
1298define <4 x i32> @spltRegVali(i32 signext %val) {
1299; P9BE-LABEL: spltRegVali:
1300; P9BE:       # %bb.0: # %entry
1301; P9BE-NEXT:    mtvsrws v2, r3
1302; P9BE-NEXT:    blr
1303;
1304; P9LE-LABEL: spltRegVali:
1305; P9LE:       # %bb.0: # %entry
1306; P9LE-NEXT:    mtvsrws v2, r3
1307; P9LE-NEXT:    blr
1308;
1309; P8BE-LABEL: spltRegVali:
1310; P8BE:       # %bb.0: # %entry
1311; P8BE-NEXT:    mtvsrwz f0, r3
1312; P8BE-NEXT:    xxspltw v2, vs0, 1
1313; P8BE-NEXT:    blr
1314;
1315; P8LE-LABEL: spltRegVali:
1316; P8LE:       # %bb.0: # %entry
1317; P8LE-NEXT:    mtvsrwz f0, r3
1318; P8LE-NEXT:    xxspltw v2, vs0, 1
1319; P8LE-NEXT:    blr
1320entry:
1321  %splat.splatinsert = insertelement <4 x i32> undef, i32 %val, i32 0
1322  %splat.splat = shufflevector <4 x i32> %splat.splatinsert, <4 x i32> undef, <4 x i32> zeroinitializer
1323  ret <4 x i32> %splat.splat
1324}
1325
1326; Function Attrs: norecurse nounwind readonly
1327define <4 x i32> @spltMemVali(i32* nocapture readonly %ptr) {
1328; P9BE-LABEL: spltMemVali:
1329; P9BE:       # %bb.0: # %entry
1330; P9BE-NEXT:    lfiwzx f0, 0, r3
1331; P9BE-NEXT:    xxsldwi vs0, f0, f0, 1
1332; P9BE-NEXT:    xxspltw v2, vs0, 0
1333; P9BE-NEXT:    blr
1334;
1335; P9LE-LABEL: spltMemVali:
1336; P9LE:       # %bb.0: # %entry
1337; P9LE-NEXT:    lfiwzx f0, 0, r3
1338; P9LE-NEXT:    xxpermdi vs0, f0, f0, 2
1339; P9LE-NEXT:    xxspltw v2, vs0, 3
1340; P9LE-NEXT:    blr
1341;
1342; P8BE-LABEL: spltMemVali:
1343; P8BE:       # %bb.0: # %entry
1344; P8BE-NEXT:    lfiwzx f0, 0, r3
1345; P8BE-NEXT:    xxsldwi vs0, f0, f0, 1
1346; P8BE-NEXT:    xxspltw v2, vs0, 0
1347; P8BE-NEXT:    blr
1348;
1349; P8LE-LABEL: spltMemVali:
1350; P8LE:       # %bb.0: # %entry
1351; P8LE-NEXT:    lfiwzx f0, 0, r3
1352; P8LE-NEXT:    xxpermdi vs0, f0, f0, 2
1353; P8LE-NEXT:    xxspltw v2, vs0, 3
1354; P8LE-NEXT:    blr
1355entry:
1356  %0 = load i32, i32* %ptr, align 4
1357  %splat.splatinsert = insertelement <4 x i32> undef, i32 %0, i32 0
1358  %splat.splat = shufflevector <4 x i32> %splat.splatinsert, <4 x i32> undef, <4 x i32> zeroinitializer
1359  ret <4 x i32> %splat.splat
1360}
1361
1362; Function Attrs: norecurse nounwind readnone
1363define <4 x i32> @spltCnstConvftoi() {
1364; P9BE-LABEL: spltCnstConvftoi:
1365; P9BE:       # %bb.0: # %entry
1366; P9BE-NEXT:    vspltisw v2, 4
1367; P9BE-NEXT:    blr
1368;
1369; P9LE-LABEL: spltCnstConvftoi:
1370; P9LE:       # %bb.0: # %entry
1371; P9LE-NEXT:    vspltisw v2, 4
1372; P9LE-NEXT:    blr
1373;
1374; P8BE-LABEL: spltCnstConvftoi:
1375; P8BE:       # %bb.0: # %entry
1376; P8BE-NEXT:    vspltisw v2, 4
1377; P8BE-NEXT:    blr
1378;
1379; P8LE-LABEL: spltCnstConvftoi:
1380; P8LE:       # %bb.0: # %entry
1381; P8LE-NEXT:    vspltisw v2, 4
1382; P8LE-NEXT:    blr
1383entry:
1384  ret <4 x i32> <i32 4, i32 4, i32 4, i32 4>
1385}
1386
1387; Function Attrs: norecurse nounwind readnone
1388define <4 x i32> @fromRegsConvftoi(float %a, float %b, float %c, float %d) {
1389; P9BE-LABEL: fromRegsConvftoi:
1390; P9BE:       # %bb.0: # %entry
1391; P9BE-NEXT:    # kill: def $f4 killed $f4 def $vsl4
1392; P9BE-NEXT:    # kill: def $f2 killed $f2 def $vsl2
1393; P9BE-NEXT:    xxmrghd vs0, vs2, vs4
1394; P9BE-NEXT:    # kill: def $f3 killed $f3 def $vsl3
1395; P9BE-NEXT:    # kill: def $f1 killed $f1 def $vsl1
1396; P9BE-NEXT:    xvcvdpsxws v2, vs0
1397; P9BE-NEXT:    xxmrghd vs0, vs1, vs3
1398; P9BE-NEXT:    xvcvdpsxws v3, vs0
1399; P9BE-NEXT:    vmrgew v2, v3, v2
1400; P9BE-NEXT:    blr
1401;
1402; P9LE-LABEL: fromRegsConvftoi:
1403; P9LE:       # %bb.0: # %entry
1404; P9LE-NEXT:    # kill: def $f3 killed $f3 def $vsl3
1405; P9LE-NEXT:    # kill: def $f1 killed $f1 def $vsl1
1406; P9LE-NEXT:    xxmrghd vs0, vs3, vs1
1407; P9LE-NEXT:    # kill: def $f4 killed $f4 def $vsl4
1408; P9LE-NEXT:    # kill: def $f2 killed $f2 def $vsl2
1409; P9LE-NEXT:    xvcvdpsxws v2, vs0
1410; P9LE-NEXT:    xxmrghd vs0, vs4, vs2
1411; P9LE-NEXT:    xvcvdpsxws v3, vs0
1412; P9LE-NEXT:    vmrgew v2, v3, v2
1413; P9LE-NEXT:    blr
1414;
1415; P8BE-LABEL: fromRegsConvftoi:
1416; P8BE:       # %bb.0: # %entry
1417; P8BE-NEXT:    # kill: def $f1 killed $f1 def $vsl1
1418; P8BE-NEXT:    # kill: def $f4 killed $f4 def $vsl4
1419; P8BE-NEXT:    # kill: def $f3 killed $f3 def $vsl3
1420; P8BE-NEXT:    # kill: def $f2 killed $f2 def $vsl2
1421; P8BE-NEXT:    xxmrghd vs0, vs2, vs4
1422; P8BE-NEXT:    xxmrghd vs1, vs1, vs3
1423; P8BE-NEXT:    xvcvdpsxws v2, vs0
1424; P8BE-NEXT:    xvcvdpsxws v3, vs1
1425; P8BE-NEXT:    vmrgew v2, v3, v2
1426; P8BE-NEXT:    blr
1427;
1428; P8LE-LABEL: fromRegsConvftoi:
1429; P8LE:       # %bb.0: # %entry
1430; P8LE-NEXT:    # kill: def $f1 killed $f1 def $vsl1
1431; P8LE-NEXT:    # kill: def $f4 killed $f4 def $vsl4
1432; P8LE-NEXT:    # kill: def $f3 killed $f3 def $vsl3
1433; P8LE-NEXT:    # kill: def $f2 killed $f2 def $vsl2
1434; P8LE-NEXT:    xxmrghd vs0, vs3, vs1
1435; P8LE-NEXT:    xxmrghd vs1, vs4, vs2
1436; P8LE-NEXT:    xvcvdpsxws v2, vs0
1437; P8LE-NEXT:    xvcvdpsxws v3, vs1
1438; P8LE-NEXT:    vmrgew v2, v3, v2
1439; P8LE-NEXT:    blr
1440entry:
1441  %conv = fptosi float %a to i32
1442  %vecinit = insertelement <4 x i32> undef, i32 %conv, i32 0
1443  %conv1 = fptosi float %b to i32
1444  %vecinit2 = insertelement <4 x i32> %vecinit, i32 %conv1, i32 1
1445  %conv3 = fptosi float %c to i32
1446  %vecinit4 = insertelement <4 x i32> %vecinit2, i32 %conv3, i32 2
1447  %conv5 = fptosi float %d to i32
1448  %vecinit6 = insertelement <4 x i32> %vecinit4, i32 %conv5, i32 3
1449  ret <4 x i32> %vecinit6
1450}
1451
1452; Function Attrs: norecurse nounwind readnone
1453define <4 x i32> @fromDiffConstsConvftoi() {
1454; P9BE-LABEL: fromDiffConstsConvftoi:
1455; P9BE:       # %bb.0: # %entry
1456; P9BE-NEXT:    addis r3, r2, .LCPI17_0@toc@ha
1457; P9BE-NEXT:    addi r3, r3, .LCPI17_0@toc@l
1458; P9BE-NEXT:    lxvx v2, 0, r3
1459; P9BE-NEXT:    blr
1460;
1461; P9LE-LABEL: fromDiffConstsConvftoi:
1462; P9LE:       # %bb.0: # %entry
1463; P9LE-NEXT:    addis r3, r2, .LCPI17_0@toc@ha
1464; P9LE-NEXT:    addi r3, r3, .LCPI17_0@toc@l
1465; P9LE-NEXT:    lxvx v2, 0, r3
1466; P9LE-NEXT:    blr
1467;
1468; P8BE-LABEL: fromDiffConstsConvftoi:
1469; P8BE:       # %bb.0: # %entry
1470; P8BE-NEXT:    addis r3, r2, .LCPI17_0@toc@ha
1471; P8BE-NEXT:    addi r3, r3, .LCPI17_0@toc@l
1472; P8BE-NEXT:    lxvw4x v2, 0, r3
1473; P8BE-NEXT:    blr
1474;
1475; P8LE-LABEL: fromDiffConstsConvftoi:
1476; P8LE:       # %bb.0: # %entry
1477; P8LE-NEXT:    addis r3, r2, .LCPI17_0@toc@ha
1478; P8LE-NEXT:    addi r3, r3, .LCPI17_0@toc@l
1479; P8LE-NEXT:    lvx v2, 0, r3
1480; P8LE-NEXT:    blr
1481entry:
1482  ret <4 x i32> <i32 24, i32 234, i32 988, i32 422>
1483}
1484
1485; Function Attrs: norecurse nounwind readonly
1486define <4 x i32> @fromDiffMemConsAConvftoi(float* nocapture readonly %ptr) {
1487; P9BE-LABEL: fromDiffMemConsAConvftoi:
1488; P9BE:       # %bb.0: # %entry
1489; P9BE-NEXT:    lxv vs0, 0(r3)
1490; P9BE-NEXT:    xvcvspsxws v2, vs0
1491; P9BE-NEXT:    blr
1492;
1493; P9LE-LABEL: fromDiffMemConsAConvftoi:
1494; P9LE:       # %bb.0: # %entry
1495; P9LE-NEXT:    lxv vs0, 0(r3)
1496; P9LE-NEXT:    xvcvspsxws v2, vs0
1497; P9LE-NEXT:    blr
1498;
1499; P8BE-LABEL: fromDiffMemConsAConvftoi:
1500; P8BE:       # %bb.0: # %entry
1501; P8BE-NEXT:    lxvw4x vs0, 0, r3
1502; P8BE-NEXT:    xvcvspsxws v2, vs0
1503; P8BE-NEXT:    blr
1504;
1505; P8LE-LABEL: fromDiffMemConsAConvftoi:
1506; P8LE:       # %bb.0: # %entry
1507; P8LE-NEXT:    lxvd2x vs0, 0, r3
1508; P8LE-NEXT:    xxswapd v2, vs0
1509; P8LE-NEXT:    xvcvspsxws v2, v2
1510; P8LE-NEXT:    blr
1511entry:
1512  %0 = bitcast float* %ptr to <4 x float>*
1513  %1 = load <4 x float>, <4 x float>* %0, align 4
1514  %2 = fptosi <4 x float> %1 to <4 x i32>
1515  ret <4 x i32> %2
1516}
1517
1518; Function Attrs: norecurse nounwind readonly
1519define <4 x i32> @fromDiffMemConsDConvftoi(float* nocapture readonly %ptr) {
1520; P9BE-LABEL: fromDiffMemConsDConvftoi:
1521; P9BE:       # %bb.0: # %entry
1522; P9BE-NEXT:    lxv v2, 0(r3)
1523; P9BE-NEXT:    addis r3, r2, .LCPI19_0@toc@ha
1524; P9BE-NEXT:    addi r3, r3, .LCPI19_0@toc@l
1525; P9BE-NEXT:    lxvx v3, 0, r3
1526; P9BE-NEXT:    vperm v2, v2, v2, v3
1527; P9BE-NEXT:    xvcvspsxws v2, v2
1528; P9BE-NEXT:    blr
1529;
1530; P9LE-LABEL: fromDiffMemConsDConvftoi:
1531; P9LE:       # %bb.0: # %entry
1532; P9LE-NEXT:    lxv v2, 0(r3)
1533; P9LE-NEXT:    addis r3, r2, .LCPI19_0@toc@ha
1534; P9LE-NEXT:    addi r3, r3, .LCPI19_0@toc@l
1535; P9LE-NEXT:    lxvx v3, 0, r3
1536; P9LE-NEXT:    vperm v2, v2, v2, v3
1537; P9LE-NEXT:    xvcvspsxws v2, v2
1538; P9LE-NEXT:    blr
1539;
1540; P8BE-LABEL: fromDiffMemConsDConvftoi:
1541; P8BE:       # %bb.0: # %entry
1542; P8BE-NEXT:    addis r4, r2, .LCPI19_0@toc@ha
1543; P8BE-NEXT:    lxvw4x v2, 0, r3
1544; P8BE-NEXT:    addi r4, r4, .LCPI19_0@toc@l
1545; P8BE-NEXT:    lxvw4x v3, 0, r4
1546; P8BE-NEXT:    vperm v2, v2, v2, v3
1547; P8BE-NEXT:    xvcvspsxws v2, v2
1548; P8BE-NEXT:    blr
1549;
1550; P8LE-LABEL: fromDiffMemConsDConvftoi:
1551; P8LE:       # %bb.0: # %entry
1552; P8LE-NEXT:    lxvd2x vs0, 0, r3
1553; P8LE-NEXT:    addis r4, r2, .LCPI19_0@toc@ha
1554; P8LE-NEXT:    addi r3, r4, .LCPI19_0@toc@l
1555; P8LE-NEXT:    lvx v2, 0, r3
1556; P8LE-NEXT:    xxswapd v3, vs0
1557; P8LE-NEXT:    vperm v2, v3, v3, v2
1558; P8LE-NEXT:    xvcvspsxws v2, v2
1559; P8LE-NEXT:    blr
1560entry:
1561  %arrayidx = getelementptr inbounds float, float* %ptr, i64 3
1562  %0 = load float, float* %arrayidx, align 4
1563  %conv = fptosi float %0 to i32
1564  %vecinit = insertelement <4 x i32> undef, i32 %conv, i32 0
1565  %arrayidx1 = getelementptr inbounds float, float* %ptr, i64 2
1566  %1 = load float, float* %arrayidx1, align 4
1567  %conv2 = fptosi float %1 to i32
1568  %vecinit3 = insertelement <4 x i32> %vecinit, i32 %conv2, i32 1
1569  %arrayidx4 = getelementptr inbounds float, float* %ptr, i64 1
1570  %2 = load float, float* %arrayidx4, align 4
1571  %conv5 = fptosi float %2 to i32
1572  %vecinit6 = insertelement <4 x i32> %vecinit3, i32 %conv5, i32 2
1573  %3 = load float, float* %ptr, align 4
1574  %conv8 = fptosi float %3 to i32
1575  %vecinit9 = insertelement <4 x i32> %vecinit6, i32 %conv8, i32 3
1576  ret <4 x i32> %vecinit9
1577}
1578
1579; Function Attrs: norecurse nounwind readonly
1580define <4 x i32> @fromDiffMemVarAConvftoi(float* nocapture readonly %arr, i32 signext %elem) {
1581; P9BE-LABEL: fromDiffMemVarAConvftoi:
1582; P9BE:       # %bb.0: # %entry
1583; P9BE-NEXT:    sldi r4, r4, 2
1584; P9BE-NEXT:    lfsux f0, r3, r4
1585; P9BE-NEXT:    lfs f1, 12(r3)
1586; P9BE-NEXT:    lfs f2, 4(r3)
1587; P9BE-NEXT:    xxmrghd vs1, vs2, vs1
1588; P9BE-NEXT:    xvcvdpsp v2, vs1
1589; P9BE-NEXT:    lfs f1, 8(r3)
1590; P9BE-NEXT:    xxmrghd vs0, vs0, vs1
1591; P9BE-NEXT:    xvcvdpsp v3, vs0
1592; P9BE-NEXT:    vmrgew v2, v3, v2
1593; P9BE-NEXT:    xvcvspsxws v2, v2
1594; P9BE-NEXT:    blr
1595;
1596; P9LE-LABEL: fromDiffMemVarAConvftoi:
1597; P9LE:       # %bb.0: # %entry
1598; P9LE-NEXT:    sldi r4, r4, 2
1599; P9LE-NEXT:    lfsux f0, r3, r4
1600; P9LE-NEXT:    lfs f1, 8(r3)
1601; P9LE-NEXT:    xxmrghd vs0, vs1, vs0
1602; P9LE-NEXT:    lfs f1, 12(r3)
1603; P9LE-NEXT:    xvcvdpsp v2, vs0
1604; P9LE-NEXT:    lfs f0, 4(r3)
1605; P9LE-NEXT:    xxmrghd vs0, vs1, vs0
1606; P9LE-NEXT:    xvcvdpsp v3, vs0
1607; P9LE-NEXT:    vmrgew v2, v3, v2
1608; P9LE-NEXT:    xvcvspsxws v2, v2
1609; P9LE-NEXT:    blr
1610;
1611; P8BE-LABEL: fromDiffMemVarAConvftoi:
1612; P8BE:       # %bb.0: # %entry
1613; P8BE-NEXT:    sldi r4, r4, 2
1614; P8BE-NEXT:    lfsux f0, r3, r4
1615; P8BE-NEXT:    lfs f1, 12(r3)
1616; P8BE-NEXT:    lfs f2, 4(r3)
1617; P8BE-NEXT:    lfs f3, 8(r3)
1618; P8BE-NEXT:    xxmrghd vs1, vs2, vs1
1619; P8BE-NEXT:    xxmrghd vs0, vs0, vs3
1620; P8BE-NEXT:    xvcvdpsp v2, vs1
1621; P8BE-NEXT:    xvcvdpsp v3, vs0
1622; P8BE-NEXT:    vmrgew v2, v3, v2
1623; P8BE-NEXT:    xvcvspsxws v2, v2
1624; P8BE-NEXT:    blr
1625;
1626; P8LE-LABEL: fromDiffMemVarAConvftoi:
1627; P8LE:       # %bb.0: # %entry
1628; P8LE-NEXT:    sldi r4, r4, 2
1629; P8LE-NEXT:    lfsux f0, r3, r4
1630; P8LE-NEXT:    lfs f1, 8(r3)
1631; P8LE-NEXT:    lfs f2, 4(r3)
1632; P8LE-NEXT:    lfs f3, 12(r3)
1633; P8LE-NEXT:    xxmrghd vs0, vs1, vs0
1634; P8LE-NEXT:    xxmrghd vs1, vs3, vs2
1635; P8LE-NEXT:    xvcvdpsp v2, vs0
1636; P8LE-NEXT:    xvcvdpsp v3, vs1
1637; P8LE-NEXT:    vmrgew v2, v3, v2
1638; P8LE-NEXT:    xvcvspsxws v2, v2
1639; P8LE-NEXT:    blr
1640entry:
1641  %idxprom = sext i32 %elem to i64
1642  %arrayidx = getelementptr inbounds float, float* %arr, i64 %idxprom
1643  %0 = load float, float* %arrayidx, align 4
1644  %conv = fptosi float %0 to i32
1645  %vecinit = insertelement <4 x i32> undef, i32 %conv, i32 0
1646  %add = add nsw i32 %elem, 1
1647  %idxprom1 = sext i32 %add to i64
1648  %arrayidx2 = getelementptr inbounds float, float* %arr, i64 %idxprom1
1649  %1 = load float, float* %arrayidx2, align 4
1650  %conv3 = fptosi float %1 to i32
1651  %vecinit4 = insertelement <4 x i32> %vecinit, i32 %conv3, i32 1
1652  %add5 = add nsw i32 %elem, 2
1653  %idxprom6 = sext i32 %add5 to i64
1654  %arrayidx7 = getelementptr inbounds float, float* %arr, i64 %idxprom6
1655  %2 = load float, float* %arrayidx7, align 4
1656  %conv8 = fptosi float %2 to i32
1657  %vecinit9 = insertelement <4 x i32> %vecinit4, i32 %conv8, i32 2
1658  %add10 = add nsw i32 %elem, 3
1659  %idxprom11 = sext i32 %add10 to i64
1660  %arrayidx12 = getelementptr inbounds float, float* %arr, i64 %idxprom11
1661  %3 = load float, float* %arrayidx12, align 4
1662  %conv13 = fptosi float %3 to i32
1663  %vecinit14 = insertelement <4 x i32> %vecinit9, i32 %conv13, i32 3
1664  ret <4 x i32> %vecinit14
1665; FIXME: implement finding consecutive loads with pre-inc
1666}
1667
1668; Function Attrs: norecurse nounwind readonly
1669define <4 x i32> @fromDiffMemVarDConvftoi(float* nocapture readonly %arr, i32 signext %elem) {
1670; P9BE-LABEL: fromDiffMemVarDConvftoi:
1671; P9BE:       # %bb.0: # %entry
1672; P9BE-NEXT:    sldi r4, r4, 2
1673; P9BE-NEXT:    lfsux f0, r3, r4
1674; P9BE-NEXT:    lfs f1, -12(r3)
1675; P9BE-NEXT:    lfs f2, -4(r3)
1676; P9BE-NEXT:    xxmrghd vs1, vs2, vs1
1677; P9BE-NEXT:    xvcvdpsp v2, vs1
1678; P9BE-NEXT:    lfs f1, -8(r3)
1679; P9BE-NEXT:    xxmrghd vs0, vs0, vs1
1680; P9BE-NEXT:    xvcvdpsp v3, vs0
1681; P9BE-NEXT:    vmrgew v2, v3, v2
1682; P9BE-NEXT:    xvcvspsxws v2, v2
1683; P9BE-NEXT:    blr
1684;
1685; P9LE-LABEL: fromDiffMemVarDConvftoi:
1686; P9LE:       # %bb.0: # %entry
1687; P9LE-NEXT:    sldi r4, r4, 2
1688; P9LE-NEXT:    lfsux f0, r3, r4
1689; P9LE-NEXT:    lfs f1, -8(r3)
1690; P9LE-NEXT:    xxmrghd vs0, vs1, vs0
1691; P9LE-NEXT:    lfs f1, -12(r3)
1692; P9LE-NEXT:    xvcvdpsp v2, vs0
1693; P9LE-NEXT:    lfs f0, -4(r3)
1694; P9LE-NEXT:    xxmrghd vs0, vs1, vs0
1695; P9LE-NEXT:    xvcvdpsp v3, vs0
1696; P9LE-NEXT:    vmrgew v2, v3, v2
1697; P9LE-NEXT:    xvcvspsxws v2, v2
1698; P9LE-NEXT:    blr
1699;
1700; P8BE-LABEL: fromDiffMemVarDConvftoi:
1701; P8BE:       # %bb.0: # %entry
1702; P8BE-NEXT:    sldi r4, r4, 2
1703; P8BE-NEXT:    lfsux f0, r3, r4
1704; P8BE-NEXT:    lfs f1, -12(r3)
1705; P8BE-NEXT:    lfs f2, -4(r3)
1706; P8BE-NEXT:    lfs f3, -8(r3)
1707; P8BE-NEXT:    xxmrghd vs1, vs2, vs1
1708; P8BE-NEXT:    xxmrghd vs0, vs0, vs3
1709; P8BE-NEXT:    xvcvdpsp v2, vs1
1710; P8BE-NEXT:    xvcvdpsp v3, vs0
1711; P8BE-NEXT:    vmrgew v2, v3, v2
1712; P8BE-NEXT:    xvcvspsxws v2, v2
1713; P8BE-NEXT:    blr
1714;
1715; P8LE-LABEL: fromDiffMemVarDConvftoi:
1716; P8LE:       # %bb.0: # %entry
1717; P8LE-NEXT:    sldi r4, r4, 2
1718; P8LE-NEXT:    lfsux f0, r3, r4
1719; P8LE-NEXT:    lfs f1, -8(r3)
1720; P8LE-NEXT:    lfs f2, -4(r3)
1721; P8LE-NEXT:    lfs f3, -12(r3)
1722; P8LE-NEXT:    xxmrghd vs0, vs1, vs0
1723; P8LE-NEXT:    xxmrghd vs1, vs3, vs2
1724; P8LE-NEXT:    xvcvdpsp v2, vs0
1725; P8LE-NEXT:    xvcvdpsp v3, vs1
1726; P8LE-NEXT:    vmrgew v2, v3, v2
1727; P8LE-NEXT:    xvcvspsxws v2, v2
1728; P8LE-NEXT:    blr
1729entry:
1730  %idxprom = sext i32 %elem to i64
1731  %arrayidx = getelementptr inbounds float, float* %arr, i64 %idxprom
1732  %0 = load float, float* %arrayidx, align 4
1733  %conv = fptosi float %0 to i32
1734  %vecinit = insertelement <4 x i32> undef, i32 %conv, i32 0
1735  %sub = add nsw i32 %elem, -1
1736  %idxprom1 = sext i32 %sub to i64
1737  %arrayidx2 = getelementptr inbounds float, float* %arr, i64 %idxprom1
1738  %1 = load float, float* %arrayidx2, align 4
1739  %conv3 = fptosi float %1 to i32
1740  %vecinit4 = insertelement <4 x i32> %vecinit, i32 %conv3, i32 1
1741  %sub5 = add nsw i32 %elem, -2
1742  %idxprom6 = sext i32 %sub5 to i64
1743  %arrayidx7 = getelementptr inbounds float, float* %arr, i64 %idxprom6
1744  %2 = load float, float* %arrayidx7, align 4
1745  %conv8 = fptosi float %2 to i32
1746  %vecinit9 = insertelement <4 x i32> %vecinit4, i32 %conv8, i32 2
1747  %sub10 = add nsw i32 %elem, -3
1748  %idxprom11 = sext i32 %sub10 to i64
1749  %arrayidx12 = getelementptr inbounds float, float* %arr, i64 %idxprom11
1750  %3 = load float, float* %arrayidx12, align 4
1751  %conv13 = fptosi float %3 to i32
1752  %vecinit14 = insertelement <4 x i32> %vecinit9, i32 %conv13, i32 3
1753  ret <4 x i32> %vecinit14
1754; FIXME: implement finding consecutive loads with pre-inc
1755}
1756
1757; Function Attrs: norecurse nounwind readnone
1758define <4 x i32> @spltRegValConvftoi(float %val) {
1759; P9BE-LABEL: spltRegValConvftoi:
1760; P9BE:       # %bb.0: # %entry
1761; P9BE-NEXT:    xscvdpsxws f0, f1
1762; P9BE-NEXT:    xxspltw v2, vs0, 1
1763; P9BE-NEXT:    blr
1764;
1765; P9LE-LABEL: spltRegValConvftoi:
1766; P9LE:       # %bb.0: # %entry
1767; P9LE-NEXT:    xscvdpsxws f0, f1
1768; P9LE-NEXT:    xxspltw v2, vs0, 1
1769; P9LE-NEXT:    blr
1770;
1771; P8BE-LABEL: spltRegValConvftoi:
1772; P8BE:       # %bb.0: # %entry
1773; P8BE-NEXT:    xscvdpsxws f0, f1
1774; P8BE-NEXT:    xxspltw v2, vs0, 1
1775; P8BE-NEXT:    blr
1776;
1777; P8LE-LABEL: spltRegValConvftoi:
1778; P8LE:       # %bb.0: # %entry
1779; P8LE-NEXT:    xscvdpsxws f0, f1
1780; P8LE-NEXT:    xxspltw v2, vs0, 1
1781; P8LE-NEXT:    blr
1782entry:
1783  %conv = fptosi float %val to i32
1784  %splat.splatinsert = insertelement <4 x i32> undef, i32 %conv, i32 0
1785  %splat.splat = shufflevector <4 x i32> %splat.splatinsert, <4 x i32> undef, <4 x i32> zeroinitializer
1786  ret <4 x i32> %splat.splat
1787}
1788
1789; Function Attrs: norecurse nounwind readonly
1790define <4 x i32> @spltMemValConvftoi(float* nocapture readonly %ptr) {
1791; P9BE-LABEL: spltMemValConvftoi:
1792; P9BE:       # %bb.0: # %entry
1793; P9BE-NEXT:    lxvwsx vs0, 0, r3
1794; P9BE-NEXT:    xvcvspsxws v2, vs0
1795; P9BE-NEXT:    blr
1796;
1797; P9LE-LABEL: spltMemValConvftoi:
1798; P9LE:       # %bb.0: # %entry
1799; P9LE-NEXT:    lxvwsx vs0, 0, r3
1800; P9LE-NEXT:    xvcvspsxws v2, vs0
1801; P9LE-NEXT:    blr
1802;
1803; P8BE-LABEL: spltMemValConvftoi:
1804; P8BE:       # %bb.0: # %entry
1805; P8BE-NEXT:    lfsx f0, 0, r3
1806; P8BE-NEXT:    xscvdpsxws f0, f0
1807; P8BE-NEXT:    xxspltw v2, vs0, 1
1808; P8BE-NEXT:    blr
1809;
1810; P8LE-LABEL: spltMemValConvftoi:
1811; P8LE:       # %bb.0: # %entry
1812; P8LE-NEXT:    lfsx f0, 0, r3
1813; P8LE-NEXT:    xscvdpsxws f0, f0
1814; P8LE-NEXT:    xxspltw v2, vs0, 1
1815; P8LE-NEXT:    blr
1816entry:
1817  %0 = load float, float* %ptr, align 4
1818  %conv = fptosi float %0 to i32
1819  %splat.splatinsert = insertelement <4 x i32> undef, i32 %conv, i32 0
1820  %splat.splat = shufflevector <4 x i32> %splat.splatinsert, <4 x i32> undef, <4 x i32> zeroinitializer
1821  ret <4 x i32> %splat.splat
1822}
1823
1824; Function Attrs: norecurse nounwind readnone
1825define <4 x i32> @spltCnstConvdtoi() {
1826; P9BE-LABEL: spltCnstConvdtoi:
1827; P9BE:       # %bb.0: # %entry
1828; P9BE-NEXT:    vspltisw v2, 4
1829; P9BE-NEXT:    blr
1830;
1831; P9LE-LABEL: spltCnstConvdtoi:
1832; P9LE:       # %bb.0: # %entry
1833; P9LE-NEXT:    vspltisw v2, 4
1834; P9LE-NEXT:    blr
1835;
1836; P8BE-LABEL: spltCnstConvdtoi:
1837; P8BE:       # %bb.0: # %entry
1838; P8BE-NEXT:    vspltisw v2, 4
1839; P8BE-NEXT:    blr
1840;
1841; P8LE-LABEL: spltCnstConvdtoi:
1842; P8LE:       # %bb.0: # %entry
1843; P8LE-NEXT:    vspltisw v2, 4
1844; P8LE-NEXT:    blr
1845entry:
1846  ret <4 x i32> <i32 4, i32 4, i32 4, i32 4>
1847}
1848
1849; Function Attrs: norecurse nounwind readnone
1850define <4 x i32> @fromRegsConvdtoi(double %a, double %b, double %c, double %d) {
1851; P9BE-LABEL: fromRegsConvdtoi:
1852; P9BE:       # %bb.0: # %entry
1853; P9BE-NEXT:    # kill: def $f4 killed $f4 def $vsl4
1854; P9BE-NEXT:    # kill: def $f2 killed $f2 def $vsl2
1855; P9BE-NEXT:    xxmrghd vs0, vs2, vs4
1856; P9BE-NEXT:    # kill: def $f3 killed $f3 def $vsl3
1857; P9BE-NEXT:    # kill: def $f1 killed $f1 def $vsl1
1858; P9BE-NEXT:    xvcvdpsxws v2, vs0
1859; P9BE-NEXT:    xxmrghd vs0, vs1, vs3
1860; P9BE-NEXT:    xvcvdpsxws v3, vs0
1861; P9BE-NEXT:    vmrgew v2, v3, v2
1862; P9BE-NEXT:    blr
1863;
1864; P9LE-LABEL: fromRegsConvdtoi:
1865; P9LE:       # %bb.0: # %entry
1866; P9LE-NEXT:    # kill: def $f3 killed $f3 def $vsl3
1867; P9LE-NEXT:    # kill: def $f1 killed $f1 def $vsl1
1868; P9LE-NEXT:    xxmrghd vs0, vs3, vs1
1869; P9LE-NEXT:    # kill: def $f4 killed $f4 def $vsl4
1870; P9LE-NEXT:    # kill: def $f2 killed $f2 def $vsl2
1871; P9LE-NEXT:    xvcvdpsxws v2, vs0
1872; P9LE-NEXT:    xxmrghd vs0, vs4, vs2
1873; P9LE-NEXT:    xvcvdpsxws v3, vs0
1874; P9LE-NEXT:    vmrgew v2, v3, v2
1875; P9LE-NEXT:    blr
1876;
1877; P8BE-LABEL: fromRegsConvdtoi:
1878; P8BE:       # %bb.0: # %entry
1879; P8BE-NEXT:    # kill: def $f1 killed $f1 def $vsl1
1880; P8BE-NEXT:    # kill: def $f4 killed $f4 def $vsl4
1881; P8BE-NEXT:    # kill: def $f3 killed $f3 def $vsl3
1882; P8BE-NEXT:    # kill: def $f2 killed $f2 def $vsl2
1883; P8BE-NEXT:    xxmrghd vs0, vs2, vs4
1884; P8BE-NEXT:    xxmrghd vs1, vs1, vs3
1885; P8BE-NEXT:    xvcvdpsxws v2, vs0
1886; P8BE-NEXT:    xvcvdpsxws v3, vs1
1887; P8BE-NEXT:    vmrgew v2, v3, v2
1888; P8BE-NEXT:    blr
1889;
1890; P8LE-LABEL: fromRegsConvdtoi:
1891; P8LE:       # %bb.0: # %entry
1892; P8LE-NEXT:    # kill: def $f1 killed $f1 def $vsl1
1893; P8LE-NEXT:    # kill: def $f4 killed $f4 def $vsl4
1894; P8LE-NEXT:    # kill: def $f3 killed $f3 def $vsl3
1895; P8LE-NEXT:    # kill: def $f2 killed $f2 def $vsl2
1896; P8LE-NEXT:    xxmrghd vs0, vs3, vs1
1897; P8LE-NEXT:    xxmrghd vs1, vs4, vs2
1898; P8LE-NEXT:    xvcvdpsxws v2, vs0
1899; P8LE-NEXT:    xvcvdpsxws v3, vs1
1900; P8LE-NEXT:    vmrgew v2, v3, v2
1901; P8LE-NEXT:    blr
1902entry:
1903  %conv = fptosi double %a to i32
1904  %vecinit = insertelement <4 x i32> undef, i32 %conv, i32 0
1905  %conv1 = fptosi double %b to i32
1906  %vecinit2 = insertelement <4 x i32> %vecinit, i32 %conv1, i32 1
1907  %conv3 = fptosi double %c to i32
1908  %vecinit4 = insertelement <4 x i32> %vecinit2, i32 %conv3, i32 2
1909  %conv5 = fptosi double %d to i32
1910  %vecinit6 = insertelement <4 x i32> %vecinit4, i32 %conv5, i32 3
1911  ret <4 x i32> %vecinit6
1912}
1913
1914; Function Attrs: norecurse nounwind readnone
1915define <4 x i32> @fromDiffConstsConvdtoi() {
1916; P9BE-LABEL: fromDiffConstsConvdtoi:
1917; P9BE:       # %bb.0: # %entry
1918; P9BE-NEXT:    addis r3, r2, .LCPI26_0@toc@ha
1919; P9BE-NEXT:    addi r3, r3, .LCPI26_0@toc@l
1920; P9BE-NEXT:    lxvx v2, 0, r3
1921; P9BE-NEXT:    blr
1922;
1923; P9LE-LABEL: fromDiffConstsConvdtoi:
1924; P9LE:       # %bb.0: # %entry
1925; P9LE-NEXT:    addis r3, r2, .LCPI26_0@toc@ha
1926; P9LE-NEXT:    addi r3, r3, .LCPI26_0@toc@l
1927; P9LE-NEXT:    lxvx v2, 0, r3
1928; P9LE-NEXT:    blr
1929;
1930; P8BE-LABEL: fromDiffConstsConvdtoi:
1931; P8BE:       # %bb.0: # %entry
1932; P8BE-NEXT:    addis r3, r2, .LCPI26_0@toc@ha
1933; P8BE-NEXT:    addi r3, r3, .LCPI26_0@toc@l
1934; P8BE-NEXT:    lxvw4x v2, 0, r3
1935; P8BE-NEXT:    blr
1936;
1937; P8LE-LABEL: fromDiffConstsConvdtoi:
1938; P8LE:       # %bb.0: # %entry
1939; P8LE-NEXT:    addis r3, r2, .LCPI26_0@toc@ha
1940; P8LE-NEXT:    addi r3, r3, .LCPI26_0@toc@l
1941; P8LE-NEXT:    lvx v2, 0, r3
1942; P8LE-NEXT:    blr
1943entry:
1944  ret <4 x i32> <i32 24, i32 234, i32 988, i32 422>
1945}
1946
1947; Function Attrs: norecurse nounwind readonly
1948define <4 x i32> @fromDiffMemConsAConvdtoi(double* nocapture readonly %ptr) {
1949; P9BE-LABEL: fromDiffMemConsAConvdtoi:
1950; P9BE:       # %bb.0: # %entry
1951; P9BE-NEXT:    lxv vs0, 0(r3)
1952; P9BE-NEXT:    lxv vs1, 16(r3)
1953; P9BE-NEXT:    xxmrgld vs2, vs0, vs1
1954; P9BE-NEXT:    xxmrghd vs0, vs0, vs1
1955; P9BE-NEXT:    xvcvdpsxws v2, vs2
1956; P9BE-NEXT:    xvcvdpsxws v3, vs0
1957; P9BE-NEXT:    vmrgew v2, v3, v2
1958; P9BE-NEXT:    blr
1959;
1960; P9LE-LABEL: fromDiffMemConsAConvdtoi:
1961; P9LE:       # %bb.0: # %entry
1962; P9LE-NEXT:    lxv vs0, 0(r3)
1963; P9LE-NEXT:    lxv vs1, 16(r3)
1964; P9LE-NEXT:    xxmrgld vs2, vs1, vs0
1965; P9LE-NEXT:    xxmrghd vs0, vs1, vs0
1966; P9LE-NEXT:    xvcvdpsxws v2, vs2
1967; P9LE-NEXT:    xvcvdpsxws v3, vs0
1968; P9LE-NEXT:    vmrgew v2, v3, v2
1969; P9LE-NEXT:    blr
1970;
1971; P8BE-LABEL: fromDiffMemConsAConvdtoi:
1972; P8BE:       # %bb.0: # %entry
1973; P8BE-NEXT:    li r4, 16
1974; P8BE-NEXT:    lxvd2x vs0, 0, r3
1975; P8BE-NEXT:    lxvd2x vs1, r3, r4
1976; P8BE-NEXT:    xxmrgld vs2, vs0, vs1
1977; P8BE-NEXT:    xxmrghd vs0, vs0, vs1
1978; P8BE-NEXT:    xvcvdpsxws v2, vs2
1979; P8BE-NEXT:    xvcvdpsxws v3, vs0
1980; P8BE-NEXT:    vmrgew v2, v3, v2
1981; P8BE-NEXT:    blr
1982;
1983; P8LE-LABEL: fromDiffMemConsAConvdtoi:
1984; P8LE:       # %bb.0: # %entry
1985; P8LE-NEXT:    li r4, 16
1986; P8LE-NEXT:    lxvd2x vs0, 0, r3
1987; P8LE-NEXT:    lxvd2x vs1, r3, r4
1988; P8LE-NEXT:    xxswapd vs0, vs0
1989; P8LE-NEXT:    xxswapd vs1, vs1
1990; P8LE-NEXT:    xxmrgld vs2, vs1, vs0
1991; P8LE-NEXT:    xxmrghd vs0, vs1, vs0
1992; P8LE-NEXT:    xvcvdpsxws v2, vs2
1993; P8LE-NEXT:    xvcvdpsxws v3, vs0
1994; P8LE-NEXT:    vmrgew v2, v3, v2
1995; P8LE-NEXT:    blr
1996entry:
1997  %0 = bitcast double* %ptr to <2 x double>*
1998  %1 = load <2 x double>, <2 x double>* %0, align 8
1999  %2 = fptosi <2 x double> %1 to <2 x i32>
2000  %arrayidx4 = getelementptr inbounds double, double* %ptr, i64 2
2001  %3 = bitcast double* %arrayidx4 to <2 x double>*
2002  %4 = load <2 x double>, <2 x double>* %3, align 8
2003  %5 = fptosi <2 x double> %4 to <2 x i32>
2004  %vecinit9 = shufflevector <2 x i32> %2, <2 x i32> %5, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
2005  ret <4 x i32> %vecinit9
2006}
2007
2008; Function Attrs: norecurse nounwind readonly
2009define <4 x i32> @fromDiffMemConsDConvdtoi(double* nocapture readonly %ptr) {
2010; P9BE-LABEL: fromDiffMemConsDConvdtoi:
2011; P9BE:       # %bb.0: # %entry
2012; P9BE-NEXT:    lfd f0, 24(r3)
2013; P9BE-NEXT:    lfd f1, 16(r3)
2014; P9BE-NEXT:    lfd f2, 8(r3)
2015; P9BE-NEXT:    lfd f3, 0(r3)
2016; P9BE-NEXT:    xxmrghd vs1, vs1, vs3
2017; P9BE-NEXT:    xxmrghd vs0, vs0, vs2
2018; P9BE-NEXT:    xvcvdpsxws v2, vs1
2019; P9BE-NEXT:    xvcvdpsxws v3, vs0
2020; P9BE-NEXT:    vmrgew v2, v3, v2
2021; P9BE-NEXT:    blr
2022;
2023; P9LE-LABEL: fromDiffMemConsDConvdtoi:
2024; P9LE:       # %bb.0: # %entry
2025; P9LE-NEXT:    lfd f0, 24(r3)
2026; P9LE-NEXT:    lfd f2, 8(r3)
2027; P9LE-NEXT:    lfd f1, 16(r3)
2028; P9LE-NEXT:    lfd f3, 0(r3)
2029; P9LE-NEXT:    xxmrghd vs0, vs2, vs0
2030; P9LE-NEXT:    xvcvdpsxws v2, vs0
2031; P9LE-NEXT:    xxmrghd vs0, vs3, vs1
2032; P9LE-NEXT:    xvcvdpsxws v3, vs0
2033; P9LE-NEXT:    vmrgew v2, v3, v2
2034; P9LE-NEXT:    blr
2035;
2036; P8BE-LABEL: fromDiffMemConsDConvdtoi:
2037; P8BE:       # %bb.0: # %entry
2038; P8BE-NEXT:    lfdx f3, 0, r3
2039; P8BE-NEXT:    lfd f0, 24(r3)
2040; P8BE-NEXT:    lfd f1, 8(r3)
2041; P8BE-NEXT:    lfd f2, 16(r3)
2042; P8BE-NEXT:    xxmrghd vs0, vs0, vs1
2043; P8BE-NEXT:    xxmrghd vs1, vs2, vs3
2044; P8BE-NEXT:    xvcvdpsxws v2, vs0
2045; P8BE-NEXT:    xvcvdpsxws v3, vs1
2046; P8BE-NEXT:    vmrgew v2, v2, v3
2047; P8BE-NEXT:    blr
2048;
2049; P8LE-LABEL: fromDiffMemConsDConvdtoi:
2050; P8LE:       # %bb.0: # %entry
2051; P8LE-NEXT:    lfdx f3, 0, r3
2052; P8LE-NEXT:    lfd f0, 24(r3)
2053; P8LE-NEXT:    lfd f1, 8(r3)
2054; P8LE-NEXT:    lfd f2, 16(r3)
2055; P8LE-NEXT:    xxmrghd vs0, vs1, vs0
2056; P8LE-NEXT:    xxmrghd vs1, vs3, vs2
2057; P8LE-NEXT:    xvcvdpsxws v2, vs0
2058; P8LE-NEXT:    xvcvdpsxws v3, vs1
2059; P8LE-NEXT:    vmrgew v2, v3, v2
2060; P8LE-NEXT:    blr
2061entry:
2062  %arrayidx = getelementptr inbounds double, double* %ptr, i64 3
2063  %0 = load double, double* %arrayidx, align 8
2064  %conv = fptosi double %0 to i32
2065  %vecinit = insertelement <4 x i32> undef, i32 %conv, i32 0
2066  %arrayidx1 = getelementptr inbounds double, double* %ptr, i64 2
2067  %1 = load double, double* %arrayidx1, align 8
2068  %conv2 = fptosi double %1 to i32
2069  %vecinit3 = insertelement <4 x i32> %vecinit, i32 %conv2, i32 1
2070  %arrayidx4 = getelementptr inbounds double, double* %ptr, i64 1
2071  %2 = load double, double* %arrayidx4, align 8
2072  %conv5 = fptosi double %2 to i32
2073  %vecinit6 = insertelement <4 x i32> %vecinit3, i32 %conv5, i32 2
2074  %3 = load double, double* %ptr, align 8
2075  %conv8 = fptosi double %3 to i32
2076  %vecinit9 = insertelement <4 x i32> %vecinit6, i32 %conv8, i32 3
2077  ret <4 x i32> %vecinit9
2078}
2079
2080; Function Attrs: norecurse nounwind readonly
2081define <4 x i32> @fromDiffMemVarAConvdtoi(double* nocapture readonly %arr, i32 signext %elem) {
2082; P9BE-LABEL: fromDiffMemVarAConvdtoi:
2083; P9BE:       # %bb.0: # %entry
2084; P9BE-NEXT:    sldi r4, r4, 3
2085; P9BE-NEXT:    lfdux f0, r3, r4
2086; P9BE-NEXT:    lfd f1, 8(r3)
2087; P9BE-NEXT:    lfd f2, 16(r3)
2088; P9BE-NEXT:    lfd f3, 24(r3)
2089; P9BE-NEXT:    xxmrghd vs1, vs1, vs3
2090; P9BE-NEXT:    xxmrghd vs0, vs0, vs2
2091; P9BE-NEXT:    xvcvdpsxws v2, vs1
2092; P9BE-NEXT:    xvcvdpsxws v3, vs0
2093; P9BE-NEXT:    vmrgew v2, v3, v2
2094; P9BE-NEXT:    blr
2095;
2096; P9LE-LABEL: fromDiffMemVarAConvdtoi:
2097; P9LE:       # %bb.0: # %entry
2098; P9LE-NEXT:    sldi r4, r4, 3
2099; P9LE-NEXT:    lfdux f0, r3, r4
2100; P9LE-NEXT:    lfd f2, 16(r3)
2101; P9LE-NEXT:    lfd f1, 8(r3)
2102; P9LE-NEXT:    lfd f3, 24(r3)
2103; P9LE-NEXT:    xxmrghd vs0, vs2, vs0
2104; P9LE-NEXT:    xvcvdpsxws v2, vs0
2105; P9LE-NEXT:    xxmrghd vs0, vs3, vs1
2106; P9LE-NEXT:    xvcvdpsxws v3, vs0
2107; P9LE-NEXT:    vmrgew v2, v3, v2
2108; P9LE-NEXT:    blr
2109;
2110; P8BE-LABEL: fromDiffMemVarAConvdtoi:
2111; P8BE:       # %bb.0: # %entry
2112; P8BE-NEXT:    sldi r4, r4, 3
2113; P8BE-NEXT:    lfdux f0, r3, r4
2114; P8BE-NEXT:    lfd f1, 8(r3)
2115; P8BE-NEXT:    lfd f2, 24(r3)
2116; P8BE-NEXT:    lfd f3, 16(r3)
2117; P8BE-NEXT:    xxmrghd vs1, vs1, vs2
2118; P8BE-NEXT:    xxmrghd vs0, vs0, vs3
2119; P8BE-NEXT:    xvcvdpsxws v2, vs1
2120; P8BE-NEXT:    xvcvdpsxws v3, vs0
2121; P8BE-NEXT:    vmrgew v2, v3, v2
2122; P8BE-NEXT:    blr
2123;
2124; P8LE-LABEL: fromDiffMemVarAConvdtoi:
2125; P8LE:       # %bb.0: # %entry
2126; P8LE-NEXT:    sldi r4, r4, 3
2127; P8LE-NEXT:    lfdux f0, r3, r4
2128; P8LE-NEXT:    lfd f1, 16(r3)
2129; P8LE-NEXT:    lfd f2, 8(r3)
2130; P8LE-NEXT:    lfd f3, 24(r3)
2131; P8LE-NEXT:    xxmrghd vs0, vs1, vs0
2132; P8LE-NEXT:    xxmrghd vs1, vs3, vs2
2133; P8LE-NEXT:    xvcvdpsxws v2, vs0
2134; P8LE-NEXT:    xvcvdpsxws v3, vs1
2135; P8LE-NEXT:    vmrgew v2, v3, v2
2136; P8LE-NEXT:    blr
2137entry:
2138  %idxprom = sext i32 %elem to i64
2139  %arrayidx = getelementptr inbounds double, double* %arr, i64 %idxprom
2140  %0 = load double, double* %arrayidx, align 8
2141  %conv = fptosi double %0 to i32
2142  %vecinit = insertelement <4 x i32> undef, i32 %conv, i32 0
2143  %add = add nsw i32 %elem, 1
2144  %idxprom1 = sext i32 %add to i64
2145  %arrayidx2 = getelementptr inbounds double, double* %arr, i64 %idxprom1
2146  %1 = load double, double* %arrayidx2, align 8
2147  %conv3 = fptosi double %1 to i32
2148  %vecinit4 = insertelement <4 x i32> %vecinit, i32 %conv3, i32 1
2149  %add5 = add nsw i32 %elem, 2
2150  %idxprom6 = sext i32 %add5 to i64
2151  %arrayidx7 = getelementptr inbounds double, double* %arr, i64 %idxprom6
2152  %2 = load double, double* %arrayidx7, align 8
2153  %conv8 = fptosi double %2 to i32
2154  %vecinit9 = insertelement <4 x i32> %vecinit4, i32 %conv8, i32 2
2155  %add10 = add nsw i32 %elem, 3
2156  %idxprom11 = sext i32 %add10 to i64
2157  %arrayidx12 = getelementptr inbounds double, double* %arr, i64 %idxprom11
2158  %3 = load double, double* %arrayidx12, align 8
2159  %conv13 = fptosi double %3 to i32
2160  %vecinit14 = insertelement <4 x i32> %vecinit9, i32 %conv13, i32 3
2161  ret <4 x i32> %vecinit14
2162}
2163
2164; Function Attrs: norecurse nounwind readonly
2165define <4 x i32> @fromDiffMemVarDConvdtoi(double* nocapture readonly %arr, i32 signext %elem) {
2166; P9BE-LABEL: fromDiffMemVarDConvdtoi:
2167; P9BE:       # %bb.0: # %entry
2168; P9BE-NEXT:    sldi r4, r4, 3
2169; P9BE-NEXT:    lfdux f0, r3, r4
2170; P9BE-NEXT:    lfd f1, -8(r3)
2171; P9BE-NEXT:    lfd f2, -16(r3)
2172; P9BE-NEXT:    lfd f3, -24(r3)
2173; P9BE-NEXT:    xxmrghd vs1, vs1, vs3
2174; P9BE-NEXT:    xxmrghd vs0, vs0, vs2
2175; P9BE-NEXT:    xvcvdpsxws v2, vs1
2176; P9BE-NEXT:    xvcvdpsxws v3, vs0
2177; P9BE-NEXT:    vmrgew v2, v3, v2
2178; P9BE-NEXT:    blr
2179;
2180; P9LE-LABEL: fromDiffMemVarDConvdtoi:
2181; P9LE:       # %bb.0: # %entry
2182; P9LE-NEXT:    sldi r4, r4, 3
2183; P9LE-NEXT:    lfdux f0, r3, r4
2184; P9LE-NEXT:    lfd f2, -16(r3)
2185; P9LE-NEXT:    lfd f1, -8(r3)
2186; P9LE-NEXT:    lfd f3, -24(r3)
2187; P9LE-NEXT:    xxmrghd vs0, vs2, vs0
2188; P9LE-NEXT:    xvcvdpsxws v2, vs0
2189; P9LE-NEXT:    xxmrghd vs0, vs3, vs1
2190; P9LE-NEXT:    xvcvdpsxws v3, vs0
2191; P9LE-NEXT:    vmrgew v2, v3, v2
2192; P9LE-NEXT:    blr
2193;
2194; P8BE-LABEL: fromDiffMemVarDConvdtoi:
2195; P8BE:       # %bb.0: # %entry
2196; P8BE-NEXT:    sldi r4, r4, 3
2197; P8BE-NEXT:    lfdux f0, r3, r4
2198; P8BE-NEXT:    lfd f1, -8(r3)
2199; P8BE-NEXT:    lfd f2, -24(r3)
2200; P8BE-NEXT:    lfd f3, -16(r3)
2201; P8BE-NEXT:    xxmrghd vs1, vs1, vs2
2202; P8BE-NEXT:    xxmrghd vs0, vs0, vs3
2203; P8BE-NEXT:    xvcvdpsxws v2, vs1
2204; P8BE-NEXT:    xvcvdpsxws v3, vs0
2205; P8BE-NEXT:    vmrgew v2, v3, v2
2206; P8BE-NEXT:    blr
2207;
2208; P8LE-LABEL: fromDiffMemVarDConvdtoi:
2209; P8LE:       # %bb.0: # %entry
2210; P8LE-NEXT:    sldi r4, r4, 3
2211; P8LE-NEXT:    lfdux f0, r3, r4
2212; P8LE-NEXT:    lfd f1, -16(r3)
2213; P8LE-NEXT:    lfd f2, -8(r3)
2214; P8LE-NEXT:    lfd f3, -24(r3)
2215; P8LE-NEXT:    xxmrghd vs0, vs1, vs0
2216; P8LE-NEXT:    xxmrghd vs1, vs3, vs2
2217; P8LE-NEXT:    xvcvdpsxws v2, vs0
2218; P8LE-NEXT:    xvcvdpsxws v3, vs1
2219; P8LE-NEXT:    vmrgew v2, v3, v2
2220; P8LE-NEXT:    blr
2221entry:
2222  %idxprom = sext i32 %elem to i64
2223  %arrayidx = getelementptr inbounds double, double* %arr, i64 %idxprom
2224  %0 = load double, double* %arrayidx, align 8
2225  %conv = fptosi double %0 to i32
2226  %vecinit = insertelement <4 x i32> undef, i32 %conv, i32 0
2227  %sub = add nsw i32 %elem, -1
2228  %idxprom1 = sext i32 %sub to i64
2229  %arrayidx2 = getelementptr inbounds double, double* %arr, i64 %idxprom1
2230  %1 = load double, double* %arrayidx2, align 8
2231  %conv3 = fptosi double %1 to i32
2232  %vecinit4 = insertelement <4 x i32> %vecinit, i32 %conv3, i32 1
2233  %sub5 = add nsw i32 %elem, -2
2234  %idxprom6 = sext i32 %sub5 to i64
2235  %arrayidx7 = getelementptr inbounds double, double* %arr, i64 %idxprom6
2236  %2 = load double, double* %arrayidx7, align 8
2237  %conv8 = fptosi double %2 to i32
2238  %vecinit9 = insertelement <4 x i32> %vecinit4, i32 %conv8, i32 2
2239  %sub10 = add nsw i32 %elem, -3
2240  %idxprom11 = sext i32 %sub10 to i64
2241  %arrayidx12 = getelementptr inbounds double, double* %arr, i64 %idxprom11
2242  %3 = load double, double* %arrayidx12, align 8
2243  %conv13 = fptosi double %3 to i32
2244  %vecinit14 = insertelement <4 x i32> %vecinit9, i32 %conv13, i32 3
2245  ret <4 x i32> %vecinit14
2246}
2247
2248; Function Attrs: norecurse nounwind readnone
2249define <4 x i32> @spltRegValConvdtoi(double %val) {
2250; P9BE-LABEL: spltRegValConvdtoi:
2251; P9BE:       # %bb.0: # %entry
2252; P9BE-NEXT:    xscvdpsxws f0, f1
2253; P9BE-NEXT:    xxspltw v2, vs0, 1
2254; P9BE-NEXT:    blr
2255;
2256; P9LE-LABEL: spltRegValConvdtoi:
2257; P9LE:       # %bb.0: # %entry
2258; P9LE-NEXT:    xscvdpsxws f0, f1
2259; P9LE-NEXT:    xxspltw v2, vs0, 1
2260; P9LE-NEXT:    blr
2261;
2262; P8BE-LABEL: spltRegValConvdtoi:
2263; P8BE:       # %bb.0: # %entry
2264; P8BE-NEXT:    xscvdpsxws f0, f1
2265; P8BE-NEXT:    xxspltw v2, vs0, 1
2266; P8BE-NEXT:    blr
2267;
2268; P8LE-LABEL: spltRegValConvdtoi:
2269; P8LE:       # %bb.0: # %entry
2270; P8LE-NEXT:    xscvdpsxws f0, f1
2271; P8LE-NEXT:    xxspltw v2, vs0, 1
2272; P8LE-NEXT:    blr
2273entry:
2274  %conv = fptosi double %val to i32
2275  %splat.splatinsert = insertelement <4 x i32> undef, i32 %conv, i32 0
2276  %splat.splat = shufflevector <4 x i32> %splat.splatinsert, <4 x i32> undef, <4 x i32> zeroinitializer
2277  ret <4 x i32> %splat.splat
2278}
2279
2280; Function Attrs: norecurse nounwind readonly
2281define <4 x i32> @spltMemValConvdtoi(double* nocapture readonly %ptr) {
2282; P9BE-LABEL: spltMemValConvdtoi:
2283; P9BE:       # %bb.0: # %entry
2284; P9BE-NEXT:    lfd f0, 0(r3)
2285; P9BE-NEXT:    xscvdpsxws f0, f0
2286; P9BE-NEXT:    xxspltw v2, vs0, 1
2287; P9BE-NEXT:    blr
2288;
2289; P9LE-LABEL: spltMemValConvdtoi:
2290; P9LE:       # %bb.0: # %entry
2291; P9LE-NEXT:    lfd f0, 0(r3)
2292; P9LE-NEXT:    xscvdpsxws f0, f0
2293; P9LE-NEXT:    xxspltw v2, vs0, 1
2294; P9LE-NEXT:    blr
2295;
2296; P8BE-LABEL: spltMemValConvdtoi:
2297; P8BE:       # %bb.0: # %entry
2298; P8BE-NEXT:    lfdx f0, 0, r3
2299; P8BE-NEXT:    xscvdpsxws f0, f0
2300; P8BE-NEXT:    xxspltw v2, vs0, 1
2301; P8BE-NEXT:    blr
2302;
2303; P8LE-LABEL: spltMemValConvdtoi:
2304; P8LE:       # %bb.0: # %entry
2305; P8LE-NEXT:    lfdx f0, 0, r3
2306; P8LE-NEXT:    xscvdpsxws f0, f0
2307; P8LE-NEXT:    xxspltw v2, vs0, 1
2308; P8LE-NEXT:    blr
2309entry:
2310  %0 = load double, double* %ptr, align 8
2311  %conv = fptosi double %0 to i32
2312  %splat.splatinsert = insertelement <4 x i32> undef, i32 %conv, i32 0
2313  %splat.splat = shufflevector <4 x i32> %splat.splatinsert, <4 x i32> undef, <4 x i32> zeroinitializer
2314  ret <4 x i32> %splat.splat
2315}
2316; Function Attrs: norecurse nounwind readnone
2317define <4 x i32> @allZeroui() {
2318; P9BE-LABEL: allZeroui:
2319; P9BE:       # %bb.0: # %entry
2320; P9BE-NEXT:    xxlxor v2, v2, v2
2321; P9BE-NEXT:    blr
2322;
2323; P9LE-LABEL: allZeroui:
2324; P9LE:       # %bb.0: # %entry
2325; P9LE-NEXT:    xxlxor v2, v2, v2
2326; P9LE-NEXT:    blr
2327;
2328; P8BE-LABEL: allZeroui:
2329; P8BE:       # %bb.0: # %entry
2330; P8BE-NEXT:    xxlxor v2, v2, v2
2331; P8BE-NEXT:    blr
2332;
2333; P8LE-LABEL: allZeroui:
2334; P8LE:       # %bb.0: # %entry
2335; P8LE-NEXT:    xxlxor v2, v2, v2
2336; P8LE-NEXT:    blr
2337entry:
2338  ret <4 x i32> zeroinitializer
2339}
2340
2341; Function Attrs: norecurse nounwind readnone
2342define <4 x i32> @allOneui() {
2343; P9BE-LABEL: allOneui:
2344; P9BE:       # %bb.0: # %entry
2345; P9BE-NEXT:    xxspltib v2, 255
2346; P9BE-NEXT:    blr
2347;
2348; P9LE-LABEL: allOneui:
2349; P9LE:       # %bb.0: # %entry
2350; P9LE-NEXT:    xxspltib v2, 255
2351; P9LE-NEXT:    blr
2352;
2353; P8BE-LABEL: allOneui:
2354; P8BE:       # %bb.0: # %entry
2355; P8BE-NEXT:    vspltisb v2, -1
2356; P8BE-NEXT:    blr
2357;
2358; P8LE-LABEL: allOneui:
2359; P8LE:       # %bb.0: # %entry
2360; P8LE-NEXT:    vspltisb v2, -1
2361; P8LE-NEXT:    blr
2362entry:
2363  ret <4 x i32> <i32 -1, i32 -1, i32 -1, i32 -1>
2364}
2365
2366; Function Attrs: norecurse nounwind readnone
2367define <4 x i32> @spltConst1ui() {
2368; P9BE-LABEL: spltConst1ui:
2369; P9BE:       # %bb.0: # %entry
2370; P9BE-NEXT:    vspltisw v2, 1
2371; P9BE-NEXT:    blr
2372;
2373; P9LE-LABEL: spltConst1ui:
2374; P9LE:       # %bb.0: # %entry
2375; P9LE-NEXT:    vspltisw v2, 1
2376; P9LE-NEXT:    blr
2377;
2378; P8BE-LABEL: spltConst1ui:
2379; P8BE:       # %bb.0: # %entry
2380; P8BE-NEXT:    vspltisw v2, 1
2381; P8BE-NEXT:    blr
2382;
2383; P8LE-LABEL: spltConst1ui:
2384; P8LE:       # %bb.0: # %entry
2385; P8LE-NEXT:    vspltisw v2, 1
2386; P8LE-NEXT:    blr
2387entry:
2388  ret <4 x i32> <i32 1, i32 1, i32 1, i32 1>
2389}
2390
2391; Function Attrs: norecurse nounwind readnone
2392define <4 x i32> @spltConst16kui() {
2393; P9BE-LABEL: spltConst16kui:
2394; P9BE:       # %bb.0: # %entry
2395; P9BE-NEXT:    vspltisw v2, -15
2396; P9BE-NEXT:    vsrw v2, v2, v2
2397; P9BE-NEXT:    blr
2398;
2399; P9LE-LABEL: spltConst16kui:
2400; P9LE:       # %bb.0: # %entry
2401; P9LE-NEXT:    vspltisw v2, -15
2402; P9LE-NEXT:    vsrw v2, v2, v2
2403; P9LE-NEXT:    blr
2404;
2405; P8BE-LABEL: spltConst16kui:
2406; P8BE:       # %bb.0: # %entry
2407; P8BE-NEXT:    vspltisw v2, -15
2408; P8BE-NEXT:    vsrw v2, v2, v2
2409; P8BE-NEXT:    blr
2410;
2411; P8LE-LABEL: spltConst16kui:
2412; P8LE:       # %bb.0: # %entry
2413; P8LE-NEXT:    vspltisw v2, -15
2414; P8LE-NEXT:    vsrw v2, v2, v2
2415; P8LE-NEXT:    blr
2416entry:
2417  ret <4 x i32> <i32 32767, i32 32767, i32 32767, i32 32767>
2418}
2419
2420; Function Attrs: norecurse nounwind readnone
2421define <4 x i32> @spltConst32kui() {
2422; P9BE-LABEL: spltConst32kui:
2423; P9BE:       # %bb.0: # %entry
2424; P9BE-NEXT:    vspltisw v2, -16
2425; P9BE-NEXT:    vsrw v2, v2, v2
2426; P9BE-NEXT:    blr
2427;
2428; P9LE-LABEL: spltConst32kui:
2429; P9LE:       # %bb.0: # %entry
2430; P9LE-NEXT:    vspltisw v2, -16
2431; P9LE-NEXT:    vsrw v2, v2, v2
2432; P9LE-NEXT:    blr
2433;
2434; P8BE-LABEL: spltConst32kui:
2435; P8BE:       # %bb.0: # %entry
2436; P8BE-NEXT:    vspltisw v2, -16
2437; P8BE-NEXT:    vsrw v2, v2, v2
2438; P8BE-NEXT:    blr
2439;
2440; P8LE-LABEL: spltConst32kui:
2441; P8LE:       # %bb.0: # %entry
2442; P8LE-NEXT:    vspltisw v2, -16
2443; P8LE-NEXT:    vsrw v2, v2, v2
2444; P8LE-NEXT:    blr
2445entry:
2446  ret <4 x i32> <i32 65535, i32 65535, i32 65535, i32 65535>
2447}
2448
2449; Function Attrs: norecurse nounwind readnone
2450define <4 x i32> @fromRegsui(i32 zeroext %a, i32 zeroext %b, i32 zeroext %c, i32 zeroext %d) {
2451; P9BE-LABEL: fromRegsui:
2452; P9BE:       # %bb.0: # %entry
2453; P9BE-NEXT:    rldimi r6, r5, 32, 0
2454; P9BE-NEXT:    rldimi r4, r3, 32, 0
2455; P9BE-NEXT:    mtvsrdd v2, r4, r6
2456; P9BE-NEXT:    blr
2457;
2458; P9LE-LABEL: fromRegsui:
2459; P9LE:       # %bb.0: # %entry
2460; P9LE-NEXT:    rldimi r3, r4, 32, 0
2461; P9LE-NEXT:    rldimi r5, r6, 32, 0
2462; P9LE-NEXT:    mtvsrdd v2, r5, r3
2463; P9LE-NEXT:    blr
2464;
2465; P8BE-LABEL: fromRegsui:
2466; P8BE:       # %bb.0: # %entry
2467; P8BE-NEXT:    rldimi r6, r5, 32, 0
2468; P8BE-NEXT:    rldimi r4, r3, 32, 0
2469; P8BE-NEXT:    mtvsrd f0, r6
2470; P8BE-NEXT:    mtvsrd f1, r4
2471; P8BE-NEXT:    xxmrghd v2, vs1, vs0
2472; P8BE-NEXT:    blr
2473;
2474; P8LE-LABEL: fromRegsui:
2475; P8LE:       # %bb.0: # %entry
2476; P8LE-NEXT:    rldimi r3, r4, 32, 0
2477; P8LE-NEXT:    rldimi r5, r6, 32, 0
2478; P8LE-NEXT:    mtvsrd f0, r3
2479; P8LE-NEXT:    mtvsrd f1, r5
2480; P8LE-NEXT:    xxmrghd v2, vs1, vs0
2481; P8LE-NEXT:    blr
2482entry:
2483  %vecinit = insertelement <4 x i32> undef, i32 %a, i32 0
2484  %vecinit1 = insertelement <4 x i32> %vecinit, i32 %b, i32 1
2485  %vecinit2 = insertelement <4 x i32> %vecinit1, i32 %c, i32 2
2486  %vecinit3 = insertelement <4 x i32> %vecinit2, i32 %d, i32 3
2487  ret <4 x i32> %vecinit3
2488}
2489
2490; Function Attrs: norecurse nounwind readnone
2491define <4 x i32> @fromDiffConstsui() {
2492; P9BE-LABEL: fromDiffConstsui:
2493; P9BE:       # %bb.0: # %entry
2494; P9BE-NEXT:    addis r3, r2, .LCPI39_0@toc@ha
2495; P9BE-NEXT:    addi r3, r3, .LCPI39_0@toc@l
2496; P9BE-NEXT:    lxvx v2, 0, r3
2497; P9BE-NEXT:    blr
2498;
2499; P9LE-LABEL: fromDiffConstsui:
2500; P9LE:       # %bb.0: # %entry
2501; P9LE-NEXT:    addis r3, r2, .LCPI39_0@toc@ha
2502; P9LE-NEXT:    addi r3, r3, .LCPI39_0@toc@l
2503; P9LE-NEXT:    lxvx v2, 0, r3
2504; P9LE-NEXT:    blr
2505;
2506; P8BE-LABEL: fromDiffConstsui:
2507; P8BE:       # %bb.0: # %entry
2508; P8BE-NEXT:    addis r3, r2, .LCPI39_0@toc@ha
2509; P8BE-NEXT:    addi r3, r3, .LCPI39_0@toc@l
2510; P8BE-NEXT:    lxvw4x v2, 0, r3
2511; P8BE-NEXT:    blr
2512;
2513; P8LE-LABEL: fromDiffConstsui:
2514; P8LE:       # %bb.0: # %entry
2515; P8LE-NEXT:    addis r3, r2, .LCPI39_0@toc@ha
2516; P8LE-NEXT:    addi r3, r3, .LCPI39_0@toc@l
2517; P8LE-NEXT:    lvx v2, 0, r3
2518; P8LE-NEXT:    blr
2519entry:
2520  ret <4 x i32> <i32 242, i32 -113, i32 889, i32 19>
2521}
2522
2523; Function Attrs: norecurse nounwind readonly
2524define <4 x i32> @fromDiffMemConsAui(i32* nocapture readonly %arr) {
2525; P9BE-LABEL: fromDiffMemConsAui:
2526; P9BE:       # %bb.0: # %entry
2527; P9BE-NEXT:    lxv v2, 0(r3)
2528; P9BE-NEXT:    blr
2529;
2530; P9LE-LABEL: fromDiffMemConsAui:
2531; P9LE:       # %bb.0: # %entry
2532; P9LE-NEXT:    lxv v2, 0(r3)
2533; P9LE-NEXT:    blr
2534;
2535; P8BE-LABEL: fromDiffMemConsAui:
2536; P8BE:       # %bb.0: # %entry
2537; P8BE-NEXT:    lxvw4x v2, 0, r3
2538; P8BE-NEXT:    blr
2539;
2540; P8LE-LABEL: fromDiffMemConsAui:
2541; P8LE:       # %bb.0: # %entry
2542; P8LE-NEXT:    lxvd2x vs0, 0, r3
2543; P8LE-NEXT:    xxswapd v2, vs0
2544; P8LE-NEXT:    blr
2545entry:
2546  %0 = load i32, i32* %arr, align 4
2547  %vecinit = insertelement <4 x i32> undef, i32 %0, i32 0
2548  %arrayidx1 = getelementptr inbounds i32, i32* %arr, i64 1
2549  %1 = load i32, i32* %arrayidx1, align 4
2550  %vecinit2 = insertelement <4 x i32> %vecinit, i32 %1, i32 1
2551  %arrayidx3 = getelementptr inbounds i32, i32* %arr, i64 2
2552  %2 = load i32, i32* %arrayidx3, align 4
2553  %vecinit4 = insertelement <4 x i32> %vecinit2, i32 %2, i32 2
2554  %arrayidx5 = getelementptr inbounds i32, i32* %arr, i64 3
2555  %3 = load i32, i32* %arrayidx5, align 4
2556  %vecinit6 = insertelement <4 x i32> %vecinit4, i32 %3, i32 3
2557  ret <4 x i32> %vecinit6
2558}
2559
2560; Function Attrs: norecurse nounwind readonly
2561define <4 x i32> @fromDiffMemConsDui(i32* nocapture readonly %arr) {
2562; P9BE-LABEL: fromDiffMemConsDui:
2563; P9BE:       # %bb.0: # %entry
2564; P9BE-NEXT:    lxv v2, 0(r3)
2565; P9BE-NEXT:    addis r3, r2, .LCPI41_0@toc@ha
2566; P9BE-NEXT:    addi r3, r3, .LCPI41_0@toc@l
2567; P9BE-NEXT:    lxvx v3, 0, r3
2568; P9BE-NEXT:    vperm v2, v2, v2, v3
2569; P9BE-NEXT:    blr
2570;
2571; P9LE-LABEL: fromDiffMemConsDui:
2572; P9LE:       # %bb.0: # %entry
2573; P9LE-NEXT:    lxv v2, 0(r3)
2574; P9LE-NEXT:    addis r3, r2, .LCPI41_0@toc@ha
2575; P9LE-NEXT:    addi r3, r3, .LCPI41_0@toc@l
2576; P9LE-NEXT:    lxvx v3, 0, r3
2577; P9LE-NEXT:    vperm v2, v2, v2, v3
2578; P9LE-NEXT:    blr
2579;
2580; P8BE-LABEL: fromDiffMemConsDui:
2581; P8BE:       # %bb.0: # %entry
2582; P8BE-NEXT:    addis r4, r2, .LCPI41_0@toc@ha
2583; P8BE-NEXT:    lxvw4x v2, 0, r3
2584; P8BE-NEXT:    addi r4, r4, .LCPI41_0@toc@l
2585; P8BE-NEXT:    lxvw4x v3, 0, r4
2586; P8BE-NEXT:    vperm v2, v2, v2, v3
2587; P8BE-NEXT:    blr
2588;
2589; P8LE-LABEL: fromDiffMemConsDui:
2590; P8LE:       # %bb.0: # %entry
2591; P8LE-NEXT:    lxvd2x vs0, 0, r3
2592; P8LE-NEXT:    addis r4, r2, .LCPI41_0@toc@ha
2593; P8LE-NEXT:    addi r3, r4, .LCPI41_0@toc@l
2594; P8LE-NEXT:    lvx v2, 0, r3
2595; P8LE-NEXT:    xxswapd v3, vs0
2596; P8LE-NEXT:    vperm v2, v3, v3, v2
2597; P8LE-NEXT:    blr
2598entry:
2599  %arrayidx = getelementptr inbounds i32, i32* %arr, i64 3
2600  %0 = load i32, i32* %arrayidx, align 4
2601  %vecinit = insertelement <4 x i32> undef, i32 %0, i32 0
2602  %arrayidx1 = getelementptr inbounds i32, i32* %arr, i64 2
2603  %1 = load i32, i32* %arrayidx1, align 4
2604  %vecinit2 = insertelement <4 x i32> %vecinit, i32 %1, i32 1
2605  %arrayidx3 = getelementptr inbounds i32, i32* %arr, i64 1
2606  %2 = load i32, i32* %arrayidx3, align 4
2607  %vecinit4 = insertelement <4 x i32> %vecinit2, i32 %2, i32 2
2608  %3 = load i32, i32* %arr, align 4
2609  %vecinit6 = insertelement <4 x i32> %vecinit4, i32 %3, i32 3
2610  ret <4 x i32> %vecinit6
2611}
2612
2613; Function Attrs: norecurse nounwind readonly
2614define <4 x i32> @fromDiffMemVarAui(i32* nocapture readonly %arr, i32 signext %elem) {
2615; P9BE-LABEL: fromDiffMemVarAui:
2616; P9BE:       # %bb.0: # %entry
2617; P9BE-NEXT:    sldi r4, r4, 2
2618; P9BE-NEXT:    lxvx v2, r3, r4
2619; P9BE-NEXT:    blr
2620;
2621; P9LE-LABEL: fromDiffMemVarAui:
2622; P9LE:       # %bb.0: # %entry
2623; P9LE-NEXT:    sldi r4, r4, 2
2624; P9LE-NEXT:    lxvx v2, r3, r4
2625; P9LE-NEXT:    blr
2626;
2627; P8BE-LABEL: fromDiffMemVarAui:
2628; P8BE:       # %bb.0: # %entry
2629; P8BE-NEXT:    sldi r4, r4, 2
2630; P8BE-NEXT:    lxvw4x v2, r3, r4
2631; P8BE-NEXT:    blr
2632;
2633; P8LE-LABEL: fromDiffMemVarAui:
2634; P8LE:       # %bb.0: # %entry
2635; P8LE-NEXT:    sldi r4, r4, 2
2636; P8LE-NEXT:    lxvd2x vs0, r3, r4
2637; P8LE-NEXT:    xxswapd v2, vs0
2638; P8LE-NEXT:    blr
2639entry:
2640  %idxprom = sext i32 %elem to i64
2641  %arrayidx = getelementptr inbounds i32, i32* %arr, i64 %idxprom
2642  %0 = load i32, i32* %arrayidx, align 4
2643  %vecinit = insertelement <4 x i32> undef, i32 %0, i32 0
2644  %add = add nsw i32 %elem, 1
2645  %idxprom1 = sext i32 %add to i64
2646  %arrayidx2 = getelementptr inbounds i32, i32* %arr, i64 %idxprom1
2647  %1 = load i32, i32* %arrayidx2, align 4
2648  %vecinit3 = insertelement <4 x i32> %vecinit, i32 %1, i32 1
2649  %add4 = add nsw i32 %elem, 2
2650  %idxprom5 = sext i32 %add4 to i64
2651  %arrayidx6 = getelementptr inbounds i32, i32* %arr, i64 %idxprom5
2652  %2 = load i32, i32* %arrayidx6, align 4
2653  %vecinit7 = insertelement <4 x i32> %vecinit3, i32 %2, i32 2
2654  %add8 = add nsw i32 %elem, 3
2655  %idxprom9 = sext i32 %add8 to i64
2656  %arrayidx10 = getelementptr inbounds i32, i32* %arr, i64 %idxprom9
2657  %3 = load i32, i32* %arrayidx10, align 4
2658  %vecinit11 = insertelement <4 x i32> %vecinit7, i32 %3, i32 3
2659  ret <4 x i32> %vecinit11
2660}
2661
2662; Function Attrs: norecurse nounwind readonly
2663define <4 x i32> @fromDiffMemVarDui(i32* nocapture readonly %arr, i32 signext %elem) {
2664; P9BE-LABEL: fromDiffMemVarDui:
2665; P9BE:       # %bb.0: # %entry
2666; P9BE-NEXT:    sldi r4, r4, 2
2667; P9BE-NEXT:    add r3, r3, r4
2668; P9BE-NEXT:    addi r3, r3, -12
2669; P9BE-NEXT:    lxvx v2, 0, r3
2670; P9BE-NEXT:    addis r3, r2, .LCPI43_0@toc@ha
2671; P9BE-NEXT:    addi r3, r3, .LCPI43_0@toc@l
2672; P9BE-NEXT:    lxvx v3, 0, r3
2673; P9BE-NEXT:    vperm v2, v2, v2, v3
2674; P9BE-NEXT:    blr
2675;
2676; P9LE-LABEL: fromDiffMemVarDui:
2677; P9LE:       # %bb.0: # %entry
2678; P9LE-NEXT:    sldi r4, r4, 2
2679; P9LE-NEXT:    add r3, r3, r4
2680; P9LE-NEXT:    addi r3, r3, -12
2681; P9LE-NEXT:    lxvx v2, 0, r3
2682; P9LE-NEXT:    addis r3, r2, .LCPI43_0@toc@ha
2683; P9LE-NEXT:    addi r3, r3, .LCPI43_0@toc@l
2684; P9LE-NEXT:    lxvx v3, 0, r3
2685; P9LE-NEXT:    vperm v2, v2, v2, v3
2686; P9LE-NEXT:    blr
2687;
2688; P8BE-LABEL: fromDiffMemVarDui:
2689; P8BE:       # %bb.0: # %entry
2690; P8BE-NEXT:    sldi r4, r4, 2
2691; P8BE-NEXT:    addis r5, r2, .LCPI43_0@toc@ha
2692; P8BE-NEXT:    add r3, r3, r4
2693; P8BE-NEXT:    addi r4, r5, .LCPI43_0@toc@l
2694; P8BE-NEXT:    addi r3, r3, -12
2695; P8BE-NEXT:    lxvw4x v3, 0, r4
2696; P8BE-NEXT:    lxvw4x v2, 0, r3
2697; P8BE-NEXT:    vperm v2, v2, v2, v3
2698; P8BE-NEXT:    blr
2699;
2700; P8LE-LABEL: fromDiffMemVarDui:
2701; P8LE:       # %bb.0: # %entry
2702; P8LE-NEXT:    sldi r4, r4, 2
2703; P8LE-NEXT:    addis r5, r2, .LCPI43_0@toc@ha
2704; P8LE-NEXT:    add r3, r3, r4
2705; P8LE-NEXT:    addi r3, r3, -12
2706; P8LE-NEXT:    lxvd2x vs0, 0, r3
2707; P8LE-NEXT:    addi r3, r5, .LCPI43_0@toc@l
2708; P8LE-NEXT:    lvx v3, 0, r3
2709; P8LE-NEXT:    xxswapd v2, vs0
2710; P8LE-NEXT:    vperm v2, v2, v2, v3
2711; P8LE-NEXT:    blr
2712entry:
2713  %idxprom = sext i32 %elem to i64
2714  %arrayidx = getelementptr inbounds i32, i32* %arr, i64 %idxprom
2715  %0 = load i32, i32* %arrayidx, align 4
2716  %vecinit = insertelement <4 x i32> undef, i32 %0, i32 0
2717  %sub = add nsw i32 %elem, -1
2718  %idxprom1 = sext i32 %sub to i64
2719  %arrayidx2 = getelementptr inbounds i32, i32* %arr, i64 %idxprom1
2720  %1 = load i32, i32* %arrayidx2, align 4
2721  %vecinit3 = insertelement <4 x i32> %vecinit, i32 %1, i32 1
2722  %sub4 = add nsw i32 %elem, -2
2723  %idxprom5 = sext i32 %sub4 to i64
2724  %arrayidx6 = getelementptr inbounds i32, i32* %arr, i64 %idxprom5
2725  %2 = load i32, i32* %arrayidx6, align 4
2726  %vecinit7 = insertelement <4 x i32> %vecinit3, i32 %2, i32 2
2727  %sub8 = add nsw i32 %elem, -3
2728  %idxprom9 = sext i32 %sub8 to i64
2729  %arrayidx10 = getelementptr inbounds i32, i32* %arr, i64 %idxprom9
2730  %3 = load i32, i32* %arrayidx10, align 4
2731  %vecinit11 = insertelement <4 x i32> %vecinit7, i32 %3, i32 3
2732  ret <4 x i32> %vecinit11
2733}
2734
2735; Function Attrs: norecurse nounwind readonly
2736define <4 x i32> @fromRandMemConsui(i32* nocapture readonly %arr) {
2737; P9BE-LABEL: fromRandMemConsui:
2738; P9BE:       # %bb.0: # %entry
2739; P9BE-NEXT:    lwz r4, 16(r3)
2740; P9BE-NEXT:    lwz r5, 72(r3)
2741; P9BE-NEXT:    lwz r6, 8(r3)
2742; P9BE-NEXT:    lwz r3, 352(r3)
2743; P9BE-NEXT:    rldimi r3, r6, 32, 0
2744; P9BE-NEXT:    rldimi r5, r4, 32, 0
2745; P9BE-NEXT:    mtvsrdd v2, r5, r3
2746; P9BE-NEXT:    blr
2747;
2748; P9LE-LABEL: fromRandMemConsui:
2749; P9LE:       # %bb.0: # %entry
2750; P9LE-NEXT:    lwz r4, 16(r3)
2751; P9LE-NEXT:    lwz r5, 72(r3)
2752; P9LE-NEXT:    lwz r6, 8(r3)
2753; P9LE-NEXT:    lwz r3, 352(r3)
2754; P9LE-NEXT:    rldimi r4, r5, 32, 0
2755; P9LE-NEXT:    rldimi r6, r3, 32, 0
2756; P9LE-NEXT:    mtvsrdd v2, r6, r4
2757; P9LE-NEXT:    blr
2758;
2759; P8BE-LABEL: fromRandMemConsui:
2760; P8BE:       # %bb.0: # %entry
2761; P8BE-NEXT:    lwz r4, 8(r3)
2762; P8BE-NEXT:    lwz r5, 352(r3)
2763; P8BE-NEXT:    lwz r6, 16(r3)
2764; P8BE-NEXT:    lwz r3, 72(r3)
2765; P8BE-NEXT:    rldimi r5, r4, 32, 0
2766; P8BE-NEXT:    rldimi r3, r6, 32, 0
2767; P8BE-NEXT:    mtvsrd f0, r5
2768; P8BE-NEXT:    mtvsrd f1, r3
2769; P8BE-NEXT:    xxmrghd v2, vs1, vs0
2770; P8BE-NEXT:    blr
2771;
2772; P8LE-LABEL: fromRandMemConsui:
2773; P8LE:       # %bb.0: # %entry
2774; P8LE-NEXT:    lwz r4, 16(r3)
2775; P8LE-NEXT:    lwz r5, 72(r3)
2776; P8LE-NEXT:    lwz r6, 8(r3)
2777; P8LE-NEXT:    lwz r3, 352(r3)
2778; P8LE-NEXT:    rldimi r4, r5, 32, 0
2779; P8LE-NEXT:    rldimi r6, r3, 32, 0
2780; P8LE-NEXT:    mtvsrd f0, r4
2781; P8LE-NEXT:    mtvsrd f1, r6
2782; P8LE-NEXT:    xxmrghd v2, vs1, vs0
2783; P8LE-NEXT:    blr
2784entry:
2785  %arrayidx = getelementptr inbounds i32, i32* %arr, i64 4
2786  %0 = load i32, i32* %arrayidx, align 4
2787  %vecinit = insertelement <4 x i32> undef, i32 %0, i32 0
2788  %arrayidx1 = getelementptr inbounds i32, i32* %arr, i64 18
2789  %1 = load i32, i32* %arrayidx1, align 4
2790  %vecinit2 = insertelement <4 x i32> %vecinit, i32 %1, i32 1
2791  %arrayidx3 = getelementptr inbounds i32, i32* %arr, i64 2
2792  %2 = load i32, i32* %arrayidx3, align 4
2793  %vecinit4 = insertelement <4 x i32> %vecinit2, i32 %2, i32 2
2794  %arrayidx5 = getelementptr inbounds i32, i32* %arr, i64 88
2795  %3 = load i32, i32* %arrayidx5, align 4
2796  %vecinit6 = insertelement <4 x i32> %vecinit4, i32 %3, i32 3
2797  ret <4 x i32> %vecinit6
2798}
2799
2800; Function Attrs: norecurse nounwind readonly
2801define <4 x i32> @fromRandMemVarui(i32* nocapture readonly %arr, i32 signext %elem) {
2802; P9BE-LABEL: fromRandMemVarui:
2803; P9BE:       # %bb.0: # %entry
2804; P9BE-NEXT:    sldi r4, r4, 2
2805; P9BE-NEXT:    add r3, r3, r4
2806; P9BE-NEXT:    lwz r4, 16(r3)
2807; P9BE-NEXT:    lwz r5, 4(r3)
2808; P9BE-NEXT:    lwz r6, 8(r3)
2809; P9BE-NEXT:    lwz r3, 32(r3)
2810; P9BE-NEXT:    rldimi r3, r6, 32, 0
2811; P9BE-NEXT:    rldimi r5, r4, 32, 0
2812; P9BE-NEXT:    mtvsrdd v2, r5, r3
2813; P9BE-NEXT:    blr
2814;
2815; P9LE-LABEL: fromRandMemVarui:
2816; P9LE:       # %bb.0: # %entry
2817; P9LE-NEXT:    sldi r4, r4, 2
2818; P9LE-NEXT:    add r3, r3, r4
2819; P9LE-NEXT:    lwz r4, 16(r3)
2820; P9LE-NEXT:    lwz r5, 4(r3)
2821; P9LE-NEXT:    lwz r6, 8(r3)
2822; P9LE-NEXT:    lwz r3, 32(r3)
2823; P9LE-NEXT:    rldimi r4, r5, 32, 0
2824; P9LE-NEXT:    rldimi r6, r3, 32, 0
2825; P9LE-NEXT:    mtvsrdd v2, r6, r4
2826; P9LE-NEXT:    blr
2827;
2828; P8BE-LABEL: fromRandMemVarui:
2829; P8BE:       # %bb.0: # %entry
2830; P8BE-NEXT:    sldi r4, r4, 2
2831; P8BE-NEXT:    add r3, r3, r4
2832; P8BE-NEXT:    lwz r4, 8(r3)
2833; P8BE-NEXT:    lwz r5, 32(r3)
2834; P8BE-NEXT:    lwz r6, 16(r3)
2835; P8BE-NEXT:    lwz r3, 4(r3)
2836; P8BE-NEXT:    rldimi r5, r4, 32, 0
2837; P8BE-NEXT:    rldimi r3, r6, 32, 0
2838; P8BE-NEXT:    mtvsrd f0, r5
2839; P8BE-NEXT:    mtvsrd f1, r3
2840; P8BE-NEXT:    xxmrghd v2, vs1, vs0
2841; P8BE-NEXT:    blr
2842;
2843; P8LE-LABEL: fromRandMemVarui:
2844; P8LE:       # %bb.0: # %entry
2845; P8LE-NEXT:    sldi r4, r4, 2
2846; P8LE-NEXT:    add r3, r3, r4
2847; P8LE-NEXT:    lwz r4, 16(r3)
2848; P8LE-NEXT:    lwz r5, 4(r3)
2849; P8LE-NEXT:    lwz r6, 8(r3)
2850; P8LE-NEXT:    lwz r3, 32(r3)
2851; P8LE-NEXT:    rldimi r4, r5, 32, 0
2852; P8LE-NEXT:    rldimi r6, r3, 32, 0
2853; P8LE-NEXT:    mtvsrd f0, r4
2854; P8LE-NEXT:    mtvsrd f1, r6
2855; P8LE-NEXT:    xxmrghd v2, vs1, vs0
2856; P8LE-NEXT:    blr
2857entry:
2858  %add = add nsw i32 %elem, 4
2859  %idxprom = sext i32 %add to i64
2860  %arrayidx = getelementptr inbounds i32, i32* %arr, i64 %idxprom
2861  %0 = load i32, i32* %arrayidx, align 4
2862  %vecinit = insertelement <4 x i32> undef, i32 %0, i32 0
2863  %add1 = add nsw i32 %elem, 1
2864  %idxprom2 = sext i32 %add1 to i64
2865  %arrayidx3 = getelementptr inbounds i32, i32* %arr, i64 %idxprom2
2866  %1 = load i32, i32* %arrayidx3, align 4
2867  %vecinit4 = insertelement <4 x i32> %vecinit, i32 %1, i32 1
2868  %add5 = add nsw i32 %elem, 2
2869  %idxprom6 = sext i32 %add5 to i64
2870  %arrayidx7 = getelementptr inbounds i32, i32* %arr, i64 %idxprom6
2871  %2 = load i32, i32* %arrayidx7, align 4
2872  %vecinit8 = insertelement <4 x i32> %vecinit4, i32 %2, i32 2
2873  %add9 = add nsw i32 %elem, 8
2874  %idxprom10 = sext i32 %add9 to i64
2875  %arrayidx11 = getelementptr inbounds i32, i32* %arr, i64 %idxprom10
2876  %3 = load i32, i32* %arrayidx11, align 4
2877  %vecinit12 = insertelement <4 x i32> %vecinit8, i32 %3, i32 3
2878  ret <4 x i32> %vecinit12
2879}
2880
2881; Function Attrs: norecurse nounwind readnone
2882define <4 x i32> @spltRegValui(i32 zeroext %val) {
2883; P9BE-LABEL: spltRegValui:
2884; P9BE:       # %bb.0: # %entry
2885; P9BE-NEXT:    mtvsrws v2, r3
2886; P9BE-NEXT:    blr
2887;
2888; P9LE-LABEL: spltRegValui:
2889; P9LE:       # %bb.0: # %entry
2890; P9LE-NEXT:    mtvsrws v2, r3
2891; P9LE-NEXT:    blr
2892;
2893; P8BE-LABEL: spltRegValui:
2894; P8BE:       # %bb.0: # %entry
2895; P8BE-NEXT:    mtvsrwz f0, r3
2896; P8BE-NEXT:    xxspltw v2, vs0, 1
2897; P8BE-NEXT:    blr
2898;
2899; P8LE-LABEL: spltRegValui:
2900; P8LE:       # %bb.0: # %entry
2901; P8LE-NEXT:    mtvsrwz f0, r3
2902; P8LE-NEXT:    xxspltw v2, vs0, 1
2903; P8LE-NEXT:    blr
2904entry:
2905  %splat.splatinsert = insertelement <4 x i32> undef, i32 %val, i32 0
2906  %splat.splat = shufflevector <4 x i32> %splat.splatinsert, <4 x i32> undef, <4 x i32> zeroinitializer
2907  ret <4 x i32> %splat.splat
2908}
2909
2910; Function Attrs: norecurse nounwind readonly
2911define <4 x i32> @spltMemValui(i32* nocapture readonly %ptr) {
2912; P9BE-LABEL: spltMemValui:
2913; P9BE:       # %bb.0: # %entry
2914; P9BE-NEXT:    lfiwzx f0, 0, r3
2915; P9BE-NEXT:    xxsldwi vs0, f0, f0, 1
2916; P9BE-NEXT:    xxspltw v2, vs0, 0
2917; P9BE-NEXT:    blr
2918;
2919; P9LE-LABEL: spltMemValui:
2920; P9LE:       # %bb.0: # %entry
2921; P9LE-NEXT:    lfiwzx f0, 0, r3
2922; P9LE-NEXT:    xxpermdi vs0, f0, f0, 2
2923; P9LE-NEXT:    xxspltw v2, vs0, 3
2924; P9LE-NEXT:    blr
2925;
2926; P8BE-LABEL: spltMemValui:
2927; P8BE:       # %bb.0: # %entry
2928; P8BE-NEXT:    lfiwzx f0, 0, r3
2929; P8BE-NEXT:    xxsldwi vs0, f0, f0, 1
2930; P8BE-NEXT:    xxspltw v2, vs0, 0
2931; P8BE-NEXT:    blr
2932;
2933; P8LE-LABEL: spltMemValui:
2934; P8LE:       # %bb.0: # %entry
2935; P8LE-NEXT:    lfiwzx f0, 0, r3
2936; P8LE-NEXT:    xxpermdi vs0, f0, f0, 2
2937; P8LE-NEXT:    xxspltw v2, vs0, 3
2938; P8LE-NEXT:    blr
2939entry:
2940  %0 = load i32, i32* %ptr, align 4
2941  %splat.splatinsert = insertelement <4 x i32> undef, i32 %0, i32 0
2942  %splat.splat = shufflevector <4 x i32> %splat.splatinsert, <4 x i32> undef, <4 x i32> zeroinitializer
2943  ret <4 x i32> %splat.splat
2944}
2945
2946; Function Attrs: norecurse nounwind readnone
2947define <4 x i32> @spltCnstConvftoui() {
2948; P9BE-LABEL: spltCnstConvftoui:
2949; P9BE:       # %bb.0: # %entry
2950; P9BE-NEXT:    vspltisw v2, 4
2951; P9BE-NEXT:    blr
2952;
2953; P9LE-LABEL: spltCnstConvftoui:
2954; P9LE:       # %bb.0: # %entry
2955; P9LE-NEXT:    vspltisw v2, 4
2956; P9LE-NEXT:    blr
2957;
2958; P8BE-LABEL: spltCnstConvftoui:
2959; P8BE:       # %bb.0: # %entry
2960; P8BE-NEXT:    vspltisw v2, 4
2961; P8BE-NEXT:    blr
2962;
2963; P8LE-LABEL: spltCnstConvftoui:
2964; P8LE:       # %bb.0: # %entry
2965; P8LE-NEXT:    vspltisw v2, 4
2966; P8LE-NEXT:    blr
2967entry:
2968  ret <4 x i32> <i32 4, i32 4, i32 4, i32 4>
2969}
2970
2971; Function Attrs: norecurse nounwind readnone
2972define <4 x i32> @fromRegsConvftoui(float %a, float %b, float %c, float %d) {
2973; P9BE-LABEL: fromRegsConvftoui:
2974; P9BE:       # %bb.0: # %entry
2975; P9BE-NEXT:    # kill: def $f4 killed $f4 def $vsl4
2976; P9BE-NEXT:    # kill: def $f2 killed $f2 def $vsl2
2977; P9BE-NEXT:    xxmrghd vs0, vs2, vs4
2978; P9BE-NEXT:    # kill: def $f3 killed $f3 def $vsl3
2979; P9BE-NEXT:    # kill: def $f1 killed $f1 def $vsl1
2980; P9BE-NEXT:    xvcvdpuxws v2, vs0
2981; P9BE-NEXT:    xxmrghd vs0, vs1, vs3
2982; P9BE-NEXT:    xvcvdpuxws v3, vs0
2983; P9BE-NEXT:    vmrgew v2, v3, v2
2984; P9BE-NEXT:    blr
2985;
2986; P9LE-LABEL: fromRegsConvftoui:
2987; P9LE:       # %bb.0: # %entry
2988; P9LE-NEXT:    # kill: def $f3 killed $f3 def $vsl3
2989; P9LE-NEXT:    # kill: def $f1 killed $f1 def $vsl1
2990; P9LE-NEXT:    xxmrghd vs0, vs3, vs1
2991; P9LE-NEXT:    # kill: def $f4 killed $f4 def $vsl4
2992; P9LE-NEXT:    # kill: def $f2 killed $f2 def $vsl2
2993; P9LE-NEXT:    xvcvdpuxws v2, vs0
2994; P9LE-NEXT:    xxmrghd vs0, vs4, vs2
2995; P9LE-NEXT:    xvcvdpuxws v3, vs0
2996; P9LE-NEXT:    vmrgew v2, v3, v2
2997; P9LE-NEXT:    blr
2998;
2999; P8BE-LABEL: fromRegsConvftoui:
3000; P8BE:       # %bb.0: # %entry
3001; P8BE-NEXT:    # kill: def $f1 killed $f1 def $vsl1
3002; P8BE-NEXT:    # kill: def $f4 killed $f4 def $vsl4
3003; P8BE-NEXT:    # kill: def $f3 killed $f3 def $vsl3
3004; P8BE-NEXT:    # kill: def $f2 killed $f2 def $vsl2
3005; P8BE-NEXT:    xxmrghd vs0, vs2, vs4
3006; P8BE-NEXT:    xxmrghd vs1, vs1, vs3
3007; P8BE-NEXT:    xvcvdpuxws v2, vs0
3008; P8BE-NEXT:    xvcvdpuxws v3, vs1
3009; P8BE-NEXT:    vmrgew v2, v3, v2
3010; P8BE-NEXT:    blr
3011;
3012; P8LE-LABEL: fromRegsConvftoui:
3013; P8LE:       # %bb.0: # %entry
3014; P8LE-NEXT:    # kill: def $f1 killed $f1 def $vsl1
3015; P8LE-NEXT:    # kill: def $f4 killed $f4 def $vsl4
3016; P8LE-NEXT:    # kill: def $f3 killed $f3 def $vsl3
3017; P8LE-NEXT:    # kill: def $f2 killed $f2 def $vsl2
3018; P8LE-NEXT:    xxmrghd vs0, vs3, vs1
3019; P8LE-NEXT:    xxmrghd vs1, vs4, vs2
3020; P8LE-NEXT:    xvcvdpuxws v2, vs0
3021; P8LE-NEXT:    xvcvdpuxws v3, vs1
3022; P8LE-NEXT:    vmrgew v2, v3, v2
3023; P8LE-NEXT:    blr
3024entry:
3025  %conv = fptoui float %a to i32
3026  %vecinit = insertelement <4 x i32> undef, i32 %conv, i32 0
3027  %conv1 = fptoui float %b to i32
3028  %vecinit2 = insertelement <4 x i32> %vecinit, i32 %conv1, i32 1
3029  %conv3 = fptoui float %c to i32
3030  %vecinit4 = insertelement <4 x i32> %vecinit2, i32 %conv3, i32 2
3031  %conv5 = fptoui float %d to i32
3032  %vecinit6 = insertelement <4 x i32> %vecinit4, i32 %conv5, i32 3
3033  ret <4 x i32> %vecinit6
3034}
3035
3036; Function Attrs: norecurse nounwind readnone
3037define <4 x i32> @fromDiffConstsConvftoui() {
3038; P9BE-LABEL: fromDiffConstsConvftoui:
3039; P9BE:       # %bb.0: # %entry
3040; P9BE-NEXT:    addis r3, r2, .LCPI50_0@toc@ha
3041; P9BE-NEXT:    addi r3, r3, .LCPI50_0@toc@l
3042; P9BE-NEXT:    lxvx v2, 0, r3
3043; P9BE-NEXT:    blr
3044;
3045; P9LE-LABEL: fromDiffConstsConvftoui:
3046; P9LE:       # %bb.0: # %entry
3047; P9LE-NEXT:    addis r3, r2, .LCPI50_0@toc@ha
3048; P9LE-NEXT:    addi r3, r3, .LCPI50_0@toc@l
3049; P9LE-NEXT:    lxvx v2, 0, r3
3050; P9LE-NEXT:    blr
3051;
3052; P8BE-LABEL: fromDiffConstsConvftoui:
3053; P8BE:       # %bb.0: # %entry
3054; P8BE-NEXT:    addis r3, r2, .LCPI50_0@toc@ha
3055; P8BE-NEXT:    addi r3, r3, .LCPI50_0@toc@l
3056; P8BE-NEXT:    lxvw4x v2, 0, r3
3057; P8BE-NEXT:    blr
3058;
3059; P8LE-LABEL: fromDiffConstsConvftoui:
3060; P8LE:       # %bb.0: # %entry
3061; P8LE-NEXT:    addis r3, r2, .LCPI50_0@toc@ha
3062; P8LE-NEXT:    addi r3, r3, .LCPI50_0@toc@l
3063; P8LE-NEXT:    lvx v2, 0, r3
3064; P8LE-NEXT:    blr
3065entry:
3066  ret <4 x i32> <i32 24, i32 234, i32 988, i32 422>
3067}
3068
3069; Function Attrs: norecurse nounwind readonly
3070define <4 x i32> @fromDiffMemConsAConvftoui(float* nocapture readonly %ptr) {
3071; P9BE-LABEL: fromDiffMemConsAConvftoui:
3072; P9BE:       # %bb.0: # %entry
3073; P9BE-NEXT:    lxv vs0, 0(r3)
3074; P9BE-NEXT:    xvcvspuxws v2, vs0
3075; P9BE-NEXT:    blr
3076;
3077; P9LE-LABEL: fromDiffMemConsAConvftoui:
3078; P9LE:       # %bb.0: # %entry
3079; P9LE-NEXT:    lxv vs0, 0(r3)
3080; P9LE-NEXT:    xvcvspuxws v2, vs0
3081; P9LE-NEXT:    blr
3082;
3083; P8BE-LABEL: fromDiffMemConsAConvftoui:
3084; P8BE:       # %bb.0: # %entry
3085; P8BE-NEXT:    lxvw4x vs0, 0, r3
3086; P8BE-NEXT:    xvcvspuxws v2, vs0
3087; P8BE-NEXT:    blr
3088;
3089; P8LE-LABEL: fromDiffMemConsAConvftoui:
3090; P8LE:       # %bb.0: # %entry
3091; P8LE-NEXT:    lxvd2x vs0, 0, r3
3092; P8LE-NEXT:    xxswapd v2, vs0
3093; P8LE-NEXT:    xvcvspuxws v2, v2
3094; P8LE-NEXT:    blr
3095entry:
3096  %0 = bitcast float* %ptr to <4 x float>*
3097  %1 = load <4 x float>, <4 x float>* %0, align 4
3098  %2 = fptoui <4 x float> %1 to <4 x i32>
3099  ret <4 x i32> %2
3100}
3101
3102; Function Attrs: norecurse nounwind readonly
3103define <4 x i32> @fromDiffMemConsDConvftoui(float* nocapture readonly %ptr) {
3104; P9BE-LABEL: fromDiffMemConsDConvftoui:
3105; P9BE:       # %bb.0: # %entry
3106; P9BE-NEXT:    lxv v2, 0(r3)
3107; P9BE-NEXT:    addis r3, r2, .LCPI52_0@toc@ha
3108; P9BE-NEXT:    addi r3, r3, .LCPI52_0@toc@l
3109; P9BE-NEXT:    lxvx v3, 0, r3
3110; P9BE-NEXT:    vperm v2, v2, v2, v3
3111; P9BE-NEXT:    xvcvspuxws v2, v2
3112; P9BE-NEXT:    blr
3113;
3114; P9LE-LABEL: fromDiffMemConsDConvftoui:
3115; P9LE:       # %bb.0: # %entry
3116; P9LE-NEXT:    lxv v2, 0(r3)
3117; P9LE-NEXT:    addis r3, r2, .LCPI52_0@toc@ha
3118; P9LE-NEXT:    addi r3, r3, .LCPI52_0@toc@l
3119; P9LE-NEXT:    lxvx v3, 0, r3
3120; P9LE-NEXT:    vperm v2, v2, v2, v3
3121; P9LE-NEXT:    xvcvspuxws v2, v2
3122; P9LE-NEXT:    blr
3123;
3124; P8BE-LABEL: fromDiffMemConsDConvftoui:
3125; P8BE:       # %bb.0: # %entry
3126; P8BE-NEXT:    addis r4, r2, .LCPI52_0@toc@ha
3127; P8BE-NEXT:    lxvw4x v2, 0, r3
3128; P8BE-NEXT:    addi r4, r4, .LCPI52_0@toc@l
3129; P8BE-NEXT:    lxvw4x v3, 0, r4
3130; P8BE-NEXT:    vperm v2, v2, v2, v3
3131; P8BE-NEXT:    xvcvspuxws v2, v2
3132; P8BE-NEXT:    blr
3133;
3134; P8LE-LABEL: fromDiffMemConsDConvftoui:
3135; P8LE:       # %bb.0: # %entry
3136; P8LE-NEXT:    lxvd2x vs0, 0, r3
3137; P8LE-NEXT:    addis r4, r2, .LCPI52_0@toc@ha
3138; P8LE-NEXT:    addi r3, r4, .LCPI52_0@toc@l
3139; P8LE-NEXT:    lvx v2, 0, r3
3140; P8LE-NEXT:    xxswapd v3, vs0
3141; P8LE-NEXT:    vperm v2, v3, v3, v2
3142; P8LE-NEXT:    xvcvspuxws v2, v2
3143; P8LE-NEXT:    blr
3144entry:
3145  %arrayidx = getelementptr inbounds float, float* %ptr, i64 3
3146  %0 = load float, float* %arrayidx, align 4
3147  %conv = fptoui float %0 to i32
3148  %vecinit = insertelement <4 x i32> undef, i32 %conv, i32 0
3149  %arrayidx1 = getelementptr inbounds float, float* %ptr, i64 2
3150  %1 = load float, float* %arrayidx1, align 4
3151  %conv2 = fptoui float %1 to i32
3152  %vecinit3 = insertelement <4 x i32> %vecinit, i32 %conv2, i32 1
3153  %arrayidx4 = getelementptr inbounds float, float* %ptr, i64 1
3154  %2 = load float, float* %arrayidx4, align 4
3155  %conv5 = fptoui float %2 to i32
3156  %vecinit6 = insertelement <4 x i32> %vecinit3, i32 %conv5, i32 2
3157  %3 = load float, float* %ptr, align 4
3158  %conv8 = fptoui float %3 to i32
3159  %vecinit9 = insertelement <4 x i32> %vecinit6, i32 %conv8, i32 3
3160  ret <4 x i32> %vecinit9
3161}
3162
3163; Function Attrs: norecurse nounwind readonly
3164define <4 x i32> @fromDiffMemVarAConvftoui(float* nocapture readonly %arr, i32 signext %elem) {
3165; P9BE-LABEL: fromDiffMemVarAConvftoui:
3166; P9BE:       # %bb.0: # %entry
3167; P9BE-NEXT:    sldi r4, r4, 2
3168; P9BE-NEXT:    lfsux f0, r3, r4
3169; P9BE-NEXT:    lfs f1, 12(r3)
3170; P9BE-NEXT:    lfs f2, 4(r3)
3171; P9BE-NEXT:    xxmrghd vs1, vs2, vs1
3172; P9BE-NEXT:    xvcvdpsp v2, vs1
3173; P9BE-NEXT:    lfs f1, 8(r3)
3174; P9BE-NEXT:    xxmrghd vs0, vs0, vs1
3175; P9BE-NEXT:    xvcvdpsp v3, vs0
3176; P9BE-NEXT:    vmrgew v2, v3, v2
3177; P9BE-NEXT:    xvcvspuxws v2, v2
3178; P9BE-NEXT:    blr
3179;
3180; P9LE-LABEL: fromDiffMemVarAConvftoui:
3181; P9LE:       # %bb.0: # %entry
3182; P9LE-NEXT:    sldi r4, r4, 2
3183; P9LE-NEXT:    lfsux f0, r3, r4
3184; P9LE-NEXT:    lfs f1, 8(r3)
3185; P9LE-NEXT:    xxmrghd vs0, vs1, vs0
3186; P9LE-NEXT:    lfs f1, 12(r3)
3187; P9LE-NEXT:    xvcvdpsp v2, vs0
3188; P9LE-NEXT:    lfs f0, 4(r3)
3189; P9LE-NEXT:    xxmrghd vs0, vs1, vs0
3190; P9LE-NEXT:    xvcvdpsp v3, vs0
3191; P9LE-NEXT:    vmrgew v2, v3, v2
3192; P9LE-NEXT:    xvcvspuxws v2, v2
3193; P9LE-NEXT:    blr
3194;
3195; P8BE-LABEL: fromDiffMemVarAConvftoui:
3196; P8BE:       # %bb.0: # %entry
3197; P8BE-NEXT:    sldi r4, r4, 2
3198; P8BE-NEXT:    lfsux f0, r3, r4
3199; P8BE-NEXT:    lfs f1, 12(r3)
3200; P8BE-NEXT:    lfs f2, 4(r3)
3201; P8BE-NEXT:    lfs f3, 8(r3)
3202; P8BE-NEXT:    xxmrghd vs1, vs2, vs1
3203; P8BE-NEXT:    xxmrghd vs0, vs0, vs3
3204; P8BE-NEXT:    xvcvdpsp v2, vs1
3205; P8BE-NEXT:    xvcvdpsp v3, vs0
3206; P8BE-NEXT:    vmrgew v2, v3, v2
3207; P8BE-NEXT:    xvcvspuxws v2, v2
3208; P8BE-NEXT:    blr
3209;
3210; P8LE-LABEL: fromDiffMemVarAConvftoui:
3211; P8LE:       # %bb.0: # %entry
3212; P8LE-NEXT:    sldi r4, r4, 2
3213; P8LE-NEXT:    lfsux f0, r3, r4
3214; P8LE-NEXT:    lfs f1, 8(r3)
3215; P8LE-NEXT:    lfs f2, 4(r3)
3216; P8LE-NEXT:    lfs f3, 12(r3)
3217; P8LE-NEXT:    xxmrghd vs0, vs1, vs0
3218; P8LE-NEXT:    xxmrghd vs1, vs3, vs2
3219; P8LE-NEXT:    xvcvdpsp v2, vs0
3220; P8LE-NEXT:    xvcvdpsp v3, vs1
3221; P8LE-NEXT:    vmrgew v2, v3, v2
3222; P8LE-NEXT:    xvcvspuxws v2, v2
3223; P8LE-NEXT:    blr
3224entry:
3225  %idxprom = sext i32 %elem to i64
3226  %arrayidx = getelementptr inbounds float, float* %arr, i64 %idxprom
3227  %0 = load float, float* %arrayidx, align 4
3228  %conv = fptoui float %0 to i32
3229  %vecinit = insertelement <4 x i32> undef, i32 %conv, i32 0
3230  %add = add nsw i32 %elem, 1
3231  %idxprom1 = sext i32 %add to i64
3232  %arrayidx2 = getelementptr inbounds float, float* %arr, i64 %idxprom1
3233  %1 = load float, float* %arrayidx2, align 4
3234  %conv3 = fptoui float %1 to i32
3235  %vecinit4 = insertelement <4 x i32> %vecinit, i32 %conv3, i32 1
3236  %add5 = add nsw i32 %elem, 2
3237  %idxprom6 = sext i32 %add5 to i64
3238  %arrayidx7 = getelementptr inbounds float, float* %arr, i64 %idxprom6
3239  %2 = load float, float* %arrayidx7, align 4
3240  %conv8 = fptoui float %2 to i32
3241  %vecinit9 = insertelement <4 x i32> %vecinit4, i32 %conv8, i32 2
3242  %add10 = add nsw i32 %elem, 3
3243  %idxprom11 = sext i32 %add10 to i64
3244  %arrayidx12 = getelementptr inbounds float, float* %arr, i64 %idxprom11
3245  %3 = load float, float* %arrayidx12, align 4
3246  %conv13 = fptoui float %3 to i32
3247  %vecinit14 = insertelement <4 x i32> %vecinit9, i32 %conv13, i32 3
3248  ret <4 x i32> %vecinit14
3249; FIXME: implement finding consecutive loads with pre-inc
3250}
3251
3252; Function Attrs: norecurse nounwind readonly
3253define <4 x i32> @fromDiffMemVarDConvftoui(float* nocapture readonly %arr, i32 signext %elem) {
3254; P9BE-LABEL: fromDiffMemVarDConvftoui:
3255; P9BE:       # %bb.0: # %entry
3256; P9BE-NEXT:    sldi r4, r4, 2
3257; P9BE-NEXT:    lfsux f0, r3, r4
3258; P9BE-NEXT:    lfs f1, -12(r3)
3259; P9BE-NEXT:    lfs f2, -4(r3)
3260; P9BE-NEXT:    xxmrghd vs1, vs2, vs1
3261; P9BE-NEXT:    xvcvdpsp v2, vs1
3262; P9BE-NEXT:    lfs f1, -8(r3)
3263; P9BE-NEXT:    xxmrghd vs0, vs0, vs1
3264; P9BE-NEXT:    xvcvdpsp v3, vs0
3265; P9BE-NEXT:    vmrgew v2, v3, v2
3266; P9BE-NEXT:    xvcvspuxws v2, v2
3267; P9BE-NEXT:    blr
3268;
3269; P9LE-LABEL: fromDiffMemVarDConvftoui:
3270; P9LE:       # %bb.0: # %entry
3271; P9LE-NEXT:    sldi r4, r4, 2
3272; P9LE-NEXT:    lfsux f0, r3, r4
3273; P9LE-NEXT:    lfs f1, -8(r3)
3274; P9LE-NEXT:    xxmrghd vs0, vs1, vs0
3275; P9LE-NEXT:    lfs f1, -12(r3)
3276; P9LE-NEXT:    xvcvdpsp v2, vs0
3277; P9LE-NEXT:    lfs f0, -4(r3)
3278; P9LE-NEXT:    xxmrghd vs0, vs1, vs0
3279; P9LE-NEXT:    xvcvdpsp v3, vs0
3280; P9LE-NEXT:    vmrgew v2, v3, v2
3281; P9LE-NEXT:    xvcvspuxws v2, v2
3282; P9LE-NEXT:    blr
3283;
3284; P8BE-LABEL: fromDiffMemVarDConvftoui:
3285; P8BE:       # %bb.0: # %entry
3286; P8BE-NEXT:    sldi r4, r4, 2
3287; P8BE-NEXT:    lfsux f0, r3, r4
3288; P8BE-NEXT:    lfs f1, -12(r3)
3289; P8BE-NEXT:    lfs f2, -4(r3)
3290; P8BE-NEXT:    lfs f3, -8(r3)
3291; P8BE-NEXT:    xxmrghd vs1, vs2, vs1
3292; P8BE-NEXT:    xxmrghd vs0, vs0, vs3
3293; P8BE-NEXT:    xvcvdpsp v2, vs1
3294; P8BE-NEXT:    xvcvdpsp v3, vs0
3295; P8BE-NEXT:    vmrgew v2, v3, v2
3296; P8BE-NEXT:    xvcvspuxws v2, v2
3297; P8BE-NEXT:    blr
3298;
3299; P8LE-LABEL: fromDiffMemVarDConvftoui:
3300; P8LE:       # %bb.0: # %entry
3301; P8LE-NEXT:    sldi r4, r4, 2
3302; P8LE-NEXT:    lfsux f0, r3, r4
3303; P8LE-NEXT:    lfs f1, -8(r3)
3304; P8LE-NEXT:    lfs f2, -4(r3)
3305; P8LE-NEXT:    lfs f3, -12(r3)
3306; P8LE-NEXT:    xxmrghd vs0, vs1, vs0
3307; P8LE-NEXT:    xxmrghd vs1, vs3, vs2
3308; P8LE-NEXT:    xvcvdpsp v2, vs0
3309; P8LE-NEXT:    xvcvdpsp v3, vs1
3310; P8LE-NEXT:    vmrgew v2, v3, v2
3311; P8LE-NEXT:    xvcvspuxws v2, v2
3312; P8LE-NEXT:    blr
3313entry:
3314  %idxprom = sext i32 %elem to i64
3315  %arrayidx = getelementptr inbounds float, float* %arr, i64 %idxprom
3316  %0 = load float, float* %arrayidx, align 4
3317  %conv = fptoui float %0 to i32
3318  %vecinit = insertelement <4 x i32> undef, i32 %conv, i32 0
3319  %sub = add nsw i32 %elem, -1
3320  %idxprom1 = sext i32 %sub to i64
3321  %arrayidx2 = getelementptr inbounds float, float* %arr, i64 %idxprom1
3322  %1 = load float, float* %arrayidx2, align 4
3323  %conv3 = fptoui float %1 to i32
3324  %vecinit4 = insertelement <4 x i32> %vecinit, i32 %conv3, i32 1
3325  %sub5 = add nsw i32 %elem, -2
3326  %idxprom6 = sext i32 %sub5 to i64
3327  %arrayidx7 = getelementptr inbounds float, float* %arr, i64 %idxprom6
3328  %2 = load float, float* %arrayidx7, align 4
3329  %conv8 = fptoui float %2 to i32
3330  %vecinit9 = insertelement <4 x i32> %vecinit4, i32 %conv8, i32 2
3331  %sub10 = add nsw i32 %elem, -3
3332  %idxprom11 = sext i32 %sub10 to i64
3333  %arrayidx12 = getelementptr inbounds float, float* %arr, i64 %idxprom11
3334  %3 = load float, float* %arrayidx12, align 4
3335  %conv13 = fptoui float %3 to i32
3336  %vecinit14 = insertelement <4 x i32> %vecinit9, i32 %conv13, i32 3
3337  ret <4 x i32> %vecinit14
3338; FIXME: implement finding consecutive loads with pre-inc
3339}
3340
3341; Function Attrs: norecurse nounwind readnone
3342define <4 x i32> @spltRegValConvftoui(float %val) {
3343; P9BE-LABEL: spltRegValConvftoui:
3344; P9BE:       # %bb.0: # %entry
3345; P9BE-NEXT:    xscvdpuxws f0, f1
3346; P9BE-NEXT:    xxspltw v2, vs0, 1
3347; P9BE-NEXT:    blr
3348;
3349; P9LE-LABEL: spltRegValConvftoui:
3350; P9LE:       # %bb.0: # %entry
3351; P9LE-NEXT:    xscvdpuxws f0, f1
3352; P9LE-NEXT:    xxspltw v2, vs0, 1
3353; P9LE-NEXT:    blr
3354;
3355; P8BE-LABEL: spltRegValConvftoui:
3356; P8BE:       # %bb.0: # %entry
3357; P8BE-NEXT:    xscvdpuxws f0, f1
3358; P8BE-NEXT:    xxspltw v2, vs0, 1
3359; P8BE-NEXT:    blr
3360;
3361; P8LE-LABEL: spltRegValConvftoui:
3362; P8LE:       # %bb.0: # %entry
3363; P8LE-NEXT:    xscvdpuxws f0, f1
3364; P8LE-NEXT:    xxspltw v2, vs0, 1
3365; P8LE-NEXT:    blr
3366entry:
3367  %conv = fptoui float %val to i32
3368  %splat.splatinsert = insertelement <4 x i32> undef, i32 %conv, i32 0
3369  %splat.splat = shufflevector <4 x i32> %splat.splatinsert, <4 x i32> undef, <4 x i32> zeroinitializer
3370  ret <4 x i32> %splat.splat
3371}
3372
3373; Function Attrs: norecurse nounwind readonly
3374define <4 x i32> @spltMemValConvftoui(float* nocapture readonly %ptr) {
3375; P9BE-LABEL: spltMemValConvftoui:
3376; P9BE:       # %bb.0: # %entry
3377; P9BE-NEXT:    lxvwsx vs0, 0, r3
3378; P9BE-NEXT:    xvcvspuxws v2, vs0
3379; P9BE-NEXT:    blr
3380;
3381; P9LE-LABEL: spltMemValConvftoui:
3382; P9LE:       # %bb.0: # %entry
3383; P9LE-NEXT:    lxvwsx vs0, 0, r3
3384; P9LE-NEXT:    xvcvspuxws v2, vs0
3385; P9LE-NEXT:    blr
3386;
3387; P8BE-LABEL: spltMemValConvftoui:
3388; P8BE:       # %bb.0: # %entry
3389; P8BE-NEXT:    lfsx f0, 0, r3
3390; P8BE-NEXT:    xscvdpuxws f0, f0
3391; P8BE-NEXT:    xxspltw v2, vs0, 1
3392; P8BE-NEXT:    blr
3393;
3394; P8LE-LABEL: spltMemValConvftoui:
3395; P8LE:       # %bb.0: # %entry
3396; P8LE-NEXT:    lfsx f0, 0, r3
3397; P8LE-NEXT:    xscvdpuxws f0, f0
3398; P8LE-NEXT:    xxspltw v2, vs0, 1
3399; P8LE-NEXT:    blr
3400entry:
3401  %0 = load float, float* %ptr, align 4
3402  %conv = fptoui float %0 to i32
3403  %splat.splatinsert = insertelement <4 x i32> undef, i32 %conv, i32 0
3404  %splat.splat = shufflevector <4 x i32> %splat.splatinsert, <4 x i32> undef, <4 x i32> zeroinitializer
3405  ret <4 x i32> %splat.splat
3406}
3407
3408; Function Attrs: norecurse nounwind readnone
3409define <4 x i32> @spltCnstConvdtoui() {
3410; P9BE-LABEL: spltCnstConvdtoui:
3411; P9BE:       # %bb.0: # %entry
3412; P9BE-NEXT:    vspltisw v2, 4
3413; P9BE-NEXT:    blr
3414;
3415; P9LE-LABEL: spltCnstConvdtoui:
3416; P9LE:       # %bb.0: # %entry
3417; P9LE-NEXT:    vspltisw v2, 4
3418; P9LE-NEXT:    blr
3419;
3420; P8BE-LABEL: spltCnstConvdtoui:
3421; P8BE:       # %bb.0: # %entry
3422; P8BE-NEXT:    vspltisw v2, 4
3423; P8BE-NEXT:    blr
3424;
3425; P8LE-LABEL: spltCnstConvdtoui:
3426; P8LE:       # %bb.0: # %entry
3427; P8LE-NEXT:    vspltisw v2, 4
3428; P8LE-NEXT:    blr
3429entry:
3430  ret <4 x i32> <i32 4, i32 4, i32 4, i32 4>
3431}
3432
3433; Function Attrs: norecurse nounwind readnone
3434define <4 x i32> @fromRegsConvdtoui(double %a, double %b, double %c, double %d) {
3435; P9BE-LABEL: fromRegsConvdtoui:
3436; P9BE:       # %bb.0: # %entry
3437; P9BE-NEXT:    # kill: def $f4 killed $f4 def $vsl4
3438; P9BE-NEXT:    # kill: def $f2 killed $f2 def $vsl2
3439; P9BE-NEXT:    xxmrghd vs0, vs2, vs4
3440; P9BE-NEXT:    # kill: def $f3 killed $f3 def $vsl3
3441; P9BE-NEXT:    # kill: def $f1 killed $f1 def $vsl1
3442; P9BE-NEXT:    xvcvdpuxws v2, vs0
3443; P9BE-NEXT:    xxmrghd vs0, vs1, vs3
3444; P9BE-NEXT:    xvcvdpuxws v3, vs0
3445; P9BE-NEXT:    vmrgew v2, v3, v2
3446; P9BE-NEXT:    blr
3447;
3448; P9LE-LABEL: fromRegsConvdtoui:
3449; P9LE:       # %bb.0: # %entry
3450; P9LE-NEXT:    # kill: def $f3 killed $f3 def $vsl3
3451; P9LE-NEXT:    # kill: def $f1 killed $f1 def $vsl1
3452; P9LE-NEXT:    xxmrghd vs0, vs3, vs1
3453; P9LE-NEXT:    # kill: def $f4 killed $f4 def $vsl4
3454; P9LE-NEXT:    # kill: def $f2 killed $f2 def $vsl2
3455; P9LE-NEXT:    xvcvdpuxws v2, vs0
3456; P9LE-NEXT:    xxmrghd vs0, vs4, vs2
3457; P9LE-NEXT:    xvcvdpuxws v3, vs0
3458; P9LE-NEXT:    vmrgew v2, v3, v2
3459; P9LE-NEXT:    blr
3460;
3461; P8BE-LABEL: fromRegsConvdtoui:
3462; P8BE:       # %bb.0: # %entry
3463; P8BE-NEXT:    # kill: def $f1 killed $f1 def $vsl1
3464; P8BE-NEXT:    # kill: def $f4 killed $f4 def $vsl4
3465; P8BE-NEXT:    # kill: def $f3 killed $f3 def $vsl3
3466; P8BE-NEXT:    # kill: def $f2 killed $f2 def $vsl2
3467; P8BE-NEXT:    xxmrghd vs0, vs2, vs4
3468; P8BE-NEXT:    xxmrghd vs1, vs1, vs3
3469; P8BE-NEXT:    xvcvdpuxws v2, vs0
3470; P8BE-NEXT:    xvcvdpuxws v3, vs1
3471; P8BE-NEXT:    vmrgew v2, v3, v2
3472; P8BE-NEXT:    blr
3473;
3474; P8LE-LABEL: fromRegsConvdtoui:
3475; P8LE:       # %bb.0: # %entry
3476; P8LE-NEXT:    # kill: def $f1 killed $f1 def $vsl1
3477; P8LE-NEXT:    # kill: def $f4 killed $f4 def $vsl4
3478; P8LE-NEXT:    # kill: def $f3 killed $f3 def $vsl3
3479; P8LE-NEXT:    # kill: def $f2 killed $f2 def $vsl2
3480; P8LE-NEXT:    xxmrghd vs0, vs3, vs1
3481; P8LE-NEXT:    xxmrghd vs1, vs4, vs2
3482; P8LE-NEXT:    xvcvdpuxws v2, vs0
3483; P8LE-NEXT:    xvcvdpuxws v3, vs1
3484; P8LE-NEXT:    vmrgew v2, v3, v2
3485; P8LE-NEXT:    blr
3486entry:
3487  %conv = fptoui double %a to i32
3488  %vecinit = insertelement <4 x i32> undef, i32 %conv, i32 0
3489  %conv1 = fptoui double %b to i32
3490  %vecinit2 = insertelement <4 x i32> %vecinit, i32 %conv1, i32 1
3491  %conv3 = fptoui double %c to i32
3492  %vecinit4 = insertelement <4 x i32> %vecinit2, i32 %conv3, i32 2
3493  %conv5 = fptoui double %d to i32
3494  %vecinit6 = insertelement <4 x i32> %vecinit4, i32 %conv5, i32 3
3495  ret <4 x i32> %vecinit6
3496}
3497
3498; Function Attrs: norecurse nounwind readnone
3499define <4 x i32> @fromDiffConstsConvdtoui() {
3500; P9BE-LABEL: fromDiffConstsConvdtoui:
3501; P9BE:       # %bb.0: # %entry
3502; P9BE-NEXT:    addis r3, r2, .LCPI59_0@toc@ha
3503; P9BE-NEXT:    addi r3, r3, .LCPI59_0@toc@l
3504; P9BE-NEXT:    lxvx v2, 0, r3
3505; P9BE-NEXT:    blr
3506;
3507; P9LE-LABEL: fromDiffConstsConvdtoui:
3508; P9LE:       # %bb.0: # %entry
3509; P9LE-NEXT:    addis r3, r2, .LCPI59_0@toc@ha
3510; P9LE-NEXT:    addi r3, r3, .LCPI59_0@toc@l
3511; P9LE-NEXT:    lxvx v2, 0, r3
3512; P9LE-NEXT:    blr
3513;
3514; P8BE-LABEL: fromDiffConstsConvdtoui:
3515; P8BE:       # %bb.0: # %entry
3516; P8BE-NEXT:    addis r3, r2, .LCPI59_0@toc@ha
3517; P8BE-NEXT:    addi r3, r3, .LCPI59_0@toc@l
3518; P8BE-NEXT:    lxvw4x v2, 0, r3
3519; P8BE-NEXT:    blr
3520;
3521; P8LE-LABEL: fromDiffConstsConvdtoui:
3522; P8LE:       # %bb.0: # %entry
3523; P8LE-NEXT:    addis r3, r2, .LCPI59_0@toc@ha
3524; P8LE-NEXT:    addi r3, r3, .LCPI59_0@toc@l
3525; P8LE-NEXT:    lvx v2, 0, r3
3526; P8LE-NEXT:    blr
3527entry:
3528  ret <4 x i32> <i32 24, i32 234, i32 988, i32 422>
3529}
3530
3531; Function Attrs: norecurse nounwind readonly
3532define <4 x i32> @fromDiffMemConsAConvdtoui(double* nocapture readonly %ptr) {
3533; P9BE-LABEL: fromDiffMemConsAConvdtoui:
3534; P9BE:       # %bb.0: # %entry
3535; P9BE-NEXT:    lxv vs0, 0(r3)
3536; P9BE-NEXT:    lxv vs1, 16(r3)
3537; P9BE-NEXT:    xxmrgld vs2, vs0, vs1
3538; P9BE-NEXT:    xxmrghd vs0, vs0, vs1
3539; P9BE-NEXT:    xvcvdpuxws v2, vs2
3540; P9BE-NEXT:    xvcvdpuxws v3, vs0
3541; P9BE-NEXT:    vmrgew v2, v3, v2
3542; P9BE-NEXT:    blr
3543;
3544; P9LE-LABEL: fromDiffMemConsAConvdtoui:
3545; P9LE:       # %bb.0: # %entry
3546; P9LE-NEXT:    lxv vs0, 0(r3)
3547; P9LE-NEXT:    lxv vs1, 16(r3)
3548; P9LE-NEXT:    xxmrgld vs2, vs1, vs0
3549; P9LE-NEXT:    xxmrghd vs0, vs1, vs0
3550; P9LE-NEXT:    xvcvdpuxws v2, vs2
3551; P9LE-NEXT:    xvcvdpuxws v3, vs0
3552; P9LE-NEXT:    vmrgew v2, v3, v2
3553; P9LE-NEXT:    blr
3554;
3555; P8BE-LABEL: fromDiffMemConsAConvdtoui:
3556; P8BE:       # %bb.0: # %entry
3557; P8BE-NEXT:    li r4, 16
3558; P8BE-NEXT:    lxvd2x vs0, 0, r3
3559; P8BE-NEXT:    lxvd2x vs1, r3, r4
3560; P8BE-NEXT:    xxmrgld vs2, vs0, vs1
3561; P8BE-NEXT:    xxmrghd vs0, vs0, vs1
3562; P8BE-NEXT:    xvcvdpuxws v2, vs2
3563; P8BE-NEXT:    xvcvdpuxws v3, vs0
3564; P8BE-NEXT:    vmrgew v2, v3, v2
3565; P8BE-NEXT:    blr
3566;
3567; P8LE-LABEL: fromDiffMemConsAConvdtoui:
3568; P8LE:       # %bb.0: # %entry
3569; P8LE-NEXT:    li r4, 16
3570; P8LE-NEXT:    lxvd2x vs0, 0, r3
3571; P8LE-NEXT:    lxvd2x vs1, r3, r4
3572; P8LE-NEXT:    xxswapd vs0, vs0
3573; P8LE-NEXT:    xxswapd vs1, vs1
3574; P8LE-NEXT:    xxmrgld vs2, vs1, vs0
3575; P8LE-NEXT:    xxmrghd vs0, vs1, vs0
3576; P8LE-NEXT:    xvcvdpuxws v2, vs2
3577; P8LE-NEXT:    xvcvdpuxws v3, vs0
3578; P8LE-NEXT:    vmrgew v2, v3, v2
3579; P8LE-NEXT:    blr
3580entry:
3581  %0 = bitcast double* %ptr to <2 x double>*
3582  %1 = load <2 x double>, <2 x double>* %0, align 8
3583  %2 = fptoui <2 x double> %1 to <2 x i32>
3584  %arrayidx4 = getelementptr inbounds double, double* %ptr, i64 2
3585  %3 = bitcast double* %arrayidx4 to <2 x double>*
3586  %4 = load <2 x double>, <2 x double>* %3, align 8
3587  %5 = fptoui <2 x double> %4 to <2 x i32>
3588  %vecinit9 = shufflevector <2 x i32> %2, <2 x i32> %5, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
3589  ret <4 x i32> %vecinit9
3590}
3591
3592; Function Attrs: norecurse nounwind readonly
3593define <4 x i32> @fromDiffMemConsDConvdtoui(double* nocapture readonly %ptr) {
3594; P9BE-LABEL: fromDiffMemConsDConvdtoui:
3595; P9BE:       # %bb.0: # %entry
3596; P9BE-NEXT:    lfd f0, 24(r3)
3597; P9BE-NEXT:    lfd f1, 16(r3)
3598; P9BE-NEXT:    lfd f2, 8(r3)
3599; P9BE-NEXT:    lfd f3, 0(r3)
3600; P9BE-NEXT:    xxmrghd vs1, vs1, vs3
3601; P9BE-NEXT:    xxmrghd vs0, vs0, vs2
3602; P9BE-NEXT:    xvcvdpuxws v2, vs1
3603; P9BE-NEXT:    xvcvdpuxws v3, vs0
3604; P9BE-NEXT:    vmrgew v2, v3, v2
3605; P9BE-NEXT:    blr
3606;
3607; P9LE-LABEL: fromDiffMemConsDConvdtoui:
3608; P9LE:       # %bb.0: # %entry
3609; P9LE-NEXT:    lfd f0, 24(r3)
3610; P9LE-NEXT:    lfd f2, 8(r3)
3611; P9LE-NEXT:    lfd f1, 16(r3)
3612; P9LE-NEXT:    lfd f3, 0(r3)
3613; P9LE-NEXT:    xxmrghd vs0, vs2, vs0
3614; P9LE-NEXT:    xvcvdpuxws v2, vs0
3615; P9LE-NEXT:    xxmrghd vs0, vs3, vs1
3616; P9LE-NEXT:    xvcvdpuxws v3, vs0
3617; P9LE-NEXT:    vmrgew v2, v3, v2
3618; P9LE-NEXT:    blr
3619;
3620; P8BE-LABEL: fromDiffMemConsDConvdtoui:
3621; P8BE:       # %bb.0: # %entry
3622; P8BE-NEXT:    lfdx f3, 0, r3
3623; P8BE-NEXT:    lfd f0, 24(r3)
3624; P8BE-NEXT:    lfd f1, 8(r3)
3625; P8BE-NEXT:    lfd f2, 16(r3)
3626; P8BE-NEXT:    xxmrghd vs0, vs0, vs1
3627; P8BE-NEXT:    xxmrghd vs1, vs2, vs3
3628; P8BE-NEXT:    xvcvdpuxws v2, vs0
3629; P8BE-NEXT:    xvcvdpuxws v3, vs1
3630; P8BE-NEXT:    vmrgew v2, v2, v3
3631; P8BE-NEXT:    blr
3632;
3633; P8LE-LABEL: fromDiffMemConsDConvdtoui:
3634; P8LE:       # %bb.0: # %entry
3635; P8LE-NEXT:    lfdx f3, 0, r3
3636; P8LE-NEXT:    lfd f0, 24(r3)
3637; P8LE-NEXT:    lfd f1, 8(r3)
3638; P8LE-NEXT:    lfd f2, 16(r3)
3639; P8LE-NEXT:    xxmrghd vs0, vs1, vs0
3640; P8LE-NEXT:    xxmrghd vs1, vs3, vs2
3641; P8LE-NEXT:    xvcvdpuxws v2, vs0
3642; P8LE-NEXT:    xvcvdpuxws v3, vs1
3643; P8LE-NEXT:    vmrgew v2, v3, v2
3644; P8LE-NEXT:    blr
3645entry:
3646  %arrayidx = getelementptr inbounds double, double* %ptr, i64 3
3647  %0 = load double, double* %arrayidx, align 8
3648  %conv = fptoui double %0 to i32
3649  %vecinit = insertelement <4 x i32> undef, i32 %conv, i32 0
3650  %arrayidx1 = getelementptr inbounds double, double* %ptr, i64 2
3651  %1 = load double, double* %arrayidx1, align 8
3652  %conv2 = fptoui double %1 to i32
3653  %vecinit3 = insertelement <4 x i32> %vecinit, i32 %conv2, i32 1
3654  %arrayidx4 = getelementptr inbounds double, double* %ptr, i64 1
3655  %2 = load double, double* %arrayidx4, align 8
3656  %conv5 = fptoui double %2 to i32
3657  %vecinit6 = insertelement <4 x i32> %vecinit3, i32 %conv5, i32 2
3658  %3 = load double, double* %ptr, align 8
3659  %conv8 = fptoui double %3 to i32
3660  %vecinit9 = insertelement <4 x i32> %vecinit6, i32 %conv8, i32 3
3661  ret <4 x i32> %vecinit9
3662}
3663
3664; Function Attrs: norecurse nounwind readonly
3665define <4 x i32> @fromDiffMemVarAConvdtoui(double* nocapture readonly %arr, i32 signext %elem) {
3666; P9BE-LABEL: fromDiffMemVarAConvdtoui:
3667; P9BE:       # %bb.0: # %entry
3668; P9BE-NEXT:    sldi r4, r4, 3
3669; P9BE-NEXT:    lfdux f0, r3, r4
3670; P9BE-NEXT:    lfd f1, 8(r3)
3671; P9BE-NEXT:    lfd f2, 16(r3)
3672; P9BE-NEXT:    lfd f3, 24(r3)
3673; P9BE-NEXT:    xxmrghd vs1, vs1, vs3
3674; P9BE-NEXT:    xxmrghd vs0, vs0, vs2
3675; P9BE-NEXT:    xvcvdpuxws v2, vs1
3676; P9BE-NEXT:    xvcvdpuxws v3, vs0
3677; P9BE-NEXT:    vmrgew v2, v3, v2
3678; P9BE-NEXT:    blr
3679;
3680; P9LE-LABEL: fromDiffMemVarAConvdtoui:
3681; P9LE:       # %bb.0: # %entry
3682; P9LE-NEXT:    sldi r4, r4, 3
3683; P9LE-NEXT:    lfdux f0, r3, r4
3684; P9LE-NEXT:    lfd f2, 16(r3)
3685; P9LE-NEXT:    lfd f1, 8(r3)
3686; P9LE-NEXT:    lfd f3, 24(r3)
3687; P9LE-NEXT:    xxmrghd vs0, vs2, vs0
3688; P9LE-NEXT:    xvcvdpuxws v2, vs0
3689; P9LE-NEXT:    xxmrghd vs0, vs3, vs1
3690; P9LE-NEXT:    xvcvdpuxws v3, vs0
3691; P9LE-NEXT:    vmrgew v2, v3, v2
3692; P9LE-NEXT:    blr
3693;
3694; P8BE-LABEL: fromDiffMemVarAConvdtoui:
3695; P8BE:       # %bb.0: # %entry
3696; P8BE-NEXT:    sldi r4, r4, 3
3697; P8BE-NEXT:    lfdux f0, r3, r4
3698; P8BE-NEXT:    lfd f1, 8(r3)
3699; P8BE-NEXT:    lfd f2, 24(r3)
3700; P8BE-NEXT:    lfd f3, 16(r3)
3701; P8BE-NEXT:    xxmrghd vs1, vs1, vs2
3702; P8BE-NEXT:    xxmrghd vs0, vs0, vs3
3703; P8BE-NEXT:    xvcvdpuxws v2, vs1
3704; P8BE-NEXT:    xvcvdpuxws v3, vs0
3705; P8BE-NEXT:    vmrgew v2, v3, v2
3706; P8BE-NEXT:    blr
3707;
3708; P8LE-LABEL: fromDiffMemVarAConvdtoui:
3709; P8LE:       # %bb.0: # %entry
3710; P8LE-NEXT:    sldi r4, r4, 3
3711; P8LE-NEXT:    lfdux f0, r3, r4
3712; P8LE-NEXT:    lfd f1, 16(r3)
3713; P8LE-NEXT:    lfd f2, 8(r3)
3714; P8LE-NEXT:    lfd f3, 24(r3)
3715; P8LE-NEXT:    xxmrghd vs0, vs1, vs0
3716; P8LE-NEXT:    xxmrghd vs1, vs3, vs2
3717; P8LE-NEXT:    xvcvdpuxws v2, vs0
3718; P8LE-NEXT:    xvcvdpuxws v3, vs1
3719; P8LE-NEXT:    vmrgew v2, v3, v2
3720; P8LE-NEXT:    blr
3721entry:
3722  %idxprom = sext i32 %elem to i64
3723  %arrayidx = getelementptr inbounds double, double* %arr, i64 %idxprom
3724  %0 = load double, double* %arrayidx, align 8
3725  %conv = fptoui double %0 to i32
3726  %vecinit = insertelement <4 x i32> undef, i32 %conv, i32 0
3727  %add = add nsw i32 %elem, 1
3728  %idxprom1 = sext i32 %add to i64
3729  %arrayidx2 = getelementptr inbounds double, double* %arr, i64 %idxprom1
3730  %1 = load double, double* %arrayidx2, align 8
3731  %conv3 = fptoui double %1 to i32
3732  %vecinit4 = insertelement <4 x i32> %vecinit, i32 %conv3, i32 1
3733  %add5 = add nsw i32 %elem, 2
3734  %idxprom6 = sext i32 %add5 to i64
3735  %arrayidx7 = getelementptr inbounds double, double* %arr, i64 %idxprom6
3736  %2 = load double, double* %arrayidx7, align 8
3737  %conv8 = fptoui double %2 to i32
3738  %vecinit9 = insertelement <4 x i32> %vecinit4, i32 %conv8, i32 2
3739  %add10 = add nsw i32 %elem, 3
3740  %idxprom11 = sext i32 %add10 to i64
3741  %arrayidx12 = getelementptr inbounds double, double* %arr, i64 %idxprom11
3742  %3 = load double, double* %arrayidx12, align 8
3743  %conv13 = fptoui double %3 to i32
3744  %vecinit14 = insertelement <4 x i32> %vecinit9, i32 %conv13, i32 3
3745  ret <4 x i32> %vecinit14
3746}
3747
3748; Function Attrs: norecurse nounwind readonly
3749define <4 x i32> @fromDiffMemVarDConvdtoui(double* nocapture readonly %arr, i32 signext %elem) {
3750; P9BE-LABEL: fromDiffMemVarDConvdtoui:
3751; P9BE:       # %bb.0: # %entry
3752; P9BE-NEXT:    sldi r4, r4, 3
3753; P9BE-NEXT:    lfdux f0, r3, r4
3754; P9BE-NEXT:    lfd f1, -8(r3)
3755; P9BE-NEXT:    lfd f2, -16(r3)
3756; P9BE-NEXT:    lfd f3, -24(r3)
3757; P9BE-NEXT:    xxmrghd vs1, vs1, vs3
3758; P9BE-NEXT:    xxmrghd vs0, vs0, vs2
3759; P9BE-NEXT:    xvcvdpuxws v2, vs1
3760; P9BE-NEXT:    xvcvdpuxws v3, vs0
3761; P9BE-NEXT:    vmrgew v2, v3, v2
3762; P9BE-NEXT:    blr
3763;
3764; P9LE-LABEL: fromDiffMemVarDConvdtoui:
3765; P9LE:       # %bb.0: # %entry
3766; P9LE-NEXT:    sldi r4, r4, 3
3767; P9LE-NEXT:    lfdux f0, r3, r4
3768; P9LE-NEXT:    lfd f2, -16(r3)
3769; P9LE-NEXT:    lfd f1, -8(r3)
3770; P9LE-NEXT:    lfd f3, -24(r3)
3771; P9LE-NEXT:    xxmrghd vs0, vs2, vs0
3772; P9LE-NEXT:    xvcvdpuxws v2, vs0
3773; P9LE-NEXT:    xxmrghd vs0, vs3, vs1
3774; P9LE-NEXT:    xvcvdpuxws v3, vs0
3775; P9LE-NEXT:    vmrgew v2, v3, v2
3776; P9LE-NEXT:    blr
3777;
3778; P8BE-LABEL: fromDiffMemVarDConvdtoui:
3779; P8BE:       # %bb.0: # %entry
3780; P8BE-NEXT:    sldi r4, r4, 3
3781; P8BE-NEXT:    lfdux f0, r3, r4
3782; P8BE-NEXT:    lfd f1, -8(r3)
3783; P8BE-NEXT:    lfd f2, -24(r3)
3784; P8BE-NEXT:    lfd f3, -16(r3)
3785; P8BE-NEXT:    xxmrghd vs1, vs1, vs2
3786; P8BE-NEXT:    xxmrghd vs0, vs0, vs3
3787; P8BE-NEXT:    xvcvdpuxws v2, vs1
3788; P8BE-NEXT:    xvcvdpuxws v3, vs0
3789; P8BE-NEXT:    vmrgew v2, v3, v2
3790; P8BE-NEXT:    blr
3791;
3792; P8LE-LABEL: fromDiffMemVarDConvdtoui:
3793; P8LE:       # %bb.0: # %entry
3794; P8LE-NEXT:    sldi r4, r4, 3
3795; P8LE-NEXT:    lfdux f0, r3, r4
3796; P8LE-NEXT:    lfd f1, -16(r3)
3797; P8LE-NEXT:    lfd f2, -8(r3)
3798; P8LE-NEXT:    lfd f3, -24(r3)
3799; P8LE-NEXT:    xxmrghd vs0, vs1, vs0
3800; P8LE-NEXT:    xxmrghd vs1, vs3, vs2
3801; P8LE-NEXT:    xvcvdpuxws v2, vs0
3802; P8LE-NEXT:    xvcvdpuxws v3, vs1
3803; P8LE-NEXT:    vmrgew v2, v3, v2
3804; P8LE-NEXT:    blr
3805entry:
3806  %idxprom = sext i32 %elem to i64
3807  %arrayidx = getelementptr inbounds double, double* %arr, i64 %idxprom
3808  %0 = load double, double* %arrayidx, align 8
3809  %conv = fptoui double %0 to i32
3810  %vecinit = insertelement <4 x i32> undef, i32 %conv, i32 0
3811  %sub = add nsw i32 %elem, -1
3812  %idxprom1 = sext i32 %sub to i64
3813  %arrayidx2 = getelementptr inbounds double, double* %arr, i64 %idxprom1
3814  %1 = load double, double* %arrayidx2, align 8
3815  %conv3 = fptoui double %1 to i32
3816  %vecinit4 = insertelement <4 x i32> %vecinit, i32 %conv3, i32 1
3817  %sub5 = add nsw i32 %elem, -2
3818  %idxprom6 = sext i32 %sub5 to i64
3819  %arrayidx7 = getelementptr inbounds double, double* %arr, i64 %idxprom6
3820  %2 = load double, double* %arrayidx7, align 8
3821  %conv8 = fptoui double %2 to i32
3822  %vecinit9 = insertelement <4 x i32> %vecinit4, i32 %conv8, i32 2
3823  %sub10 = add nsw i32 %elem, -3
3824  %idxprom11 = sext i32 %sub10 to i64
3825  %arrayidx12 = getelementptr inbounds double, double* %arr, i64 %idxprom11
3826  %3 = load double, double* %arrayidx12, align 8
3827  %conv13 = fptoui double %3 to i32
3828  %vecinit14 = insertelement <4 x i32> %vecinit9, i32 %conv13, i32 3
3829  ret <4 x i32> %vecinit14
3830}
3831
3832; Function Attrs: norecurse nounwind readnone
3833define <4 x i32> @spltRegValConvdtoui(double %val) {
3834; P9BE-LABEL: spltRegValConvdtoui:
3835; P9BE:       # %bb.0: # %entry
3836; P9BE-NEXT:    xscvdpuxws f0, f1
3837; P9BE-NEXT:    xxspltw v2, vs0, 1
3838; P9BE-NEXT:    blr
3839;
3840; P9LE-LABEL: spltRegValConvdtoui:
3841; P9LE:       # %bb.0: # %entry
3842; P9LE-NEXT:    xscvdpuxws f0, f1
3843; P9LE-NEXT:    xxspltw v2, vs0, 1
3844; P9LE-NEXT:    blr
3845;
3846; P8BE-LABEL: spltRegValConvdtoui:
3847; P8BE:       # %bb.0: # %entry
3848; P8BE-NEXT:    xscvdpuxws f0, f1
3849; P8BE-NEXT:    xxspltw v2, vs0, 1
3850; P8BE-NEXT:    blr
3851;
3852; P8LE-LABEL: spltRegValConvdtoui:
3853; P8LE:       # %bb.0: # %entry
3854; P8LE-NEXT:    xscvdpuxws f0, f1
3855; P8LE-NEXT:    xxspltw v2, vs0, 1
3856; P8LE-NEXT:    blr
3857entry:
3858  %conv = fptoui double %val to i32
3859  %splat.splatinsert = insertelement <4 x i32> undef, i32 %conv, i32 0
3860  %splat.splat = shufflevector <4 x i32> %splat.splatinsert, <4 x i32> undef, <4 x i32> zeroinitializer
3861  ret <4 x i32> %splat.splat
3862}
3863
3864; Function Attrs: norecurse nounwind readonly
3865define <4 x i32> @spltMemValConvdtoui(double* nocapture readonly %ptr) {
3866; P9BE-LABEL: spltMemValConvdtoui:
3867; P9BE:       # %bb.0: # %entry
3868; P9BE-NEXT:    lfd f0, 0(r3)
3869; P9BE-NEXT:    xscvdpuxws f0, f0
3870; P9BE-NEXT:    xxspltw v2, vs0, 1
3871; P9BE-NEXT:    blr
3872;
3873; P9LE-LABEL: spltMemValConvdtoui:
3874; P9LE:       # %bb.0: # %entry
3875; P9LE-NEXT:    lfd f0, 0(r3)
3876; P9LE-NEXT:    xscvdpuxws f0, f0
3877; P9LE-NEXT:    xxspltw v2, vs0, 1
3878; P9LE-NEXT:    blr
3879;
3880; P8BE-LABEL: spltMemValConvdtoui:
3881; P8BE:       # %bb.0: # %entry
3882; P8BE-NEXT:    lfdx f0, 0, r3
3883; P8BE-NEXT:    xscvdpuxws f0, f0
3884; P8BE-NEXT:    xxspltw v2, vs0, 1
3885; P8BE-NEXT:    blr
3886;
3887; P8LE-LABEL: spltMemValConvdtoui:
3888; P8LE:       # %bb.0: # %entry
3889; P8LE-NEXT:    lfdx f0, 0, r3
3890; P8LE-NEXT:    xscvdpuxws f0, f0
3891; P8LE-NEXT:    xxspltw v2, vs0, 1
3892; P8LE-NEXT:    blr
3893entry:
3894  %0 = load double, double* %ptr, align 8
3895  %conv = fptoui double %0 to i32
3896  %splat.splatinsert = insertelement <4 x i32> undef, i32 %conv, i32 0
3897  %splat.splat = shufflevector <4 x i32> %splat.splatinsert, <4 x i32> undef, <4 x i32> zeroinitializer
3898  ret <4 x i32> %splat.splat
3899}
3900; Function Attrs: norecurse nounwind readnone
3901define <2 x i64> @allZeroll() {
3902; P9BE-LABEL: allZeroll:
3903; P9BE:       # %bb.0: # %entry
3904; P9BE-NEXT:    xxlxor v2, v2, v2
3905; P9BE-NEXT:    blr
3906;
3907; P9LE-LABEL: allZeroll:
3908; P9LE:       # %bb.0: # %entry
3909; P9LE-NEXT:    xxlxor v2, v2, v2
3910; P9LE-NEXT:    blr
3911;
3912; P8BE-LABEL: allZeroll:
3913; P8BE:       # %bb.0: # %entry
3914; P8BE-NEXT:    xxlxor v2, v2, v2
3915; P8BE-NEXT:    blr
3916;
3917; P8LE-LABEL: allZeroll:
3918; P8LE:       # %bb.0: # %entry
3919; P8LE-NEXT:    xxlxor v2, v2, v2
3920; P8LE-NEXT:    blr
3921entry:
3922  ret <2 x i64> zeroinitializer
3923}
3924
3925; Function Attrs: norecurse nounwind readnone
3926define <2 x i64> @allOnell() {
3927; P9BE-LABEL: allOnell:
3928; P9BE:       # %bb.0: # %entry
3929; P9BE-NEXT:    xxspltib v2, 255
3930; P9BE-NEXT:    blr
3931;
3932; P9LE-LABEL: allOnell:
3933; P9LE:       # %bb.0: # %entry
3934; P9LE-NEXT:    xxspltib v2, 255
3935; P9LE-NEXT:    blr
3936;
3937; P8BE-LABEL: allOnell:
3938; P8BE:       # %bb.0: # %entry
3939; P8BE-NEXT:    vspltisb v2, -1
3940; P8BE-NEXT:    blr
3941;
3942; P8LE-LABEL: allOnell:
3943; P8LE:       # %bb.0: # %entry
3944; P8LE-NEXT:    vspltisb v2, -1
3945; P8LE-NEXT:    blr
3946entry:
3947  ret <2 x i64> <i64 -1, i64 -1>
3948}
3949
3950; Function Attrs: norecurse nounwind readnone
3951define <2 x i64> @spltConst1ll() {
3952; P9BE-LABEL: spltConst1ll:
3953; P9BE:       # %bb.0: # %entry
3954; P9BE-NEXT:    addis r3, r2, .LCPI68_0@toc@ha
3955; P9BE-NEXT:    addi r3, r3, .LCPI68_0@toc@l
3956; P9BE-NEXT:    lxvx v2, 0, r3
3957; P9BE-NEXT:    blr
3958;
3959; P9LE-LABEL: spltConst1ll:
3960; P9LE:       # %bb.0: # %entry
3961; P9LE-NEXT:    addis r3, r2, .LCPI68_0@toc@ha
3962; P9LE-NEXT:    addi r3, r3, .LCPI68_0@toc@l
3963; P9LE-NEXT:    lxvx v2, 0, r3
3964; P9LE-NEXT:    blr
3965;
3966; P8BE-LABEL: spltConst1ll:
3967; P8BE:       # %bb.0: # %entry
3968; P8BE-NEXT:    addis r3, r2, .LCPI68_0@toc@ha
3969; P8BE-NEXT:    addi r3, r3, .LCPI68_0@toc@l
3970; P8BE-NEXT:    lxvd2x v2, 0, r3
3971; P8BE-NEXT:    blr
3972;
3973; P8LE-LABEL: spltConst1ll:
3974; P8LE:       # %bb.0: # %entry
3975; P8LE-NEXT:    addis r3, r2, .LCPI68_0@toc@ha
3976; P8LE-NEXT:    addi r3, r3, .LCPI68_0@toc@l
3977; P8LE-NEXT:    lxvd2x vs0, 0, r3
3978; P8LE-NEXT:    xxswapd v2, vs0
3979; P8LE-NEXT:    blr
3980entry:
3981  ret <2 x i64> <i64 1, i64 1>
3982}
3983
3984; Function Attrs: norecurse nounwind readnone
3985define <2 x i64> @spltConst16kll() {
3986; P9BE-LABEL: spltConst16kll:
3987; P9BE:       # %bb.0: # %entry
3988; P9BE-NEXT:    addis r3, r2, .LCPI69_0@toc@ha
3989; P9BE-NEXT:    addi r3, r3, .LCPI69_0@toc@l
3990; P9BE-NEXT:    lxvx v2, 0, r3
3991; P9BE-NEXT:    blr
3992;
3993; P9LE-LABEL: spltConst16kll:
3994; P9LE:       # %bb.0: # %entry
3995; P9LE-NEXT:    addis r3, r2, .LCPI69_0@toc@ha
3996; P9LE-NEXT:    addi r3, r3, .LCPI69_0@toc@l
3997; P9LE-NEXT:    lxvx v2, 0, r3
3998; P9LE-NEXT:    blr
3999;
4000; P8BE-LABEL: spltConst16kll:
4001; P8BE:       # %bb.0: # %entry
4002; P8BE-NEXT:    addis r3, r2, .LCPI69_0@toc@ha
4003; P8BE-NEXT:    addi r3, r3, .LCPI69_0@toc@l
4004; P8BE-NEXT:    lxvd2x v2, 0, r3
4005; P8BE-NEXT:    blr
4006;
4007; P8LE-LABEL: spltConst16kll:
4008; P8LE:       # %bb.0: # %entry
4009; P8LE-NEXT:    addis r3, r2, .LCPI69_0@toc@ha
4010; P8LE-NEXT:    addi r3, r3, .LCPI69_0@toc@l
4011; P8LE-NEXT:    lxvd2x vs0, 0, r3
4012; P8LE-NEXT:    xxswapd v2, vs0
4013; P8LE-NEXT:    blr
4014entry:
4015  ret <2 x i64> <i64 32767, i64 32767>
4016}
4017
4018; Function Attrs: norecurse nounwind readnone
4019define <2 x i64> @spltConst32kll() {
4020; P9BE-LABEL: spltConst32kll:
4021; P9BE:       # %bb.0: # %entry
4022; P9BE-NEXT:    addis r3, r2, .LCPI70_0@toc@ha
4023; P9BE-NEXT:    addi r3, r3, .LCPI70_0@toc@l
4024; P9BE-NEXT:    lxvx v2, 0, r3
4025; P9BE-NEXT:    blr
4026;
4027; P9LE-LABEL: spltConst32kll:
4028; P9LE:       # %bb.0: # %entry
4029; P9LE-NEXT:    addis r3, r2, .LCPI70_0@toc@ha
4030; P9LE-NEXT:    addi r3, r3, .LCPI70_0@toc@l
4031; P9LE-NEXT:    lxvx v2, 0, r3
4032; P9LE-NEXT:    blr
4033;
4034; P8BE-LABEL: spltConst32kll:
4035; P8BE:       # %bb.0: # %entry
4036; P8BE-NEXT:    addis r3, r2, .LCPI70_0@toc@ha
4037; P8BE-NEXT:    addi r3, r3, .LCPI70_0@toc@l
4038; P8BE-NEXT:    lxvd2x v2, 0, r3
4039; P8BE-NEXT:    blr
4040;
4041; P8LE-LABEL: spltConst32kll:
4042; P8LE:       # %bb.0: # %entry
4043; P8LE-NEXT:    addis r3, r2, .LCPI70_0@toc@ha
4044; P8LE-NEXT:    addi r3, r3, .LCPI70_0@toc@l
4045; P8LE-NEXT:    lxvd2x vs0, 0, r3
4046; P8LE-NEXT:    xxswapd v2, vs0
4047; P8LE-NEXT:    blr
4048entry:
4049  ret <2 x i64> <i64 65535, i64 65535>
4050}
4051
4052; Function Attrs: norecurse nounwind readnone
4053define <2 x i64> @fromRegsll(i64 %a, i64 %b) {
4054; P9BE-LABEL: fromRegsll:
4055; P9BE:       # %bb.0: # %entry
4056; P9BE-NEXT:    mtvsrdd v2, r3, r4
4057; P9BE-NEXT:    blr
4058;
4059; P9LE-LABEL: fromRegsll:
4060; P9LE:       # %bb.0: # %entry
4061; P9LE-NEXT:    mtvsrdd v2, r4, r3
4062; P9LE-NEXT:    blr
4063;
4064; P8BE-LABEL: fromRegsll:
4065; P8BE:       # %bb.0: # %entry
4066; P8BE-NEXT:    mtvsrd f0, r4
4067; P8BE-NEXT:    mtvsrd f1, r3
4068; P8BE-NEXT:    xxmrghd v2, vs1, vs0
4069; P8BE-NEXT:    blr
4070;
4071; P8LE-LABEL: fromRegsll:
4072; P8LE:       # %bb.0: # %entry
4073; P8LE-NEXT:    mtvsrd f0, r3
4074; P8LE-NEXT:    mtvsrd f1, r4
4075; P8LE-NEXT:    xxmrghd v2, vs1, vs0
4076; P8LE-NEXT:    blr
4077entry:
4078  %vecinit = insertelement <2 x i64> undef, i64 %a, i32 0
4079  %vecinit1 = insertelement <2 x i64> %vecinit, i64 %b, i32 1
4080  ret <2 x i64> %vecinit1
4081}
4082
4083; Function Attrs: norecurse nounwind readnone
4084define <2 x i64> @fromDiffConstsll() {
4085; P9BE-LABEL: fromDiffConstsll:
4086; P9BE:       # %bb.0: # %entry
4087; P9BE-NEXT:    addis r3, r2, .LCPI72_0@toc@ha
4088; P9BE-NEXT:    addi r3, r3, .LCPI72_0@toc@l
4089; P9BE-NEXT:    lxvx v2, 0, r3
4090; P9BE-NEXT:    blr
4091;
4092; P9LE-LABEL: fromDiffConstsll:
4093; P9LE:       # %bb.0: # %entry
4094; P9LE-NEXT:    addis r3, r2, .LCPI72_0@toc@ha
4095; P9LE-NEXT:    addi r3, r3, .LCPI72_0@toc@l
4096; P9LE-NEXT:    lxvx v2, 0, r3
4097; P9LE-NEXT:    blr
4098;
4099; P8BE-LABEL: fromDiffConstsll:
4100; P8BE:       # %bb.0: # %entry
4101; P8BE-NEXT:    addis r3, r2, .LCPI72_0@toc@ha
4102; P8BE-NEXT:    addi r3, r3, .LCPI72_0@toc@l
4103; P8BE-NEXT:    lxvd2x v2, 0, r3
4104; P8BE-NEXT:    blr
4105;
4106; P8LE-LABEL: fromDiffConstsll:
4107; P8LE:       # %bb.0: # %entry
4108; P8LE-NEXT:    addis r3, r2, .LCPI72_0@toc@ha
4109; P8LE-NEXT:    addi r3, r3, .LCPI72_0@toc@l
4110; P8LE-NEXT:    lxvd2x vs0, 0, r3
4111; P8LE-NEXT:    xxswapd v2, vs0
4112; P8LE-NEXT:    blr
4113entry:
4114  ret <2 x i64> <i64 242, i64 -113>
4115}
4116
4117; Function Attrs: norecurse nounwind readonly
4118define <2 x i64> @fromDiffMemConsAll(i64* nocapture readonly %arr) {
4119; P9BE-LABEL: fromDiffMemConsAll:
4120; P9BE:       # %bb.0: # %entry
4121; P9BE-NEXT:    lxv v2, 0(r3)
4122; P9BE-NEXT:    blr
4123;
4124; P9LE-LABEL: fromDiffMemConsAll:
4125; P9LE:       # %bb.0: # %entry
4126; P9LE-NEXT:    lxv v2, 0(r3)
4127; P9LE-NEXT:    blr
4128;
4129; P8BE-LABEL: fromDiffMemConsAll:
4130; P8BE:       # %bb.0: # %entry
4131; P8BE-NEXT:    lxvd2x v2, 0, r3
4132; P8BE-NEXT:    blr
4133;
4134; P8LE-LABEL: fromDiffMemConsAll:
4135; P8LE:       # %bb.0: # %entry
4136; P8LE-NEXT:    lxvd2x vs0, 0, r3
4137; P8LE-NEXT:    xxswapd v2, vs0
4138; P8LE-NEXT:    blr
4139entry:
4140  %0 = load i64, i64* %arr, align 8
4141  %vecinit = insertelement <2 x i64> undef, i64 %0, i32 0
4142  %arrayidx1 = getelementptr inbounds i64, i64* %arr, i64 1
4143  %1 = load i64, i64* %arrayidx1, align 8
4144  %vecinit2 = insertelement <2 x i64> %vecinit, i64 %1, i32 1
4145  ret <2 x i64> %vecinit2
4146}
4147
4148; Function Attrs: norecurse nounwind readonly
4149define <2 x i64> @fromDiffMemConsDll(i64* nocapture readonly %arr) {
4150; P9BE-LABEL: fromDiffMemConsDll:
4151; P9BE:       # %bb.0: # %entry
4152; P9BE-NEXT:    lxv v2, 16(r3)
4153; P9BE-NEXT:    xxswapd v2, v2
4154; P9BE-NEXT:    blr
4155;
4156; P9LE-LABEL: fromDiffMemConsDll:
4157; P9LE:       # %bb.0: # %entry
4158; P9LE-NEXT:    lxv v2, 16(r3)
4159; P9LE-NEXT:    xxswapd v2, v2
4160; P9LE-NEXT:    blr
4161;
4162; P8BE-LABEL: fromDiffMemConsDll:
4163; P8BE:       # %bb.0: # %entry
4164; P8BE-NEXT:    addi r3, r3, 16
4165; P8BE-NEXT:    lxvd2x v2, 0, r3
4166; P8BE-NEXT:    xxswapd v2, v2
4167; P8BE-NEXT:    blr
4168;
4169; P8LE-LABEL: fromDiffMemConsDll:
4170; P8LE:       # %bb.0: # %entry
4171; P8LE-NEXT:    addi r3, r3, 16
4172; P8LE-NEXT:    lxvd2x v2, 0, r3
4173; P8LE-NEXT:    blr
4174entry:
4175  %arrayidx = getelementptr inbounds i64, i64* %arr, i64 3
4176  %0 = load i64, i64* %arrayidx, align 8
4177  %vecinit = insertelement <2 x i64> undef, i64 %0, i32 0
4178  %arrayidx1 = getelementptr inbounds i64, i64* %arr, i64 2
4179  %1 = load i64, i64* %arrayidx1, align 8
4180  %vecinit2 = insertelement <2 x i64> %vecinit, i64 %1, i32 1
4181  ret <2 x i64> %vecinit2
4182}
4183
4184; Function Attrs: norecurse nounwind readonly
4185define <2 x i64> @fromDiffMemVarAll(i64* nocapture readonly %arr, i32 signext %elem) {
4186; P9BE-LABEL: fromDiffMemVarAll:
4187; P9BE:       # %bb.0: # %entry
4188; P9BE-NEXT:    sldi r4, r4, 3
4189; P9BE-NEXT:    lxvx v2, r3, r4
4190; P9BE-NEXT:    blr
4191;
4192; P9LE-LABEL: fromDiffMemVarAll:
4193; P9LE:       # %bb.0: # %entry
4194; P9LE-NEXT:    sldi r4, r4, 3
4195; P9LE-NEXT:    lxvx v2, r3, r4
4196; P9LE-NEXT:    blr
4197;
4198; P8BE-LABEL: fromDiffMemVarAll:
4199; P8BE:       # %bb.0: # %entry
4200; P8BE-NEXT:    sldi r4, r4, 3
4201; P8BE-NEXT:    lxvd2x v2, r3, r4
4202; P8BE-NEXT:    blr
4203;
4204; P8LE-LABEL: fromDiffMemVarAll:
4205; P8LE:       # %bb.0: # %entry
4206; P8LE-NEXT:    sldi r4, r4, 3
4207; P8LE-NEXT:    lxvd2x vs0, r3, r4
4208; P8LE-NEXT:    xxswapd v2, vs0
4209; P8LE-NEXT:    blr
4210entry:
4211  %idxprom = sext i32 %elem to i64
4212  %arrayidx = getelementptr inbounds i64, i64* %arr, i64 %idxprom
4213  %0 = load i64, i64* %arrayidx, align 8
4214  %vecinit = insertelement <2 x i64> undef, i64 %0, i32 0
4215  %add = add nsw i32 %elem, 1
4216  %idxprom1 = sext i32 %add to i64
4217  %arrayidx2 = getelementptr inbounds i64, i64* %arr, i64 %idxprom1
4218  %1 = load i64, i64* %arrayidx2, align 8
4219  %vecinit3 = insertelement <2 x i64> %vecinit, i64 %1, i32 1
4220  ret <2 x i64> %vecinit3
4221}
4222
4223; Function Attrs: norecurse nounwind readonly
4224define <2 x i64> @fromDiffMemVarDll(i64* nocapture readonly %arr, i32 signext %elem) {
4225; P9BE-LABEL: fromDiffMemVarDll:
4226; P9BE:       # %bb.0: # %entry
4227; P9BE-NEXT:    sldi r4, r4, 3
4228; P9BE-NEXT:    add r3, r3, r4
4229; P9BE-NEXT:    li r4, -8
4230; P9BE-NEXT:    lxvx v2, r3, r4
4231; P9BE-NEXT:    xxswapd v2, v2
4232; P9BE-NEXT:    blr
4233;
4234; P9LE-LABEL: fromDiffMemVarDll:
4235; P9LE:       # %bb.0: # %entry
4236; P9LE-NEXT:    sldi r4, r4, 3
4237; P9LE-NEXT:    add r3, r3, r4
4238; P9LE-NEXT:    li r4, -8
4239; P9LE-NEXT:    lxvx v2, r3, r4
4240; P9LE-NEXT:    xxswapd v2, v2
4241; P9LE-NEXT:    blr
4242;
4243; P8BE-LABEL: fromDiffMemVarDll:
4244; P8BE:       # %bb.0: # %entry
4245; P8BE-NEXT:    sldi r4, r4, 3
4246; P8BE-NEXT:    add r3, r3, r4
4247; P8BE-NEXT:    addi r3, r3, -8
4248; P8BE-NEXT:    lxvd2x v2, 0, r3
4249; P8BE-NEXT:    xxswapd v2, v2
4250; P8BE-NEXT:    blr
4251;
4252; P8LE-LABEL: fromDiffMemVarDll:
4253; P8LE:       # %bb.0: # %entry
4254; P8LE-NEXT:    sldi r4, r4, 3
4255; P8LE-NEXT:    add r3, r3, r4
4256; P8LE-NEXT:    addi r3, r3, -8
4257; P8LE-NEXT:    lxvd2x v2, 0, r3
4258; P8LE-NEXT:    blr
4259entry:
4260  %idxprom = sext i32 %elem to i64
4261  %arrayidx = getelementptr inbounds i64, i64* %arr, i64 %idxprom
4262  %0 = load i64, i64* %arrayidx, align 8
4263  %vecinit = insertelement <2 x i64> undef, i64 %0, i32 0
4264  %sub = add nsw i32 %elem, -1
4265  %idxprom1 = sext i32 %sub to i64
4266  %arrayidx2 = getelementptr inbounds i64, i64* %arr, i64 %idxprom1
4267  %1 = load i64, i64* %arrayidx2, align 8
4268  %vecinit3 = insertelement <2 x i64> %vecinit, i64 %1, i32 1
4269  ret <2 x i64> %vecinit3
4270}
4271
4272; Function Attrs: norecurse nounwind readonly
4273define <2 x i64> @fromRandMemConsll(i64* nocapture readonly %arr) {
4274; P9BE-LABEL: fromRandMemConsll:
4275; P9BE:       # %bb.0: # %entry
4276; P9BE-NEXT:    ld r4, 32(r3)
4277; P9BE-NEXT:    ld r3, 144(r3)
4278; P9BE-NEXT:    mtvsrdd v2, r4, r3
4279; P9BE-NEXT:    blr
4280;
4281; P9LE-LABEL: fromRandMemConsll:
4282; P9LE:       # %bb.0: # %entry
4283; P9LE-NEXT:    ld r4, 32(r3)
4284; P9LE-NEXT:    ld r3, 144(r3)
4285; P9LE-NEXT:    mtvsrdd v2, r3, r4
4286; P9LE-NEXT:    blr
4287;
4288; P8BE-LABEL: fromRandMemConsll:
4289; P8BE:       # %bb.0: # %entry
4290; P8BE-NEXT:    ld r4, 144(r3)
4291; P8BE-NEXT:    ld r3, 32(r3)
4292; P8BE-NEXT:    mtvsrd f0, r4
4293; P8BE-NEXT:    mtvsrd f1, r3
4294; P8BE-NEXT:    xxmrghd v2, vs1, vs0
4295; P8BE-NEXT:    blr
4296;
4297; P8LE-LABEL: fromRandMemConsll:
4298; P8LE:       # %bb.0: # %entry
4299; P8LE-NEXT:    ld r4, 32(r3)
4300; P8LE-NEXT:    ld r3, 144(r3)
4301; P8LE-NEXT:    mtvsrd f0, r4
4302; P8LE-NEXT:    mtvsrd f1, r3
4303; P8LE-NEXT:    xxmrghd v2, vs1, vs0
4304; P8LE-NEXT:    blr
4305entry:
4306  %arrayidx = getelementptr inbounds i64, i64* %arr, i64 4
4307  %0 = load i64, i64* %arrayidx, align 8
4308  %vecinit = insertelement <2 x i64> undef, i64 %0, i32 0
4309  %arrayidx1 = getelementptr inbounds i64, i64* %arr, i64 18
4310  %1 = load i64, i64* %arrayidx1, align 8
4311  %vecinit2 = insertelement <2 x i64> %vecinit, i64 %1, i32 1
4312  ret <2 x i64> %vecinit2
4313}
4314
4315; Function Attrs: norecurse nounwind readonly
4316define <2 x i64> @fromRandMemVarll(i64* nocapture readonly %arr, i32 signext %elem) {
4317; P9BE-LABEL: fromRandMemVarll:
4318; P9BE:       # %bb.0: # %entry
4319; P9BE-NEXT:    sldi r4, r4, 3
4320; P9BE-NEXT:    add r3, r3, r4
4321; P9BE-NEXT:    ld r4, 32(r3)
4322; P9BE-NEXT:    ld r3, 8(r3)
4323; P9BE-NEXT:    mtvsrdd v2, r4, r3
4324; P9BE-NEXT:    blr
4325;
4326; P9LE-LABEL: fromRandMemVarll:
4327; P9LE:       # %bb.0: # %entry
4328; P9LE-NEXT:    sldi r4, r4, 3
4329; P9LE-NEXT:    add r3, r3, r4
4330; P9LE-NEXT:    ld r4, 32(r3)
4331; P9LE-NEXT:    ld r3, 8(r3)
4332; P9LE-NEXT:    mtvsrdd v2, r3, r4
4333; P9LE-NEXT:    blr
4334;
4335; P8BE-LABEL: fromRandMemVarll:
4336; P8BE:       # %bb.0: # %entry
4337; P8BE-NEXT:    sldi r4, r4, 3
4338; P8BE-NEXT:    add r3, r3, r4
4339; P8BE-NEXT:    ld r4, 8(r3)
4340; P8BE-NEXT:    ld r3, 32(r3)
4341; P8BE-NEXT:    mtvsrd f0, r4
4342; P8BE-NEXT:    mtvsrd f1, r3
4343; P8BE-NEXT:    xxmrghd v2, vs1, vs0
4344; P8BE-NEXT:    blr
4345;
4346; P8LE-LABEL: fromRandMemVarll:
4347; P8LE:       # %bb.0: # %entry
4348; P8LE-NEXT:    sldi r4, r4, 3
4349; P8LE-NEXT:    add r3, r3, r4
4350; P8LE-NEXT:    ld r4, 32(r3)
4351; P8LE-NEXT:    ld r3, 8(r3)
4352; P8LE-NEXT:    mtvsrd f0, r4
4353; P8LE-NEXT:    mtvsrd f1, r3
4354; P8LE-NEXT:    xxmrghd v2, vs1, vs0
4355; P8LE-NEXT:    blr
4356entry:
4357  %add = add nsw i32 %elem, 4
4358  %idxprom = sext i32 %add to i64
4359  %arrayidx = getelementptr inbounds i64, i64* %arr, i64 %idxprom
4360  %0 = load i64, i64* %arrayidx, align 8
4361  %vecinit = insertelement <2 x i64> undef, i64 %0, i32 0
4362  %add1 = add nsw i32 %elem, 1
4363  %idxprom2 = sext i32 %add1 to i64
4364  %arrayidx3 = getelementptr inbounds i64, i64* %arr, i64 %idxprom2
4365  %1 = load i64, i64* %arrayidx3, align 8
4366  %vecinit4 = insertelement <2 x i64> %vecinit, i64 %1, i32 1
4367  ret <2 x i64> %vecinit4
4368}
4369
4370; Function Attrs: norecurse nounwind readnone
4371define <2 x i64> @spltRegValll(i64 %val) {
4372; P9BE-LABEL: spltRegValll:
4373; P9BE:       # %bb.0: # %entry
4374; P9BE-NEXT:    mtvsrdd v2, r3, r3
4375; P9BE-NEXT:    blr
4376;
4377; P9LE-LABEL: spltRegValll:
4378; P9LE:       # %bb.0: # %entry
4379; P9LE-NEXT:    mtvsrdd v2, r3, r3
4380; P9LE-NEXT:    blr
4381;
4382; P8BE-LABEL: spltRegValll:
4383; P8BE:       # %bb.0: # %entry
4384; P8BE-NEXT:    mtvsrd f0, r3
4385; P8BE-NEXT:    xxspltd v2, vs0, 0
4386; P8BE-NEXT:    blr
4387;
4388; P8LE-LABEL: spltRegValll:
4389; P8LE:       # %bb.0: # %entry
4390; P8LE-NEXT:    mtvsrd f0, r3
4391; P8LE-NEXT:    xxspltd v2, vs0, 0
4392; P8LE-NEXT:    blr
4393entry:
4394  %splat.splatinsert = insertelement <2 x i64> undef, i64 %val, i32 0
4395  %splat.splat = shufflevector <2 x i64> %splat.splatinsert, <2 x i64> undef, <2 x i32> zeroinitializer
4396  ret <2 x i64> %splat.splat
4397}
4398
4399; Function Attrs: norecurse nounwind readonly
4400define <2 x i64> @spltMemValll(i64* nocapture readonly %ptr) {
4401; P9BE-LABEL: spltMemValll:
4402; P9BE:       # %bb.0: # %entry
4403; P9BE-NEXT:    lxvdsx v2, 0, r3
4404; P9BE-NEXT:    blr
4405;
4406; P9LE-LABEL: spltMemValll:
4407; P9LE:       # %bb.0: # %entry
4408; P9LE-NEXT:    lxvdsx v2, 0, r3
4409; P9LE-NEXT:    blr
4410;
4411; P8BE-LABEL: spltMemValll:
4412; P8BE:       # %bb.0: # %entry
4413; P8BE-NEXT:    lxvdsx v2, 0, r3
4414; P8BE-NEXT:    blr
4415;
4416; P8LE-LABEL: spltMemValll:
4417; P8LE:       # %bb.0: # %entry
4418; P8LE-NEXT:    lxvdsx v2, 0, r3
4419; P8LE-NEXT:    blr
4420entry:
4421  %0 = load i64, i64* %ptr, align 8
4422  %splat.splatinsert = insertelement <2 x i64> undef, i64 %0, i32 0
4423  %splat.splat = shufflevector <2 x i64> %splat.splatinsert, <2 x i64> undef, <2 x i32> zeroinitializer
4424  ret <2 x i64> %splat.splat
4425}
4426
4427; Function Attrs: norecurse nounwind readnone
4428define <2 x i64> @spltCnstConvftoll() {
4429; P9BE-LABEL: spltCnstConvftoll:
4430; P9BE:       # %bb.0: # %entry
4431; P9BE-NEXT:    addis r3, r2, .LCPI81_0@toc@ha
4432; P9BE-NEXT:    addi r3, r3, .LCPI81_0@toc@l
4433; P9BE-NEXT:    lxvx v2, 0, r3
4434; P9BE-NEXT:    blr
4435;
4436; P9LE-LABEL: spltCnstConvftoll:
4437; P9LE:       # %bb.0: # %entry
4438; P9LE-NEXT:    addis r3, r2, .LCPI81_0@toc@ha
4439; P9LE-NEXT:    addi r3, r3, .LCPI81_0@toc@l
4440; P9LE-NEXT:    lxvx v2, 0, r3
4441; P9LE-NEXT:    blr
4442;
4443; P8BE-LABEL: spltCnstConvftoll:
4444; P8BE:       # %bb.0: # %entry
4445; P8BE-NEXT:    addis r3, r2, .LCPI81_0@toc@ha
4446; P8BE-NEXT:    addi r3, r3, .LCPI81_0@toc@l
4447; P8BE-NEXT:    lxvd2x v2, 0, r3
4448; P8BE-NEXT:    blr
4449;
4450; P8LE-LABEL: spltCnstConvftoll:
4451; P8LE:       # %bb.0: # %entry
4452; P8LE-NEXT:    addis r3, r2, .LCPI81_0@toc@ha
4453; P8LE-NEXT:    addi r3, r3, .LCPI81_0@toc@l
4454; P8LE-NEXT:    lxvd2x vs0, 0, r3
4455; P8LE-NEXT:    xxswapd v2, vs0
4456; P8LE-NEXT:    blr
4457entry:
4458  ret <2 x i64> <i64 4, i64 4>
4459}
4460
4461; Function Attrs: norecurse nounwind readnone
4462define <2 x i64> @fromRegsConvftoll(float %a, float %b) {
4463; P9BE-LABEL: fromRegsConvftoll:
4464; P9BE:       # %bb.0: # %entry
4465; P9BE-NEXT:    # kill: def $f2 killed $f2 def $vsl2
4466; P9BE-NEXT:    # kill: def $f1 killed $f1 def $vsl1
4467; P9BE-NEXT:    xxmrghd vs0, vs1, vs2
4468; P9BE-NEXT:    xvcvdpsxds v2, vs0
4469; P9BE-NEXT:    blr
4470;
4471; P9LE-LABEL: fromRegsConvftoll:
4472; P9LE:       # %bb.0: # %entry
4473; P9LE-NEXT:    # kill: def $f2 killed $f2 def $vsl2
4474; P9LE-NEXT:    # kill: def $f1 killed $f1 def $vsl1
4475; P9LE-NEXT:    xxmrghd vs0, vs2, vs1
4476; P9LE-NEXT:    xvcvdpsxds v2, vs0
4477; P9LE-NEXT:    blr
4478;
4479; P8BE-LABEL: fromRegsConvftoll:
4480; P8BE:       # %bb.0: # %entry
4481; P8BE-NEXT:    # kill: def $f2 killed $f2 def $vsl2
4482; P8BE-NEXT:    # kill: def $f1 killed $f1 def $vsl1
4483; P8BE-NEXT:    xxmrghd vs0, vs1, vs2
4484; P8BE-NEXT:    xvcvdpsxds v2, vs0
4485; P8BE-NEXT:    blr
4486;
4487; P8LE-LABEL: fromRegsConvftoll:
4488; P8LE:       # %bb.0: # %entry
4489; P8LE-NEXT:    # kill: def $f2 killed $f2 def $vsl2
4490; P8LE-NEXT:    # kill: def $f1 killed $f1 def $vsl1
4491; P8LE-NEXT:    xxmrghd vs0, vs2, vs1
4492; P8LE-NEXT:    xvcvdpsxds v2, vs0
4493; P8LE-NEXT:    blr
4494entry:
4495  %conv = fptosi float %a to i64
4496  %vecinit = insertelement <2 x i64> undef, i64 %conv, i32 0
4497  %conv1 = fptosi float %b to i64
4498  %vecinit2 = insertelement <2 x i64> %vecinit, i64 %conv1, i32 1
4499  ret <2 x i64> %vecinit2
4500}
4501
4502; Function Attrs: norecurse nounwind readnone
4503define <2 x i64> @fromDiffConstsConvftoll() {
4504; P9BE-LABEL: fromDiffConstsConvftoll:
4505; P9BE:       # %bb.0: # %entry
4506; P9BE-NEXT:    addis r3, r2, .LCPI83_0@toc@ha
4507; P9BE-NEXT:    addi r3, r3, .LCPI83_0@toc@l
4508; P9BE-NEXT:    lxvx v2, 0, r3
4509; P9BE-NEXT:    blr
4510;
4511; P9LE-LABEL: fromDiffConstsConvftoll:
4512; P9LE:       # %bb.0: # %entry
4513; P9LE-NEXT:    addis r3, r2, .LCPI83_0@toc@ha
4514; P9LE-NEXT:    addi r3, r3, .LCPI83_0@toc@l
4515; P9LE-NEXT:    lxvx v2, 0, r3
4516; P9LE-NEXT:    blr
4517;
4518; P8BE-LABEL: fromDiffConstsConvftoll:
4519; P8BE:       # %bb.0: # %entry
4520; P8BE-NEXT:    addis r3, r2, .LCPI83_0@toc@ha
4521; P8BE-NEXT:    addi r3, r3, .LCPI83_0@toc@l
4522; P8BE-NEXT:    lxvd2x v2, 0, r3
4523; P8BE-NEXT:    blr
4524;
4525; P8LE-LABEL: fromDiffConstsConvftoll:
4526; P8LE:       # %bb.0: # %entry
4527; P8LE-NEXT:    addis r3, r2, .LCPI83_0@toc@ha
4528; P8LE-NEXT:    addi r3, r3, .LCPI83_0@toc@l
4529; P8LE-NEXT:    lxvd2x vs0, 0, r3
4530; P8LE-NEXT:    xxswapd v2, vs0
4531; P8LE-NEXT:    blr
4532entry:
4533  ret <2 x i64> <i64 24, i64 234>
4534}
4535
4536; Function Attrs: norecurse nounwind readonly
4537define <2 x i64> @fromDiffMemConsAConvftoll(float* nocapture readonly %ptr) {
4538; P9BE-LABEL: fromDiffMemConsAConvftoll:
4539; P9BE:       # %bb.0: # %entry
4540; P9BE-NEXT:    lfs f0, 0(r3)
4541; P9BE-NEXT:    lfs f1, 4(r3)
4542; P9BE-NEXT:    xxmrghd vs0, vs0, vs1
4543; P9BE-NEXT:    xvcvdpsxds v2, vs0
4544; P9BE-NEXT:    blr
4545;
4546; P9LE-LABEL: fromDiffMemConsAConvftoll:
4547; P9LE:       # %bb.0: # %entry
4548; P9LE-NEXT:    lfs f0, 0(r3)
4549; P9LE-NEXT:    lfs f1, 4(r3)
4550; P9LE-NEXT:    xxmrghd vs0, vs1, vs0
4551; P9LE-NEXT:    xvcvdpsxds v2, vs0
4552; P9LE-NEXT:    blr
4553;
4554; P8BE-LABEL: fromDiffMemConsAConvftoll:
4555; P8BE:       # %bb.0: # %entry
4556; P8BE-NEXT:    lfsx f0, 0, r3
4557; P8BE-NEXT:    lfs f1, 4(r3)
4558; P8BE-NEXT:    xxmrghd vs0, vs0, vs1
4559; P8BE-NEXT:    xvcvdpsxds v2, vs0
4560; P8BE-NEXT:    blr
4561;
4562; P8LE-LABEL: fromDiffMemConsAConvftoll:
4563; P8LE:       # %bb.0: # %entry
4564; P8LE-NEXT:    lfsx f0, 0, r3
4565; P8LE-NEXT:    lfs f1, 4(r3)
4566; P8LE-NEXT:    xxmrghd vs0, vs1, vs0
4567; P8LE-NEXT:    xvcvdpsxds v2, vs0
4568; P8LE-NEXT:    blr
4569entry:
4570  %0 = load float, float* %ptr, align 4
4571  %conv = fptosi float %0 to i64
4572  %vecinit = insertelement <2 x i64> undef, i64 %conv, i32 0
4573  %arrayidx1 = getelementptr inbounds float, float* %ptr, i64 1
4574  %1 = load float, float* %arrayidx1, align 4
4575  %conv2 = fptosi float %1 to i64
4576  %vecinit3 = insertelement <2 x i64> %vecinit, i64 %conv2, i32 1
4577  ret <2 x i64> %vecinit3
4578}
4579
4580; Function Attrs: norecurse nounwind readonly
4581define <2 x i64> @fromDiffMemConsDConvftoll(float* nocapture readonly %ptr) {
4582; P9BE-LABEL: fromDiffMemConsDConvftoll:
4583; P9BE:       # %bb.0: # %entry
4584; P9BE-NEXT:    lfs f0, 12(r3)
4585; P9BE-NEXT:    lfs f1, 8(r3)
4586; P9BE-NEXT:    xxmrghd vs0, vs0, vs1
4587; P9BE-NEXT:    xvcvdpsxds v2, vs0
4588; P9BE-NEXT:    blr
4589;
4590; P9LE-LABEL: fromDiffMemConsDConvftoll:
4591; P9LE:       # %bb.0: # %entry
4592; P9LE-NEXT:    lfs f0, 12(r3)
4593; P9LE-NEXT:    lfs f1, 8(r3)
4594; P9LE-NEXT:    xxmrghd vs0, vs1, vs0
4595; P9LE-NEXT:    xvcvdpsxds v2, vs0
4596; P9LE-NEXT:    blr
4597;
4598; P8BE-LABEL: fromDiffMemConsDConvftoll:
4599; P8BE:       # %bb.0: # %entry
4600; P8BE-NEXT:    lfs f0, 12(r3)
4601; P8BE-NEXT:    lfs f1, 8(r3)
4602; P8BE-NEXT:    xxmrghd vs0, vs0, vs1
4603; P8BE-NEXT:    xvcvdpsxds v2, vs0
4604; P8BE-NEXT:    blr
4605;
4606; P8LE-LABEL: fromDiffMemConsDConvftoll:
4607; P8LE:       # %bb.0: # %entry
4608; P8LE-NEXT:    lfs f0, 12(r3)
4609; P8LE-NEXT:    lfs f1, 8(r3)
4610; P8LE-NEXT:    xxmrghd vs0, vs1, vs0
4611; P8LE-NEXT:    xvcvdpsxds v2, vs0
4612; P8LE-NEXT:    blr
4613entry:
4614  %arrayidx = getelementptr inbounds float, float* %ptr, i64 3
4615  %0 = load float, float* %arrayidx, align 4
4616  %conv = fptosi float %0 to i64
4617  %vecinit = insertelement <2 x i64> undef, i64 %conv, i32 0
4618  %arrayidx1 = getelementptr inbounds float, float* %ptr, i64 2
4619  %1 = load float, float* %arrayidx1, align 4
4620  %conv2 = fptosi float %1 to i64
4621  %vecinit3 = insertelement <2 x i64> %vecinit, i64 %conv2, i32 1
4622  ret <2 x i64> %vecinit3
4623}
4624
4625; Function Attrs: norecurse nounwind readonly
4626define <2 x i64> @fromDiffMemVarAConvftoll(float* nocapture readonly %arr, i32 signext %elem) {
4627; P9BE-LABEL: fromDiffMemVarAConvftoll:
4628; P9BE:       # %bb.0: # %entry
4629; P9BE-NEXT:    sldi r4, r4, 2
4630; P9BE-NEXT:    lfsux f0, r3, r4
4631; P9BE-NEXT:    lfs f1, 4(r3)
4632; P9BE-NEXT:    xxmrghd vs0, vs0, vs1
4633; P9BE-NEXT:    xvcvdpsxds v2, vs0
4634; P9BE-NEXT:    blr
4635;
4636; P9LE-LABEL: fromDiffMemVarAConvftoll:
4637; P9LE:       # %bb.0: # %entry
4638; P9LE-NEXT:    sldi r4, r4, 2
4639; P9LE-NEXT:    lfsux f0, r3, r4
4640; P9LE-NEXT:    lfs f1, 4(r3)
4641; P9LE-NEXT:    xxmrghd vs0, vs1, vs0
4642; P9LE-NEXT:    xvcvdpsxds v2, vs0
4643; P9LE-NEXT:    blr
4644;
4645; P8BE-LABEL: fromDiffMemVarAConvftoll:
4646; P8BE:       # %bb.0: # %entry
4647; P8BE-NEXT:    sldi r4, r4, 2
4648; P8BE-NEXT:    lfsux f0, r3, r4
4649; P8BE-NEXT:    lfs f1, 4(r3)
4650; P8BE-NEXT:    xxmrghd vs0, vs0, vs1
4651; P8BE-NEXT:    xvcvdpsxds v2, vs0
4652; P8BE-NEXT:    blr
4653;
4654; P8LE-LABEL: fromDiffMemVarAConvftoll:
4655; P8LE:       # %bb.0: # %entry
4656; P8LE-NEXT:    sldi r4, r4, 2
4657; P8LE-NEXT:    lfsux f0, r3, r4
4658; P8LE-NEXT:    lfs f1, 4(r3)
4659; P8LE-NEXT:    xxmrghd vs0, vs1, vs0
4660; P8LE-NEXT:    xvcvdpsxds v2, vs0
4661; P8LE-NEXT:    blr
4662entry:
4663  %idxprom = sext i32 %elem to i64
4664  %arrayidx = getelementptr inbounds float, float* %arr, i64 %idxprom
4665  %0 = load float, float* %arrayidx, align 4
4666  %conv = fptosi float %0 to i64
4667  %vecinit = insertelement <2 x i64> undef, i64 %conv, i32 0
4668  %add = add nsw i32 %elem, 1
4669  %idxprom1 = sext i32 %add to i64
4670  %arrayidx2 = getelementptr inbounds float, float* %arr, i64 %idxprom1
4671  %1 = load float, float* %arrayidx2, align 4
4672  %conv3 = fptosi float %1 to i64
4673  %vecinit4 = insertelement <2 x i64> %vecinit, i64 %conv3, i32 1
4674  ret <2 x i64> %vecinit4
4675}
4676
4677; Function Attrs: norecurse nounwind readonly
4678define <2 x i64> @fromDiffMemVarDConvftoll(float* nocapture readonly %arr, i32 signext %elem) {
4679; P9BE-LABEL: fromDiffMemVarDConvftoll:
4680; P9BE:       # %bb.0: # %entry
4681; P9BE-NEXT:    sldi r4, r4, 2
4682; P9BE-NEXT:    lfsux f0, r3, r4
4683; P9BE-NEXT:    lfs f1, -4(r3)
4684; P9BE-NEXT:    xxmrghd vs0, vs0, vs1
4685; P9BE-NEXT:    xvcvdpsxds v2, vs0
4686; P9BE-NEXT:    blr
4687;
4688; P9LE-LABEL: fromDiffMemVarDConvftoll:
4689; P9LE:       # %bb.0: # %entry
4690; P9LE-NEXT:    sldi r4, r4, 2
4691; P9LE-NEXT:    lfsux f0, r3, r4
4692; P9LE-NEXT:    lfs f1, -4(r3)
4693; P9LE-NEXT:    xxmrghd vs0, vs1, vs0
4694; P9LE-NEXT:    xvcvdpsxds v2, vs0
4695; P9LE-NEXT:    blr
4696;
4697; P8BE-LABEL: fromDiffMemVarDConvftoll:
4698; P8BE:       # %bb.0: # %entry
4699; P8BE-NEXT:    sldi r4, r4, 2
4700; P8BE-NEXT:    lfsux f0, r3, r4
4701; P8BE-NEXT:    lfs f1, -4(r3)
4702; P8BE-NEXT:    xxmrghd vs0, vs0, vs1
4703; P8BE-NEXT:    xvcvdpsxds v2, vs0
4704; P8BE-NEXT:    blr
4705;
4706; P8LE-LABEL: fromDiffMemVarDConvftoll:
4707; P8LE:       # %bb.0: # %entry
4708; P8LE-NEXT:    sldi r4, r4, 2
4709; P8LE-NEXT:    lfsux f0, r3, r4
4710; P8LE-NEXT:    lfs f1, -4(r3)
4711; P8LE-NEXT:    xxmrghd vs0, vs1, vs0
4712; P8LE-NEXT:    xvcvdpsxds v2, vs0
4713; P8LE-NEXT:    blr
4714entry:
4715  %idxprom = sext i32 %elem to i64
4716  %arrayidx = getelementptr inbounds float, float* %arr, i64 %idxprom
4717  %0 = load float, float* %arrayidx, align 4
4718  %conv = fptosi float %0 to i64
4719  %vecinit = insertelement <2 x i64> undef, i64 %conv, i32 0
4720  %sub = add nsw i32 %elem, -1
4721  %idxprom1 = sext i32 %sub to i64
4722  %arrayidx2 = getelementptr inbounds float, float* %arr, i64 %idxprom1
4723  %1 = load float, float* %arrayidx2, align 4
4724  %conv3 = fptosi float %1 to i64
4725  %vecinit4 = insertelement <2 x i64> %vecinit, i64 %conv3, i32 1
4726  ret <2 x i64> %vecinit4
4727}
4728
4729; Function Attrs: norecurse nounwind readnone
4730define <2 x i64> @spltRegValConvftoll(float %val) {
4731; P9BE-LABEL: spltRegValConvftoll:
4732; P9BE:       # %bb.0: # %entry
4733; P9BE-NEXT:    xscvdpsxds f0, f1
4734; P9BE-NEXT:    xxspltd v2, f0, 0
4735; P9BE-NEXT:    blr
4736;
4737; P9LE-LABEL: spltRegValConvftoll:
4738; P9LE:       # %bb.0: # %entry
4739; P9LE-NEXT:    xscvdpsxds f0, f1
4740; P9LE-NEXT:    xxspltd v2, f0, 0
4741; P9LE-NEXT:    blr
4742;
4743; P8BE-LABEL: spltRegValConvftoll:
4744; P8BE:       # %bb.0: # %entry
4745; P8BE-NEXT:    xscvdpsxds f0, f1
4746; P8BE-NEXT:    xxspltd v2, f0, 0
4747; P8BE-NEXT:    blr
4748;
4749; P8LE-LABEL: spltRegValConvftoll:
4750; P8LE:       # %bb.0: # %entry
4751; P8LE-NEXT:    xscvdpsxds f0, f1
4752; P8LE-NEXT:    xxspltd v2, f0, 0
4753; P8LE-NEXT:    blr
4754entry:
4755  %conv = fptosi float %val to i64
4756  %splat.splatinsert = insertelement <2 x i64> undef, i64 %conv, i32 0
4757  %splat.splat = shufflevector <2 x i64> %splat.splatinsert, <2 x i64> undef, <2 x i32> zeroinitializer
4758  ret <2 x i64> %splat.splat
4759}
4760
4761; Function Attrs: norecurse nounwind readonly
4762define <2 x i64> @spltMemValConvftoll(float* nocapture readonly %ptr) {
4763; P9BE-LABEL: spltMemValConvftoll:
4764; P9BE:       # %bb.0: # %entry
4765; P9BE-NEXT:    lfs f0, 0(r3)
4766; P9BE-NEXT:    xscvdpsxds f0, f0
4767; P9BE-NEXT:    xxspltd v2, f0, 0
4768; P9BE-NEXT:    blr
4769;
4770; P9LE-LABEL: spltMemValConvftoll:
4771; P9LE:       # %bb.0: # %entry
4772; P9LE-NEXT:    lfs f0, 0(r3)
4773; P9LE-NEXT:    xscvdpsxds f0, f0
4774; P9LE-NEXT:    xxspltd v2, f0, 0
4775; P9LE-NEXT:    blr
4776;
4777; P8BE-LABEL: spltMemValConvftoll:
4778; P8BE:       # %bb.0: # %entry
4779; P8BE-NEXT:    lfsx f0, 0, r3
4780; P8BE-NEXT:    xscvdpsxds f0, f0
4781; P8BE-NEXT:    xxspltd v2, f0, 0
4782; P8BE-NEXT:    blr
4783;
4784; P8LE-LABEL: spltMemValConvftoll:
4785; P8LE:       # %bb.0: # %entry
4786; P8LE-NEXT:    lfsx f0, 0, r3
4787; P8LE-NEXT:    xscvdpsxds f0, f0
4788; P8LE-NEXT:    xxspltd v2, f0, 0
4789; P8LE-NEXT:    blr
4790entry:
4791  %0 = load float, float* %ptr, align 4
4792  %conv = fptosi float %0 to i64
4793  %splat.splatinsert = insertelement <2 x i64> undef, i64 %conv, i32 0
4794  %splat.splat = shufflevector <2 x i64> %splat.splatinsert, <2 x i64> undef, <2 x i32> zeroinitializer
4795  ret <2 x i64> %splat.splat
4796}
4797
4798; Function Attrs: norecurse nounwind readnone
4799define <2 x i64> @spltCnstConvdtoll() {
4800; P9BE-LABEL: spltCnstConvdtoll:
4801; P9BE:       # %bb.0: # %entry
4802; P9BE-NEXT:    addis r3, r2, .LCPI90_0@toc@ha
4803; P9BE-NEXT:    addi r3, r3, .LCPI90_0@toc@l
4804; P9BE-NEXT:    lxvx v2, 0, r3
4805; P9BE-NEXT:    blr
4806;
4807; P9LE-LABEL: spltCnstConvdtoll:
4808; P9LE:       # %bb.0: # %entry
4809; P9LE-NEXT:    addis r3, r2, .LCPI90_0@toc@ha
4810; P9LE-NEXT:    addi r3, r3, .LCPI90_0@toc@l
4811; P9LE-NEXT:    lxvx v2, 0, r3
4812; P9LE-NEXT:    blr
4813;
4814; P8BE-LABEL: spltCnstConvdtoll:
4815; P8BE:       # %bb.0: # %entry
4816; P8BE-NEXT:    addis r3, r2, .LCPI90_0@toc@ha
4817; P8BE-NEXT:    addi r3, r3, .LCPI90_0@toc@l
4818; P8BE-NEXT:    lxvd2x v2, 0, r3
4819; P8BE-NEXT:    blr
4820;
4821; P8LE-LABEL: spltCnstConvdtoll:
4822; P8LE:       # %bb.0: # %entry
4823; P8LE-NEXT:    addis r3, r2, .LCPI90_0@toc@ha
4824; P8LE-NEXT:    addi r3, r3, .LCPI90_0@toc@l
4825; P8LE-NEXT:    lxvd2x vs0, 0, r3
4826; P8LE-NEXT:    xxswapd v2, vs0
4827; P8LE-NEXT:    blr
4828entry:
4829  ret <2 x i64> <i64 4, i64 4>
4830}
4831
4832; Function Attrs: norecurse nounwind readnone
4833define <2 x i64> @fromRegsConvdtoll(double %a, double %b) {
4834; P9BE-LABEL: fromRegsConvdtoll:
4835; P9BE:       # %bb.0: # %entry
4836; P9BE-NEXT:    # kill: def $f2 killed $f2 def $vsl2
4837; P9BE-NEXT:    # kill: def $f1 killed $f1 def $vsl1
4838; P9BE-NEXT:    xxmrghd vs0, vs1, vs2
4839; P9BE-NEXT:    xvcvdpsxds v2, vs0
4840; P9BE-NEXT:    blr
4841;
4842; P9LE-LABEL: fromRegsConvdtoll:
4843; P9LE:       # %bb.0: # %entry
4844; P9LE-NEXT:    # kill: def $f2 killed $f2 def $vsl2
4845; P9LE-NEXT:    # kill: def $f1 killed $f1 def $vsl1
4846; P9LE-NEXT:    xxmrghd vs0, vs2, vs1
4847; P9LE-NEXT:    xvcvdpsxds v2, vs0
4848; P9LE-NEXT:    blr
4849;
4850; P8BE-LABEL: fromRegsConvdtoll:
4851; P8BE:       # %bb.0: # %entry
4852; P8BE-NEXT:    # kill: def $f2 killed $f2 def $vsl2
4853; P8BE-NEXT:    # kill: def $f1 killed $f1 def $vsl1
4854; P8BE-NEXT:    xxmrghd vs0, vs1, vs2
4855; P8BE-NEXT:    xvcvdpsxds v2, vs0
4856; P8BE-NEXT:    blr
4857;
4858; P8LE-LABEL: fromRegsConvdtoll:
4859; P8LE:       # %bb.0: # %entry
4860; P8LE-NEXT:    # kill: def $f2 killed $f2 def $vsl2
4861; P8LE-NEXT:    # kill: def $f1 killed $f1 def $vsl1
4862; P8LE-NEXT:    xxmrghd vs0, vs2, vs1
4863; P8LE-NEXT:    xvcvdpsxds v2, vs0
4864; P8LE-NEXT:    blr
4865entry:
4866  %conv = fptosi double %a to i64
4867  %vecinit = insertelement <2 x i64> undef, i64 %conv, i32 0
4868  %conv1 = fptosi double %b to i64
4869  %vecinit2 = insertelement <2 x i64> %vecinit, i64 %conv1, i32 1
4870  ret <2 x i64> %vecinit2
4871}
4872
4873; Function Attrs: norecurse nounwind readnone
4874define <2 x i64> @fromDiffConstsConvdtoll() {
4875; P9BE-LABEL: fromDiffConstsConvdtoll:
4876; P9BE:       # %bb.0: # %entry
4877; P9BE-NEXT:    addis r3, r2, .LCPI92_0@toc@ha
4878; P9BE-NEXT:    addi r3, r3, .LCPI92_0@toc@l
4879; P9BE-NEXT:    lxvx v2, 0, r3
4880; P9BE-NEXT:    blr
4881;
4882; P9LE-LABEL: fromDiffConstsConvdtoll:
4883; P9LE:       # %bb.0: # %entry
4884; P9LE-NEXT:    addis r3, r2, .LCPI92_0@toc@ha
4885; P9LE-NEXT:    addi r3, r3, .LCPI92_0@toc@l
4886; P9LE-NEXT:    lxvx v2, 0, r3
4887; P9LE-NEXT:    blr
4888;
4889; P8BE-LABEL: fromDiffConstsConvdtoll:
4890; P8BE:       # %bb.0: # %entry
4891; P8BE-NEXT:    addis r3, r2, .LCPI92_0@toc@ha
4892; P8BE-NEXT:    addi r3, r3, .LCPI92_0@toc@l
4893; P8BE-NEXT:    lxvd2x v2, 0, r3
4894; P8BE-NEXT:    blr
4895;
4896; P8LE-LABEL: fromDiffConstsConvdtoll:
4897; P8LE:       # %bb.0: # %entry
4898; P8LE-NEXT:    addis r3, r2, .LCPI92_0@toc@ha
4899; P8LE-NEXT:    addi r3, r3, .LCPI92_0@toc@l
4900; P8LE-NEXT:    lxvd2x vs0, 0, r3
4901; P8LE-NEXT:    xxswapd v2, vs0
4902; P8LE-NEXT:    blr
4903entry:
4904  ret <2 x i64> <i64 24, i64 234>
4905}
4906
4907; Function Attrs: norecurse nounwind readonly
4908define <2 x i64> @fromDiffMemConsAConvdtoll(double* nocapture readonly %ptr) {
4909; P9BE-LABEL: fromDiffMemConsAConvdtoll:
4910; P9BE:       # %bb.0: # %entry
4911; P9BE-NEXT:    lxv vs0, 0(r3)
4912; P9BE-NEXT:    xvcvdpsxds v2, vs0
4913; P9BE-NEXT:    blr
4914;
4915; P9LE-LABEL: fromDiffMemConsAConvdtoll:
4916; P9LE:       # %bb.0: # %entry
4917; P9LE-NEXT:    lxv vs0, 0(r3)
4918; P9LE-NEXT:    xvcvdpsxds v2, vs0
4919; P9LE-NEXT:    blr
4920;
4921; P8BE-LABEL: fromDiffMemConsAConvdtoll:
4922; P8BE:       # %bb.0: # %entry
4923; P8BE-NEXT:    lxvd2x vs0, 0, r3
4924; P8BE-NEXT:    xvcvdpsxds v2, vs0
4925; P8BE-NEXT:    blr
4926;
4927; P8LE-LABEL: fromDiffMemConsAConvdtoll:
4928; P8LE:       # %bb.0: # %entry
4929; P8LE-NEXT:    lxvd2x vs0, 0, r3
4930; P8LE-NEXT:    xxswapd vs0, vs0
4931; P8LE-NEXT:    xvcvdpsxds v2, vs0
4932; P8LE-NEXT:    blr
4933entry:
4934  %0 = bitcast double* %ptr to <2 x double>*
4935  %1 = load <2 x double>, <2 x double>* %0, align 8
4936  %2 = fptosi <2 x double> %1 to <2 x i64>
4937  ret <2 x i64> %2
4938}
4939
4940; Function Attrs: norecurse nounwind readonly
4941define <2 x i64> @fromDiffMemConsDConvdtoll(double* nocapture readonly %ptr) {
4942; P9BE-LABEL: fromDiffMemConsDConvdtoll:
4943; P9BE:       # %bb.0: # %entry
4944; P9BE-NEXT:    lxv vs0, 16(r3)
4945; P9BE-NEXT:    xxswapd vs0, vs0
4946; P9BE-NEXT:    xvcvdpsxds v2, vs0
4947; P9BE-NEXT:    blr
4948;
4949; P9LE-LABEL: fromDiffMemConsDConvdtoll:
4950; P9LE:       # %bb.0: # %entry
4951; P9LE-NEXT:    lxv vs0, 16(r3)
4952; P9LE-NEXT:    xxswapd vs0, vs0
4953; P9LE-NEXT:    xvcvdpsxds v2, vs0
4954; P9LE-NEXT:    blr
4955;
4956; P8BE-LABEL: fromDiffMemConsDConvdtoll:
4957; P8BE:       # %bb.0: # %entry
4958; P8BE-NEXT:    addi r3, r3, 16
4959; P8BE-NEXT:    lxvd2x vs0, 0, r3
4960; P8BE-NEXT:    xxswapd vs0, vs0
4961; P8BE-NEXT:    xvcvdpsxds v2, vs0
4962; P8BE-NEXT:    blr
4963;
4964; P8LE-LABEL: fromDiffMemConsDConvdtoll:
4965; P8LE:       # %bb.0: # %entry
4966; P8LE-NEXT:    addi r3, r3, 16
4967; P8LE-NEXT:    lxvd2x vs0, 0, r3
4968; P8LE-NEXT:    xvcvdpsxds v2, vs0
4969; P8LE-NEXT:    blr
4970entry:
4971  %arrayidx = getelementptr inbounds double, double* %ptr, i64 3
4972  %0 = load double, double* %arrayidx, align 8
4973  %conv = fptosi double %0 to i64
4974  %vecinit = insertelement <2 x i64> undef, i64 %conv, i32 0
4975  %arrayidx1 = getelementptr inbounds double, double* %ptr, i64 2
4976  %1 = load double, double* %arrayidx1, align 8
4977  %conv2 = fptosi double %1 to i64
4978  %vecinit3 = insertelement <2 x i64> %vecinit, i64 %conv2, i32 1
4979  ret <2 x i64> %vecinit3
4980}
4981
4982; Function Attrs: norecurse nounwind readonly
4983define <2 x i64> @fromDiffMemVarAConvdtoll(double* nocapture readonly %arr, i32 signext %elem) {
4984; P9BE-LABEL: fromDiffMemVarAConvdtoll:
4985; P9BE:       # %bb.0: # %entry
4986; P9BE-NEXT:    sldi r4, r4, 3
4987; P9BE-NEXT:    lxvx vs0, r3, r4
4988; P9BE-NEXT:    xvcvdpsxds v2, vs0
4989; P9BE-NEXT:    blr
4990;
4991; P9LE-LABEL: fromDiffMemVarAConvdtoll:
4992; P9LE:       # %bb.0: # %entry
4993; P9LE-NEXT:    sldi r4, r4, 3
4994; P9LE-NEXT:    lxvx vs0, r3, r4
4995; P9LE-NEXT:    xvcvdpsxds v2, vs0
4996; P9LE-NEXT:    blr
4997;
4998; P8BE-LABEL: fromDiffMemVarAConvdtoll:
4999; P8BE:       # %bb.0: # %entry
5000; P8BE-NEXT:    sldi r4, r4, 3
5001; P8BE-NEXT:    lxvd2x vs0, r3, r4
5002; P8BE-NEXT:    xvcvdpsxds v2, vs0
5003; P8BE-NEXT:    blr
5004;
5005; P8LE-LABEL: fromDiffMemVarAConvdtoll:
5006; P8LE:       # %bb.0: # %entry
5007; P8LE-NEXT:    sldi r4, r4, 3
5008; P8LE-NEXT:    lxvd2x vs0, r3, r4
5009; P8LE-NEXT:    xxswapd vs0, vs0
5010; P8LE-NEXT:    xvcvdpsxds v2, vs0
5011; P8LE-NEXT:    blr
5012entry:
5013  %idxprom = sext i32 %elem to i64
5014  %arrayidx = getelementptr inbounds double, double* %arr, i64 %idxprom
5015  %0 = load double, double* %arrayidx, align 8
5016  %conv = fptosi double %0 to i64
5017  %vecinit = insertelement <2 x i64> undef, i64 %conv, i32 0
5018  %add = add nsw i32 %elem, 1
5019  %idxprom1 = sext i32 %add to i64
5020  %arrayidx2 = getelementptr inbounds double, double* %arr, i64 %idxprom1
5021  %1 = load double, double* %arrayidx2, align 8
5022  %conv3 = fptosi double %1 to i64
5023  %vecinit4 = insertelement <2 x i64> %vecinit, i64 %conv3, i32 1
5024  ret <2 x i64> %vecinit4
5025}
5026
5027; Function Attrs: norecurse nounwind readonly
5028define <2 x i64> @fromDiffMemVarDConvdtoll(double* nocapture readonly %arr, i32 signext %elem) {
5029; P9BE-LABEL: fromDiffMemVarDConvdtoll:
5030; P9BE:       # %bb.0: # %entry
5031; P9BE-NEXT:    sldi r4, r4, 3
5032; P9BE-NEXT:    add r3, r3, r4
5033; P9BE-NEXT:    li r4, -8
5034; P9BE-NEXT:    lxvx vs0, r3, r4
5035; P9BE-NEXT:    xxswapd vs0, vs0
5036; P9BE-NEXT:    xvcvdpsxds v2, vs0
5037; P9BE-NEXT:    blr
5038;
5039; P9LE-LABEL: fromDiffMemVarDConvdtoll:
5040; P9LE:       # %bb.0: # %entry
5041; P9LE-NEXT:    sldi r4, r4, 3
5042; P9LE-NEXT:    add r3, r3, r4
5043; P9LE-NEXT:    li r4, -8
5044; P9LE-NEXT:    lxvx vs0, r3, r4
5045; P9LE-NEXT:    xxswapd vs0, vs0
5046; P9LE-NEXT:    xvcvdpsxds v2, vs0
5047; P9LE-NEXT:    blr
5048;
5049; P8BE-LABEL: fromDiffMemVarDConvdtoll:
5050; P8BE:       # %bb.0: # %entry
5051; P8BE-NEXT:    sldi r4, r4, 3
5052; P8BE-NEXT:    add r3, r3, r4
5053; P8BE-NEXT:    addi r3, r3, -8
5054; P8BE-NEXT:    lxvd2x vs0, 0, r3
5055; P8BE-NEXT:    xxswapd vs0, vs0
5056; P8BE-NEXT:    xvcvdpsxds v2, vs0
5057; P8BE-NEXT:    blr
5058;
5059; P8LE-LABEL: fromDiffMemVarDConvdtoll:
5060; P8LE:       # %bb.0: # %entry
5061; P8LE-NEXT:    sldi r4, r4, 3
5062; P8LE-NEXT:    add r3, r3, r4
5063; P8LE-NEXT:    addi r3, r3, -8
5064; P8LE-NEXT:    lxvd2x vs0, 0, r3
5065; P8LE-NEXT:    xvcvdpsxds v2, vs0
5066; P8LE-NEXT:    blr
5067entry:
5068  %idxprom = sext i32 %elem to i64
5069  %arrayidx = getelementptr inbounds double, double* %arr, i64 %idxprom
5070  %0 = load double, double* %arrayidx, align 8
5071  %conv = fptosi double %0 to i64
5072  %vecinit = insertelement <2 x i64> undef, i64 %conv, i32 0
5073  %sub = add nsw i32 %elem, -1
5074  %idxprom1 = sext i32 %sub to i64
5075  %arrayidx2 = getelementptr inbounds double, double* %arr, i64 %idxprom1
5076  %1 = load double, double* %arrayidx2, align 8
5077  %conv3 = fptosi double %1 to i64
5078  %vecinit4 = insertelement <2 x i64> %vecinit, i64 %conv3, i32 1
5079  ret <2 x i64> %vecinit4
5080}
5081
5082; Function Attrs: norecurse nounwind readnone
5083define <2 x i64> @spltRegValConvdtoll(double %val) {
5084; P9BE-LABEL: spltRegValConvdtoll:
5085; P9BE:       # %bb.0: # %entry
5086; P9BE-NEXT:    xscvdpsxds f0, f1
5087; P9BE-NEXT:    xxspltd v2, vs0, 0
5088; P9BE-NEXT:    blr
5089;
5090; P9LE-LABEL: spltRegValConvdtoll:
5091; P9LE:       # %bb.0: # %entry
5092; P9LE-NEXT:    xscvdpsxds f0, f1
5093; P9LE-NEXT:    xxspltd v2, vs0, 0
5094; P9LE-NEXT:    blr
5095;
5096; P8BE-LABEL: spltRegValConvdtoll:
5097; P8BE:       # %bb.0: # %entry
5098; P8BE-NEXT:    xscvdpsxds f0, f1
5099; P8BE-NEXT:    xxspltd v2, vs0, 0
5100; P8BE-NEXT:    blr
5101;
5102; P8LE-LABEL: spltRegValConvdtoll:
5103; P8LE:       # %bb.0: # %entry
5104; P8LE-NEXT:    xscvdpsxds f0, f1
5105; P8LE-NEXT:    xxspltd v2, vs0, 0
5106; P8LE-NEXT:    blr
5107entry:
5108  %conv = fptosi double %val to i64
5109  %splat.splatinsert = insertelement <2 x i64> undef, i64 %conv, i32 0
5110  %splat.splat = shufflevector <2 x i64> %splat.splatinsert, <2 x i64> undef, <2 x i32> zeroinitializer
5111  ret <2 x i64> %splat.splat
5112}
5113
5114; Function Attrs: norecurse nounwind readonly
5115define <2 x i64> @spltMemValConvdtoll(double* nocapture readonly %ptr) {
5116; P9BE-LABEL: spltMemValConvdtoll:
5117; P9BE:       # %bb.0: # %entry
5118; P9BE-NEXT:    lxvdsx vs0, 0, r3
5119; P9BE-NEXT:    xvcvdpsxds v2, vs0
5120; P9BE-NEXT:    blr
5121;
5122; P9LE-LABEL: spltMemValConvdtoll:
5123; P9LE:       # %bb.0: # %entry
5124; P9LE-NEXT:    lxvdsx vs0, 0, r3
5125; P9LE-NEXT:    xvcvdpsxds v2, vs0
5126; P9LE-NEXT:    blr
5127;
5128; P8BE-LABEL: spltMemValConvdtoll:
5129; P8BE:       # %bb.0: # %entry
5130; P8BE-NEXT:    lxvdsx vs0, 0, r3
5131; P8BE-NEXT:    xvcvdpsxds v2, vs0
5132; P8BE-NEXT:    blr
5133;
5134; P8LE-LABEL: spltMemValConvdtoll:
5135; P8LE:       # %bb.0: # %entry
5136; P8LE-NEXT:    lxvdsx vs0, 0, r3
5137; P8LE-NEXT:    xvcvdpsxds v2, vs0
5138; P8LE-NEXT:    blr
5139entry:
5140  %0 = load double, double* %ptr, align 8
5141  %conv = fptosi double %0 to i64
5142  %splat.splatinsert = insertelement <2 x i64> undef, i64 %conv, i32 0
5143  %splat.splat = shufflevector <2 x i64> %splat.splatinsert, <2 x i64> undef, <2 x i32> zeroinitializer
5144  ret <2 x i64> %splat.splat
5145}
5146
5147; Function Attrs: norecurse nounwind readnone
5148define <2 x i64> @allZeroull() {
5149; P9BE-LABEL: allZeroull:
5150; P9BE:       # %bb.0: # %entry
5151; P9BE-NEXT:    xxlxor v2, v2, v2
5152; P9BE-NEXT:    blr
5153;
5154; P9LE-LABEL: allZeroull:
5155; P9LE:       # %bb.0: # %entry
5156; P9LE-NEXT:    xxlxor v2, v2, v2
5157; P9LE-NEXT:    blr
5158;
5159; P8BE-LABEL: allZeroull:
5160; P8BE:       # %bb.0: # %entry
5161; P8BE-NEXT:    xxlxor v2, v2, v2
5162; P8BE-NEXT:    blr
5163;
5164; P8LE-LABEL: allZeroull:
5165; P8LE:       # %bb.0: # %entry
5166; P8LE-NEXT:    xxlxor v2, v2, v2
5167; P8LE-NEXT:    blr
5168entry:
5169  ret <2 x i64> zeroinitializer
5170}
5171
5172; Function Attrs: norecurse nounwind readnone
5173define <2 x i64> @allOneull() {
5174; P9BE-LABEL: allOneull:
5175; P9BE:       # %bb.0: # %entry
5176; P9BE-NEXT:    xxspltib v2, 255
5177; P9BE-NEXT:    blr
5178;
5179; P9LE-LABEL: allOneull:
5180; P9LE:       # %bb.0: # %entry
5181; P9LE-NEXT:    xxspltib v2, 255
5182; P9LE-NEXT:    blr
5183;
5184; P8BE-LABEL: allOneull:
5185; P8BE:       # %bb.0: # %entry
5186; P8BE-NEXT:    vspltisb v2, -1
5187; P8BE-NEXT:    blr
5188;
5189; P8LE-LABEL: allOneull:
5190; P8LE:       # %bb.0: # %entry
5191; P8LE-NEXT:    vspltisb v2, -1
5192; P8LE-NEXT:    blr
5193entry:
5194  ret <2 x i64> <i64 -1, i64 -1>
5195}
5196
5197; Function Attrs: norecurse nounwind readnone
5198define <2 x i64> @spltConst1ull() {
5199; P9BE-LABEL: spltConst1ull:
5200; P9BE:       # %bb.0: # %entry
5201; P9BE-NEXT:    addis r3, r2, .LCPI101_0@toc@ha
5202; P9BE-NEXT:    addi r3, r3, .LCPI101_0@toc@l
5203; P9BE-NEXT:    lxvx v2, 0, r3
5204; P9BE-NEXT:    blr
5205;
5206; P9LE-LABEL: spltConst1ull:
5207; P9LE:       # %bb.0: # %entry
5208; P9LE-NEXT:    addis r3, r2, .LCPI101_0@toc@ha
5209; P9LE-NEXT:    addi r3, r3, .LCPI101_0@toc@l
5210; P9LE-NEXT:    lxvx v2, 0, r3
5211; P9LE-NEXT:    blr
5212;
5213; P8BE-LABEL: spltConst1ull:
5214; P8BE:       # %bb.0: # %entry
5215; P8BE-NEXT:    addis r3, r2, .LCPI101_0@toc@ha
5216; P8BE-NEXT:    addi r3, r3, .LCPI101_0@toc@l
5217; P8BE-NEXT:    lxvd2x v2, 0, r3
5218; P8BE-NEXT:    blr
5219;
5220; P8LE-LABEL: spltConst1ull:
5221; P8LE:       # %bb.0: # %entry
5222; P8LE-NEXT:    addis r3, r2, .LCPI101_0@toc@ha
5223; P8LE-NEXT:    addi r3, r3, .LCPI101_0@toc@l
5224; P8LE-NEXT:    lxvd2x vs0, 0, r3
5225; P8LE-NEXT:    xxswapd v2, vs0
5226; P8LE-NEXT:    blr
5227entry:
5228  ret <2 x i64> <i64 1, i64 1>
5229}
5230
5231; Function Attrs: norecurse nounwind readnone
5232define <2 x i64> @spltConst16kull() {
5233; P9BE-LABEL: spltConst16kull:
5234; P9BE:       # %bb.0: # %entry
5235; P9BE-NEXT:    addis r3, r2, .LCPI102_0@toc@ha
5236; P9BE-NEXT:    addi r3, r3, .LCPI102_0@toc@l
5237; P9BE-NEXT:    lxvx v2, 0, r3
5238; P9BE-NEXT:    blr
5239;
5240; P9LE-LABEL: spltConst16kull:
5241; P9LE:       # %bb.0: # %entry
5242; P9LE-NEXT:    addis r3, r2, .LCPI102_0@toc@ha
5243; P9LE-NEXT:    addi r3, r3, .LCPI102_0@toc@l
5244; P9LE-NEXT:    lxvx v2, 0, r3
5245; P9LE-NEXT:    blr
5246;
5247; P8BE-LABEL: spltConst16kull:
5248; P8BE:       # %bb.0: # %entry
5249; P8BE-NEXT:    addis r3, r2, .LCPI102_0@toc@ha
5250; P8BE-NEXT:    addi r3, r3, .LCPI102_0@toc@l
5251; P8BE-NEXT:    lxvd2x v2, 0, r3
5252; P8BE-NEXT:    blr
5253;
5254; P8LE-LABEL: spltConst16kull:
5255; P8LE:       # %bb.0: # %entry
5256; P8LE-NEXT:    addis r3, r2, .LCPI102_0@toc@ha
5257; P8LE-NEXT:    addi r3, r3, .LCPI102_0@toc@l
5258; P8LE-NEXT:    lxvd2x vs0, 0, r3
5259; P8LE-NEXT:    xxswapd v2, vs0
5260; P8LE-NEXT:    blr
5261entry:
5262  ret <2 x i64> <i64 32767, i64 32767>
5263}
5264
5265; Function Attrs: norecurse nounwind readnone
5266define <2 x i64> @spltConst32kull() {
5267; P9BE-LABEL: spltConst32kull:
5268; P9BE:       # %bb.0: # %entry
5269; P9BE-NEXT:    addis r3, r2, .LCPI103_0@toc@ha
5270; P9BE-NEXT:    addi r3, r3, .LCPI103_0@toc@l
5271; P9BE-NEXT:    lxvx v2, 0, r3
5272; P9BE-NEXT:    blr
5273;
5274; P9LE-LABEL: spltConst32kull:
5275; P9LE:       # %bb.0: # %entry
5276; P9LE-NEXT:    addis r3, r2, .LCPI103_0@toc@ha
5277; P9LE-NEXT:    addi r3, r3, .LCPI103_0@toc@l
5278; P9LE-NEXT:    lxvx v2, 0, r3
5279; P9LE-NEXT:    blr
5280;
5281; P8BE-LABEL: spltConst32kull:
5282; P8BE:       # %bb.0: # %entry
5283; P8BE-NEXT:    addis r3, r2, .LCPI103_0@toc@ha
5284; P8BE-NEXT:    addi r3, r3, .LCPI103_0@toc@l
5285; P8BE-NEXT:    lxvd2x v2, 0, r3
5286; P8BE-NEXT:    blr
5287;
5288; P8LE-LABEL: spltConst32kull:
5289; P8LE:       # %bb.0: # %entry
5290; P8LE-NEXT:    addis r3, r2, .LCPI103_0@toc@ha
5291; P8LE-NEXT:    addi r3, r3, .LCPI103_0@toc@l
5292; P8LE-NEXT:    lxvd2x vs0, 0, r3
5293; P8LE-NEXT:    xxswapd v2, vs0
5294; P8LE-NEXT:    blr
5295entry:
5296  ret <2 x i64> <i64 65535, i64 65535>
5297}
5298
5299; Function Attrs: norecurse nounwind readnone
5300define <2 x i64> @fromRegsull(i64 %a, i64 %b) {
5301; P9BE-LABEL: fromRegsull:
5302; P9BE:       # %bb.0: # %entry
5303; P9BE-NEXT:    mtvsrdd v2, r3, r4
5304; P9BE-NEXT:    blr
5305;
5306; P9LE-LABEL: fromRegsull:
5307; P9LE:       # %bb.0: # %entry
5308; P9LE-NEXT:    mtvsrdd v2, r4, r3
5309; P9LE-NEXT:    blr
5310;
5311; P8BE-LABEL: fromRegsull:
5312; P8BE:       # %bb.0: # %entry
5313; P8BE-NEXT:    mtvsrd f0, r4
5314; P8BE-NEXT:    mtvsrd f1, r3
5315; P8BE-NEXT:    xxmrghd v2, vs1, vs0
5316; P8BE-NEXT:    blr
5317;
5318; P8LE-LABEL: fromRegsull:
5319; P8LE:       # %bb.0: # %entry
5320; P8LE-NEXT:    mtvsrd f0, r3
5321; P8LE-NEXT:    mtvsrd f1, r4
5322; P8LE-NEXT:    xxmrghd v2, vs1, vs0
5323; P8LE-NEXT:    blr
5324entry:
5325  %vecinit = insertelement <2 x i64> undef, i64 %a, i32 0
5326  %vecinit1 = insertelement <2 x i64> %vecinit, i64 %b, i32 1
5327  ret <2 x i64> %vecinit1
5328}
5329
5330; Function Attrs: norecurse nounwind readnone
5331define <2 x i64> @fromDiffConstsull() {
5332; P9BE-LABEL: fromDiffConstsull:
5333; P9BE:       # %bb.0: # %entry
5334; P9BE-NEXT:    addis r3, r2, .LCPI105_0@toc@ha
5335; P9BE-NEXT:    addi r3, r3, .LCPI105_0@toc@l
5336; P9BE-NEXT:    lxvx v2, 0, r3
5337; P9BE-NEXT:    blr
5338;
5339; P9LE-LABEL: fromDiffConstsull:
5340; P9LE:       # %bb.0: # %entry
5341; P9LE-NEXT:    addis r3, r2, .LCPI105_0@toc@ha
5342; P9LE-NEXT:    addi r3, r3, .LCPI105_0@toc@l
5343; P9LE-NEXT:    lxvx v2, 0, r3
5344; P9LE-NEXT:    blr
5345;
5346; P8BE-LABEL: fromDiffConstsull:
5347; P8BE:       # %bb.0: # %entry
5348; P8BE-NEXT:    addis r3, r2, .LCPI105_0@toc@ha
5349; P8BE-NEXT:    addi r3, r3, .LCPI105_0@toc@l
5350; P8BE-NEXT:    lxvd2x v2, 0, r3
5351; P8BE-NEXT:    blr
5352;
5353; P8LE-LABEL: fromDiffConstsull:
5354; P8LE:       # %bb.0: # %entry
5355; P8LE-NEXT:    addis r3, r2, .LCPI105_0@toc@ha
5356; P8LE-NEXT:    addi r3, r3, .LCPI105_0@toc@l
5357; P8LE-NEXT:    lxvd2x vs0, 0, r3
5358; P8LE-NEXT:    xxswapd v2, vs0
5359; P8LE-NEXT:    blr
5360entry:
5361  ret <2 x i64> <i64 242, i64 -113>
5362}
5363
5364; Function Attrs: norecurse nounwind readonly
5365define <2 x i64> @fromDiffMemConsAull(i64* nocapture readonly %arr) {
5366; P9BE-LABEL: fromDiffMemConsAull:
5367; P9BE:       # %bb.0: # %entry
5368; P9BE-NEXT:    lxv v2, 0(r3)
5369; P9BE-NEXT:    blr
5370;
5371; P9LE-LABEL: fromDiffMemConsAull:
5372; P9LE:       # %bb.0: # %entry
5373; P9LE-NEXT:    lxv v2, 0(r3)
5374; P9LE-NEXT:    blr
5375;
5376; P8BE-LABEL: fromDiffMemConsAull:
5377; P8BE:       # %bb.0: # %entry
5378; P8BE-NEXT:    lxvd2x v2, 0, r3
5379; P8BE-NEXT:    blr
5380;
5381; P8LE-LABEL: fromDiffMemConsAull:
5382; P8LE:       # %bb.0: # %entry
5383; P8LE-NEXT:    lxvd2x vs0, 0, r3
5384; P8LE-NEXT:    xxswapd v2, vs0
5385; P8LE-NEXT:    blr
5386entry:
5387  %0 = load i64, i64* %arr, align 8
5388  %vecinit = insertelement <2 x i64> undef, i64 %0, i32 0
5389  %arrayidx1 = getelementptr inbounds i64, i64* %arr, i64 1
5390  %1 = load i64, i64* %arrayidx1, align 8
5391  %vecinit2 = insertelement <2 x i64> %vecinit, i64 %1, i32 1
5392  ret <2 x i64> %vecinit2
5393}
5394
5395; Function Attrs: norecurse nounwind readonly
5396define <2 x i64> @fromDiffMemConsDull(i64* nocapture readonly %arr) {
5397; P9BE-LABEL: fromDiffMemConsDull:
5398; P9BE:       # %bb.0: # %entry
5399; P9BE-NEXT:    lxv v2, 16(r3)
5400; P9BE-NEXT:    xxswapd v2, v2
5401; P9BE-NEXT:    blr
5402;
5403; P9LE-LABEL: fromDiffMemConsDull:
5404; P9LE:       # %bb.0: # %entry
5405; P9LE-NEXT:    lxv v2, 16(r3)
5406; P9LE-NEXT:    xxswapd v2, v2
5407; P9LE-NEXT:    blr
5408;
5409; P8BE-LABEL: fromDiffMemConsDull:
5410; P8BE:       # %bb.0: # %entry
5411; P8BE-NEXT:    addi r3, r3, 16
5412; P8BE-NEXT:    lxvd2x v2, 0, r3
5413; P8BE-NEXT:    xxswapd v2, v2
5414; P8BE-NEXT:    blr
5415;
5416; P8LE-LABEL: fromDiffMemConsDull:
5417; P8LE:       # %bb.0: # %entry
5418; P8LE-NEXT:    addi r3, r3, 16
5419; P8LE-NEXT:    lxvd2x v2, 0, r3
5420; P8LE-NEXT:    blr
5421entry:
5422  %arrayidx = getelementptr inbounds i64, i64* %arr, i64 3
5423  %0 = load i64, i64* %arrayidx, align 8
5424  %vecinit = insertelement <2 x i64> undef, i64 %0, i32 0
5425  %arrayidx1 = getelementptr inbounds i64, i64* %arr, i64 2
5426  %1 = load i64, i64* %arrayidx1, align 8
5427  %vecinit2 = insertelement <2 x i64> %vecinit, i64 %1, i32 1
5428  ret <2 x i64> %vecinit2
5429}
5430
5431; Function Attrs: norecurse nounwind readonly
5432define <2 x i64> @fromDiffMemVarAull(i64* nocapture readonly %arr, i32 signext %elem) {
5433; P9BE-LABEL: fromDiffMemVarAull:
5434; P9BE:       # %bb.0: # %entry
5435; P9BE-NEXT:    sldi r4, r4, 3
5436; P9BE-NEXT:    lxvx v2, r3, r4
5437; P9BE-NEXT:    blr
5438;
5439; P9LE-LABEL: fromDiffMemVarAull:
5440; P9LE:       # %bb.0: # %entry
5441; P9LE-NEXT:    sldi r4, r4, 3
5442; P9LE-NEXT:    lxvx v2, r3, r4
5443; P9LE-NEXT:    blr
5444;
5445; P8BE-LABEL: fromDiffMemVarAull:
5446; P8BE:       # %bb.0: # %entry
5447; P8BE-NEXT:    sldi r4, r4, 3
5448; P8BE-NEXT:    lxvd2x v2, r3, r4
5449; P8BE-NEXT:    blr
5450;
5451; P8LE-LABEL: fromDiffMemVarAull:
5452; P8LE:       # %bb.0: # %entry
5453; P8LE-NEXT:    sldi r4, r4, 3
5454; P8LE-NEXT:    lxvd2x vs0, r3, r4
5455; P8LE-NEXT:    xxswapd v2, vs0
5456; P8LE-NEXT:    blr
5457entry:
5458  %idxprom = sext i32 %elem to i64
5459  %arrayidx = getelementptr inbounds i64, i64* %arr, i64 %idxprom
5460  %0 = load i64, i64* %arrayidx, align 8
5461  %vecinit = insertelement <2 x i64> undef, i64 %0, i32 0
5462  %add = add nsw i32 %elem, 1
5463  %idxprom1 = sext i32 %add to i64
5464  %arrayidx2 = getelementptr inbounds i64, i64* %arr, i64 %idxprom1
5465  %1 = load i64, i64* %arrayidx2, align 8
5466  %vecinit3 = insertelement <2 x i64> %vecinit, i64 %1, i32 1
5467  ret <2 x i64> %vecinit3
5468}
5469
5470; Function Attrs: norecurse nounwind readonly
5471define <2 x i64> @fromDiffMemVarDull(i64* nocapture readonly %arr, i32 signext %elem) {
5472; P9BE-LABEL: fromDiffMemVarDull:
5473; P9BE:       # %bb.0: # %entry
5474; P9BE-NEXT:    sldi r4, r4, 3
5475; P9BE-NEXT:    add r3, r3, r4
5476; P9BE-NEXT:    li r4, -8
5477; P9BE-NEXT:    lxvx v2, r3, r4
5478; P9BE-NEXT:    xxswapd v2, v2
5479; P9BE-NEXT:    blr
5480;
5481; P9LE-LABEL: fromDiffMemVarDull:
5482; P9LE:       # %bb.0: # %entry
5483; P9LE-NEXT:    sldi r4, r4, 3
5484; P9LE-NEXT:    add r3, r3, r4
5485; P9LE-NEXT:    li r4, -8
5486; P9LE-NEXT:    lxvx v2, r3, r4
5487; P9LE-NEXT:    xxswapd v2, v2
5488; P9LE-NEXT:    blr
5489;
5490; P8BE-LABEL: fromDiffMemVarDull:
5491; P8BE:       # %bb.0: # %entry
5492; P8BE-NEXT:    sldi r4, r4, 3
5493; P8BE-NEXT:    add r3, r3, r4
5494; P8BE-NEXT:    addi r3, r3, -8
5495; P8BE-NEXT:    lxvd2x v2, 0, r3
5496; P8BE-NEXT:    xxswapd v2, v2
5497; P8BE-NEXT:    blr
5498;
5499; P8LE-LABEL: fromDiffMemVarDull:
5500; P8LE:       # %bb.0: # %entry
5501; P8LE-NEXT:    sldi r4, r4, 3
5502; P8LE-NEXT:    add r3, r3, r4
5503; P8LE-NEXT:    addi r3, r3, -8
5504; P8LE-NEXT:    lxvd2x v2, 0, r3
5505; P8LE-NEXT:    blr
5506entry:
5507  %idxprom = sext i32 %elem to i64
5508  %arrayidx = getelementptr inbounds i64, i64* %arr, i64 %idxprom
5509  %0 = load i64, i64* %arrayidx, align 8
5510  %vecinit = insertelement <2 x i64> undef, i64 %0, i32 0
5511  %sub = add nsw i32 %elem, -1
5512  %idxprom1 = sext i32 %sub to i64
5513  %arrayidx2 = getelementptr inbounds i64, i64* %arr, i64 %idxprom1
5514  %1 = load i64, i64* %arrayidx2, align 8
5515  %vecinit3 = insertelement <2 x i64> %vecinit, i64 %1, i32 1
5516  ret <2 x i64> %vecinit3
5517}
5518
5519; Function Attrs: norecurse nounwind readonly
5520define <2 x i64> @fromRandMemConsull(i64* nocapture readonly %arr) {
5521; P9BE-LABEL: fromRandMemConsull:
5522; P9BE:       # %bb.0: # %entry
5523; P9BE-NEXT:    ld r4, 32(r3)
5524; P9BE-NEXT:    ld r3, 144(r3)
5525; P9BE-NEXT:    mtvsrdd v2, r4, r3
5526; P9BE-NEXT:    blr
5527;
5528; P9LE-LABEL: fromRandMemConsull:
5529; P9LE:       # %bb.0: # %entry
5530; P9LE-NEXT:    ld r4, 32(r3)
5531; P9LE-NEXT:    ld r3, 144(r3)
5532; P9LE-NEXT:    mtvsrdd v2, r3, r4
5533; P9LE-NEXT:    blr
5534;
5535; P8BE-LABEL: fromRandMemConsull:
5536; P8BE:       # %bb.0: # %entry
5537; P8BE-NEXT:    ld r4, 144(r3)
5538; P8BE-NEXT:    ld r3, 32(r3)
5539; P8BE-NEXT:    mtvsrd f0, r4
5540; P8BE-NEXT:    mtvsrd f1, r3
5541; P8BE-NEXT:    xxmrghd v2, vs1, vs0
5542; P8BE-NEXT:    blr
5543;
5544; P8LE-LABEL: fromRandMemConsull:
5545; P8LE:       # %bb.0: # %entry
5546; P8LE-NEXT:    ld r4, 32(r3)
5547; P8LE-NEXT:    ld r3, 144(r3)
5548; P8LE-NEXT:    mtvsrd f0, r4
5549; P8LE-NEXT:    mtvsrd f1, r3
5550; P8LE-NEXT:    xxmrghd v2, vs1, vs0
5551; P8LE-NEXT:    blr
5552entry:
5553  %arrayidx = getelementptr inbounds i64, i64* %arr, i64 4
5554  %0 = load i64, i64* %arrayidx, align 8
5555  %vecinit = insertelement <2 x i64> undef, i64 %0, i32 0
5556  %arrayidx1 = getelementptr inbounds i64, i64* %arr, i64 18
5557  %1 = load i64, i64* %arrayidx1, align 8
5558  %vecinit2 = insertelement <2 x i64> %vecinit, i64 %1, i32 1
5559  ret <2 x i64> %vecinit2
5560}
5561
5562; Function Attrs: norecurse nounwind readonly
5563define <2 x i64> @fromRandMemVarull(i64* nocapture readonly %arr, i32 signext %elem) {
5564; P9BE-LABEL: fromRandMemVarull:
5565; P9BE:       # %bb.0: # %entry
5566; P9BE-NEXT:    sldi r4, r4, 3
5567; P9BE-NEXT:    add r3, r3, r4
5568; P9BE-NEXT:    ld r4, 32(r3)
5569; P9BE-NEXT:    ld r3, 8(r3)
5570; P9BE-NEXT:    mtvsrdd v2, r4, r3
5571; P9BE-NEXT:    blr
5572;
5573; P9LE-LABEL: fromRandMemVarull:
5574; P9LE:       # %bb.0: # %entry
5575; P9LE-NEXT:    sldi r4, r4, 3
5576; P9LE-NEXT:    add r3, r3, r4
5577; P9LE-NEXT:    ld r4, 32(r3)
5578; P9LE-NEXT:    ld r3, 8(r3)
5579; P9LE-NEXT:    mtvsrdd v2, r3, r4
5580; P9LE-NEXT:    blr
5581;
5582; P8BE-LABEL: fromRandMemVarull:
5583; P8BE:       # %bb.0: # %entry
5584; P8BE-NEXT:    sldi r4, r4, 3
5585; P8BE-NEXT:    add r3, r3, r4
5586; P8BE-NEXT:    ld r4, 8(r3)
5587; P8BE-NEXT:    ld r3, 32(r3)
5588; P8BE-NEXT:    mtvsrd f0, r4
5589; P8BE-NEXT:    mtvsrd f1, r3
5590; P8BE-NEXT:    xxmrghd v2, vs1, vs0
5591; P8BE-NEXT:    blr
5592;
5593; P8LE-LABEL: fromRandMemVarull:
5594; P8LE:       # %bb.0: # %entry
5595; P8LE-NEXT:    sldi r4, r4, 3
5596; P8LE-NEXT:    add r3, r3, r4
5597; P8LE-NEXT:    ld r4, 32(r3)
5598; P8LE-NEXT:    ld r3, 8(r3)
5599; P8LE-NEXT:    mtvsrd f0, r4
5600; P8LE-NEXT:    mtvsrd f1, r3
5601; P8LE-NEXT:    xxmrghd v2, vs1, vs0
5602; P8LE-NEXT:    blr
5603entry:
5604  %add = add nsw i32 %elem, 4
5605  %idxprom = sext i32 %add to i64
5606  %arrayidx = getelementptr inbounds i64, i64* %arr, i64 %idxprom
5607  %0 = load i64, i64* %arrayidx, align 8
5608  %vecinit = insertelement <2 x i64> undef, i64 %0, i32 0
5609  %add1 = add nsw i32 %elem, 1
5610  %idxprom2 = sext i32 %add1 to i64
5611  %arrayidx3 = getelementptr inbounds i64, i64* %arr, i64 %idxprom2
5612  %1 = load i64, i64* %arrayidx3, align 8
5613  %vecinit4 = insertelement <2 x i64> %vecinit, i64 %1, i32 1
5614  ret <2 x i64> %vecinit4
5615}
5616
5617; Function Attrs: norecurse nounwind readnone
5618define <2 x i64> @spltRegValull(i64 %val) {
5619; P9BE-LABEL: spltRegValull:
5620; P9BE:       # %bb.0: # %entry
5621; P9BE-NEXT:    mtvsrdd v2, r3, r3
5622; P9BE-NEXT:    blr
5623;
5624; P9LE-LABEL: spltRegValull:
5625; P9LE:       # %bb.0: # %entry
5626; P9LE-NEXT:    mtvsrdd v2, r3, r3
5627; P9LE-NEXT:    blr
5628;
5629; P8BE-LABEL: spltRegValull:
5630; P8BE:       # %bb.0: # %entry
5631; P8BE-NEXT:    mtvsrd f0, r3
5632; P8BE-NEXT:    xxspltd v2, vs0, 0
5633; P8BE-NEXT:    blr
5634;
5635; P8LE-LABEL: spltRegValull:
5636; P8LE:       # %bb.0: # %entry
5637; P8LE-NEXT:    mtvsrd f0, r3
5638; P8LE-NEXT:    xxspltd v2, vs0, 0
5639; P8LE-NEXT:    blr
5640entry:
5641  %splat.splatinsert = insertelement <2 x i64> undef, i64 %val, i32 0
5642  %splat.splat = shufflevector <2 x i64> %splat.splatinsert, <2 x i64> undef, <2 x i32> zeroinitializer
5643  ret <2 x i64> %splat.splat
5644}
5645
5646; Function Attrs: norecurse nounwind readonly
5647define <2 x i64> @spltMemValull(i64* nocapture readonly %ptr) {
5648; P9BE-LABEL: spltMemValull:
5649; P9BE:       # %bb.0: # %entry
5650; P9BE-NEXT:    lxvdsx v2, 0, r3
5651; P9BE-NEXT:    blr
5652;
5653; P9LE-LABEL: spltMemValull:
5654; P9LE:       # %bb.0: # %entry
5655; P9LE-NEXT:    lxvdsx v2, 0, r3
5656; P9LE-NEXT:    blr
5657;
5658; P8BE-LABEL: spltMemValull:
5659; P8BE:       # %bb.0: # %entry
5660; P8BE-NEXT:    lxvdsx v2, 0, r3
5661; P8BE-NEXT:    blr
5662;
5663; P8LE-LABEL: spltMemValull:
5664; P8LE:       # %bb.0: # %entry
5665; P8LE-NEXT:    lxvdsx v2, 0, r3
5666; P8LE-NEXT:    blr
5667entry:
5668  %0 = load i64, i64* %ptr, align 8
5669  %splat.splatinsert = insertelement <2 x i64> undef, i64 %0, i32 0
5670  %splat.splat = shufflevector <2 x i64> %splat.splatinsert, <2 x i64> undef, <2 x i32> zeroinitializer
5671  ret <2 x i64> %splat.splat
5672}
5673
5674; Function Attrs: norecurse nounwind readnone
5675define <2 x i64> @spltCnstConvftoull() {
5676; P9BE-LABEL: spltCnstConvftoull:
5677; P9BE:       # %bb.0: # %entry
5678; P9BE-NEXT:    addis r3, r2, .LCPI114_0@toc@ha
5679; P9BE-NEXT:    addi r3, r3, .LCPI114_0@toc@l
5680; P9BE-NEXT:    lxvx v2, 0, r3
5681; P9BE-NEXT:    blr
5682;
5683; P9LE-LABEL: spltCnstConvftoull:
5684; P9LE:       # %bb.0: # %entry
5685; P9LE-NEXT:    addis r3, r2, .LCPI114_0@toc@ha
5686; P9LE-NEXT:    addi r3, r3, .LCPI114_0@toc@l
5687; P9LE-NEXT:    lxvx v2, 0, r3
5688; P9LE-NEXT:    blr
5689;
5690; P8BE-LABEL: spltCnstConvftoull:
5691; P8BE:       # %bb.0: # %entry
5692; P8BE-NEXT:    addis r3, r2, .LCPI114_0@toc@ha
5693; P8BE-NEXT:    addi r3, r3, .LCPI114_0@toc@l
5694; P8BE-NEXT:    lxvd2x v2, 0, r3
5695; P8BE-NEXT:    blr
5696;
5697; P8LE-LABEL: spltCnstConvftoull:
5698; P8LE:       # %bb.0: # %entry
5699; P8LE-NEXT:    addis r3, r2, .LCPI114_0@toc@ha
5700; P8LE-NEXT:    addi r3, r3, .LCPI114_0@toc@l
5701; P8LE-NEXT:    lxvd2x vs0, 0, r3
5702; P8LE-NEXT:    xxswapd v2, vs0
5703; P8LE-NEXT:    blr
5704entry:
5705  ret <2 x i64> <i64 4, i64 4>
5706}
5707
5708; Function Attrs: norecurse nounwind readnone
5709define <2 x i64> @fromRegsConvftoull(float %a, float %b) {
5710; P9BE-LABEL: fromRegsConvftoull:
5711; P9BE:       # %bb.0: # %entry
5712; P9BE-NEXT:    # kill: def $f2 killed $f2 def $vsl2
5713; P9BE-NEXT:    # kill: def $f1 killed $f1 def $vsl1
5714; P9BE-NEXT:    xxmrghd vs0, vs1, vs2
5715; P9BE-NEXT:    xvcvdpuxds v2, vs0
5716; P9BE-NEXT:    blr
5717;
5718; P9LE-LABEL: fromRegsConvftoull:
5719; P9LE:       # %bb.0: # %entry
5720; P9LE-NEXT:    # kill: def $f2 killed $f2 def $vsl2
5721; P9LE-NEXT:    # kill: def $f1 killed $f1 def $vsl1
5722; P9LE-NEXT:    xxmrghd vs0, vs2, vs1
5723; P9LE-NEXT:    xvcvdpuxds v2, vs0
5724; P9LE-NEXT:    blr
5725;
5726; P8BE-LABEL: fromRegsConvftoull:
5727; P8BE:       # %bb.0: # %entry
5728; P8BE-NEXT:    # kill: def $f2 killed $f2 def $vsl2
5729; P8BE-NEXT:    # kill: def $f1 killed $f1 def $vsl1
5730; P8BE-NEXT:    xxmrghd vs0, vs1, vs2
5731; P8BE-NEXT:    xvcvdpuxds v2, vs0
5732; P8BE-NEXT:    blr
5733;
5734; P8LE-LABEL: fromRegsConvftoull:
5735; P8LE:       # %bb.0: # %entry
5736; P8LE-NEXT:    # kill: def $f2 killed $f2 def $vsl2
5737; P8LE-NEXT:    # kill: def $f1 killed $f1 def $vsl1
5738; P8LE-NEXT:    xxmrghd vs0, vs2, vs1
5739; P8LE-NEXT:    xvcvdpuxds v2, vs0
5740; P8LE-NEXT:    blr
5741entry:
5742  %conv = fptoui float %a to i64
5743  %vecinit = insertelement <2 x i64> undef, i64 %conv, i32 0
5744  %conv1 = fptoui float %b to i64
5745  %vecinit2 = insertelement <2 x i64> %vecinit, i64 %conv1, i32 1
5746  ret <2 x i64> %vecinit2
5747}
5748
5749; Function Attrs: norecurse nounwind readnone
5750define <2 x i64> @fromDiffConstsConvftoull() {
5751; P9BE-LABEL: fromDiffConstsConvftoull:
5752; P9BE:       # %bb.0: # %entry
5753; P9BE-NEXT:    addis r3, r2, .LCPI116_0@toc@ha
5754; P9BE-NEXT:    addi r3, r3, .LCPI116_0@toc@l
5755; P9BE-NEXT:    lxvx v2, 0, r3
5756; P9BE-NEXT:    blr
5757;
5758; P9LE-LABEL: fromDiffConstsConvftoull:
5759; P9LE:       # %bb.0: # %entry
5760; P9LE-NEXT:    addis r3, r2, .LCPI116_0@toc@ha
5761; P9LE-NEXT:    addi r3, r3, .LCPI116_0@toc@l
5762; P9LE-NEXT:    lxvx v2, 0, r3
5763; P9LE-NEXT:    blr
5764;
5765; P8BE-LABEL: fromDiffConstsConvftoull:
5766; P8BE:       # %bb.0: # %entry
5767; P8BE-NEXT:    addis r3, r2, .LCPI116_0@toc@ha
5768; P8BE-NEXT:    addi r3, r3, .LCPI116_0@toc@l
5769; P8BE-NEXT:    lxvd2x v2, 0, r3
5770; P8BE-NEXT:    blr
5771;
5772; P8LE-LABEL: fromDiffConstsConvftoull:
5773; P8LE:       # %bb.0: # %entry
5774; P8LE-NEXT:    addis r3, r2, .LCPI116_0@toc@ha
5775; P8LE-NEXT:    addi r3, r3, .LCPI116_0@toc@l
5776; P8LE-NEXT:    lxvd2x vs0, 0, r3
5777; P8LE-NEXT:    xxswapd v2, vs0
5778; P8LE-NEXT:    blr
5779entry:
5780  ret <2 x i64> <i64 24, i64 234>
5781}
5782
5783; Function Attrs: norecurse nounwind readonly
5784define <2 x i64> @fromDiffMemConsAConvftoull(float* nocapture readonly %ptr) {
5785; P9BE-LABEL: fromDiffMemConsAConvftoull:
5786; P9BE:       # %bb.0: # %entry
5787; P9BE-NEXT:    lfs f0, 0(r3)
5788; P9BE-NEXT:    lfs f1, 4(r3)
5789; P9BE-NEXT:    xxmrghd vs0, vs0, vs1
5790; P9BE-NEXT:    xvcvdpuxds v2, vs0
5791; P9BE-NEXT:    blr
5792;
5793; P9LE-LABEL: fromDiffMemConsAConvftoull:
5794; P9LE:       # %bb.0: # %entry
5795; P9LE-NEXT:    lfs f0, 0(r3)
5796; P9LE-NEXT:    lfs f1, 4(r3)
5797; P9LE-NEXT:    xxmrghd vs0, vs1, vs0
5798; P9LE-NEXT:    xvcvdpuxds v2, vs0
5799; P9LE-NEXT:    blr
5800;
5801; P8BE-LABEL: fromDiffMemConsAConvftoull:
5802; P8BE:       # %bb.0: # %entry
5803; P8BE-NEXT:    lfsx f0, 0, r3
5804; P8BE-NEXT:    lfs f1, 4(r3)
5805; P8BE-NEXT:    xxmrghd vs0, vs0, vs1
5806; P8BE-NEXT:    xvcvdpuxds v2, vs0
5807; P8BE-NEXT:    blr
5808;
5809; P8LE-LABEL: fromDiffMemConsAConvftoull:
5810; P8LE:       # %bb.0: # %entry
5811; P8LE-NEXT:    lfsx f0, 0, r3
5812; P8LE-NEXT:    lfs f1, 4(r3)
5813; P8LE-NEXT:    xxmrghd vs0, vs1, vs0
5814; P8LE-NEXT:    xvcvdpuxds v2, vs0
5815; P8LE-NEXT:    blr
5816entry:
5817  %0 = load float, float* %ptr, align 4
5818  %conv = fptoui float %0 to i64
5819  %vecinit = insertelement <2 x i64> undef, i64 %conv, i32 0
5820  %arrayidx1 = getelementptr inbounds float, float* %ptr, i64 1
5821  %1 = load float, float* %arrayidx1, align 4
5822  %conv2 = fptoui float %1 to i64
5823  %vecinit3 = insertelement <2 x i64> %vecinit, i64 %conv2, i32 1
5824  ret <2 x i64> %vecinit3
5825}
5826
5827; Function Attrs: norecurse nounwind readonly
5828define <2 x i64> @fromDiffMemConsDConvftoull(float* nocapture readonly %ptr) {
5829; P9BE-LABEL: fromDiffMemConsDConvftoull:
5830; P9BE:       # %bb.0: # %entry
5831; P9BE-NEXT:    lfs f0, 12(r3)
5832; P9BE-NEXT:    lfs f1, 8(r3)
5833; P9BE-NEXT:    xxmrghd vs0, vs0, vs1
5834; P9BE-NEXT:    xvcvdpuxds v2, vs0
5835; P9BE-NEXT:    blr
5836;
5837; P9LE-LABEL: fromDiffMemConsDConvftoull:
5838; P9LE:       # %bb.0: # %entry
5839; P9LE-NEXT:    lfs f0, 12(r3)
5840; P9LE-NEXT:    lfs f1, 8(r3)
5841; P9LE-NEXT:    xxmrghd vs0, vs1, vs0
5842; P9LE-NEXT:    xvcvdpuxds v2, vs0
5843; P9LE-NEXT:    blr
5844;
5845; P8BE-LABEL: fromDiffMemConsDConvftoull:
5846; P8BE:       # %bb.0: # %entry
5847; P8BE-NEXT:    lfs f0, 12(r3)
5848; P8BE-NEXT:    lfs f1, 8(r3)
5849; P8BE-NEXT:    xxmrghd vs0, vs0, vs1
5850; P8BE-NEXT:    xvcvdpuxds v2, vs0
5851; P8BE-NEXT:    blr
5852;
5853; P8LE-LABEL: fromDiffMemConsDConvftoull:
5854; P8LE:       # %bb.0: # %entry
5855; P8LE-NEXT:    lfs f0, 12(r3)
5856; P8LE-NEXT:    lfs f1, 8(r3)
5857; P8LE-NEXT:    xxmrghd vs0, vs1, vs0
5858; P8LE-NEXT:    xvcvdpuxds v2, vs0
5859; P8LE-NEXT:    blr
5860entry:
5861  %arrayidx = getelementptr inbounds float, float* %ptr, i64 3
5862  %0 = load float, float* %arrayidx, align 4
5863  %conv = fptoui float %0 to i64
5864  %vecinit = insertelement <2 x i64> undef, i64 %conv, i32 0
5865  %arrayidx1 = getelementptr inbounds float, float* %ptr, i64 2
5866  %1 = load float, float* %arrayidx1, align 4
5867  %conv2 = fptoui float %1 to i64
5868  %vecinit3 = insertelement <2 x i64> %vecinit, i64 %conv2, i32 1
5869  ret <2 x i64> %vecinit3
5870}
5871
5872; Function Attrs: norecurse nounwind readonly
5873define <2 x i64> @fromDiffMemVarAConvftoull(float* nocapture readonly %arr, i32 signext %elem) {
5874; P9BE-LABEL: fromDiffMemVarAConvftoull:
5875; P9BE:       # %bb.0: # %entry
5876; P9BE-NEXT:    sldi r4, r4, 2
5877; P9BE-NEXT:    lfsux f0, r3, r4
5878; P9BE-NEXT:    lfs f1, 4(r3)
5879; P9BE-NEXT:    xxmrghd vs0, vs0, vs1
5880; P9BE-NEXT:    xvcvdpuxds v2, vs0
5881; P9BE-NEXT:    blr
5882;
5883; P9LE-LABEL: fromDiffMemVarAConvftoull:
5884; P9LE:       # %bb.0: # %entry
5885; P9LE-NEXT:    sldi r4, r4, 2
5886; P9LE-NEXT:    lfsux f0, r3, r4
5887; P9LE-NEXT:    lfs f1, 4(r3)
5888; P9LE-NEXT:    xxmrghd vs0, vs1, vs0
5889; P9LE-NEXT:    xvcvdpuxds v2, vs0
5890; P9LE-NEXT:    blr
5891;
5892; P8BE-LABEL: fromDiffMemVarAConvftoull:
5893; P8BE:       # %bb.0: # %entry
5894; P8BE-NEXT:    sldi r4, r4, 2
5895; P8BE-NEXT:    lfsux f0, r3, r4
5896; P8BE-NEXT:    lfs f1, 4(r3)
5897; P8BE-NEXT:    xxmrghd vs0, vs0, vs1
5898; P8BE-NEXT:    xvcvdpuxds v2, vs0
5899; P8BE-NEXT:    blr
5900;
5901; P8LE-LABEL: fromDiffMemVarAConvftoull:
5902; P8LE:       # %bb.0: # %entry
5903; P8LE-NEXT:    sldi r4, r4, 2
5904; P8LE-NEXT:    lfsux f0, r3, r4
5905; P8LE-NEXT:    lfs f1, 4(r3)
5906; P8LE-NEXT:    xxmrghd vs0, vs1, vs0
5907; P8LE-NEXT:    xvcvdpuxds v2, vs0
5908; P8LE-NEXT:    blr
5909entry:
5910  %idxprom = sext i32 %elem to i64
5911  %arrayidx = getelementptr inbounds float, float* %arr, i64 %idxprom
5912  %0 = load float, float* %arrayidx, align 4
5913  %conv = fptoui float %0 to i64
5914  %vecinit = insertelement <2 x i64> undef, i64 %conv, i32 0
5915  %add = add nsw i32 %elem, 1
5916  %idxprom1 = sext i32 %add to i64
5917  %arrayidx2 = getelementptr inbounds float, float* %arr, i64 %idxprom1
5918  %1 = load float, float* %arrayidx2, align 4
5919  %conv3 = fptoui float %1 to i64
5920  %vecinit4 = insertelement <2 x i64> %vecinit, i64 %conv3, i32 1
5921  ret <2 x i64> %vecinit4
5922}
5923
5924; Function Attrs: norecurse nounwind readonly
5925define <2 x i64> @fromDiffMemVarDConvftoull(float* nocapture readonly %arr, i32 signext %elem) {
5926; P9BE-LABEL: fromDiffMemVarDConvftoull:
5927; P9BE:       # %bb.0: # %entry
5928; P9BE-NEXT:    sldi r4, r4, 2
5929; P9BE-NEXT:    lfsux f0, r3, r4
5930; P9BE-NEXT:    lfs f1, -4(r3)
5931; P9BE-NEXT:    xxmrghd vs0, vs0, vs1
5932; P9BE-NEXT:    xvcvdpuxds v2, vs0
5933; P9BE-NEXT:    blr
5934;
5935; P9LE-LABEL: fromDiffMemVarDConvftoull:
5936; P9LE:       # %bb.0: # %entry
5937; P9LE-NEXT:    sldi r4, r4, 2
5938; P9LE-NEXT:    lfsux f0, r3, r4
5939; P9LE-NEXT:    lfs f1, -4(r3)
5940; P9LE-NEXT:    xxmrghd vs0, vs1, vs0
5941; P9LE-NEXT:    xvcvdpuxds v2, vs0
5942; P9LE-NEXT:    blr
5943;
5944; P8BE-LABEL: fromDiffMemVarDConvftoull:
5945; P8BE:       # %bb.0: # %entry
5946; P8BE-NEXT:    sldi r4, r4, 2
5947; P8BE-NEXT:    lfsux f0, r3, r4
5948; P8BE-NEXT:    lfs f1, -4(r3)
5949; P8BE-NEXT:    xxmrghd vs0, vs0, vs1
5950; P8BE-NEXT:    xvcvdpuxds v2, vs0
5951; P8BE-NEXT:    blr
5952;
5953; P8LE-LABEL: fromDiffMemVarDConvftoull:
5954; P8LE:       # %bb.0: # %entry
5955; P8LE-NEXT:    sldi r4, r4, 2
5956; P8LE-NEXT:    lfsux f0, r3, r4
5957; P8LE-NEXT:    lfs f1, -4(r3)
5958; P8LE-NEXT:    xxmrghd vs0, vs1, vs0
5959; P8LE-NEXT:    xvcvdpuxds v2, vs0
5960; P8LE-NEXT:    blr
5961entry:
5962  %idxprom = sext i32 %elem to i64
5963  %arrayidx = getelementptr inbounds float, float* %arr, i64 %idxprom
5964  %0 = load float, float* %arrayidx, align 4
5965  %conv = fptoui float %0 to i64
5966  %vecinit = insertelement <2 x i64> undef, i64 %conv, i32 0
5967  %sub = add nsw i32 %elem, -1
5968  %idxprom1 = sext i32 %sub to i64
5969  %arrayidx2 = getelementptr inbounds float, float* %arr, i64 %idxprom1
5970  %1 = load float, float* %arrayidx2, align 4
5971  %conv3 = fptoui float %1 to i64
5972  %vecinit4 = insertelement <2 x i64> %vecinit, i64 %conv3, i32 1
5973  ret <2 x i64> %vecinit4
5974}
5975
5976; Function Attrs: norecurse nounwind readnone
5977define <2 x i64> @spltRegValConvftoull(float %val) {
5978; P9BE-LABEL: spltRegValConvftoull:
5979; P9BE:       # %bb.0: # %entry
5980; P9BE-NEXT:    xscvdpuxds f0, f1
5981; P9BE-NEXT:    xxspltd v2, f0, 0
5982; P9BE-NEXT:    blr
5983;
5984; P9LE-LABEL: spltRegValConvftoull:
5985; P9LE:       # %bb.0: # %entry
5986; P9LE-NEXT:    xscvdpuxds f0, f1
5987; P9LE-NEXT:    xxspltd v2, f0, 0
5988; P9LE-NEXT:    blr
5989;
5990; P8BE-LABEL: spltRegValConvftoull:
5991; P8BE:       # %bb.0: # %entry
5992; P8BE-NEXT:    xscvdpuxds f0, f1
5993; P8BE-NEXT:    xxspltd v2, f0, 0
5994; P8BE-NEXT:    blr
5995;
5996; P8LE-LABEL: spltRegValConvftoull:
5997; P8LE:       # %bb.0: # %entry
5998; P8LE-NEXT:    xscvdpuxds f0, f1
5999; P8LE-NEXT:    xxspltd v2, f0, 0
6000; P8LE-NEXT:    blr
6001entry:
6002  %conv = fptoui float %val to i64
6003  %splat.splatinsert = insertelement <2 x i64> undef, i64 %conv, i32 0
6004  %splat.splat = shufflevector <2 x i64> %splat.splatinsert, <2 x i64> undef, <2 x i32> zeroinitializer
6005  ret <2 x i64> %splat.splat
6006}
6007
6008; Function Attrs: norecurse nounwind readonly
6009define <2 x i64> @spltMemValConvftoull(float* nocapture readonly %ptr) {
6010; P9BE-LABEL: spltMemValConvftoull:
6011; P9BE:       # %bb.0: # %entry
6012; P9BE-NEXT:    lfs f0, 0(r3)
6013; P9BE-NEXT:    xscvdpuxds f0, f0
6014; P9BE-NEXT:    xxspltd v2, f0, 0
6015; P9BE-NEXT:    blr
6016;
6017; P9LE-LABEL: spltMemValConvftoull:
6018; P9LE:       # %bb.0: # %entry
6019; P9LE-NEXT:    lfs f0, 0(r3)
6020; P9LE-NEXT:    xscvdpuxds f0, f0
6021; P9LE-NEXT:    xxspltd v2, f0, 0
6022; P9LE-NEXT:    blr
6023;
6024; P8BE-LABEL: spltMemValConvftoull:
6025; P8BE:       # %bb.0: # %entry
6026; P8BE-NEXT:    lfsx f0, 0, r3
6027; P8BE-NEXT:    xscvdpuxds f0, f0
6028; P8BE-NEXT:    xxspltd v2, f0, 0
6029; P8BE-NEXT:    blr
6030;
6031; P8LE-LABEL: spltMemValConvftoull:
6032; P8LE:       # %bb.0: # %entry
6033; P8LE-NEXT:    lfsx f0, 0, r3
6034; P8LE-NEXT:    xscvdpuxds f0, f0
6035; P8LE-NEXT:    xxspltd v2, f0, 0
6036; P8LE-NEXT:    blr
6037entry:
6038  %0 = load float, float* %ptr, align 4
6039  %conv = fptoui float %0 to i64
6040  %splat.splatinsert = insertelement <2 x i64> undef, i64 %conv, i32 0
6041  %splat.splat = shufflevector <2 x i64> %splat.splatinsert, <2 x i64> undef, <2 x i32> zeroinitializer
6042  ret <2 x i64> %splat.splat
6043}
6044
6045; Function Attrs: norecurse nounwind readnone
6046define <2 x i64> @spltCnstConvdtoull() {
6047; P9BE-LABEL: spltCnstConvdtoull:
6048; P9BE:       # %bb.0: # %entry
6049; P9BE-NEXT:    addis r3, r2, .LCPI123_0@toc@ha
6050; P9BE-NEXT:    addi r3, r3, .LCPI123_0@toc@l
6051; P9BE-NEXT:    lxvx v2, 0, r3
6052; P9BE-NEXT:    blr
6053;
6054; P9LE-LABEL: spltCnstConvdtoull:
6055; P9LE:       # %bb.0: # %entry
6056; P9LE-NEXT:    addis r3, r2, .LCPI123_0@toc@ha
6057; P9LE-NEXT:    addi r3, r3, .LCPI123_0@toc@l
6058; P9LE-NEXT:    lxvx v2, 0, r3
6059; P9LE-NEXT:    blr
6060;
6061; P8BE-LABEL: spltCnstConvdtoull:
6062; P8BE:       # %bb.0: # %entry
6063; P8BE-NEXT:    addis r3, r2, .LCPI123_0@toc@ha
6064; P8BE-NEXT:    addi r3, r3, .LCPI123_0@toc@l
6065; P8BE-NEXT:    lxvd2x v2, 0, r3
6066; P8BE-NEXT:    blr
6067;
6068; P8LE-LABEL: spltCnstConvdtoull:
6069; P8LE:       # %bb.0: # %entry
6070; P8LE-NEXT:    addis r3, r2, .LCPI123_0@toc@ha
6071; P8LE-NEXT:    addi r3, r3, .LCPI123_0@toc@l
6072; P8LE-NEXT:    lxvd2x vs0, 0, r3
6073; P8LE-NEXT:    xxswapd v2, vs0
6074; P8LE-NEXT:    blr
6075entry:
6076  ret <2 x i64> <i64 4, i64 4>
6077}
6078
6079; Function Attrs: norecurse nounwind readnone
6080define <2 x i64> @fromRegsConvdtoull(double %a, double %b) {
6081; P9BE-LABEL: fromRegsConvdtoull:
6082; P9BE:       # %bb.0: # %entry
6083; P9BE-NEXT:    # kill: def $f2 killed $f2 def $vsl2
6084; P9BE-NEXT:    # kill: def $f1 killed $f1 def $vsl1
6085; P9BE-NEXT:    xxmrghd vs0, vs1, vs2
6086; P9BE-NEXT:    xvcvdpuxds v2, vs0
6087; P9BE-NEXT:    blr
6088;
6089; P9LE-LABEL: fromRegsConvdtoull:
6090; P9LE:       # %bb.0: # %entry
6091; P9LE-NEXT:    # kill: def $f2 killed $f2 def $vsl2
6092; P9LE-NEXT:    # kill: def $f1 killed $f1 def $vsl1
6093; P9LE-NEXT:    xxmrghd vs0, vs2, vs1
6094; P9LE-NEXT:    xvcvdpuxds v2, vs0
6095; P9LE-NEXT:    blr
6096;
6097; P8BE-LABEL: fromRegsConvdtoull:
6098; P8BE:       # %bb.0: # %entry
6099; P8BE-NEXT:    # kill: def $f2 killed $f2 def $vsl2
6100; P8BE-NEXT:    # kill: def $f1 killed $f1 def $vsl1
6101; P8BE-NEXT:    xxmrghd vs0, vs1, vs2
6102; P8BE-NEXT:    xvcvdpuxds v2, vs0
6103; P8BE-NEXT:    blr
6104;
6105; P8LE-LABEL: fromRegsConvdtoull:
6106; P8LE:       # %bb.0: # %entry
6107; P8LE-NEXT:    # kill: def $f2 killed $f2 def $vsl2
6108; P8LE-NEXT:    # kill: def $f1 killed $f1 def $vsl1
6109; P8LE-NEXT:    xxmrghd vs0, vs2, vs1
6110; P8LE-NEXT:    xvcvdpuxds v2, vs0
6111; P8LE-NEXT:    blr
6112entry:
6113  %conv = fptoui double %a to i64
6114  %vecinit = insertelement <2 x i64> undef, i64 %conv, i32 0
6115  %conv1 = fptoui double %b to i64
6116  %vecinit2 = insertelement <2 x i64> %vecinit, i64 %conv1, i32 1
6117  ret <2 x i64> %vecinit2
6118}
6119
6120; Function Attrs: norecurse nounwind readnone
6121define <2 x i64> @fromDiffConstsConvdtoull() {
6122; P9BE-LABEL: fromDiffConstsConvdtoull:
6123; P9BE:       # %bb.0: # %entry
6124; P9BE-NEXT:    addis r3, r2, .LCPI125_0@toc@ha
6125; P9BE-NEXT:    addi r3, r3, .LCPI125_0@toc@l
6126; P9BE-NEXT:    lxvx v2, 0, r3
6127; P9BE-NEXT:    blr
6128;
6129; P9LE-LABEL: fromDiffConstsConvdtoull:
6130; P9LE:       # %bb.0: # %entry
6131; P9LE-NEXT:    addis r3, r2, .LCPI125_0@toc@ha
6132; P9LE-NEXT:    addi r3, r3, .LCPI125_0@toc@l
6133; P9LE-NEXT:    lxvx v2, 0, r3
6134; P9LE-NEXT:    blr
6135;
6136; P8BE-LABEL: fromDiffConstsConvdtoull:
6137; P8BE:       # %bb.0: # %entry
6138; P8BE-NEXT:    addis r3, r2, .LCPI125_0@toc@ha
6139; P8BE-NEXT:    addi r3, r3, .LCPI125_0@toc@l
6140; P8BE-NEXT:    lxvd2x v2, 0, r3
6141; P8BE-NEXT:    blr
6142;
6143; P8LE-LABEL: fromDiffConstsConvdtoull:
6144; P8LE:       # %bb.0: # %entry
6145; P8LE-NEXT:    addis r3, r2, .LCPI125_0@toc@ha
6146; P8LE-NEXT:    addi r3, r3, .LCPI125_0@toc@l
6147; P8LE-NEXT:    lxvd2x vs0, 0, r3
6148; P8LE-NEXT:    xxswapd v2, vs0
6149; P8LE-NEXT:    blr
6150entry:
6151  ret <2 x i64> <i64 24, i64 234>
6152}
6153
6154; Function Attrs: norecurse nounwind readonly
6155define <2 x i64> @fromDiffMemConsAConvdtoull(double* nocapture readonly %ptr) {
6156; P9BE-LABEL: fromDiffMemConsAConvdtoull:
6157; P9BE:       # %bb.0: # %entry
6158; P9BE-NEXT:    lxv vs0, 0(r3)
6159; P9BE-NEXT:    xvcvdpuxds v2, vs0
6160; P9BE-NEXT:    blr
6161;
6162; P9LE-LABEL: fromDiffMemConsAConvdtoull:
6163; P9LE:       # %bb.0: # %entry
6164; P9LE-NEXT:    lxv vs0, 0(r3)
6165; P9LE-NEXT:    xvcvdpuxds v2, vs0
6166; P9LE-NEXT:    blr
6167;
6168; P8BE-LABEL: fromDiffMemConsAConvdtoull:
6169; P8BE:       # %bb.0: # %entry
6170; P8BE-NEXT:    lxvd2x vs0, 0, r3
6171; P8BE-NEXT:    xvcvdpuxds v2, vs0
6172; P8BE-NEXT:    blr
6173;
6174; P8LE-LABEL: fromDiffMemConsAConvdtoull:
6175; P8LE:       # %bb.0: # %entry
6176; P8LE-NEXT:    lxvd2x vs0, 0, r3
6177; P8LE-NEXT:    xxswapd vs0, vs0
6178; P8LE-NEXT:    xvcvdpuxds v2, vs0
6179; P8LE-NEXT:    blr
6180entry:
6181  %0 = bitcast double* %ptr to <2 x double>*
6182  %1 = load <2 x double>, <2 x double>* %0, align 8
6183  %2 = fptoui <2 x double> %1 to <2 x i64>
6184  ret <2 x i64> %2
6185}
6186
6187; Function Attrs: norecurse nounwind readonly
6188define <2 x i64> @fromDiffMemConsDConvdtoull(double* nocapture readonly %ptr) {
6189; P9BE-LABEL: fromDiffMemConsDConvdtoull:
6190; P9BE:       # %bb.0: # %entry
6191; P9BE-NEXT:    lxv vs0, 16(r3)
6192; P9BE-NEXT:    xxswapd vs0, vs0
6193; P9BE-NEXT:    xvcvdpuxds v2, vs0
6194; P9BE-NEXT:    blr
6195;
6196; P9LE-LABEL: fromDiffMemConsDConvdtoull:
6197; P9LE:       # %bb.0: # %entry
6198; P9LE-NEXT:    lxv vs0, 16(r3)
6199; P9LE-NEXT:    xxswapd vs0, vs0
6200; P9LE-NEXT:    xvcvdpuxds v2, vs0
6201; P9LE-NEXT:    blr
6202;
6203; P8BE-LABEL: fromDiffMemConsDConvdtoull:
6204; P8BE:       # %bb.0: # %entry
6205; P8BE-NEXT:    addi r3, r3, 16
6206; P8BE-NEXT:    lxvd2x vs0, 0, r3
6207; P8BE-NEXT:    xxswapd vs0, vs0
6208; P8BE-NEXT:    xvcvdpuxds v2, vs0
6209; P8BE-NEXT:    blr
6210;
6211; P8LE-LABEL: fromDiffMemConsDConvdtoull:
6212; P8LE:       # %bb.0: # %entry
6213; P8LE-NEXT:    addi r3, r3, 16
6214; P8LE-NEXT:    lxvd2x vs0, 0, r3
6215; P8LE-NEXT:    xvcvdpuxds v2, vs0
6216; P8LE-NEXT:    blr
6217entry:
6218  %arrayidx = getelementptr inbounds double, double* %ptr, i64 3
6219  %0 = load double, double* %arrayidx, align 8
6220  %conv = fptoui double %0 to i64
6221  %vecinit = insertelement <2 x i64> undef, i64 %conv, i32 0
6222  %arrayidx1 = getelementptr inbounds double, double* %ptr, i64 2
6223  %1 = load double, double* %arrayidx1, align 8
6224  %conv2 = fptoui double %1 to i64
6225  %vecinit3 = insertelement <2 x i64> %vecinit, i64 %conv2, i32 1
6226  ret <2 x i64> %vecinit3
6227}
6228
6229; Function Attrs: norecurse nounwind readonly
6230define <2 x i64> @fromDiffMemVarAConvdtoull(double* nocapture readonly %arr, i32 signext %elem) {
6231; P9BE-LABEL: fromDiffMemVarAConvdtoull:
6232; P9BE:       # %bb.0: # %entry
6233; P9BE-NEXT:    sldi r4, r4, 3
6234; P9BE-NEXT:    lxvx vs0, r3, r4
6235; P9BE-NEXT:    xvcvdpuxds v2, vs0
6236; P9BE-NEXT:    blr
6237;
6238; P9LE-LABEL: fromDiffMemVarAConvdtoull:
6239; P9LE:       # %bb.0: # %entry
6240; P9LE-NEXT:    sldi r4, r4, 3
6241; P9LE-NEXT:    lxvx vs0, r3, r4
6242; P9LE-NEXT:    xvcvdpuxds v2, vs0
6243; P9LE-NEXT:    blr
6244;
6245; P8BE-LABEL: fromDiffMemVarAConvdtoull:
6246; P8BE:       # %bb.0: # %entry
6247; P8BE-NEXT:    sldi r4, r4, 3
6248; P8BE-NEXT:    lxvd2x vs0, r3, r4
6249; P8BE-NEXT:    xvcvdpuxds v2, vs0
6250; P8BE-NEXT:    blr
6251;
6252; P8LE-LABEL: fromDiffMemVarAConvdtoull:
6253; P8LE:       # %bb.0: # %entry
6254; P8LE-NEXT:    sldi r4, r4, 3
6255; P8LE-NEXT:    lxvd2x vs0, r3, r4
6256; P8LE-NEXT:    xxswapd vs0, vs0
6257; P8LE-NEXT:    xvcvdpuxds v2, vs0
6258; P8LE-NEXT:    blr
6259entry:
6260  %idxprom = sext i32 %elem to i64
6261  %arrayidx = getelementptr inbounds double, double* %arr, i64 %idxprom
6262  %0 = load double, double* %arrayidx, align 8
6263  %conv = fptoui double %0 to i64
6264  %vecinit = insertelement <2 x i64> undef, i64 %conv, i32 0
6265  %add = add nsw i32 %elem, 1
6266  %idxprom1 = sext i32 %add to i64
6267  %arrayidx2 = getelementptr inbounds double, double* %arr, i64 %idxprom1
6268  %1 = load double, double* %arrayidx2, align 8
6269  %conv3 = fptoui double %1 to i64
6270  %vecinit4 = insertelement <2 x i64> %vecinit, i64 %conv3, i32 1
6271  ret <2 x i64> %vecinit4
6272}
6273
6274; Function Attrs: norecurse nounwind readonly
6275define <2 x i64> @fromDiffMemVarDConvdtoull(double* nocapture readonly %arr, i32 signext %elem) {
6276; P9BE-LABEL: fromDiffMemVarDConvdtoull:
6277; P9BE:       # %bb.0: # %entry
6278; P9BE-NEXT:    sldi r4, r4, 3
6279; P9BE-NEXT:    add r3, r3, r4
6280; P9BE-NEXT:    li r4, -8
6281; P9BE-NEXT:    lxvx vs0, r3, r4
6282; P9BE-NEXT:    xxswapd vs0, vs0
6283; P9BE-NEXT:    xvcvdpuxds v2, vs0
6284; P9BE-NEXT:    blr
6285;
6286; P9LE-LABEL: fromDiffMemVarDConvdtoull:
6287; P9LE:       # %bb.0: # %entry
6288; P9LE-NEXT:    sldi r4, r4, 3
6289; P9LE-NEXT:    add r3, r3, r4
6290; P9LE-NEXT:    li r4, -8
6291; P9LE-NEXT:    lxvx vs0, r3, r4
6292; P9LE-NEXT:    xxswapd vs0, vs0
6293; P9LE-NEXT:    xvcvdpuxds v2, vs0
6294; P9LE-NEXT:    blr
6295;
6296; P8BE-LABEL: fromDiffMemVarDConvdtoull:
6297; P8BE:       # %bb.0: # %entry
6298; P8BE-NEXT:    sldi r4, r4, 3
6299; P8BE-NEXT:    add r3, r3, r4
6300; P8BE-NEXT:    addi r3, r3, -8
6301; P8BE-NEXT:    lxvd2x vs0, 0, r3
6302; P8BE-NEXT:    xxswapd vs0, vs0
6303; P8BE-NEXT:    xvcvdpuxds v2, vs0
6304; P8BE-NEXT:    blr
6305;
6306; P8LE-LABEL: fromDiffMemVarDConvdtoull:
6307; P8LE:       # %bb.0: # %entry
6308; P8LE-NEXT:    sldi r4, r4, 3
6309; P8LE-NEXT:    add r3, r3, r4
6310; P8LE-NEXT:    addi r3, r3, -8
6311; P8LE-NEXT:    lxvd2x vs0, 0, r3
6312; P8LE-NEXT:    xvcvdpuxds v2, vs0
6313; P8LE-NEXT:    blr
6314entry:
6315  %idxprom = sext i32 %elem to i64
6316  %arrayidx = getelementptr inbounds double, double* %arr, i64 %idxprom
6317  %0 = load double, double* %arrayidx, align 8
6318  %conv = fptoui double %0 to i64
6319  %vecinit = insertelement <2 x i64> undef, i64 %conv, i32 0
6320  %sub = add nsw i32 %elem, -1
6321  %idxprom1 = sext i32 %sub to i64
6322  %arrayidx2 = getelementptr inbounds double, double* %arr, i64 %idxprom1
6323  %1 = load double, double* %arrayidx2, align 8
6324  %conv3 = fptoui double %1 to i64
6325  %vecinit4 = insertelement <2 x i64> %vecinit, i64 %conv3, i32 1
6326  ret <2 x i64> %vecinit4
6327}
6328
6329; Function Attrs: norecurse nounwind readnone
6330define <2 x i64> @spltRegValConvdtoull(double %val) {
6331; P9BE-LABEL: spltRegValConvdtoull:
6332; P9BE:       # %bb.0: # %entry
6333; P9BE-NEXT:    xscvdpuxds f0, f1
6334; P9BE-NEXT:    xxspltd v2, vs0, 0
6335; P9BE-NEXT:    blr
6336;
6337; P9LE-LABEL: spltRegValConvdtoull:
6338; P9LE:       # %bb.0: # %entry
6339; P9LE-NEXT:    xscvdpuxds f0, f1
6340; P9LE-NEXT:    xxspltd v2, vs0, 0
6341; P9LE-NEXT:    blr
6342;
6343; P8BE-LABEL: spltRegValConvdtoull:
6344; P8BE:       # %bb.0: # %entry
6345; P8BE-NEXT:    xscvdpuxds f0, f1
6346; P8BE-NEXT:    xxspltd v2, vs0, 0
6347; P8BE-NEXT:    blr
6348;
6349; P8LE-LABEL: spltRegValConvdtoull:
6350; P8LE:       # %bb.0: # %entry
6351; P8LE-NEXT:    xscvdpuxds f0, f1
6352; P8LE-NEXT:    xxspltd v2, vs0, 0
6353; P8LE-NEXT:    blr
6354entry:
6355  %conv = fptoui double %val to i64
6356  %splat.splatinsert = insertelement <2 x i64> undef, i64 %conv, i32 0
6357  %splat.splat = shufflevector <2 x i64> %splat.splatinsert, <2 x i64> undef, <2 x i32> zeroinitializer
6358  ret <2 x i64> %splat.splat
6359}
6360
6361; Function Attrs: norecurse nounwind readonly
6362define <2 x i64> @spltMemValConvdtoull(double* nocapture readonly %ptr) {
6363; P9BE-LABEL: spltMemValConvdtoull:
6364; P9BE:       # %bb.0: # %entry
6365; P9BE-NEXT:    lxvdsx vs0, 0, r3
6366; P9BE-NEXT:    xvcvdpuxds v2, vs0
6367; P9BE-NEXT:    blr
6368;
6369; P9LE-LABEL: spltMemValConvdtoull:
6370; P9LE:       # %bb.0: # %entry
6371; P9LE-NEXT:    lxvdsx vs0, 0, r3
6372; P9LE-NEXT:    xvcvdpuxds v2, vs0
6373; P9LE-NEXT:    blr
6374;
6375; P8BE-LABEL: spltMemValConvdtoull:
6376; P8BE:       # %bb.0: # %entry
6377; P8BE-NEXT:    lxvdsx vs0, 0, r3
6378; P8BE-NEXT:    xvcvdpuxds v2, vs0
6379; P8BE-NEXT:    blr
6380;
6381; P8LE-LABEL: spltMemValConvdtoull:
6382; P8LE:       # %bb.0: # %entry
6383; P8LE-NEXT:    lxvdsx vs0, 0, r3
6384; P8LE-NEXT:    xvcvdpuxds v2, vs0
6385; P8LE-NEXT:    blr
6386entry:
6387  %0 = load double, double* %ptr, align 8
6388  %conv = fptoui double %0 to i64
6389  %splat.splatinsert = insertelement <2 x i64> undef, i64 %conv, i32 0
6390  %splat.splat = shufflevector <2 x i64> %splat.splatinsert, <2 x i64> undef, <2 x i32> zeroinitializer
6391  ret <2 x i64> %splat.splat
6392}
6393