| ; 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]+}} |