xref: /aosp_15_r20/external/llvm/test/CodeGen/X86/atom-bypass-slow-division.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mcpu=atom -mtriple=i686-linux | FileCheck %s
2*9880d681SAndroid Build Coastguard Worker
3*9880d681SAndroid Build Coastguard Workerdefine i32 @Test_get_quotient(i32 %a, i32 %b) nounwind {
4*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: Test_get_quotient:
5*9880d681SAndroid Build Coastguard Worker; CHECK: orl %ecx, %edx
6*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: testl $-256, %edx
7*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: je
8*9880d681SAndroid Build Coastguard Worker; CHECK: idivl
9*9880d681SAndroid Build Coastguard Worker; CHECK: ret
10*9880d681SAndroid Build Coastguard Worker; CHECK: divb
11*9880d681SAndroid Build Coastguard Worker; CHECK: ret
12*9880d681SAndroid Build Coastguard Worker  %result = sdiv i32 %a, %b
13*9880d681SAndroid Build Coastguard Worker  ret i32 %result
14*9880d681SAndroid Build Coastguard Worker}
15*9880d681SAndroid Build Coastguard Worker
16*9880d681SAndroid Build Coastguard Workerdefine i32 @Test_get_remainder(i32 %a, i32 %b) nounwind {
17*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: Test_get_remainder:
18*9880d681SAndroid Build Coastguard Worker; CHECK: orl %ecx, %edx
19*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: testl $-256, %edx
20*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: je
21*9880d681SAndroid Build Coastguard Worker; CHECK: idivl
22*9880d681SAndroid Build Coastguard Worker; CHECK: ret
23*9880d681SAndroid Build Coastguard Worker; CHECK: divb
24*9880d681SAndroid Build Coastguard Worker; CHECK: ret
25*9880d681SAndroid Build Coastguard Worker  %result = srem i32 %a, %b
26*9880d681SAndroid Build Coastguard Worker  ret i32 %result
27*9880d681SAndroid Build Coastguard Worker}
28*9880d681SAndroid Build Coastguard Worker
29*9880d681SAndroid Build Coastguard Workerdefine i32 @Test_get_quotient_and_remainder(i32 %a, i32 %b) nounwind {
30*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: Test_get_quotient_and_remainder:
31*9880d681SAndroid Build Coastguard Worker; CHECK: orl %ecx, %edx
32*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: testl $-256, %edx
33*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: je
34*9880d681SAndroid Build Coastguard Worker; CHECK: idivl
35*9880d681SAndroid Build Coastguard Worker; CHECK: divb
36*9880d681SAndroid Build Coastguard Worker; CHECK: addl
37*9880d681SAndroid Build Coastguard Worker; CHECK: ret
38*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: idivl
39*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: divb
40*9880d681SAndroid Build Coastguard Worker  %resultdiv = sdiv i32 %a, %b
41*9880d681SAndroid Build Coastguard Worker  %resultrem = srem i32 %a, %b
42*9880d681SAndroid Build Coastguard Worker  %result = add i32 %resultdiv, %resultrem
43*9880d681SAndroid Build Coastguard Worker  ret i32 %result
44*9880d681SAndroid Build Coastguard Worker}
45*9880d681SAndroid Build Coastguard Worker
46*9880d681SAndroid Build Coastguard Workerdefine i32 @Test_use_div_and_idiv(i32 %a, i32 %b) nounwind {
47*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: Test_use_div_and_idiv:
48*9880d681SAndroid Build Coastguard Worker; CHECK: idivl
49*9880d681SAndroid Build Coastguard Worker; CHECK: divb
50*9880d681SAndroid Build Coastguard Worker; CHECK: divl
51*9880d681SAndroid Build Coastguard Worker; CHECK: divb
52*9880d681SAndroid Build Coastguard Worker; CHECK: addl
53*9880d681SAndroid Build Coastguard Worker; CHECK: ret
54*9880d681SAndroid Build Coastguard Worker  %resultidiv = sdiv i32 %a, %b
55*9880d681SAndroid Build Coastguard Worker  %resultdiv = udiv i32 %a, %b
56*9880d681SAndroid Build Coastguard Worker  %result = add i32 %resultidiv, %resultdiv
57*9880d681SAndroid Build Coastguard Worker  ret i32 %result
58*9880d681SAndroid Build Coastguard Worker}
59*9880d681SAndroid Build Coastguard Worker
60*9880d681SAndroid Build Coastguard Workerdefine i32 @Test_use_div_imm_imm() nounwind {
61*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: Test_use_div_imm_imm:
62*9880d681SAndroid Build Coastguard Worker; CHECK: movl $64
63*9880d681SAndroid Build Coastguard Worker  %resultdiv = sdiv i32 256, 4
64*9880d681SAndroid Build Coastguard Worker  ret i32 %resultdiv
65*9880d681SAndroid Build Coastguard Worker}
66*9880d681SAndroid Build Coastguard Worker
67*9880d681SAndroid Build Coastguard Workerdefine i32 @Test_use_div_reg_imm(i32 %a) nounwind {
68*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: Test_use_div_reg_imm:
69*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: test
70*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: idiv
71*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: divb
72*9880d681SAndroid Build Coastguard Worker  %resultdiv = sdiv i32 %a, 33
73*9880d681SAndroid Build Coastguard Worker  ret i32 %resultdiv
74*9880d681SAndroid Build Coastguard Worker}
75*9880d681SAndroid Build Coastguard Worker
76*9880d681SAndroid Build Coastguard Workerdefine i32 @Test_use_rem_reg_imm(i32 %a) nounwind {
77*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: Test_use_rem_reg_imm:
78*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: test
79*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: idiv
80*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: divb
81*9880d681SAndroid Build Coastguard Worker  %resultrem = srem i32 %a, 33
82*9880d681SAndroid Build Coastguard Worker  ret i32 %resultrem
83*9880d681SAndroid Build Coastguard Worker}
84*9880d681SAndroid Build Coastguard Worker
85*9880d681SAndroid Build Coastguard Workerdefine i32 @Test_use_divrem_reg_imm(i32 %a) nounwind {
86*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: Test_use_divrem_reg_imm:
87*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: test
88*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: idiv
89*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: divb
90*9880d681SAndroid Build Coastguard Worker  %resultdiv = sdiv i32 %a, 33
91*9880d681SAndroid Build Coastguard Worker  %resultrem = srem i32 %a, 33
92*9880d681SAndroid Build Coastguard Worker  %result = add i32 %resultdiv, %resultrem
93*9880d681SAndroid Build Coastguard Worker  ret i32 %result
94*9880d681SAndroid Build Coastguard Worker}
95*9880d681SAndroid Build Coastguard Worker
96*9880d681SAndroid Build Coastguard Workerdefine i32 @Test_use_div_imm_reg(i32 %a) nounwind {
97*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: Test_use_div_imm_reg:
98*9880d681SAndroid Build Coastguard Worker; CHECK: test
99*9880d681SAndroid Build Coastguard Worker; CHECK: idiv
100*9880d681SAndroid Build Coastguard Worker; CHECK: divb
101*9880d681SAndroid Build Coastguard Worker  %resultdiv = sdiv i32 4, %a
102*9880d681SAndroid Build Coastguard Worker  ret i32 %resultdiv
103*9880d681SAndroid Build Coastguard Worker}
104*9880d681SAndroid Build Coastguard Worker
105*9880d681SAndroid Build Coastguard Workerdefine i32 @Test_use_rem_imm_reg(i32 %a) nounwind {
106*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: Test_use_rem_imm_reg:
107*9880d681SAndroid Build Coastguard Worker; CHECK: test
108*9880d681SAndroid Build Coastguard Worker; CHECK: idiv
109*9880d681SAndroid Build Coastguard Worker; CHECK: divb
110*9880d681SAndroid Build Coastguard Worker  %resultdiv = sdiv i32 4, %a
111*9880d681SAndroid Build Coastguard Worker  ret i32 %resultdiv
112*9880d681SAndroid Build Coastguard Worker}
113