blob: bc1a6a32fbf92caf7021f153373a8123725d9897 [file] [log] [blame]
Jim Stichnoth5bc2b1d2014-05-22 13:38:48 -07001; This is a very early test that just checks the representation of i32
2; arithmetic instructions. No assembly tests are done.
3
4; RUN: %llvm2ice --verbose inst %s | FileCheck %s
5; RUN: %llvm2ice --verbose none %s | FileCheck --check-prefix=ERRORS %s
Karl Schimpfa667fb82014-05-19 14:56:51 -07006; RUN: %llvm2iceinsts %s | %szdiff %s | FileCheck --check-prefix=DUMP %s
7; RUN: %llvm2iceinsts --pnacl %s | %szdiff %s \
8; RUN: | FileCheck --check-prefix=DUMP %s
Jim Stichnothf7c9a142014-04-29 10:52:43 -07009
10define i32 @Add(i32 %a, i32 %b) {
11; CHECK: define i32 @Add
12entry:
13 %add = add i32 %b, %a
14; CHECK: add
15 tail call void @Use(i32 %add)
16; CHECK: call Use
17 ret i32 %add
18}
19
20declare void @Use(i32)
21
22define i32 @And(i32 %a, i32 %b) {
23; CHECK: define i32 @And
24entry:
25 %and = and i32 %b, %a
26; CHECK: and
27 tail call void @Use(i32 %and)
28; CHECK: call Use
29 ret i32 %and
30}
31
32define i32 @Or(i32 %a, i32 %b) {
33; CHECK: define i32 @Or
34entry:
35 %or = or i32 %b, %a
36; CHECK: or
37 tail call void @Use(i32 %or)
38; CHECK: call Use
39 ret i32 %or
40}
41
42define i32 @Xor(i32 %a, i32 %b) {
43; CHECK: define i32 @Xor
44entry:
45 %xor = xor i32 %b, %a
46; CHECK: xor
47 tail call void @Use(i32 %xor)
48; CHECK: call Use
49 ret i32 %xor
50}
51
52define i32 @Sub(i32 %a, i32 %b) {
53; CHECK: define i32 @Sub
54entry:
55 %sub = sub i32 %a, %b
56; CHECK: sub
57 tail call void @Use(i32 %sub)
58; CHECK: call Use
59 ret i32 %sub
60}
61
62define i32 @Mul(i32 %a, i32 %b) {
63; CHECK: define i32 @Mul
64entry:
65 %mul = mul i32 %b, %a
66; CHECK: imul
67 tail call void @Use(i32 %mul)
68; CHECK: call Use
69 ret i32 %mul
70}
71
72define i32 @Sdiv(i32 %a, i32 %b) {
73; CHECK: define i32 @Sdiv
74entry:
75 %div = sdiv i32 %a, %b
76; CHECK: cdq
77; CHECK: idiv
78 tail call void @Use(i32 %div)
79; CHECK: call Use
80 ret i32 %div
81}
82
83define i32 @Srem(i32 %a, i32 %b) {
84; CHECK: define i32 @Srem
85entry:
86 %rem = srem i32 %a, %b
87; CHECK: cdq
88; CHECK: idiv
89 tail call void @Use(i32 %rem)
90; CHECK: call Use
91 ret i32 %rem
92}
93
94define i32 @Udiv(i32 %a, i32 %b) {
95; CHECK: define i32 @Udiv
96entry:
97 %div = udiv i32 %a, %b
98; CHECK: div
99 tail call void @Use(i32 %div)
100; CHECK: call Use
101 ret i32 %div
102}
103
104define i32 @Urem(i32 %a, i32 %b) {
105; CHECK: define i32 @Urem
106entry:
107 %rem = urem i32 %a, %b
108; CHECK: div
109 tail call void @Use(i32 %rem)
110; CHECK: call Use
111 ret i32 %rem
112}
113
Jim Stichnothef8cf0e2014-08-26 22:16:29 -0700114; Check for a valid addressing mode in the x86-32 mul instruction when
115; the second source operand is an immediate.
116define i64 @MulImm() {
117entry:
118 %mul = mul i64 3, 4
119 ret i64 %mul
120}
121; CHECK-LABEL: MulImm
122; CHECK-NOT: mul {{[0-9]+}}
123
Jim Stichnothf7c9a142014-04-29 10:52:43 -0700124; ERRORS-NOT: ICE translation error
125; DUMP-NOT: SZ