blob: 7ce0777b88700917ccb9f4c0c9cb70d6283e8e23 [file] [log] [blame]
Ulrich Weigand9e3577f2013-05-06 16:17:29 +00001; Test 32-bit floating-point addition.
2;
3; RUN: llc < %s -mtriple=s390x-linux-gnu | FileCheck %s
4
5; Check register addition.
6define float @f1(float %f1, float %f2) {
7; CHECK: f1:
8; CHECK: aebr %f0, %f2
9; CHECK: br %r14
10 %res = fadd float %f1, %f2
11 ret float %res
12}
13
14; Check the low end of the AEB range.
15define float @f2(float %f1, float *%ptr) {
16; CHECK: f2:
17; CHECK: aeb %f0, 0(%r2)
18; CHECK: br %r14
19 %f2 = load float *%ptr
20 %res = fadd float %f1, %f2
21 ret float %res
22}
23
24; Check the high end of the aligned AEB range.
25define float @f3(float %f1, float *%base) {
26; CHECK: f3:
27; CHECK: aeb %f0, 4092(%r2)
28; CHECK: br %r14
29 %ptr = getelementptr float *%base, i64 1023
30 %f2 = load float *%ptr
31 %res = fadd float %f1, %f2
32 ret float %res
33}
34
35; Check the next word up, which needs separate address logic.
36; Other sequences besides this one would be OK.
37define float @f4(float %f1, float *%base) {
38; CHECK: f4:
39; CHECK: aghi %r2, 4096
40; CHECK: aeb %f0, 0(%r2)
41; CHECK: br %r14
42 %ptr = getelementptr float *%base, i64 1024
43 %f2 = load float *%ptr
44 %res = fadd float %f1, %f2
45 ret float %res
46}
47
48; Check negative displacements, which also need separate address logic.
49define float @f5(float %f1, float *%base) {
50; CHECK: f5:
51; CHECK: aghi %r2, -4
52; CHECK: aeb %f0, 0(%r2)
53; CHECK: br %r14
54 %ptr = getelementptr float *%base, i64 -1
55 %f2 = load float *%ptr
56 %res = fadd float %f1, %f2
57 ret float %res
58}
59
60; Check that AEB allows indices.
61define float @f6(float %f1, float *%base, i64 %index) {
62; CHECK: f6:
63; CHECK: sllg %r1, %r3, 2
64; CHECK: aeb %f0, 400(%r1,%r2)
65; CHECK: br %r14
66 %ptr1 = getelementptr float *%base, i64 %index
67 %ptr2 = getelementptr float *%ptr1, i64 100
68 %f2 = load float *%ptr2
69 %res = fadd float %f1, %f2
70 ret float %res
71}