xref: /llvm-project/llvm/test/CodeGen/ARM/unaligned_load_store.ll (revision bed1c7f061aa12417aa081e334afdba45767b938)
1; RUN: llc -mtriple=arm-eabi -pre-RA-sched=source -mattr=+strict-align %s -o - \
2; RUN:	| FileCheck %s -check-prefix=EXPANDED
3
4; RUN: llc -mtriple=armv6-apple-darwin -mcpu=cortex-a8 -mattr=-neon,+strict-align -pre-RA-sched=source %s -o - \
5; RUN:	| FileCheck %s -check-prefix=EXPANDED
6
7; RUN: llc -mtriple=armv6-apple-darwin -mcpu=cortex-a8 %s -o - \
8; RUN:	| FileCheck %s -check-prefix=UNALIGNED
9
10; rdar://7113725
11; rdar://12091029
12
13define void @t(ptr nocapture %a, ptr nocapture %b) nounwind {
14entry:
15; EXPANDED-LABEL: t:
16; EXPANDED-DAG: ldrb [[R2:r[0-9]+]]
17; EXPANDED-DAG: ldrb [[R3:r[0-9]+]]
18; EXPANDED-DAG: ldrb [[R12:r[0-9]+]]
19; EXPANDED-DAG: ldrb [[R1:r[0-9]+]]
20; EXPANDED-DAG: strb [[R1]]
21; EXPANDED-DAG: strb [[R12]]
22; EXPANDED-DAG: strb [[R3]]
23; EXPANDED-DAG: strb [[R2]]
24
25; UNALIGNED-LABEL: t:
26; UNALIGNED: ldr r1
27; UNALIGNED: str r1
28
29  %tmp.i = load i32, ptr %b, align 1           ; <i32> [#uses=1]
30  store i32 %tmp.i, ptr %a, align 1
31  ret void
32}
33
34define void @hword(ptr %a, ptr %b) nounwind {
35entry:
36; EXPANDED-LABEL: hword:
37; EXPANDED-NOT: vld1
38; EXPANDED: ldrh
39; EXPANDED-NOT: str1
40; EXPANDED: strh
41
42; UNALIGNED-LABEL: hword:
43; UNALIGNED: vld1.16
44; UNALIGNED: vst1.16
45  %tmp = load double, ptr %a, align 2
46  store double %tmp, ptr %b, align 2
47  ret void
48}
49
50define void @byte(ptr %a, ptr %b) nounwind {
51entry:
52; EXPANDED-LABEL: byte:
53; EXPANDED-NOT: vld1
54; EXPANDED: ldrb
55; EXPANDED-NOT: str1
56; EXPANDED: strb
57
58; UNALIGNED-LABEL: byte:
59; UNALIGNED: vld1.8
60; UNALIGNED: vst1.8
61  %tmp = load double, ptr %a, align 1
62  store double %tmp, ptr %b, align 1
63  ret void
64}
65
66define void @byte_word_ops(ptr %a, ptr %b) nounwind {
67entry:
68; EXPANDED-LABEL: byte_word_ops:
69; EXPANDED: ldrb
70; EXPANDED: strb
71
72; UNALIGNED-LABEL: byte_word_ops:
73; UNALIGNED-NOT: ldrb
74; UNALIGNED: ldr
75; UNALIGNED-NOT: strb
76; UNALIGNED: str
77  %tmp = load i32, ptr %a, align 1
78  store i32 %tmp, ptr %b, align 1
79  ret void
80}
81