xref: /aosp_15_r20/external/llvm/test/CodeGen/PowerPC/swaps-le-5.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; RUN: llc -mcpu=pwr8 -mtriple=powerpc64le-unknown-linux-gnu -O3 < %s | FileCheck %s
2*9880d681SAndroid Build Coastguard Worker
3*9880d681SAndroid Build Coastguard Worker; These tests verify that VSX swap optimization works for various
4*9880d681SAndroid Build Coastguard Worker; manipulations of <2 x double> vectors.
5*9880d681SAndroid Build Coastguard Worker
6*9880d681SAndroid Build Coastguard Worker@x = global <2 x double> <double 9.970000e+01, double -1.032220e+02>, align 16
7*9880d681SAndroid Build Coastguard Worker@z = global <2 x double> <double 2.332000e+01, double 3.111111e+01>, align 16
8*9880d681SAndroid Build Coastguard Worker
9*9880d681SAndroid Build Coastguard Workerdefine void @bar0(double %y) {
10*9880d681SAndroid Build Coastguard Workerentry:
11*9880d681SAndroid Build Coastguard Worker  %0 = load <2 x double>, <2 x double>* @x, align 16
12*9880d681SAndroid Build Coastguard Worker  %vecins = insertelement <2 x double> %0, double %y, i32 0
13*9880d681SAndroid Build Coastguard Worker  store <2 x double> %vecins, <2 x double>* @z, align 16
14*9880d681SAndroid Build Coastguard Worker  ret void
15*9880d681SAndroid Build Coastguard Worker}
16*9880d681SAndroid Build Coastguard Worker
17*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @bar0
18*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: lxvd2x [[REG1:[0-9]+]]
19*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: xxspltd [[REG2:[0-9]+]]
20*9880d681SAndroid Build Coastguard Worker; CHECK: xxpermdi [[REG3:[0-9]+]], [[REG2]], [[REG1]], 1
21*9880d681SAndroid Build Coastguard Worker; CHECK: stxvd2x [[REG3]]
22*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: xxswapd
23*9880d681SAndroid Build Coastguard Worker
24*9880d681SAndroid Build Coastguard Workerdefine void @bar1(double %y) {
25*9880d681SAndroid Build Coastguard Workerentry:
26*9880d681SAndroid Build Coastguard Worker  %0 = load <2 x double>, <2 x double>* @x, align 16
27*9880d681SAndroid Build Coastguard Worker  %vecins = insertelement <2 x double> %0, double %y, i32 1
28*9880d681SAndroid Build Coastguard Worker  store <2 x double> %vecins, <2 x double>* @z, align 16
29*9880d681SAndroid Build Coastguard Worker  ret void
30*9880d681SAndroid Build Coastguard Worker}
31*9880d681SAndroid Build Coastguard Worker
32*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @bar1
33*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: lxvd2x [[REG1:[0-9]+]]
34*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: xxspltd [[REG2:[0-9]+]]
35*9880d681SAndroid Build Coastguard Worker; CHECK: xxmrghd [[REG3:[0-9]+]], [[REG1]], [[REG2]]
36*9880d681SAndroid Build Coastguard Worker; CHECK: stxvd2x [[REG3]]
37*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: xxswapd
38*9880d681SAndroid Build Coastguard Worker
39*9880d681SAndroid Build Coastguard Workerdefine void @baz0() {
40*9880d681SAndroid Build Coastguard Workerentry:
41*9880d681SAndroid Build Coastguard Worker  %0 = load <2 x double>, <2 x double>* @z, align 16
42*9880d681SAndroid Build Coastguard Worker  %1 = load <2 x double>, <2 x double>* @x, align 16
43*9880d681SAndroid Build Coastguard Worker  %vecins = shufflevector <2 x double> %0, <2 x double> %1, <2 x i32> <i32 0, i32 2>
44*9880d681SAndroid Build Coastguard Worker  store <2 x double> %vecins, <2 x double>* @z, align 16
45*9880d681SAndroid Build Coastguard Worker  ret void
46*9880d681SAndroid Build Coastguard Worker}
47*9880d681SAndroid Build Coastguard Worker
48*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @baz0
49*9880d681SAndroid Build Coastguard Worker; CHECK: lxvd2x
50*9880d681SAndroid Build Coastguard Worker; CHECK: lxvd2x
51*9880d681SAndroid Build Coastguard Worker; CHECK: xxmrghd
52*9880d681SAndroid Build Coastguard Worker; CHECK: stxvd2x
53*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: xxswapd
54*9880d681SAndroid Build Coastguard Worker
55*9880d681SAndroid Build Coastguard Workerdefine void @baz1() {
56*9880d681SAndroid Build Coastguard Workerentry:
57*9880d681SAndroid Build Coastguard Worker  %0 = load <2 x double>, <2 x double>* @z, align 16
58*9880d681SAndroid Build Coastguard Worker  %1 = load <2 x double>, <2 x double>* @x, align 16
59*9880d681SAndroid Build Coastguard Worker  %vecins = shufflevector <2 x double> %0, <2 x double> %1, <2 x i32> <i32 3, i32 1>
60*9880d681SAndroid Build Coastguard Worker  store <2 x double> %vecins, <2 x double>* @z, align 16
61*9880d681SAndroid Build Coastguard Worker  ret void
62*9880d681SAndroid Build Coastguard Worker}
63*9880d681SAndroid Build Coastguard Worker
64*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @baz1
65*9880d681SAndroid Build Coastguard Worker; CHECK: lxvd2x
66*9880d681SAndroid Build Coastguard Worker; CHECK: lxvd2x
67*9880d681SAndroid Build Coastguard Worker; CHECK: xxmrgld
68*9880d681SAndroid Build Coastguard Worker; CHECK: stxvd2x
69*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: xxswapd
70*9880d681SAndroid Build Coastguard Worker
71