blob: e0cb0db52b1953ab1e6d7f4036e8b01728b9ff80 [file] [log] [blame]
; This is a very early test that just checks the representation of i32
; arithmetic instructions. No assembly tests are done.
; REQUIRES: allow_dump
; RUN: %p2i -i %s --filetype=asm --args --verbose inst -threads=0 \
; RUN: -allow-externally-defined-symbols | FileCheck %s
define internal i32 @Add(i32 %a, i32 %b) {
; CHECK: define internal i32 @Add
entry:
%add = add i32 %b, %a
; CHECK: add
tail call void @Use(i32 %add)
; CHECK: call Use
ret i32 %add
}
declare void @Use(i32)
define internal i32 @And(i32 %a, i32 %b) {
; CHECK: define internal i32 @And
entry:
%and = and i32 %b, %a
; CHECK: and
tail call void @Use(i32 %and)
; CHECK: call Use
ret i32 %and
}
define internal i32 @Or(i32 %a, i32 %b) {
; CHECK: define internal i32 @Or
entry:
%or = or i32 %b, %a
; CHECK: or
tail call void @Use(i32 %or)
; CHECK: call Use
ret i32 %or
}
define internal i32 @Xor(i32 %a, i32 %b) {
; CHECK: define internal i32 @Xor
entry:
%xor = xor i32 %b, %a
; CHECK: xor
tail call void @Use(i32 %xor)
; CHECK: call Use
ret i32 %xor
}
define internal i32 @Sub(i32 %a, i32 %b) {
; CHECK: define internal i32 @Sub
entry:
%sub = sub i32 %a, %b
; CHECK: sub
tail call void @Use(i32 %sub)
; CHECK: call Use
ret i32 %sub
}
define internal i32 @Mul(i32 %a, i32 %b) {
; CHECK: define internal i32 @Mul
entry:
%mul = mul i32 %b, %a
; CHECK: imul
tail call void @Use(i32 %mul)
; CHECK: call Use
ret i32 %mul
}
define internal i32 @Sdiv(i32 %a, i32 %b) {
; CHECK: define internal i32 @Sdiv
entry:
%div = sdiv i32 %a, %b
; CHECK: cdq
; CHECK: idiv
tail call void @Use(i32 %div)
; CHECK: call Use
ret i32 %div
}
define internal i32 @Srem(i32 %a, i32 %b) {
; CHECK: define internal i32 @Srem
entry:
%rem = srem i32 %a, %b
; CHECK: cdq
; CHECK: idiv
tail call void @Use(i32 %rem)
; CHECK: call Use
ret i32 %rem
}
define internal i32 @Udiv(i32 %a, i32 %b) {
; CHECK: define internal i32 @Udiv
entry:
%div = udiv i32 %a, %b
; CHECK: div
tail call void @Use(i32 %div)
; CHECK: call Use
ret i32 %div
}
define internal i32 @Urem(i32 %a, i32 %b) {
; CHECK: define internal i32 @Urem
entry:
%rem = urem i32 %a, %b
; CHECK: div
tail call void @Use(i32 %rem)
; CHECK: call Use
ret i32 %rem
}
; Check for a valid addressing mode in the x86-32 mul instruction when
; the second source operand is an immediate.
define internal i64 @MulImm() {
entry:
%mul = mul i64 3, 4
ret i64 %mul
}
; CHECK-LABEL: MulImm
; CHECK-NOT: mul {{[0-9]+}}