b77fb675a4ab4032d09fca597978021dbd405b0e
[oota-llvm.git] / test / CodeGen / Mips / divrem.ll
1 ; RUN: llc -march=mips -mcpu=mips32 -verify-machineinstrs < %s | FileCheck %s -check-prefix=ALL -check-prefix=ACC -check-prefix=TRAP
2 ; RUN: llc -march=mips -mcpu=mips32 -mno-check-zero-division < %s | FileCheck %s -check-prefix=ALL -check-prefix=ACC -check-prefix=NOCHECK
3
4 ; FileCheck Prefixes:
5 ;   ALL - All targets
6 ;   ACC - Accumulator based multiply/divide. I.e. All ISA's before MIPS32r6
7 ;   TRAP - Division must be explicitly checked for divide by zero
8 ;   NOCHECK - Division by zero will not be detected
9
10 @g0 = common global i32 0, align 4
11 @g1 = common global i32 0, align 4
12
13 define i32 @sdiv1(i32 %a0, i32 %a1) nounwind readnone {
14 entry:
15 ; ALL-LABEL: sdiv1:
16
17 ; ACC:           div $zero, $4, $5
18
19 ; TRAP:          teq $5, $zero, 7
20 ; NOCHECK-NOT:   teq
21
22 ; ACC:           mflo $2
23
24 ; ALL: .end sdiv1
25
26   %div = sdiv i32 %a0, %a1
27   ret i32 %div
28 }
29
30 define i32 @srem1(i32 %a0, i32 %a1) nounwind readnone {
31 entry:
32 ; ALL-LABEL: srem1:
33
34 ; ACC:           div $zero, $4, $5
35
36 ; TRAP:          teq $5, $zero, 7
37 ; NOCHECK-NOT:   teq
38
39 ; ACC:           mfhi $2
40
41 ; ALL: .end srem1
42
43   %rem = srem i32 %a0, %a1
44   ret i32 %rem
45 }
46
47 define i32 @udiv1(i32 %a0, i32 %a1) nounwind readnone {
48 entry:
49 ; ALL-LABEL: udiv1:
50
51 ; ACC:           divu $zero, $4, $5
52
53 ; TRAP:          teq $5, $zero, 7
54 ; NOCHECK-NOT:   teq
55
56 ; ACC:           mflo $2
57
58 ; ALL: .end udiv1
59   %div = udiv i32 %a0, %a1
60   ret i32 %div
61 }
62
63 define i32 @urem1(i32 %a0, i32 %a1) nounwind readnone {
64 entry:
65 ; ALL-LABEL: urem1:
66
67 ; ACC:           divu $zero, $4, $5
68
69 ; TRAP:          teq $5, $zero, 7
70 ; NOCHECK-NOT:   teq
71
72 ; ACC:           mfhi $2
73
74 ; ALL: .end urem1
75
76   %rem = urem i32 %a0, %a1
77   ret i32 %rem
78 }
79
80 define i32 @sdivrem1(i32 %a0, i32 %a1, i32* nocapture %r) nounwind {
81 entry:
82 ; ALL-LABEL: sdivrem1:
83
84 ; ACC:           div $zero, $4, $5
85 ; TRAP:          teq $5, $zero, 7
86 ; NOCHECK-NOT:   teq
87 ; ACC:           mflo $2
88 ; ACC:           mfhi $[[R0:[0-9]+]]
89 ; ACC:           sw $[[R0]], 0(${{[0-9]+}})
90
91 ; ALL: .end sdivrem1
92
93   %rem = srem i32 %a0, %a1
94   store i32 %rem, i32* %r, align 4
95   %div = sdiv i32 %a0, %a1
96   ret i32 %div
97 }
98
99 define i32 @udivrem1(i32 %a0, i32 %a1, i32* nocapture %r) nounwind {
100 entry:
101 ; ALL-LABEL: udivrem1:
102
103 ; ACC:           divu $zero, $4, $5
104 ; TRAP:          teq $5, $zero, 7
105 ; NOCHECK-NOT:   teq
106 ; ACC:           mflo $2
107 ; ACC:           mfhi $[[R0:[0-9]+]]
108 ; ACC:           sw $[[R0]], 0(${{[0-9]+}})
109
110 ; ALL: .end udivrem1
111
112   %rem = urem i32 %a0, %a1
113   store i32 %rem, i32* %r, align 4
114   %div = udiv i32 %a0, %a1
115   ret i32 %div
116 }
117
118 ; FIXME: It's not clear what this is supposed to test.
119 define i32 @killFlags() {
120 entry:
121   %0 = load i32* @g0, align 4
122   %1 = load i32* @g1, align 4
123   %div = sdiv i32 %0, %1
124   ret i32 %div
125 }