1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc < %s -mtriple=i686-- | FileCheck %s --check-prefix=X86
3; RUN: llc < %s -mtriple=x86_64-- | FileCheck %s --check-prefix=X64
4
5; Make sure none of these crash, and that the power-of-two transformations
6; trigger correctly.
7
8define i128 @test1(i128 %x) nounwind {
9; X86-LABEL: test1:
10; X86:       # %bb.0:
11; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
12; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx
13; X86-NEXT:    movl {{[0-9]+}}(%esp), %edx
14; X86-NEXT:    shrdl $2, %edx, %ecx
15; X86-NEXT:    shrl $2, %edx
16; X86-NEXT:    movl %edx, 4(%eax)
17; X86-NEXT:    movl %ecx, (%eax)
18; X86-NEXT:    movl $0, 12(%eax)
19; X86-NEXT:    movl $0, 8(%eax)
20; X86-NEXT:    retl $4
21;
22; X64-LABEL: test1:
23; X64:       # %bb.0:
24; X64-NEXT:    movq %rsi, %rax
25; X64-NEXT:    shrq $2, %rax
26; X64-NEXT:    xorl %edx, %edx
27; X64-NEXT:    retq
28  %tmp = udiv i128 %x, 73786976294838206464
29  ret i128 %tmp
30}
31
32define i128 @test2(i128 %x) nounwind {
33; X86-LABEL: test2:
34; X86:       # %bb.0:
35; X86-NEXT:    pushl %ebp
36; X86-NEXT:    movl %esp, %ebp
37; X86-NEXT:    pushl %edi
38; X86-NEXT:    pushl %esi
39; X86-NEXT:    andl $-8, %esp
40; X86-NEXT:    subl $16, %esp
41; X86-NEXT:    movl 8(%ebp), %esi
42; X86-NEXT:    movl %esp, %eax
43; X86-NEXT:    pushl $-1
44; X86-NEXT:    pushl $-4
45; X86-NEXT:    pushl $0
46; X86-NEXT:    pushl $0
47; X86-NEXT:    pushl 24(%ebp)
48; X86-NEXT:    pushl 20(%ebp)
49; X86-NEXT:    pushl 16(%ebp)
50; X86-NEXT:    pushl 12(%ebp)
51; X86-NEXT:    pushl %eax
52; X86-NEXT:    calll __udivti3
53; X86-NEXT:    addl $32, %esp
54; X86-NEXT:    movl (%esp), %eax
55; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx
56; X86-NEXT:    movl {{[0-9]+}}(%esp), %edx
57; X86-NEXT:    movl {{[0-9]+}}(%esp), %edi
58; X86-NEXT:    movl %edi, 12(%esi)
59; X86-NEXT:    movl %edx, 8(%esi)
60; X86-NEXT:    movl %ecx, 4(%esi)
61; X86-NEXT:    movl %eax, (%esi)
62; X86-NEXT:    movl %esi, %eax
63; X86-NEXT:    leal -8(%ebp), %esp
64; X86-NEXT:    popl %esi
65; X86-NEXT:    popl %edi
66; X86-NEXT:    popl %ebp
67; X86-NEXT:    retl $4
68;
69; X64-LABEL: test2:
70; X64:       # %bb.0:
71; X64-NEXT:    pushq %rax
72; X64-NEXT:    xorl %edx, %edx
73; X64-NEXT:    movq $-4, %rcx
74; X64-NEXT:    callq __udivti3
75; X64-NEXT:    popq %rcx
76; X64-NEXT:    retq
77  %tmp = udiv i128 %x, -73786976294838206464
78  ret i128 %tmp
79}
80
81define i128 @test3(i128 %x) nounwind {
82; X86-LABEL: test3:
83; X86:       # %bb.0:
84; X86-NEXT:    pushl %ebp
85; X86-NEXT:    movl %esp, %ebp
86; X86-NEXT:    pushl %edi
87; X86-NEXT:    pushl %esi
88; X86-NEXT:    andl $-8, %esp
89; X86-NEXT:    subl $16, %esp
90; X86-NEXT:    movl 8(%ebp), %esi
91; X86-NEXT:    movl %esp, %eax
92; X86-NEXT:    pushl $-1
93; X86-NEXT:    pushl $-5
94; X86-NEXT:    pushl $-1
95; X86-NEXT:    pushl $-3
96; X86-NEXT:    pushl 24(%ebp)
97; X86-NEXT:    pushl 20(%ebp)
98; X86-NEXT:    pushl 16(%ebp)
99; X86-NEXT:    pushl 12(%ebp)
100; X86-NEXT:    pushl %eax
101; X86-NEXT:    calll __udivti3
102; X86-NEXT:    addl $32, %esp
103; X86-NEXT:    movl (%esp), %eax
104; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx
105; X86-NEXT:    movl {{[0-9]+}}(%esp), %edx
106; X86-NEXT:    movl {{[0-9]+}}(%esp), %edi
107; X86-NEXT:    movl %edi, 12(%esi)
108; X86-NEXT:    movl %edx, 8(%esi)
109; X86-NEXT:    movl %ecx, 4(%esi)
110; X86-NEXT:    movl %eax, (%esi)
111; X86-NEXT:    movl %esi, %eax
112; X86-NEXT:    leal -8(%ebp), %esp
113; X86-NEXT:    popl %esi
114; X86-NEXT:    popl %edi
115; X86-NEXT:    popl %ebp
116; X86-NEXT:    retl $4
117;
118; X64-LABEL: test3:
119; X64:       # %bb.0:
120; X64-NEXT:    pushq %rax
121; X64-NEXT:    movq $-3, %rdx
122; X64-NEXT:    movq $-5, %rcx
123; X64-NEXT:    callq __udivti3
124; X64-NEXT:    popq %rcx
125; X64-NEXT:    retq
126  %tmp = udiv i128 %x, -73786976294838206467
127  ret i128 %tmp
128}
129