06721e70e5802dc044063114574d948cd5de57a4
[oota-llvm.git] / test / CodeGen / AArch64 / arm64-ldr-merge.ll
1 ; RUN: llc < %s -mtriple aarch64--none-eabi -mcpu=cortex-a57 -verify-machineinstrs | FileCheck %s --check-prefix=CHECK --check-prefix=LE
2 ; RUN: llc < %s -mtriple aarch64_be--none-eabi -mcpu=cortex-a57 -verify-machineinstrs | FileCheck %s --check-prefix=CHECK --check-prefix=BE
3
4 ; CHECK-LABEL: Ldrh_merge
5 ; CHECK-NOT: ldrh
6 ; CHECK: ldr [[NEW_DEST:w[0-9]+]]
7 ; CHECK-DAG: and [[LO_PART:w[0-9]+]], [[NEW_DEST]], #0xffff
8 ; CHECK-DAG: lsr [[HI_PART:w[0-9]+]], [[NEW_DEST]], #16
9 ; LE: sub {{w[0-9]+}}, [[LO_PART]], [[HI_PART]]
10 ; BE: sub {{w[0-9]+}}, [[HI_PART]], [[LO_PART]]
11 define i16 @Ldrh_merge(i16* nocapture readonly %p) {
12   %1 = load i16, i16* %p, align 2
13   %arrayidx2 = getelementptr inbounds i16, i16* %p, i64 1
14   %2 = load i16, i16* %arrayidx2, align 2
15   %add = sub nuw nsw i16 %1, %2
16   ret i16 %add
17 }
18
19 ; CHECK-LABEL: Ldurh_merge
20 ; CHECK-NOT: ldurh
21 ; CHECK: ldur [[NEW_DEST:w[0-9]+]]
22 ; CHECK-DAG: and [[LO_PART:w[0-9]+]], [[NEW_DEST]], #0xffff
23 ; CHECK-DAG: lsr  [[HI_PART:w[0-9]+]], [[NEW_DEST]]
24 ; LE: sub {{w[0-9]+}}, [[LO_PART]], [[HI_PART]]
25 ; BE: sub {{w[0-9]+}}, [[HI_PART]], [[LO_PART]]
26 define i16 @Ldurh_merge(i16* nocapture readonly %p)  {
27 entry:
28   %arrayidx = getelementptr inbounds i16, i16* %p, i64 -2
29   %0 = load i16, i16* %arrayidx
30   %arrayidx3 = getelementptr inbounds i16, i16* %p, i64 -1
31   %1 = load i16, i16* %arrayidx3
32   %add = sub nuw nsw i16 %0, %1
33   ret i16 %add
34 }
35
36 ; CHECK-LABEL: Ldrh_4_merge
37 ; CHECK-NOT: ldrh
38 ; CHECK: ldp [[WORD1:w[0-9]+]], [[WORD2:w[0-9]+]], [x0]
39 ; CHECK-DAG: and [[WORD1LO:w[0-9]+]], [[WORD1]], #0xffff
40 ; CHECK-DAG: lsr [[WORD1HI:w[0-9]+]], [[WORD1]], #16
41 ; CHECK-DAG: and [[WORD2LO:w[0-9]+]], [[WORD2]], #0xffff
42 ; CHECK-DAG: lsr [[WORD2HI:w[0-9]+]], [[WORD2]], #16
43 ; LE-DAG: sub [[TEMP1:w[0-9]+]], [[WORD1HI]], [[WORD1LO]]
44 ; BE-DAG: sub [[TEMP1:w[0-9]+]], [[WORD1LO]], [[WORD1HI]]
45 ; LE: udiv [[TEMP2:w[0-9]+]], [[TEMP1]], [[WORD2LO]]
46 ; BE: udiv [[TEMP2:w[0-9]+]], [[TEMP1]], [[WORD2HI]]
47 ; LE: sub w0, [[TEMP2]], [[WORD2HI]]
48 ; BE: sub w0, [[TEMP2]], [[WORD2LO]]
49 define i16 @Ldrh_4_merge(i16* nocapture readonly %P) {
50   %arrayidx = getelementptr inbounds i16, i16* %P, i64 0
51   %l0 = load i16, i16* %arrayidx
52   %arrayidx2 = getelementptr inbounds i16, i16* %P, i64 1
53   %l1 = load i16, i16* %arrayidx2
54   %arrayidx7 = getelementptr inbounds i16, i16* %P, i64 2
55   %l2 = load i16, i16* %arrayidx7
56   %arrayidx12 = getelementptr inbounds i16, i16* %P, i64 3
57   %l3 = load i16, i16* %arrayidx12
58   %add4 = sub nuw nsw i16 %l1, %l0
59   %add9 = udiv i16 %add4, %l2
60   %add14 = sub nuw nsw i16 %add9, %l3
61   ret i16 %add14
62 }