xref: /llvm-project/llvm/test/CodeGen/SystemZ/fshl.ll (revision bba0c0df028e9f71a478a0c37b0fcf0068f87cfa)
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc < %s -mtriple=s390x-linux-gnu | FileCheck %s
3
4declare i8 @llvm.fshl.i8(i8, i8, i8)
5declare i16 @llvm.fshl.i16(i16, i16, i16)
6declare i32 @llvm.fshl.i32(i32, i32, i32)
7declare i64 @llvm.fshl.i64(i64, i64, i64)
8declare i128 @llvm.fshl.i128(i128, i128, i128)
9
10;
11; Variable Funnel Shift
12;
13
14define i8 @var_shift_i8(i8 %x, i8 %y, i8 %z) {
15; CHECK-LABEL: var_shift_i8:
16; CHECK:       # %bb.0:
17; CHECK-NEXT:    # kill: def $r3l killed $r3l def $r3d
18; CHECK-NEXT:    # kill: def $r2l killed $r2l def $r2d
19; CHECK-NEXT:    sll %r2, 8
20; CHECK-NEXT:    rosbg %r2, %r3, 56, 63, 0
21; CHECK-NEXT:    nill %r4, 7
22; CHECK-NEXT:    sll %r2, 0(%r4)
23; CHECK-NEXT:    srl %r2, 8
24; CHECK-NEXT:    # kill: def $r2l killed $r2l killed $r2d
25; CHECK-NEXT:    br %r14
26  %tmp = tail call i8 @llvm.fshl.i8(i8 %x, i8 %y, i8 %z)
27  ret i8 %tmp
28}
29
30define i16 @var_shift_i16(i16 %x, i16 %y, i16 %z) {
31; CHECK-LABEL: var_shift_i16:
32; CHECK:       # %bb.0:
33; CHECK-NEXT:    # kill: def $r3l killed $r3l def $r3d
34; CHECK-NEXT:    # kill: def $r2l killed $r2l def $r2d
35; CHECK-NEXT:    sll %r2, 16
36; CHECK-NEXT:    rosbg %r2, %r3, 48, 63, 0
37; CHECK-NEXT:    nill %r4, 15
38; CHECK-NEXT:    sll %r2, 0(%r4)
39; CHECK-NEXT:    srl %r2, 16
40; CHECK-NEXT:    # kill: def $r2l killed $r2l killed $r2d
41; CHECK-NEXT:    br %r14
42  %tmp = tail call i16 @llvm.fshl.i16(i16 %x, i16 %y, i16 %z)
43  ret i16 %tmp
44}
45
46define i32 @var_shift_i32(i32 %x, i32 %y, i32 %z) {
47; CHECK-LABEL: var_shift_i32:
48; CHECK:       # %bb.0:
49; CHECK-NEXT:    lr %r1, %r4
50; CHECK-NEXT:    nill %r1, 31
51; CHECK-NEXT:    sll %r2, 0(%r1)
52; CHECK-NEXT:    srl %r3, 1
53; CHECK-NEXT:    xilf %r4, 4294967295
54; CHECK-NEXT:    nill %r4, 31
55; CHECK-NEXT:    srl %r3, 0(%r4)
56; CHECK-NEXT:    or %r2, %r3
57; CHECK-NEXT:    br %r14
58  %tmp = tail call i32 @llvm.fshl.i32(i32 %x, i32 %y, i32 %z)
59  ret i32 %tmp
60}
61
62define i64 @var_shift_i64(i64 %x, i64 %y, i64 %z) {
63; CHECK-LABEL: var_shift_i64:
64; CHECK:       # %bb.0:
65; CHECK-NEXT:    sllg %r0, %r2, 0(%r4)
66; CHECK-NEXT:    srlg %r1, %r3, 1
67; CHECK-NEXT:    xilf %r4, 4294967295
68; CHECK-NEXT:    srlg %r2, %r1, 0(%r4)
69; CHECK-NEXT:    ogr %r2, %r0
70; CHECK-NEXT:    br %r14
71  %tmp = tail call i64 @llvm.fshl.i64(i64 %x, i64 %y, i64 %z)
72  ret i64 %tmp
73}
74
75define i128 @var_shift_i128(i128 %x, i128 %y, i128 %z) {
76; CHECK-LABEL: var_shift_i128:
77; CHECK:       # %bb.0:
78; CHECK-NEXT:    stmg %r13, %r15, 104(%r15)
79; CHECK-NEXT:    .cfi_offset %r13, -56
80; CHECK-NEXT:    .cfi_offset %r14, -48
81; CHECK-NEXT:    .cfi_offset %r15, -40
82; CHECK-NEXT:    lg %r1, 8(%r5)
83; CHECK-NEXT:    lg %r0, 0(%r4)
84; CHECK-NEXT:    lg %r14, 8(%r3)
85; CHECK-NEXT:    tmll %r1, 64
86; CHECK-NEXT:    lgr %r13, %r0
87; CHECK-NEXT:    jne .LBB4_2
88; CHECK-NEXT:  # %bb.1:
89; CHECK-NEXT:    lgr %r13, %r14
90; CHECK-NEXT:  .LBB4_2:
91; CHECK-NEXT:    sllg %r5, %r13, 0(%r1)
92; CHECK-NEXT:    je .LBB4_4
93; CHECK-NEXT:  # %bb.3:
94; CHECK-NEXT:    lg %r0, 8(%r4)
95; CHECK-NEXT:    j .LBB4_5
96; CHECK-NEXT:  .LBB4_4:
97; CHECK-NEXT:    lg %r14, 0(%r3)
98; CHECK-NEXT:  .LBB4_5:
99; CHECK-NEXT:    sllg %r3, %r14, 0(%r1)
100; CHECK-NEXT:    srlg %r4, %r13, 1
101; CHECK-NEXT:    xilf %r1, 4294967295
102; CHECK-NEXT:    srlg %r4, %r4, 0(%r1)
103; CHECK-NEXT:    ogr %r4, %r3
104; CHECK-NEXT:    srlg %r0, %r0, 1
105; CHECK-NEXT:    srlg %r0, %r0, 0(%r1)
106; CHECK-NEXT:    ogr %r5, %r0
107; CHECK-NEXT:    stg %r5, 8(%r2)
108; CHECK-NEXT:    stg %r4, 0(%r2)
109; CHECK-NEXT:    lmg %r13, %r15, 104(%r15)
110; CHECK-NEXT:    br %r14
111  %tmp = tail call i128 @llvm.fshl.i128(i128 %x, i128 %y, i128 %z)
112  ret i128 %tmp
113}
114
115;
116; Const Funnel Shift
117;
118
119define i8 @const_shift_i8(i8 %x, i8 %y) {
120; CHECK-LABEL: const_shift_i8:
121; CHECK:       # %bb.0:
122; CHECK-NEXT:    # kill: def $r3l killed $r3l def $r3d
123; CHECK-NEXT:    # kill: def $r2l killed $r2l def $r2d
124; CHECK-NEXT:    sll %r2, 7
125; CHECK-NEXT:    rosbg %r2, %r3, 57, 63, 63
126; CHECK-NEXT:    # kill: def $r2l killed $r2l killed $r2d
127; CHECK-NEXT:    br %r14
128  %tmp = tail call i8 @llvm.fshl.i8(i8 %x, i8 %y, i8 7)
129  ret i8 %tmp
130}
131
132define i16 @const_shift_i16(i16 %x, i16 %y) {
133; CHECK-LABEL: const_shift_i16:
134; CHECK:       # %bb.0:
135; CHECK-NEXT:    # kill: def $r3l killed $r3l def $r3d
136; CHECK-NEXT:    # kill: def $r2l killed $r2l def $r2d
137; CHECK-NEXT:    sll %r2, 7
138; CHECK-NEXT:    rosbg %r2, %r3, 57, 63, 55
139; CHECK-NEXT:    # kill: def $r2l killed $r2l killed $r2d
140; CHECK-NEXT:    br %r14
141  %tmp = tail call i16 @llvm.fshl.i16(i16 %x, i16 %y, i16 7)
142  ret i16 %tmp
143}
144
145define i32 @const_shift_i32(i32 %x, i32 %y) {
146; CHECK-LABEL: const_shift_i32:
147; CHECK:       # %bb.0:
148; CHECK-NEXT:    # kill: def $r3l killed $r3l def $r3d
149; CHECK-NEXT:    # kill: def $r2l killed $r2l def $r2d
150; CHECK-NEXT:    sll %r2, 7
151; CHECK-NEXT:    rosbg %r2, %r3, 57, 63, 39
152; CHECK-NEXT:    # kill: def $r2l killed $r2l killed $r2d
153; CHECK-NEXT:    br %r14
154  %tmp = tail call i32 @llvm.fshl.i32(i32 %x, i32 %y, i32 7)
155  ret i32 %tmp
156}
157
158define i64 @const_shift_i64(i64 %x, i64 %y) {
159; CHECK-LABEL: const_shift_i64:
160; CHECK:       # %bb.0:
161; CHECK-NEXT:    sllg %r2, %r2, 7
162; CHECK-NEXT:    rosbg %r2, %r3, 57, 63, 7
163; CHECK-NEXT:    br %r14
164  %tmp = tail call i64 @llvm.fshl.i64(i64 %x, i64 %y, i64 7)
165  ret i64 %tmp
166}
167