]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - test/CodeGen/X86/bypass-slow-division-tune.ll
Vendor import of llvm release_40 branch r292009:
[FreeBSD/FreeBSD.git] / test / CodeGen / X86 / bypass-slow-division-tune.ll
1 ; Check that a division is bypassed when appropriate only.
2 ; RUN: llc -mtriple=x86_64-unknown-linux-gnu -mcpu=atom       < %s | FileCheck -check-prefixes=ATOM,CHECK %s
3 ; RUN: llc -mtriple=x86_64-unknown-linux-gnu -mcpu=silvermont < %s | FileCheck -check-prefixes=REST,CHECK %s
4 ; RUN: llc -mtriple=x86_64-unknown-linux-gnu -mcpu=skylake    < %s | FileCheck -check-prefixes=REST,CHECK %s
5
6 ; Verify that div32 is bypassed only for Atoms.
7 define i32 @div32(i32 %a, i32 %b) {
8 entry:
9 ; ATOM-LABEL: div32:
10 ; ATOM: orl   %{{.*}}, [[REG:%[a-z]+]]
11 ; ATOM: testl $-256, [[REG]]
12 ; ATOM: divb
13 ;
14 ; REST-LABEL: div32:
15 ; REST-NOT: divb
16 ;
17   %div = sdiv i32 %a, %b
18   ret i32 %div
19 }
20
21 ; Verify that div64 is always bypassed.
22 define i64 @div64(i64 %a, i64 %b) {
23 entry:
24 ; CHECK-LABEL: div64:
25 ; CHECK:     orq     %{{.*}}, [[REG:%[a-z]+]]
26 ; CHECK:     shrq    $32, [[REG]]
27 ; CHECK:     divl
28 ;
29   %div = sdiv i64 %a, %b
30   ret i64 %div
31 }
32
33
34 ; Verify that no extra code is generated when optimizing for size.
35
36 define i64 @div64_optsize(i64 %a, i64 %b) optsize {
37 ; CHECK-LABEL: div64_optsize:
38 ; CHECK-NOT: divl
39   %div = sdiv i64 %a, %b
40   ret i64 %div
41 }
42
43 define i32 @div32_optsize(i32 %a, i32 %b) optsize {
44 ; CHECK-LABEL: div32_optsize:
45 ; CHECK-NOT: divb
46   %div = sdiv i32 %a, %b
47   ret i32 %div
48 }
49
50 define i32 @div32_minsize(i32 %a, i32 %b) minsize {
51 ; CHECK-LABEL: div32_minsize:
52 ; CHECK-NOT: divb
53   %div = sdiv i32 %a, %b
54   ret i32 %div
55 }