xref: /llvm-project/llvm/test/CodeGen/X86/isel-urem.ll (revision 10edabbcf331fdd53d27c5195de1b692a0063721)
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc < %s -global-isel=0                    -mtriple=x86_64-linux-gnu | FileCheck %s --check-prefixes=X64,SDAG-X64
3; RUN: llc < %s -fast-isel -fast-isel-abort=1     -mtriple=x86_64-linux-gnu | FileCheck %s --check-prefixes=X64,FAST-X64
4; RUN: llc < %s -global-isel -global-isel-abort=1 -mtriple=x86_64-linux-gnu | FileCheck %s --check-prefixes=X64,GISEL-X64
5; RUN: llc < %s -global-isel=0                    -mtriple=i686-linux-gnu | FileCheck %s --check-prefixes=X86,DAG-X86,SDAG-X86
6; RUN: llc < %s -fast-isel -fast-isel-abort=1     -mtriple=i686-linux-gnu | FileCheck %s --check-prefixes=X86,DAG-X86,FAST-X86
7; RUN: llc < %s -global-isel -global-isel-abort=1 -mtriple=i686-linux-gnu | FileCheck %s --check-prefixes=X86,GISEL-X86
8
9define i8 @test_urem_i8(i8 %arg1, i8 %arg2) nounwind {
10; SDAG-X64-LABEL: test_urem_i8:
11; SDAG-X64:       # %bb.0:
12; SDAG-X64-NEXT:    movzbl %dil, %eax
13; SDAG-X64-NEXT:    divb %sil
14; SDAG-X64-NEXT:    movzbl %ah, %eax
15; SDAG-X64-NEXT:    # kill: def $al killed $al killed $eax
16; SDAG-X64-NEXT:    retq
17;
18; FAST-X64-LABEL: test_urem_i8:
19; FAST-X64:       # %bb.0:
20; FAST-X64-NEXT:    movzbl %dil, %eax
21; FAST-X64-NEXT:    divb %sil
22; FAST-X64-NEXT:    shrw $8, %ax
23; FAST-X64-NEXT:    # kill: def $al killed $al killed $ax
24; FAST-X64-NEXT:    retq
25;
26; GISEL-X64-LABEL: test_urem_i8:
27; GISEL-X64:       # %bb.0:
28; GISEL-X64-NEXT:    movzbl %dil, %eax
29; GISEL-X64-NEXT:    divb %sil
30; GISEL-X64-NEXT:    shrw $8, %ax
31; GISEL-X64-NEXT:    # kill: def $al killed $al killed $ax
32; GISEL-X64-NEXT:    retq
33;
34; SDAG-X86-LABEL: test_urem_i8:
35; SDAG-X86:       # %bb.0:
36; SDAG-X86-NEXT:    movzbl {{[0-9]+}}(%esp), %eax
37; SDAG-X86-NEXT:    divb {{[0-9]+}}(%esp)
38; SDAG-X86-NEXT:    movzbl %ah, %eax
39; SDAG-X86-NEXT:    # kill: def $al killed $al killed $eax
40; SDAG-X86-NEXT:    retl
41;
42; FAST-X86-LABEL: test_urem_i8:
43; FAST-X86:       # %bb.0:
44; FAST-X86-NEXT:    movzbl {{[0-9]+}}(%esp), %eax
45; FAST-X86-NEXT:    divb {{[0-9]+}}(%esp)
46; FAST-X86-NEXT:    movb %ah, %al
47; FAST-X86-NEXT:    retl
48;
49; GISEL-X86-LABEL: test_urem_i8:
50; GISEL-X86:       # %bb.0:
51; GISEL-X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
52; GISEL-X86-NEXT:    movzbl %al, %eax
53; GISEL-X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx
54; GISEL-X86-NEXT:    divb %cl
55; GISEL-X86-NEXT:    movb %ah, %al
56; GISEL-X86-NEXT:    retl
57  %ret = urem i8 %arg1, %arg2
58  ret i8 %ret
59}
60
61define i16 @test_urem_i16(i16 %arg1, i16 %arg2) nounwind {
62; X64-LABEL: test_urem_i16:
63; X64:       # %bb.0:
64; X64-NEXT:    movl %edi, %eax
65; X64-NEXT:    # kill: def $ax killed $ax killed $eax
66; X64-NEXT:    xorl %edx, %edx
67; X64-NEXT:    divw %si
68; X64-NEXT:    movl %edx, %eax
69; X64-NEXT:    retq
70;
71; DAG-X86-LABEL: test_urem_i16:
72; DAG-X86:       # %bb.0:
73; DAG-X86-NEXT:    movzwl {{[0-9]+}}(%esp), %eax
74; DAG-X86-NEXT:    xorl %edx, %edx
75; DAG-X86-NEXT:    divw {{[0-9]+}}(%esp)
76; DAG-X86-NEXT:    movl %edx, %eax
77; DAG-X86-NEXT:    retl
78;
79; GISEL-X86-LABEL: test_urem_i16:
80; GISEL-X86:       # %bb.0:
81; GISEL-X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
82; GISEL-X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx
83; GISEL-X86-NEXT:    # kill: def $ax killed $ax killed $eax
84; GISEL-X86-NEXT:    xorl %edx, %edx
85; GISEL-X86-NEXT:    divw %cx
86; GISEL-X86-NEXT:    movl %edx, %eax
87; GISEL-X86-NEXT:    retl
88  %ret = urem i16 %arg1, %arg2
89  ret i16 %ret
90}
91
92define i32 @test_urem_i32(i32 %arg1, i32 %arg2) nounwind {
93; X64-LABEL: test_urem_i32:
94; X64:       # %bb.0:
95; X64-NEXT:    movl %edi, %eax
96; X64-NEXT:    xorl %edx, %edx
97; X64-NEXT:    divl %esi
98; X64-NEXT:    movl %edx, %eax
99; X64-NEXT:    retq
100;
101; X86-LABEL: test_urem_i32:
102; X86:       # %bb.0:
103; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
104; X86-NEXT:    xorl %edx, %edx
105; X86-NEXT:    divl {{[0-9]+}}(%esp)
106; X86-NEXT:    movl %edx, %eax
107; X86-NEXT:    retl
108  %ret = urem i32 %arg1, %arg2
109  ret i32 %ret
110}
111
112define i64 @test_urem_i64(i64 %arg1, i64 %arg2) nounwind {
113; X64-LABEL: test_urem_i64:
114; X64:       # %bb.0:
115; X64-NEXT:    movq %rdi, %rax
116; X64-NEXT:    xorl %edx, %edx
117; X64-NEXT:    divq %rsi
118; X64-NEXT:    movq %rdx, %rax
119; X64-NEXT:    retq
120;
121; DAG-X86-LABEL: test_urem_i64:
122; DAG-X86:       # %bb.0:
123; DAG-X86-NEXT:    subl $12, %esp
124; DAG-X86-NEXT:    pushl {{[0-9]+}}(%esp)
125; DAG-X86-NEXT:    pushl {{[0-9]+}}(%esp)
126; DAG-X86-NEXT:    pushl {{[0-9]+}}(%esp)
127; DAG-X86-NEXT:    pushl {{[0-9]+}}(%esp)
128; DAG-X86-NEXT:    calll __umoddi3
129; DAG-X86-NEXT:    addl $28, %esp
130; DAG-X86-NEXT:    retl
131;
132; GISEL-X86-LABEL: test_urem_i64:
133; GISEL-X86:       # %bb.0:
134; GISEL-X86-NEXT:    pushl %esi
135; GISEL-X86-NEXT:    subl $24, %esp
136; GISEL-X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
137; GISEL-X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx
138; GISEL-X86-NEXT:    movl {{[0-9]+}}(%esp), %edx
139; GISEL-X86-NEXT:    movl {{[0-9]+}}(%esp), %esi
140; GISEL-X86-NEXT:    movl %eax, (%esp)
141; GISEL-X86-NEXT:    movl %ecx, {{[0-9]+}}(%esp)
142; GISEL-X86-NEXT:    movl %edx, {{[0-9]+}}(%esp)
143; GISEL-X86-NEXT:    movl %esi, {{[0-9]+}}(%esp)
144; GISEL-X86-NEXT:    calll __umoddi3
145; GISEL-X86-NEXT:    addl $24, %esp
146; GISEL-X86-NEXT:    popl %esi
147; GISEL-X86-NEXT:    retl
148  %ret = urem i64 %arg1, %arg2
149  ret i64 %ret
150}
151