~pali/+junk/llvm-toolchain-3.7

« back to all changes in this revision

Viewing changes to test/CodeGen/SystemZ/memset-01.ll

  • Committer: Package Import Robot
  • Author(s): Sylvestre Ledru
  • Date: 2015-07-15 17:51:08 UTC
  • Revision ID: package-import@ubuntu.com-20150715175108-l8mynwovkx4zx697
Tags: upstream-3.7~+rc2
ImportĀ upstreamĀ versionĀ 3.7~+rc2

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
; Test memset in cases where the set value is variable.
 
2
;
 
3
; RUN: llc < %s -mtriple=s390x-linux-gnu | FileCheck %s
 
4
 
 
5
declare void @llvm.memset.p0i8.i32(i8 *nocapture, i8, i32, i32, i1) nounwind
 
6
declare void @llvm.memset.p0i8.i64(i8 *nocapture, i8, i64, i32, i1) nounwind
 
7
 
 
8
; No bytes, i32 version.
 
9
define void @f1(i8 *%dest, i8 %val) {
 
10
; CHECK-LABEL: f1:
 
11
; CHECK-NOT: %r2
 
12
; CHECK-NOT: %r3
 
13
; CHECK: br %r14
 
14
  call void @llvm.memset.p0i8.i32(i8 *%dest, i8 %val, i32 0, i32 1, i1 false)
 
15
  ret void
 
16
}
 
17
 
 
18
; No bytes, i64 version.
 
19
define void @f2(i8 *%dest, i8 %val) {
 
20
; CHECK-LABEL: f2:
 
21
; CHECK-NOT: %r2
 
22
; CHECK-NOT: %r3
 
23
; CHECK: br %r14
 
24
  call void @llvm.memset.p0i8.i64(i8 *%dest, i8 %val, i64 0, i32 1, i1 false)
 
25
  ret void
 
26
}
 
27
 
 
28
; 1 byte, i32 version.
 
29
define void @f3(i8 *%dest, i8 %val) {
 
30
; CHECK-LABEL: f3:
 
31
; CHECK: stc %r3, 0(%r2)
 
32
; CHECK: br %r14
 
33
  call void @llvm.memset.p0i8.i32(i8 *%dest, i8 %val, i32 1, i32 1, i1 false)
 
34
  ret void
 
35
}
 
36
 
 
37
; 1 byte, i64 version.
 
38
define void @f4(i8 *%dest, i8 %val) {
 
39
; CHECK-LABEL: f4:
 
40
; CHECK: stc %r3, 0(%r2)
 
41
; CHECK: br %r14
 
42
  call void @llvm.memset.p0i8.i64(i8 *%dest, i8 %val, i64 1, i32 1, i1 false)
 
43
  ret void
 
44
}
 
45
 
 
46
; 2 bytes, i32 version.
 
47
define void @f5(i8 *%dest, i8 %val) {
 
48
; CHECK-LABEL: f5:
 
49
; CHECK-DAG: stc %r3, 0(%r2)
 
50
; CHECK-DAG: stc %r3, 1(%r2)
 
51
; CHECK: br %r14
 
52
  call void @llvm.memset.p0i8.i32(i8 *%dest, i8 %val, i32 2, i32 1, i1 false)
 
53
  ret void
 
54
}
 
55
 
 
56
; 2 bytes, i64 version.
 
57
define void @f6(i8 *%dest, i8 %val) {
 
58
; CHECK-LABEL: f6:
 
59
; CHECK-DAG: stc %r3, 0(%r2)
 
60
; CHECK-DAG: stc %r3, 1(%r2)
 
61
; CHECK: br %r14
 
62
  call void @llvm.memset.p0i8.i64(i8 *%dest, i8 %val, i64 2, i32 1, i1 false)
 
63
  ret void
 
64
}
 
65
 
 
66
; 3 bytes, i32 version.
 
67
define void @f7(i8 *%dest, i8 %val) {
 
68
; CHECK-LABEL: f7:
 
69
; CHECK: stc %r3, 0(%r2)
 
70
; CHECK: mvc 1(2,%r2), 0(%r2)
 
71
; CHECK: br %r14
 
72
  call void @llvm.memset.p0i8.i32(i8 *%dest, i8 %val, i32 3, i32 1, i1 false)
 
73
  ret void
 
74
}
 
75
 
 
76
; 3 bytes, i64 version.
 
77
define void @f8(i8 *%dest, i8 %val) {
 
78
; CHECK-LABEL: f8:
 
79
; CHECK: stc %r3, 0(%r2)
 
80
; CHECK: mvc 1(2,%r2), 0(%r2)
 
81
; CHECK: br %r14
 
82
  call void @llvm.memset.p0i8.i64(i8 *%dest, i8 %val, i64 3, i32 1, i1 false)
 
83
  ret void
 
84
}
 
85
 
 
86
; 257 bytes, i32 version.
 
87
define void @f9(i8 *%dest, i8 %val) {
 
88
; CHECK-LABEL: f9:
 
89
; CHECK: stc %r3, 0(%r2)
 
90
; CHECK: mvc 1(256,%r2), 0(%r2)
 
91
; CHECK: br %r14
 
92
  call void @llvm.memset.p0i8.i32(i8 *%dest, i8 %val, i32 257, i32 1, i1 false)
 
93
  ret void
 
94
}
 
95
 
 
96
; 257 bytes, i64 version.
 
97
define void @f10(i8 *%dest, i8 %val) {
 
98
; CHECK-LABEL: f10:
 
99
; CHECK: stc %r3, 0(%r2)
 
100
; CHECK: mvc 1(256,%r2), 0(%r2)
 
101
; CHECK: br %r14
 
102
  call void @llvm.memset.p0i8.i64(i8 *%dest, i8 %val, i64 257, i32 1, i1 false)
 
103
  ret void
 
104
}
 
105
 
 
106
; 258 bytes, i32 version.  We need two MVCs.
 
107
define void @f11(i8 *%dest, i8 %val) {
 
108
; CHECK-LABEL: f11:
 
109
; CHECK: stc %r3, 0(%r2)
 
110
; CHECK: mvc 1(256,%r2), 0(%r2)
 
111
; CHECK: mvc 257(1,%r2), 256(%r2)
 
112
; CHECK: br %r14
 
113
  call void @llvm.memset.p0i8.i32(i8 *%dest, i8 %val, i32 258, i32 1, i1 false)
 
114
  ret void
 
115
}
 
116
 
 
117
; 258 bytes, i64 version.
 
118
define void @f12(i8 *%dest, i8 %val) {
 
119
; CHECK-LABEL: f12:
 
120
; CHECK: stc %r3, 0(%r2)
 
121
; CHECK: mvc 1(256,%r2), 0(%r2)
 
122
; CHECK: mvc 257(1,%r2), 256(%r2)
 
123
; CHECK: br %r14
 
124
  call void @llvm.memset.p0i8.i64(i8 *%dest, i8 %val, i64 258, i32 1, i1 false)
 
125
  ret void
 
126
}
 
127
 
 
128
; Test the largest case for which straight-line code is used.
 
129
define void @f13(i8 *%dest, i8 %val) {
 
130
; CHECK-LABEL: f13:
 
131
; CHECK: stc %r3, 0(%r2)
 
132
; CHECK: mvc 1(256,%r2), 0(%r2)
 
133
; CHECK: mvc 257(256,%r2), 256(%r2)
 
134
; CHECK: mvc 513(256,%r2), 512(%r2)
 
135
; CHECK: mvc 769(256,%r2), 768(%r2)
 
136
; CHECK: mvc 1025(256,%r2), 1024(%r2)
 
137
; CHECK: mvc 1281(256,%r2), 1280(%r2)
 
138
; CHECK: br %r14
 
139
  call void @llvm.memset.p0i8.i64(i8 *%dest, i8 %val, i64 1537, i32 1,
 
140
                                  i1 false)
 
141
  ret void
 
142
}
 
143
 
 
144
; Test the next size up, which uses a loop.  We leave the other corner
 
145
; cases to memcpy-01.ll.
 
146
define void @f14(i8 *%dest, i8 %val) {
 
147
; CHECK-LABEL: f14:
 
148
; CHECK: stc %r3, 0(%r2)
 
149
; CHECK: lghi [[COUNT:%r[0-5]]], 6
 
150
; CHECK: [[LABEL:\.L[^:]*]]:
 
151
; CHECK: pfd 2, 769(%r2)
 
152
; CHECK: mvc 1(256,%r2), 0(%r2)
 
153
; CHECK: la %r2, 256(%r2)
 
154
; CHECK: brctg [[COUNT]], [[LABEL]]
 
155
; CHECK: mvc 1(1,%r2), 0(%r2)
 
156
; CHECK: br %r14
 
157
  call void @llvm.memset.p0i8.i64(i8 *%dest, i8 %val, i64 1538, i32 1,
 
158
                                  i1 false)
 
159
  ret void
 
160
}