blob: b38797e2d9dda3e45fe40e6abb55c1bfeb60a84f [file] [log] [blame]
Ahmed Bougacha12eb5582014-11-03 20:26:35 +00001; RUN: llc -march=x86-64 < %s | FileCheck %s --check-prefix=CHECK --check-prefix=CHECK-64
2; RUN: llc -march=x86 < %s | FileCheck %s --check-prefix=CHECK --check-prefix=CHECK-32
3target datalayout = "e-m:o-i64:64-f80:128-n8:16:32:64-S128"
4target triple = "x86_64-apple-macosx10.10.0"
5
6define zeroext i8 @test_udivrem_zext_ah(i8 %x, i8 %y) {
7; CHECK-LABEL: test_udivrem_zext_ah
8; CHECK: divb
Hans Wennborg23cdc642016-02-18 18:17:05 +00009; CHECK: movzbl %ah, [[REG_REM:%[a-z0-9]+]]
Ahmed Bougacha12eb5582014-11-03 20:26:35 +000010; CHECK: movb %al, ([[REG_ZPTR:%[a-z0-9]+]])
Hans Wennborg23cdc642016-02-18 18:17:05 +000011; CHECK: movl [[REG_REM]], %eax
Ahmed Bougacha12eb5582014-11-03 20:26:35 +000012; CHECK: ret
13 %div = udiv i8 %x, %y
14 store i8 %div, i8* @z
15 %1 = urem i8 %x, %y
16 ret i8 %1
17}
18
19define zeroext i8 @test_urem_zext_ah(i8 %x, i8 %y) {
20; CHECK-LABEL: test_urem_zext_ah
21; CHECK: divb
22; CHECK: movzbl %ah, %eax
23; CHECK: ret
24 %1 = urem i8 %x, %y
25 ret i8 %1
26}
27
28define i8 @test_urem_noext_ah(i8 %x, i8 %y) {
29; CHECK-LABEL: test_urem_noext_ah
30; CHECK: divb [[REG_X:%[a-z0-9]+]]
31; CHECK: movzbl %ah, %eax
32; CHECK: addb [[REG_X]], %al
33; CHECK: ret
34 %1 = urem i8 %x, %y
35 %2 = add i8 %1, %y
36 ret i8 %2
37}
38
39define i64 @test_urem_zext64_ah(i8 %x, i8 %y) {
40; CHECK-LABEL: test_urem_zext64_ah
41; CHECK: divb
42; CHECK: movzbl %ah, %eax
43; CHECK-32: xorl %edx, %edx
44; CHECK: ret
45 %1 = urem i8 %x, %y
46 %2 = zext i8 %1 to i64
47 ret i64 %2
48}
49
50define signext i8 @test_sdivrem_sext_ah(i8 %x, i8 %y) {
51; CHECK-LABEL: test_sdivrem_sext_ah
52; CHECK: cbtw
53; CHECK: idivb
Hans Wennborg23cdc642016-02-18 18:17:05 +000054; CHECK: movsbl %ah, [[REG_REM:%[a-z0-9]+]]
Ahmed Bougacha12eb5582014-11-03 20:26:35 +000055; CHECK: movb %al, ([[REG_ZPTR]])
Hans Wennborg23cdc642016-02-18 18:17:05 +000056; CHECK: movl [[REG_REM]], %eax
Ahmed Bougacha12eb5582014-11-03 20:26:35 +000057; CHECK: ret
58 %div = sdiv i8 %x, %y
59 store i8 %div, i8* @z
60 %1 = srem i8 %x, %y
61 ret i8 %1
62}
63
64define signext i8 @test_srem_sext_ah(i8 %x, i8 %y) {
65; CHECK-LABEL: test_srem_sext_ah
66; CHECK: cbtw
67; CHECK: idivb
68; CHECK: movsbl %ah, %eax
69; CHECK: ret
70 %1 = srem i8 %x, %y
71 ret i8 %1
72}
73
74define i8 @test_srem_noext_ah(i8 %x, i8 %y) {
75; CHECK-LABEL: test_srem_noext_ah
76; CHECK: cbtw
77; CHECK: idivb [[REG_X:%[a-z0-9]+]]
78; CHECK: movsbl %ah, %eax
79; CHECK: addb [[REG_X]], %al
80; CHECK: ret
81 %1 = srem i8 %x, %y
82 %2 = add i8 %1, %y
83 ret i8 %2
84}
85
86define i64 @test_srem_sext64_ah(i8 %x, i8 %y) {
87; CHECK-LABEL: test_srem_sext64_ah
88; CHECK: cbtw
89; CHECK: idivb
90; CHECK: movsbl %ah, %eax
91; CHECK-32: movl %eax, %edx
92; CHECK-32: sarl $31, %edx
93; CHECK-64: movsbq %al, %rax
94; CHECK: ret
95 %1 = srem i8 %x, %y
96 %2 = sext i8 %1 to i64
97 ret i64 %2
98}
99
Artyom Skrobov51f2d112016-01-06 09:41:10 +0000100define i64 @pr25754(i8 %a, i8 %c) {
101; CHECK-LABEL: pr25754
102; CHECK: movzbl {{.+}}, %eax
103; CHECK: divb
104; CHECK: movzbl %ah, %ecx
105; CHECK: movzbl %al, %eax
106; CHECK-32: addl %ecx, %eax
107; CHECK-32: sbbl %edx, %edx
108; CHECK-32: andl $1, %edx
109; CHECK-64: addq %rcx, %rax
110; CHECK: ret
111 %r1 = urem i8 %a, %c
112 %d1 = udiv i8 %a, %c
113 %r2 = zext i8 %r1 to i64
114 %d2 = zext i8 %d1 to i64
115 %ret = add i64 %r2, %d2
116 ret i64 %ret
117}
118
Ahmed Bougacha12eb5582014-11-03 20:26:35 +0000119@z = external global i8