[WebAssembly] Fix import statement
[oota-llvm.git] / test / CodeGen / SystemZ / addr-02.ll
1 ; addr-01.ll in which the address is also used in a non-address context.
2 ; The assumption here is that we should match complex addresses where
3 ; possible, but this might well need to change in future.
4 ;
5 ; RUN: llc < %s -mtriple=s390x-linux-gnu | FileCheck %s
6
7 ; A simple index address.
8 define void @f1(i64 %addr, i64 %index, i8 **%dst) {
9 ; CHECK-LABEL: f1:
10 ; CHECK: lb %r0, 0(%r3,%r2)
11 ; CHECK: br %r14
12   %add = add i64 %addr, %index
13   %ptr = inttoptr i64 %add to i8 *
14   %a = load volatile i8 , i8 *%ptr
15   store volatile i8 *%ptr, i8 **%dst
16   ret void
17 }
18
19 ; An address with an index and a displacement (order 1).
20 define void @f2(i64 %addr, i64 %index, i8 **%dst) {
21 ; CHECK-LABEL: f2:
22 ; CHECK: lb %r0, 100(%r3,%r2)
23 ; CHECK: br %r14
24   %add1 = add i64 %addr, %index
25   %add2 = add i64 %add1, 100
26   %ptr = inttoptr i64 %add2 to i8 *
27   %a = load volatile i8 , i8 *%ptr
28   store volatile i8 *%ptr, i8 **%dst
29   ret void
30 }
31
32 ; An address with an index and a displacement (order 2).
33 define void @f3(i64 %addr, i64 %index, i8 **%dst) {
34 ; CHECK-LABEL: f3:
35 ; CHECK: lb %r0, 100(%r3,%r2)
36 ; CHECK: br %r14
37   %add1 = add i64 %addr, 100
38   %add2 = add i64 %add1, %index
39   %ptr = inttoptr i64 %add2 to i8 *
40   %a = load volatile i8 , i8 *%ptr
41   store volatile i8 *%ptr, i8 **%dst
42   ret void
43 }
44
45 ; An address with an index and a subtracted displacement (order 1).
46 define void @f4(i64 %addr, i64 %index, i8 **%dst) {
47 ; CHECK-LABEL: f4:
48 ; CHECK: lb %r0, -100(%r3,%r2)
49 ; CHECK: br %r14
50   %add1 = add i64 %addr, %index
51   %add2 = sub i64 %add1, 100
52   %ptr = inttoptr i64 %add2 to i8 *
53   %a = load volatile i8 , i8 *%ptr
54   store volatile i8 *%ptr, i8 **%dst
55   ret void
56 }
57
58 ; An address with an index and a subtracted displacement (order 2).
59 define void @f5(i64 %addr, i64 %index, i8 **%dst) {
60 ; CHECK-LABEL: f5:
61 ; CHECK: lb %r0, -100(%r3,%r2)
62 ; CHECK: br %r14
63   %add1 = sub i64 %addr, 100
64   %add2 = add i64 %add1, %index
65   %ptr = inttoptr i64 %add2 to i8 *
66   %a = load volatile i8 , i8 *%ptr
67   store volatile i8 *%ptr, i8 **%dst
68   ret void
69 }
70
71 ; An address with an index and a displacement added using OR.
72 define void @f6(i64 %addr, i64 %index, i8 **%dst) {
73 ; CHECK-LABEL: f6:
74 ; CHECK: nill %r2, 65528
75 ; CHECK: lb %r0, 6(%r3,%r2)
76 ; CHECK: br %r14
77   %aligned = and i64 %addr, -8
78   %or = or i64 %aligned, 6
79   %add = add i64 %or, %index
80   %ptr = inttoptr i64 %add to i8 *
81   %a = load volatile i8 , i8 *%ptr
82   store volatile i8 *%ptr, i8 **%dst
83   ret void
84 }
85
86 ; Like f6, but without the masking.  This OR doesn't count as a displacement.
87 define void @f7(i64 %addr, i64 %index, i8 **%dst) {
88 ; CHECK-LABEL: f7:
89 ; CHECK: oill %r2, 6
90 ; CHECK: lb %r0, 0(%r3,%r2)
91 ; CHECK: br %r14
92   %or = or i64 %addr, 6
93   %add = add i64 %or, %index
94   %ptr = inttoptr i64 %add to i8 *
95   %a = load volatile i8 , i8 *%ptr
96   store volatile i8 *%ptr, i8 **%dst
97   ret void
98 }
99
100 ; Like f6, but with the OR applied after the index.  We don't know anything
101 ; about the alignment of %add here.
102 define void @f8(i64 %addr, i64 %index, i8 **%dst) {
103 ; CHECK-LABEL: f8:
104 ; CHECK: nill %r2, 65528
105 ; CHECK: agr %r2, %r3
106 ; CHECK: oill %r2, 6
107 ; CHECK: lb %r0, 0(%r2)
108 ; CHECK: br %r14
109   %aligned = and i64 %addr, -8
110   %add = add i64 %aligned, %index
111   %or = or i64 %add, 6
112   %ptr = inttoptr i64 %or to i8 *
113   %a = load volatile i8 , i8 *%ptr
114   store volatile i8 *%ptr, i8 **%dst
115   ret void
116 }