blob: bbb5e7b7b9ddad4eb41f7053900970770b569157 [file] [log] [blame]
Ulrich Weigand9e3577f2013-05-06 16:17:29 +00001; Test that we can use NI for byte operations that are expressed as i32
2; or i64 operations.
3;
4; RUN: llc < %s -mtriple=s390x-linux-gnu | FileCheck %s
5
6; Zero extension to 32 bits, negative constant.
7define void @f1(i8 *%ptr) {
8; CHECK: f1:
9; CHECK: ni 0(%r2), 254
10; CHECK: br %r14
11 %val = load i8 *%ptr
12 %ext = zext i8 %val to i32
13 %and = and i32 %ext, -2
14 %trunc = trunc i32 %and to i8
15 store i8 %trunc, i8 *%ptr
16 ret void
17}
18
19; Zero extension to 64 bits, negative constant.
20define void @f2(i8 *%ptr) {
21; CHECK: f2:
22; CHECK: ni 0(%r2), 254
23; CHECK: br %r14
24 %val = load i8 *%ptr
25 %ext = zext i8 %val to i64
26 %and = and i64 %ext, -2
27 %trunc = trunc i64 %and to i8
28 store i8 %trunc, i8 *%ptr
29 ret void
30}
31
32; Zero extension to 32 bits, positive constant.
33define void @f3(i8 *%ptr) {
34; CHECK: f3:
35; CHECK: ni 0(%r2), 254
36; CHECK: br %r14
37 %val = load i8 *%ptr
38 %ext = zext i8 %val to i32
39 %and = and i32 %ext, 254
40 %trunc = trunc i32 %and to i8
41 store i8 %trunc, i8 *%ptr
42 ret void
43}
44
45; Zero extension to 64 bits, positive constant.
46define void @f4(i8 *%ptr) {
47; CHECK: f4:
48; CHECK: ni 0(%r2), 254
49; CHECK: br %r14
50 %val = load i8 *%ptr
51 %ext = zext i8 %val to i64
52 %and = and i64 %ext, 254
53 %trunc = trunc i64 %and to i8
54 store i8 %trunc, i8 *%ptr
55 ret void
56}
57
58; Sign extension to 32 bits, negative constant.
59define void @f5(i8 *%ptr) {
60; CHECK: f5:
61; CHECK: ni 0(%r2), 254
62; CHECK: br %r14
63 %val = load i8 *%ptr
64 %ext = sext i8 %val to i32
65 %and = and i32 %ext, -2
66 %trunc = trunc i32 %and to i8
67 store i8 %trunc, i8 *%ptr
68 ret void
69}
70
71; Sign extension to 64 bits, negative constant.
72define void @f6(i8 *%ptr) {
73; CHECK: f6:
74; CHECK: ni 0(%r2), 254
75; CHECK: br %r14
76 %val = load i8 *%ptr
77 %ext = sext i8 %val to i64
78 %and = and i64 %ext, -2
79 %trunc = trunc i64 %and to i8
80 store i8 %trunc, i8 *%ptr
81 ret void
82}
83
84; Sign extension to 32 bits, positive constant.
85define void @f7(i8 *%ptr) {
86; CHECK: f7:
87; CHECK: ni 0(%r2), 254
88; CHECK: br %r14
89 %val = load i8 *%ptr
90 %ext = sext i8 %val to i32
91 %and = and i32 %ext, 254
92 %trunc = trunc i32 %and to i8
93 store i8 %trunc, i8 *%ptr
94 ret void
95}
96
97; Sign extension to 64 bits, positive constant.
98define void @f8(i8 *%ptr) {
99; CHECK: f8:
100; CHECK: ni 0(%r2), 254
101; CHECK: br %r14
102 %val = load i8 *%ptr
103 %ext = sext i8 %val to i64
104 %and = and i64 %ext, 254
105 %trunc = trunc i64 %and to i8
106 store i8 %trunc, i8 *%ptr
107 ret void
108}