xref: /aosp_15_r20/external/llvm/test/CodeGen/AArch64/arm64-copy-tuple.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; RUN: llc -mtriple=arm64-apple-ios -o - %s | FileCheck %s
2*9880d681SAndroid Build Coastguard Worker
3*9880d681SAndroid Build Coastguard Worker; The main purpose of this test is to find out whether copyPhysReg can deal with
4*9880d681SAndroid Build Coastguard Worker; the memmove-like situation arising in tuples, where an early copy can clobber
5*9880d681SAndroid Build Coastguard Worker; the value needed by a later one if the tuples overlap.
6*9880d681SAndroid Build Coastguard Worker
7*9880d681SAndroid Build Coastguard Worker; We use dummy inline asm to force LLVM to generate a COPY between the registers
8*9880d681SAndroid Build Coastguard Worker; we want by clobbering all the others.
9*9880d681SAndroid Build Coastguard Worker
10*9880d681SAndroid Build Coastguard Workerdefine void @test_D1D2_from_D0D1(i8* %addr) #0 {
11*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_D1D2_from_D0D1:
12*9880d681SAndroid Build Coastguard Worker; CHECK: mov.8b v2, v1
13*9880d681SAndroid Build Coastguard Worker; CHECK: mov.8b v1, v0
14*9880d681SAndroid Build Coastguard Workerentry:
15*9880d681SAndroid Build Coastguard Worker  %addr_v8i8 = bitcast i8* %addr to <8 x i8>*
16*9880d681SAndroid Build Coastguard Worker  %vec = tail call { <8 x i8>, <8 x i8> } @llvm.aarch64.neon.ld2.v8i8.p0v8i8(<8 x i8>* %addr_v8i8)
17*9880d681SAndroid Build Coastguard Worker  %vec0 = extractvalue { <8 x i8>, <8 x i8> } %vec, 0
18*9880d681SAndroid Build Coastguard Worker  %vec1 = extractvalue { <8 x i8>, <8 x i8> } %vec, 1
19*9880d681SAndroid Build Coastguard Worker  tail call void asm sideeffect "", "~{v2},~{v3},~{v4},~{v5},~{v6},~{v7},~{v8},~{v9},~{v10},~{v11},~{v12},~{v13},~{v14},~{v15},~{v16},~{v17},~{v18},~{v19},~{v20},~{v21},~{v22},~{v23},~{v24},~{v25},~{v26},~{v27},~{v28},~{v29},~{v30},~{v31}"()
20*9880d681SAndroid Build Coastguard Worker  tail call void @llvm.aarch64.neon.st2.v8i8.p0i8(<8 x i8> %vec0, <8 x i8> %vec1, i8* %addr)
21*9880d681SAndroid Build Coastguard Worker
22*9880d681SAndroid Build Coastguard Worker  tail call void asm sideeffect "", "~{v0},~{v3},~{v4},~{v5},~{v6},~{v7},~{v8},~{v9},~{v10},~{v11},~{v12},~{v13},~{v14},~{v15},~{v16},~{v17},~{v18},~{v19},~{v20},~{v21},~{v22},~{v23},~{v24},~{v25},~{v26},~{v27},~{v28},~{v29},~{v30},~{v31}"()
23*9880d681SAndroid Build Coastguard Worker  tail call void @llvm.aarch64.neon.st2.v8i8.p0i8(<8 x i8> %vec0, <8 x i8> %vec1, i8* %addr)
24*9880d681SAndroid Build Coastguard Worker  ret void
25*9880d681SAndroid Build Coastguard Worker}
26*9880d681SAndroid Build Coastguard Worker
27*9880d681SAndroid Build Coastguard Workerdefine void @test_D0D1_from_D1D2(i8* %addr) #0 {
28*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_D0D1_from_D1D2:
29*9880d681SAndroid Build Coastguard Worker; CHECK: mov.8b v0, v1
30*9880d681SAndroid Build Coastguard Worker; CHECK: mov.8b v1, v2
31*9880d681SAndroid Build Coastguard Workerentry:
32*9880d681SAndroid Build Coastguard Worker  %addr_v8i8 = bitcast i8* %addr to <8 x i8>*
33*9880d681SAndroid Build Coastguard Worker  %vec = tail call { <8 x i8>, <8 x i8> } @llvm.aarch64.neon.ld2.v8i8.p0v8i8(<8 x i8>* %addr_v8i8)
34*9880d681SAndroid Build Coastguard Worker  %vec0 = extractvalue { <8 x i8>, <8 x i8> } %vec, 0
35*9880d681SAndroid Build Coastguard Worker  %vec1 = extractvalue { <8 x i8>, <8 x i8> } %vec, 1
36*9880d681SAndroid Build Coastguard Worker  tail call void asm sideeffect "", "~{v0},~{v3},~{v4},~{v5},~{v6},~{v7},~{v8},~{v9},~{v10},~{v11},~{v12},~{v13},~{v14},~{v15},~{v16},~{v17},~{v18},~{v19},~{v20},~{v21},~{v22},~{v23},~{v24},~{v25},~{v26},~{v27},~{v28},~{v29},~{v30},~{v31}"()
37*9880d681SAndroid Build Coastguard Worker  tail call void @llvm.aarch64.neon.st2.v8i8.p0i8(<8 x i8> %vec0, <8 x i8> %vec1, i8* %addr)
38*9880d681SAndroid Build Coastguard Worker
39*9880d681SAndroid Build Coastguard Worker  tail call void asm sideeffect "", "~{v2},~{v3},~{v4},~{v5},~{v6},~{v7},~{v8},~{v9},~{v10},~{v11},~{v12},~{v13},~{v14},~{v15},~{v16},~{v17},~{v18},~{v19},~{v20},~{v21},~{v22},~{v23},~{v24},~{v25},~{v26},~{v27},~{v28},~{v29},~{v30},~{v31}"()
40*9880d681SAndroid Build Coastguard Worker  tail call void @llvm.aarch64.neon.st2.v8i8.p0i8(<8 x i8> %vec0, <8 x i8> %vec1, i8* %addr)
41*9880d681SAndroid Build Coastguard Worker  ret void
42*9880d681SAndroid Build Coastguard Worker}
43*9880d681SAndroid Build Coastguard Worker
44*9880d681SAndroid Build Coastguard Workerdefine void @test_D0D1_from_D31D0(i8* %addr) #0 {
45*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_D0D1_from_D31D0:
46*9880d681SAndroid Build Coastguard Worker; CHECK: mov.8b v1, v0
47*9880d681SAndroid Build Coastguard Worker; CHECK: mov.8b v0, v31
48*9880d681SAndroid Build Coastguard Workerentry:
49*9880d681SAndroid Build Coastguard Worker  %addr_v8i8 = bitcast i8* %addr to <8 x i8>*
50*9880d681SAndroid Build Coastguard Worker  %vec = tail call { <8 x i8>, <8 x i8> } @llvm.aarch64.neon.ld2.v8i8.p0v8i8(<8 x i8>* %addr_v8i8)
51*9880d681SAndroid Build Coastguard Worker  %vec0 = extractvalue { <8 x i8>, <8 x i8> } %vec, 0
52*9880d681SAndroid Build Coastguard Worker  %vec1 = extractvalue { <8 x i8>, <8 x i8> } %vec, 1
53*9880d681SAndroid Build Coastguard Worker  tail call void asm sideeffect "", "~{v1},~{v2},~{v3},~{v4},~{v5},~{v6},~{v7},~{v8},~{v9},~{v10},~{v11},~{v12},~{v13},~{v14},~{v15},~{v16},~{v17},~{v18},~{v19},~{v20},~{v21},~{v22},~{v23},~{v24},~{v25},~{v26},~{v27},~{v28},~{v29},~{v30}"()
54*9880d681SAndroid Build Coastguard Worker  tail call void @llvm.aarch64.neon.st2.v8i8.p0i8(<8 x i8> %vec0, <8 x i8> %vec1, i8* %addr)
55*9880d681SAndroid Build Coastguard Worker
56*9880d681SAndroid Build Coastguard Worker  tail call void asm sideeffect "", "~{v2},~{v3},~{v4},~{v5},~{v6},~{v7},~{v8},~{v9},~{v10},~{v11},~{v12},~{v13},~{v14},~{v15},~{v16},~{v17},~{v18},~{v19},~{v20},~{v21},~{v22},~{v23},~{v24},~{v25},~{v26},~{v27},~{v28},~{v29},~{v30},~{v31}"()
57*9880d681SAndroid Build Coastguard Worker  tail call void @llvm.aarch64.neon.st2.v8i8.p0i8(<8 x i8> %vec0, <8 x i8> %vec1, i8* %addr)
58*9880d681SAndroid Build Coastguard Worker  ret void
59*9880d681SAndroid Build Coastguard Worker}
60*9880d681SAndroid Build Coastguard Worker
61*9880d681SAndroid Build Coastguard Workerdefine void @test_D31D0_from_D0D1(i8* %addr) #0 {
62*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_D31D0_from_D0D1:
63*9880d681SAndroid Build Coastguard Worker; CHECK: mov.8b v31, v0
64*9880d681SAndroid Build Coastguard Worker; CHECK: mov.8b v0, v1
65*9880d681SAndroid Build Coastguard Workerentry:
66*9880d681SAndroid Build Coastguard Worker  %addr_v8i8 = bitcast i8* %addr to <8 x i8>*
67*9880d681SAndroid Build Coastguard Worker  %vec = tail call { <8 x i8>, <8 x i8> } @llvm.aarch64.neon.ld2.v8i8.p0v8i8(<8 x i8>* %addr_v8i8)
68*9880d681SAndroid Build Coastguard Worker  %vec0 = extractvalue { <8 x i8>, <8 x i8> } %vec, 0
69*9880d681SAndroid Build Coastguard Worker  %vec1 = extractvalue { <8 x i8>, <8 x i8> } %vec, 1
70*9880d681SAndroid Build Coastguard Worker  tail call void asm sideeffect "", "~{v2},~{v3},~{v4},~{v5},~{v6},~{v7},~{v8},~{v9},~{v10},~{v11},~{v12},~{v13},~{v14},~{v15},~{v16},~{v17},~{v18},~{v19},~{v20},~{v21},~{v22},~{v23},~{v24},~{v25},~{v26},~{v27},~{v28},~{v29},~{v30},~{v31}"()
71*9880d681SAndroid Build Coastguard Worker  tail call void @llvm.aarch64.neon.st2.v8i8.p0i8(<8 x i8> %vec0, <8 x i8> %vec1, i8* %addr)
72*9880d681SAndroid Build Coastguard Worker
73*9880d681SAndroid Build Coastguard Worker  tail call void asm sideeffect "", "~{v1},~{v2},~{v3},~{v4},~{v5},~{v6},~{v7},~{v8},~{v9},~{v10},~{v11},~{v12},~{v13},~{v14},~{v15},~{v16},~{v17},~{v18},~{v19},~{v20},~{v21},~{v22},~{v23},~{v24},~{v25},~{v26},~{v27},~{v28},~{v29},~{v30}"()
74*9880d681SAndroid Build Coastguard Worker  tail call void @llvm.aarch64.neon.st2.v8i8.p0i8(<8 x i8> %vec0, <8 x i8> %vec1, i8* %addr)
75*9880d681SAndroid Build Coastguard Worker  ret void
76*9880d681SAndroid Build Coastguard Worker}
77*9880d681SAndroid Build Coastguard Worker
78*9880d681SAndroid Build Coastguard Workerdefine void @test_D2D3D4_from_D0D1D2(i8* %addr) #0 {
79*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_D2D3D4_from_D0D1D2:
80*9880d681SAndroid Build Coastguard Worker; CHECK: mov.8b v4, v2
81*9880d681SAndroid Build Coastguard Worker; CHECK: mov.8b v3, v1
82*9880d681SAndroid Build Coastguard Worker; CHECK: mov.8b v2, v0
83*9880d681SAndroid Build Coastguard Workerentry:
84*9880d681SAndroid Build Coastguard Worker  %addr_v8i8 = bitcast i8* %addr to <8 x i8>*
85*9880d681SAndroid Build Coastguard Worker  %vec = tail call { <8 x i8>, <8 x i8>, <8 x i8> } @llvm.aarch64.neon.ld3.v8i8.p0v8i8(<8 x i8>* %addr_v8i8)
86*9880d681SAndroid Build Coastguard Worker  %vec0 = extractvalue { <8 x i8>, <8 x i8>, <8 x i8> } %vec, 0
87*9880d681SAndroid Build Coastguard Worker  %vec1 = extractvalue { <8 x i8>, <8 x i8>, <8 x i8> } %vec, 1
88*9880d681SAndroid Build Coastguard Worker  %vec2 = extractvalue { <8 x i8>, <8 x i8>, <8 x i8> } %vec, 2
89*9880d681SAndroid Build Coastguard Worker
90*9880d681SAndroid Build Coastguard Worker  tail call void asm sideeffect "", "~{v3},~{v4},~{v5},~{v6},~{v7},~{v8},~{v9},~{v10},~{v11},~{v12},~{v13},~{v14},~{v15},~{v16},~{v17},~{v18},~{v19},~{v20},~{v21},~{v22},~{v23},~{v24},~{v25},~{v26},~{v27},~{v28},~{v29},~{v30},~{v31}"()
91*9880d681SAndroid Build Coastguard Worker  tail call void @llvm.aarch64.neon.st3.v8i8.p0i8(<8 x i8> %vec0, <8 x i8> %vec1, <8 x i8> %vec2, i8* %addr)
92*9880d681SAndroid Build Coastguard Worker
93*9880d681SAndroid Build Coastguard Worker  tail call void asm sideeffect "", "~{v0},~{v1},~{v5},~{v6},~{v7},~{v8},~{v9},~{v10},~{v11},~{v12},~{v13},~{v14},~{v15},~{v16},~{v17},~{v18},~{v19},~{v20},~{v21},~{v22},~{v23},~{v24},~{v25},~{v26},~{v27},~{v28},~{v29},~{v30},~{v31}"()
94*9880d681SAndroid Build Coastguard Worker  tail call void @llvm.aarch64.neon.st3.v8i8.p0i8(<8 x i8> %vec0, <8 x i8> %vec1, <8 x i8> %vec2, i8* %addr)
95*9880d681SAndroid Build Coastguard Worker  ret void
96*9880d681SAndroid Build Coastguard Worker}
97*9880d681SAndroid Build Coastguard Worker
98*9880d681SAndroid Build Coastguard Workerdefine void @test_Q0Q1Q2_from_Q1Q2Q3(i8* %addr) #0 {
99*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_Q0Q1Q2_from_Q1Q2Q3:
100*9880d681SAndroid Build Coastguard Worker; CHECK: mov.16b v0, v1
101*9880d681SAndroid Build Coastguard Worker; CHECK: mov.16b v1, v2
102*9880d681SAndroid Build Coastguard Worker; CHECK: mov.16b v2, v3
103*9880d681SAndroid Build Coastguard Workerentry:
104*9880d681SAndroid Build Coastguard Worker  %addr_v16i8 = bitcast i8* %addr to <16 x i8>*
105*9880d681SAndroid Build Coastguard Worker  %vec = tail call { <16 x i8>, <16 x i8>, <16 x i8> } @llvm.aarch64.neon.ld3.v16i8.p0v16i8(<16 x i8>* %addr_v16i8)
106*9880d681SAndroid Build Coastguard Worker  %vec0 = extractvalue { <16 x i8>, <16 x i8>, <16 x i8> } %vec, 0
107*9880d681SAndroid Build Coastguard Worker  %vec1 = extractvalue { <16 x i8>, <16 x i8>, <16 x i8> } %vec, 1
108*9880d681SAndroid Build Coastguard Worker  %vec2 = extractvalue { <16 x i8>, <16 x i8>, <16 x i8> } %vec, 2
109*9880d681SAndroid Build Coastguard Worker  tail call void asm sideeffect "", "~{v0},~{v4},~{v5},~{v6},~{v7},~{v8},~{v9},~{v10},~{v11},~{v12},~{v13},~{v14},~{v15},~{v16},~{v17},~{v18},~{v19},~{v20},~{v21},~{v22},~{v23},~{v24},~{v25},~{v26},~{v27},~{v28},~{v29},~{v30},~{v31}"()
110*9880d681SAndroid Build Coastguard Worker  tail call void @llvm.aarch64.neon.st3.v16i8.p0i8(<16 x i8> %vec0, <16 x i8> %vec1, <16 x i8> %vec2, i8* %addr)
111*9880d681SAndroid Build Coastguard Worker
112*9880d681SAndroid Build Coastguard Worker  tail call void asm sideeffect "", "~{v3},~{v4},~{v5},~{v6},~{v7},~{v8},~{v9},~{v10},~{v11},~{v12},~{v13},~{v14},~{v15},~{v16},~{v17},~{v18},~{v19},~{v20},~{v21},~{v22},~{v23},~{v24},~{v25},~{v26},~{v27},~{v28},~{v29},~{v30},~{v31}"()
113*9880d681SAndroid Build Coastguard Worker  tail call void @llvm.aarch64.neon.st3.v16i8.p0i8(<16 x i8> %vec0, <16 x i8> %vec1, <16 x i8> %vec2, i8* %addr)
114*9880d681SAndroid Build Coastguard Worker  ret void
115*9880d681SAndroid Build Coastguard Worker}
116*9880d681SAndroid Build Coastguard Worker
117*9880d681SAndroid Build Coastguard Workerdefine void @test_Q1Q2Q3Q4_from_Q30Q31Q0Q1(i8* %addr) #0 {
118*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_Q1Q2Q3Q4_from_Q30Q31Q0Q1:
119*9880d681SAndroid Build Coastguard Worker; CHECK: mov.16b v4, v1
120*9880d681SAndroid Build Coastguard Worker; CHECK: mov.16b v3, v0
121*9880d681SAndroid Build Coastguard Worker; CHECK: mov.16b v2, v31
122*9880d681SAndroid Build Coastguard Worker; CHECK: mov.16b v1, v30
123*9880d681SAndroid Build Coastguard Worker  %addr_v16i8 = bitcast i8* %addr to <16 x i8>*
124*9880d681SAndroid Build Coastguard Worker  %vec = tail call { <16 x i8>, <16 x i8>, <16 x i8>, <16 x i8> } @llvm.aarch64.neon.ld4.v16i8.p0v16i8(<16 x i8>* %addr_v16i8)
125*9880d681SAndroid Build Coastguard Worker  %vec0 = extractvalue { <16 x i8>, <16 x i8>, <16 x i8>, <16 x i8> } %vec, 0
126*9880d681SAndroid Build Coastguard Worker  %vec1 = extractvalue { <16 x i8>, <16 x i8>, <16 x i8>, <16 x i8> } %vec, 1
127*9880d681SAndroid Build Coastguard Worker  %vec2 = extractvalue { <16 x i8>, <16 x i8>, <16 x i8>, <16 x i8> } %vec, 2
128*9880d681SAndroid Build Coastguard Worker  %vec3 = extractvalue { <16 x i8>, <16 x i8>, <16 x i8>, <16 x i8> } %vec, 3
129*9880d681SAndroid Build Coastguard Worker
130*9880d681SAndroid Build Coastguard Worker  tail call void asm sideeffect "", "~{v2},~{v3},~{v4},~{v5},~{v6},~{v7},~{v8},~{v9},~{v10},~{v11},~{v12},~{v13},~{v14},~{v15},~{v16},~{v17},~{v18},~{v19},~{v20},~{v21},~{v22},~{v23},~{v24},~{v25},~{v26},~{v27},~{v28},~{v29}"()
131*9880d681SAndroid Build Coastguard Worker  tail call void @llvm.aarch64.neon.st4.v16i8.p0i8(<16 x i8> %vec0, <16 x i8> %vec1, <16 x i8> %vec2, <16 x i8> %vec3, i8* %addr)
132*9880d681SAndroid Build Coastguard Worker
133*9880d681SAndroid Build Coastguard Worker  tail call void asm sideeffect "", "~{v0},~{v5},~{v6},~{v7},~{v8},~{v9},~{v10},~{v11},~{v12},~{v13},~{v14},~{v15},~{v16},~{v17},~{v18},~{v19},~{v20},~{v21},~{v22},~{v23},~{v24},~{v25},~{v26},~{v27},~{v28},~{v29},~{v30},~{v31}"()
134*9880d681SAndroid Build Coastguard Worker  tail call void @llvm.aarch64.neon.st4.v16i8.p0i8(<16 x i8> %vec0, <16 x i8> %vec1, <16 x i8> %vec2, <16 x i8> %vec3, i8* %addr)
135*9880d681SAndroid Build Coastguard Worker  ret void
136*9880d681SAndroid Build Coastguard Worker}
137*9880d681SAndroid Build Coastguard Worker
138*9880d681SAndroid Build Coastguard Workerdeclare { <8 x i8>, <8 x i8> } @llvm.aarch64.neon.ld2.v8i8.p0v8i8(<8 x i8>*)
139*9880d681SAndroid Build Coastguard Workerdeclare { <8 x i8>, <8 x i8>, <8 x i8> } @llvm.aarch64.neon.ld3.v8i8.p0v8i8(<8 x i8>*)
140*9880d681SAndroid Build Coastguard Workerdeclare { <16 x i8>, <16 x i8>, <16 x i8> } @llvm.aarch64.neon.ld3.v16i8.p0v16i8(<16 x i8>*)
141*9880d681SAndroid Build Coastguard Workerdeclare { <16 x i8>, <16 x i8>, <16 x i8>, <16 x i8> } @llvm.aarch64.neon.ld4.v16i8.p0v16i8(<16 x i8>*)
142*9880d681SAndroid Build Coastguard Worker
143*9880d681SAndroid Build Coastguard Workerdeclare void @llvm.aarch64.neon.st2.v8i8.p0i8(<8 x i8>, <8 x i8>, i8*)
144*9880d681SAndroid Build Coastguard Workerdeclare void @llvm.aarch64.neon.st3.v8i8.p0i8(<8 x i8>, <8 x i8>, <8 x i8>, i8*)
145*9880d681SAndroid Build Coastguard Workerdeclare void @llvm.aarch64.neon.st3.v16i8.p0i8(<16 x i8>, <16 x i8>, <16 x i8>, i8*)
146*9880d681SAndroid Build Coastguard Workerdeclare void @llvm.aarch64.neon.st4.v16i8.p0i8(<16 x i8>, <16 x i8>, <16 x i8>, <16 x i8>, i8*)
147