blob: 9cee91f7b3c6326942792ada58ea50cf07b26bae [file] [log] [blame]
Ulrich Weiganda65ccc12023-12-15 12:55:15 +01001; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 2
2; Test 128-bit division and remainder in vector registers on z13 using libcalls
3;
4; RUN: llc < %s -mtriple=s390x-linux-gnu -mcpu=z13 | FileCheck %s
5
6; Divide signed.
7define i128 @f1(i128 %a, i128 %b) {
8; CHECK-LABEL: f1:
9; CHECK: # %bb.0:
10; CHECK-NEXT: stmg %r13, %r15, 104(%r15)
11; CHECK-NEXT: .cfi_offset %r13, -56
12; CHECK-NEXT: .cfi_offset %r14, -48
13; CHECK-NEXT: .cfi_offset %r15, -40
14; CHECK-NEXT: aghi %r15, -208
15; CHECK-NEXT: .cfi_def_cfa_offset 368
16; CHECK-NEXT: vl %v0, 0(%r3), 3
17; CHECK-NEXT: vl %v1, 0(%r4), 3
18; CHECK-NEXT: lgr %r13, %r2
19; CHECK-NEXT: la %r2, 192(%r15)
20; CHECK-NEXT: la %r3, 176(%r15)
21; CHECK-NEXT: la %r4, 160(%r15)
22; CHECK-NEXT: vst %v1, 160(%r15), 3
23; CHECK-NEXT: vst %v0, 176(%r15), 3
24; CHECK-NEXT: brasl %r14, __divti3@PLT
25; CHECK-NEXT: vl %v0, 192(%r15), 3
26; CHECK-NEXT: vst %v0, 0(%r13), 3
27; CHECK-NEXT: lmg %r13, %r15, 312(%r15)
28; CHECK-NEXT: br %r14
29 %res = sdiv i128 %a, %b
30 ret i128 %res
31}
32
33; Divide unsigned.
34define i128 @f2(i128 %a, i128 %b) {
35; CHECK-LABEL: f2:
36; CHECK: # %bb.0:
37; CHECK-NEXT: stmg %r13, %r15, 104(%r15)
38; CHECK-NEXT: .cfi_offset %r13, -56
39; CHECK-NEXT: .cfi_offset %r14, -48
40; CHECK-NEXT: .cfi_offset %r15, -40
41; CHECK-NEXT: aghi %r15, -208
42; CHECK-NEXT: .cfi_def_cfa_offset 368
43; CHECK-NEXT: vl %v0, 0(%r3), 3
44; CHECK-NEXT: vl %v1, 0(%r4), 3
45; CHECK-NEXT: lgr %r13, %r2
46; CHECK-NEXT: la %r2, 192(%r15)
47; CHECK-NEXT: la %r3, 176(%r15)
48; CHECK-NEXT: la %r4, 160(%r15)
49; CHECK-NEXT: vst %v1, 160(%r15), 3
50; CHECK-NEXT: vst %v0, 176(%r15), 3
51; CHECK-NEXT: brasl %r14, __udivti3@PLT
52; CHECK-NEXT: vl %v0, 192(%r15), 3
53; CHECK-NEXT: vst %v0, 0(%r13), 3
54; CHECK-NEXT: lmg %r13, %r15, 312(%r15)
55; CHECK-NEXT: br %r14
56 %res = udiv i128 %a, %b
57 ret i128 %res
58}
59
60; Remainder signed.
61define i128 @f3(i128 %a, i128 %b) {
62; CHECK-LABEL: f3:
63; CHECK: # %bb.0:
64; CHECK-NEXT: stmg %r13, %r15, 104(%r15)
65; CHECK-NEXT: .cfi_offset %r13, -56
66; CHECK-NEXT: .cfi_offset %r14, -48
67; CHECK-NEXT: .cfi_offset %r15, -40
68; CHECK-NEXT: aghi %r15, -208
69; CHECK-NEXT: .cfi_def_cfa_offset 368
70; CHECK-NEXT: vl %v0, 0(%r3), 3
71; CHECK-NEXT: vl %v1, 0(%r4), 3
72; CHECK-NEXT: lgr %r13, %r2
73; CHECK-NEXT: la %r2, 192(%r15)
74; CHECK-NEXT: la %r3, 176(%r15)
75; CHECK-NEXT: la %r4, 160(%r15)
76; CHECK-NEXT: vst %v1, 160(%r15), 3
77; CHECK-NEXT: vst %v0, 176(%r15), 3
78; CHECK-NEXT: brasl %r14, __modti3@PLT
79; CHECK-NEXT: vl %v0, 192(%r15), 3
80; CHECK-NEXT: vst %v0, 0(%r13), 3
81; CHECK-NEXT: lmg %r13, %r15, 312(%r15)
82; CHECK-NEXT: br %r14
83 %res = srem i128 %a, %b
84 ret i128 %res
85}
86
87; Remainder unsigned.
88define i128 @f4(i128 %a, i128 %b) {
89; CHECK-LABEL: f4:
90; CHECK: # %bb.0:
91; CHECK-NEXT: stmg %r13, %r15, 104(%r15)
92; CHECK-NEXT: .cfi_offset %r13, -56
93; CHECK-NEXT: .cfi_offset %r14, -48
94; CHECK-NEXT: .cfi_offset %r15, -40
95; CHECK-NEXT: aghi %r15, -208
96; CHECK-NEXT: .cfi_def_cfa_offset 368
97; CHECK-NEXT: vl %v0, 0(%r3), 3
98; CHECK-NEXT: vl %v1, 0(%r4), 3
99; CHECK-NEXT: lgr %r13, %r2
100; CHECK-NEXT: la %r2, 192(%r15)
101; CHECK-NEXT: la %r3, 176(%r15)
102; CHECK-NEXT: la %r4, 160(%r15)
103; CHECK-NEXT: vst %v1, 160(%r15), 3
104; CHECK-NEXT: vst %v0, 176(%r15), 3
105; CHECK-NEXT: brasl %r14, __umodti3@PLT
106; CHECK-NEXT: vl %v0, 192(%r15), 3
107; CHECK-NEXT: vst %v0, 0(%r13), 3
108; CHECK-NEXT: lmg %r13, %r15, 312(%r15)
109; CHECK-NEXT: br %r14
110 %res = urem i128 %a, %b
111 ret i128 %res
112}