xref: /aosp_15_r20/external/llvm/test/CodeGen/ARM/memcpy-ldm-stm.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; RUN: llc -mtriple=thumbv6m-eabi -verify-machineinstrs %s -o - | \
2*9880d681SAndroid Build Coastguard Worker; RUN:    FileCheck %s --check-prefix=CHECK --check-prefix=CHECKV6
3*9880d681SAndroid Build Coastguard Worker; RUN: llc -mtriple=thumbv6m-eabi -O=0 -verify-machineinstrs %s -o - | \
4*9880d681SAndroid Build Coastguard Worker; RUN:    FileCheck %s --check-prefix=CHECK --check-prefix=CHECKV6
5*9880d681SAndroid Build Coastguard Worker; RUN: llc -mtriple=thumbv7a-eabi -mattr=-neon -verify-machineinstrs %s -o - | \
6*9880d681SAndroid Build Coastguard Worker; RUN:    FileCheck %s --check-prefix=CHECK --check-prefix=CHECKV7
7*9880d681SAndroid Build Coastguard Worker; RUN: llc -mtriple=armv7a-eabi -mattr=-neon -verify-machineinstrs %s -o - | \
8*9880d681SAndroid Build Coastguard Worker; RUN:    FileCheck %s --check-prefix=CHECK --check-prefix=CHECKV7
9*9880d681SAndroid Build Coastguard Worker
10*9880d681SAndroid Build Coastguard Worker@d = external global [64 x i32]
11*9880d681SAndroid Build Coastguard Worker@s = external global [64 x i32]
12*9880d681SAndroid Build Coastguard Worker
13*9880d681SAndroid Build Coastguard Worker; Function Attrs: nounwind
14*9880d681SAndroid Build Coastguard Workerdefine void @t1() #0 {
15*9880d681SAndroid Build Coastguard Workerentry:
16*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: t1:
17*9880d681SAndroid Build Coastguard Worker; CHECKV6: ldr [[LB:r[0-7]]],
18*9880d681SAndroid Build Coastguard Worker; CHECKV6-NEXT: ldr [[SB:r[0-7]]],
19*9880d681SAndroid Build Coastguard Worker; We use '[rl0-9]+' to allow 'r0'..'r12', 'lr'
20*9880d681SAndroid Build Coastguard Worker; CHECKV7: movt [[LB:[rl0-9]+]], :upper16:d
21*9880d681SAndroid Build Coastguard Worker; CHECKV7-NEXT: movt [[SB:[rl0-9]+]], :upper16:s
22*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ldm{{(\.w)?}} [[LB]]!,
23*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: stm{{(\.w)?}} [[SB]]!,
24*9880d681SAndroid Build Coastguard Worker; Think of the monstrosity '{{\[}}[[LB]]]' as '[ [[LB]] ]' without the spaces.
25*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ldrb{{(\.w)?}} {{.*}}, {{\[}}[[LB]]]
26*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: strb{{(\.w)?}} {{.*}}, {{\[}}[[SB]]]
27*9880d681SAndroid Build Coastguard Worker    tail call void @llvm.memcpy.p0i8.p0i8.i32(i8* bitcast ([64 x i32]* @s to i8*), i8* bitcast ([64 x i32]* @d to i8*), i32 17, i32 4, i1 false)
28*9880d681SAndroid Build Coastguard Worker    ret void
29*9880d681SAndroid Build Coastguard Worker}
30*9880d681SAndroid Build Coastguard Worker
31*9880d681SAndroid Build Coastguard Worker; Function Attrs: nounwind
32*9880d681SAndroid Build Coastguard Workerdefine void @t2() #0 {
33*9880d681SAndroid Build Coastguard Workerentry:
34*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: t2:
35*9880d681SAndroid Build Coastguard Worker; CHECKV6: ldr [[LB:r[0-7]]],
36*9880d681SAndroid Build Coastguard Worker; CHECKV6-NEXT: ldr [[SB:r[0-7]]],
37*9880d681SAndroid Build Coastguard Worker; CHECKV7: movt [[LB:[rl0-9]+]], :upper16:d
38*9880d681SAndroid Build Coastguard Worker; CHECKV7-NEXT: movt [[SB:[rl0-9]+]], :upper16:s
39*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ldm{{(\.w)?}} [[LB]]!,
40*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: stm{{(\.w)?}} [[SB]]!,
41*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ldrh{{(\.w)?}} {{.*}}, {{\[}}[[LB]]]
42*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ldrb{{(\.w)?}} {{.*}}, {{\[}}[[LB]], #2]
43*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: strb{{(\.w)?}} {{.*}}, {{\[}}[[SB]], #2]
44*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: strh{{(\.w)?}} {{.*}}, {{\[}}[[SB]]]
45*9880d681SAndroid Build Coastguard Worker    tail call void @llvm.memcpy.p0i8.p0i8.i32(i8* bitcast ([64 x i32]* @s to i8*), i8* bitcast ([64 x i32]* @d to i8*), i32 15, i32 4, i1 false)
46*9880d681SAndroid Build Coastguard Worker    ret void
47*9880d681SAndroid Build Coastguard Worker}
48*9880d681SAndroid Build Coastguard Worker
49*9880d681SAndroid Build Coastguard Worker; PR23768
50*9880d681SAndroid Build Coastguard Worker%struct.T = type { i8, i64, i8 }
51*9880d681SAndroid Build Coastguard Worker
52*9880d681SAndroid Build Coastguard Worker@copy = external global %struct.T, align 8
53*9880d681SAndroid Build Coastguard Worker@etest = external global %struct.T, align 8
54*9880d681SAndroid Build Coastguard Worker
55*9880d681SAndroid Build Coastguard Workerdefine void @t3() {
56*9880d681SAndroid Build Coastguard Worker  call void @llvm.memcpy.p0i8.p0i8.i32(
57*9880d681SAndroid Build Coastguard Worker     i8* getelementptr inbounds (%struct.T, %struct.T* @copy, i32 0, i32 0),
58*9880d681SAndroid Build Coastguard Worker     i8* getelementptr inbounds (%struct.T, %struct.T* @etest, i32 0, i32 0),
59*9880d681SAndroid Build Coastguard Worker     i32 24, i32 8, i1 false)
60*9880d681SAndroid Build Coastguard Worker  call void @llvm.memcpy.p0i8.p0i8.i32(
61*9880d681SAndroid Build Coastguard Worker     i8* getelementptr inbounds (%struct.T, %struct.T* @copy, i32 0, i32 0),
62*9880d681SAndroid Build Coastguard Worker     i8* getelementptr inbounds (%struct.T, %struct.T* @etest, i32 0, i32 0),
63*9880d681SAndroid Build Coastguard Worker     i32 24, i32 8, i1 false)
64*9880d681SAndroid Build Coastguard Worker  ret void
65*9880d681SAndroid Build Coastguard Worker}
66*9880d681SAndroid Build Coastguard Worker
67*9880d681SAndroid Build Coastguard Worker%struct.S = type { [12 x i32] }
68*9880d681SAndroid Build Coastguard Worker
69*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test3
70*9880d681SAndroid Build Coastguard Workerdefine void @test3(%struct.S* %d, %struct.S* %s) #0 {
71*9880d681SAndroid Build Coastguard Worker  %1 = bitcast %struct.S* %d to i8*
72*9880d681SAndroid Build Coastguard Worker  %2 = bitcast %struct.S* %s to i8*
73*9880d681SAndroid Build Coastguard Worker  tail call void @llvm.memcpy.p0i8.p0i8.i32(i8* %1, i8* %2, i32 48, i32 4, i1 false)
74*9880d681SAndroid Build Coastguard Worker; 3 ldm/stm pairs in v6; 2 in v7
75*9880d681SAndroid Build Coastguard Worker; CHECK: ldm{{(\.w)?}} {{[rl0-9]+!?}}, [[REGLIST1:{.*}]]
76*9880d681SAndroid Build Coastguard Worker; CHECK: stm{{(\.w)?}} {{[rl0-9]+!?}}, [[REGLIST1]]
77*9880d681SAndroid Build Coastguard Worker; CHECK: ldm{{(\.w)?}} {{[rl0-9]+!?}}, [[REGLIST2:{.*}]]
78*9880d681SAndroid Build Coastguard Worker; CHECK: stm{{(\.w)?}} {{[rl0-9]+!?}}, [[REGLIST2]]
79*9880d681SAndroid Build Coastguard Worker; CHECKV6: ldm {{r[0-7]!?}}, [[REGLIST3:{.*}]]
80*9880d681SAndroid Build Coastguard Worker; CHECKV6: stm {{r[0-7]!?}}, [[REGLIST3]]
81*9880d681SAndroid Build Coastguard Worker; CHECKV7-NOT: ldm
82*9880d681SAndroid Build Coastguard Worker; CHECKV7-NOT: stm
83*9880d681SAndroid Build Coastguard Worker  %arrayidx = getelementptr inbounds %struct.S, %struct.S* %s, i32 0, i32 0, i32 1
84*9880d681SAndroid Build Coastguard Worker  tail call void @g(i32* %arrayidx) #3
85*9880d681SAndroid Build Coastguard Worker  ret void
86*9880d681SAndroid Build Coastguard Worker}
87*9880d681SAndroid Build Coastguard Worker
88*9880d681SAndroid Build Coastguard Workerdeclare void @g(i32*)
89*9880d681SAndroid Build Coastguard Worker
90*9880d681SAndroid Build Coastguard Worker; Set "no-frame-pointer-elim" to increase register pressure
91*9880d681SAndroid Build Coastguard Workerattributes #0 = { "no-frame-pointer-elim"="true" }
92*9880d681SAndroid Build Coastguard Worker
93*9880d681SAndroid Build Coastguard Worker; Function Attrs: nounwind
94*9880d681SAndroid Build Coastguard Workerdeclare void @llvm.memcpy.p0i8.p0i8.i32(i8* nocapture, i8* nocapture readonly, i32, i32, i1) #1
95