1*9e3577ffSUlrich Weigand; Test insertions of 16-bit constants into an i64.
2*9e3577ffSUlrich Weigand;
3*9e3577ffSUlrich Weigand; RUN: llc < %s -mtriple=s390x-linux-gnu | FileCheck %s
4*9e3577ffSUlrich Weigand
5*9e3577ffSUlrich Weigand; Check the lowest useful IILL value.  (We use NILL rather than IILL
6*9e3577ffSUlrich Weigand; to clear 16 bits.)
7*9e3577ffSUlrich Weiganddefine i64 @f1(i64 %a) {
8*9e3577ffSUlrich Weigand; CHECK: f1:
9*9e3577ffSUlrich Weigand; CHECK-NOT: ni
10*9e3577ffSUlrich Weigand; CHECK: iill %r2, 1
11*9e3577ffSUlrich Weigand; CHECK: br %r14
12*9e3577ffSUlrich Weigand  %and = and i64 %a, 18446744073709486080
13*9e3577ffSUlrich Weigand  %or = or i64 %and, 1
14*9e3577ffSUlrich Weigand  ret i64 %or
15*9e3577ffSUlrich Weigand}
16*9e3577ffSUlrich Weigand
17*9e3577ffSUlrich Weigand; Check a middle value.
18*9e3577ffSUlrich Weiganddefine i64 @f2(i64 %a) {
19*9e3577ffSUlrich Weigand; CHECK: f2:
20*9e3577ffSUlrich Weigand; CHECK-NOT: ni
21*9e3577ffSUlrich Weigand; CHECK: iill %r2, 32769
22*9e3577ffSUlrich Weigand; CHECK: br %r14
23*9e3577ffSUlrich Weigand  %and = and i64 %a, -65536
24*9e3577ffSUlrich Weigand  %or = or i64 %and, 32769
25*9e3577ffSUlrich Weigand  ret i64 %or
26*9e3577ffSUlrich Weigand}
27*9e3577ffSUlrich Weigand
28*9e3577ffSUlrich Weigand; Check the highest useful IILL value.  (We use OILL rather than IILL
29*9e3577ffSUlrich Weigand; to set 16 bits.)
30*9e3577ffSUlrich Weiganddefine i64 @f3(i64 %a) {
31*9e3577ffSUlrich Weigand; CHECK: f3:
32*9e3577ffSUlrich Weigand; CHECK-NOT: ni
33*9e3577ffSUlrich Weigand; CHECK: iill %r2, 65534
34*9e3577ffSUlrich Weigand; CHECK: br %r14
35*9e3577ffSUlrich Weigand  %and = and i64 %a, 18446744073709486080
36*9e3577ffSUlrich Weigand  %or = or i64 %and, 65534
37*9e3577ffSUlrich Weigand  ret i64 %or
38*9e3577ffSUlrich Weigand}
39*9e3577ffSUlrich Weigand
40*9e3577ffSUlrich Weigand; Check the lowest useful IILH value.
41*9e3577ffSUlrich Weiganddefine i64 @f4(i64 %a) {
42*9e3577ffSUlrich Weigand; CHECK: f4:
43*9e3577ffSUlrich Weigand; CHECK-NOT: ni
44*9e3577ffSUlrich Weigand; CHECK: iilh %r2, 1
45*9e3577ffSUlrich Weigand; CHECK: br %r14
46*9e3577ffSUlrich Weigand  %and = and i64 %a, 18446744069414649855
47*9e3577ffSUlrich Weigand  %or = or i64 %and, 65536
48*9e3577ffSUlrich Weigand  ret i64 %or
49*9e3577ffSUlrich Weigand}
50*9e3577ffSUlrich Weigand
51*9e3577ffSUlrich Weigand; Check a middle value.
52*9e3577ffSUlrich Weiganddefine i64 @f5(i64 %a) {
53*9e3577ffSUlrich Weigand; CHECK: f5:
54*9e3577ffSUlrich Weigand; CHECK-NOT: ni
55*9e3577ffSUlrich Weigand; CHECK: iilh %r2, 32767
56*9e3577ffSUlrich Weigand; CHECK: br %r14
57*9e3577ffSUlrich Weigand  %and = and i64 %a, -4294901761
58*9e3577ffSUlrich Weigand  %or = or i64 %and, 2147418112
59*9e3577ffSUlrich Weigand  ret i64 %or
60*9e3577ffSUlrich Weigand}
61*9e3577ffSUlrich Weigand
62*9e3577ffSUlrich Weigand; Check the highest useful IILH value.
63*9e3577ffSUlrich Weiganddefine i64 @f6(i64 %a) {
64*9e3577ffSUlrich Weigand; CHECK: f6:
65*9e3577ffSUlrich Weigand; CHECK-NOT: ni
66*9e3577ffSUlrich Weigand; CHECK: iilh %r2, 65534
67*9e3577ffSUlrich Weigand; CHECK: br %r14
68*9e3577ffSUlrich Weigand  %and = and i64 %a, 18446744069414649855
69*9e3577ffSUlrich Weigand  %or = or i64 %and, 4294836224
70*9e3577ffSUlrich Weigand  ret i64 %or
71*9e3577ffSUlrich Weigand}
72*9e3577ffSUlrich Weigand
73*9e3577ffSUlrich Weigand; Check the lowest useful IIHL value.
74*9e3577ffSUlrich Weiganddefine i64 @f7(i64 %a) {
75*9e3577ffSUlrich Weigand; CHECK: f7:
76*9e3577ffSUlrich Weigand; CHECK-NOT: ni
77*9e3577ffSUlrich Weigand; CHECK: iihl %r2, 1
78*9e3577ffSUlrich Weigand; CHECK: br %r14
79*9e3577ffSUlrich Weigand  %and = and i64 %a, 18446462603027808255
80*9e3577ffSUlrich Weigand  %or = or i64 %and, 4294967296
81*9e3577ffSUlrich Weigand  ret i64 %or
82*9e3577ffSUlrich Weigand}
83*9e3577ffSUlrich Weigand
84*9e3577ffSUlrich Weigand; Check a middle value.
85*9e3577ffSUlrich Weiganddefine i64 @f8(i64 %a) {
86*9e3577ffSUlrich Weigand; CHECK: f8:
87*9e3577ffSUlrich Weigand; CHECK-NOT: ni
88*9e3577ffSUlrich Weigand; CHECK: iihl %r2, 32767
89*9e3577ffSUlrich Weigand; CHECK: br %r14
90*9e3577ffSUlrich Weigand  %and = and i64 %a, -281470681743361
91*9e3577ffSUlrich Weigand  %or = or i64 %and, 140733193388032
92*9e3577ffSUlrich Weigand  ret i64 %or
93*9e3577ffSUlrich Weigand}
94*9e3577ffSUlrich Weigand
95*9e3577ffSUlrich Weigand; Check the highest useful IIHL value.
96*9e3577ffSUlrich Weiganddefine i64 @f9(i64 %a) {
97*9e3577ffSUlrich Weigand; CHECK: f9:
98*9e3577ffSUlrich Weigand; CHECK-NOT: ni
99*9e3577ffSUlrich Weigand; CHECK: iihl %r2, 65534
100*9e3577ffSUlrich Weigand; CHECK: br %r14
101*9e3577ffSUlrich Weigand  %and = and i64 %a, 18446462603027808255
102*9e3577ffSUlrich Weigand  %or = or i64 %and, 281466386776064
103*9e3577ffSUlrich Weigand  ret i64 %or
104*9e3577ffSUlrich Weigand}
105*9e3577ffSUlrich Weigand
106*9e3577ffSUlrich Weigand; Check the lowest useful IIHH value.
107*9e3577ffSUlrich Weiganddefine i64 @f10(i64 %a) {
108*9e3577ffSUlrich Weigand; CHECK: f10:
109*9e3577ffSUlrich Weigand; CHECK-NOT: ni
110*9e3577ffSUlrich Weigand; CHECK: iihh %r2, 1
111*9e3577ffSUlrich Weigand; CHECK: br %r14
112*9e3577ffSUlrich Weigand  %and = and i64 %a, 281474976710655
113*9e3577ffSUlrich Weigand  %or = or i64 %and, 281474976710656
114*9e3577ffSUlrich Weigand  ret i64 %or
115*9e3577ffSUlrich Weigand}
116*9e3577ffSUlrich Weigand
117*9e3577ffSUlrich Weigand; Check a middle value.
118*9e3577ffSUlrich Weiganddefine i64 @f11(i64 %a) {
119*9e3577ffSUlrich Weigand; CHECK: f11:
120*9e3577ffSUlrich Weigand; CHECK-NOT: ni
121*9e3577ffSUlrich Weigand; CHECK: iihh %r2, 32767
122*9e3577ffSUlrich Weigand; CHECK: br %r14
123*9e3577ffSUlrich Weigand  %and = and i64 %a, 281474976710655
124*9e3577ffSUlrich Weigand  %or = or i64 %and, 9223090561878065152
125*9e3577ffSUlrich Weigand  ret i64 %or
126*9e3577ffSUlrich Weigand}
127*9e3577ffSUlrich Weigand
128*9e3577ffSUlrich Weigand; Check the highest useful IIHH value.
129*9e3577ffSUlrich Weiganddefine i64 @f12(i64 %a) {
130*9e3577ffSUlrich Weigand; CHECK: f12:
131*9e3577ffSUlrich Weigand; CHECK-NOT: ni
132*9e3577ffSUlrich Weigand; CHECK: iihh %r2, 65534
133*9e3577ffSUlrich Weigand; CHECK: br %r14
134*9e3577ffSUlrich Weigand  %and = and i64 %a, 281474976710655
135*9e3577ffSUlrich Weigand  %or = or i64 %and, 18446181123756130304
136*9e3577ffSUlrich Weigand  ret i64 %or
137*9e3577ffSUlrich Weigand}
138