| ; Test the lowering sequence for commutative operations. If there is a source |
| ; operand whose lifetime ends in an operation, it should be the first operand, |
| ; eliminating the need for a move to start the new lifetime. |
| |
| ; RUN: %if --need=target_X8632 --command %p2i --filetype=obj --disassemble \ |
| ; RUN: --target x8632 -i %s --args -O2 \ |
| ; RUN: | %if --need=target_X8632 --command FileCheck %s |
| |
| ; RUN: %if --need=target_MIPS32 --need=allow_dump \ |
| ; RUN: --command %p2i --filetype=asm --assemble --disassemble --target \ |
| ; RUN: mips32 -i %s --args -O2 -allow-externally-defined-symbols \ |
| ; RUN: | %if --need=target_MIPS32 --need=allow_dump \ |
| ; RUN: --command FileCheck --check-prefix MIPS32 %s |
| |
| define internal i32 @integerAddLeft(i32 %a, i32 %b) { |
| entry: |
| %tmp = add i32 %a, %b |
| %result = add i32 %a, %tmp |
| ret i32 %result |
| } |
| ; CHECK-LABEL: integerAddLeft |
| ; CHECK-NEXT: mov {{e..}},DWORD PTR |
| ; CHECK-NEXT: mov {{e..}},DWORD PTR |
| ; CHECK-NEXT: add {{e..}},{{e..}} |
| ; CHECK-NEXT: add {{e..}},{{e..}} |
| ; MIPS32-LABEL: integerAddLeft |
| ; MIPS32: move v0,a0 |
| ; MIPS32: addu v0,v0,a1 |
| ; MIPS32: addu a0,a0,v0 |
| |
| define internal i32 @integerAddRight(i32 %a, i32 %b) { |
| entry: |
| %tmp = add i32 %a, %b |
| %result = add i32 %b, %tmp |
| ret i32 %result |
| } |
| ; CHECK-LABEL: integerAddRight |
| ; CHECK-NEXT: mov {{e..}},DWORD PTR |
| ; CHECK-NEXT: mov {{e..}},DWORD PTR |
| ; CHECK-NEXT: add {{e..}},{{e..}} |
| ; CHECK-NEXT: add {{e..}},{{e..}} |
| ; MIPS32-LABEL: integerAddRight |
| ; MIPS32: move v0,a1 |
| ; MIPS32: addu a0,a0,v0 |
| ; MIPS32: addu a1,a1,a0 |
| |
| define internal i32 @integerMultiplyLeft(i32 %a, i32 %b) { |
| entry: |
| %tmp = mul i32 %a, %b |
| %result = mul i32 %a, %tmp |
| ret i32 %result |
| } |
| ; CHECK-LABEL: integerMultiplyLeft |
| ; CHECK-NEXT: mov {{e..}},DWORD PTR |
| ; CHECK-NEXT: mov {{e..}},DWORD PTR |
| ; CHECK-NEXT: imul {{e..}},{{e..}} |
| ; CHECK-NEXT: imul {{e..}},{{e..}} |
| ; MIPS32-LABEL: integerMultiplyLeft |
| ; MIPS32: move v0,a0 |
| ; MIPS32: mul v0,v0,a1 |
| ; MIPS32: mul a0,a0,v0 |
| |
| define internal i32 @integerMultiplyRight(i32 %a, i32 %b) { |
| entry: |
| %tmp = mul i32 %a, %b |
| %result = mul i32 %b, %tmp |
| ret i32 %result |
| } |
| ; CHECK-LABEL: integerMultiplyRight |
| ; CHECK-NEXT: mov {{e..}},DWORD PTR |
| ; CHECK-NEXT: mov {{e..}},DWORD PTR |
| ; CHECK-NEXT: imul {{e..}},{{e..}} |
| ; CHECK-NEXT: imul {{e..}},{{e..}} |
| ; MIPS32-LABEL: integerMultiplyRight |
| ; MIPS32: move v0,a1 |
| ; MIPS32: mul a0,a0,v0 |
| ; MIPS32: mul a1,a1,a0 |
| |
| define internal float @floatAddLeft(float %a, float %b) { |
| entry: |
| %tmp = fadd float %a, %b |
| %result = fadd float %a, %tmp |
| ret float %result |
| } |
| ; CHECK-LABEL: floatAddLeft |
| ; CHECK-NEXT: sub esp,0x1c |
| ; CHECK-NEXT: movss xmm0,DWORD PTR |
| ; CHECK-NEXT: movss xmm1,DWORD PTR |
| ; CHECK-NEXT: addss xmm1,xmm0 |
| ; CHECK-NEXT: addss xmm0,xmm1 |
| ; MIPS32-LABEL: floatAddLeft |
| ; MIPS32: mov.s $f0,$f12 |
| ; MIPS32: add.s $f0,$f0,$f14 |
| ; MIPS32: add.s $f12,$f12,$f0 |
| |
| define internal float @floatAddRight(float %a, float %b) { |
| entry: |
| %tmp = fadd float %a, %b |
| %result = fadd float %b, %tmp |
| ret float %result |
| } |
| ; CHECK-LABEL: floatAddRight |
| ; CHECK-NEXT: sub esp,0x1c |
| ; CHECK-NEXT: movss xmm0,DWORD PTR |
| ; CHECK-NEXT: movss xmm1,DWORD PTR |
| ; CHECK-NEXT: addss xmm0,xmm1 |
| ; CHECK-NEXT: addss xmm1,xmm0 |
| ; MIPS32-LABEL: floatAddRight |
| ; MIPS32: mov.s $f0,$f14 |
| ; MIPS32: add.s $f12,$f12,$f0 |
| ; MIPS32: add.s $f14,$f14,$f12 |
| |
| define internal float @floatMultiplyLeft(float %a, float %b) { |
| entry: |
| %tmp = fmul float %a, %b |
| %result = fmul float %a, %tmp |
| ret float %result |
| } |
| ; CHECK-LABEL: floatMultiplyLeft |
| ; CHECK-NEXT: sub esp,0x1c |
| ; CHECK-NEXT: movss xmm0,DWORD PTR |
| ; CHECK-NEXT: movss xmm1,DWORD PTR |
| ; CHECK-NEXT: mulss xmm1,xmm0 |
| ; CHECK-NEXT: mulss xmm0,xmm1 |
| ; MIPS32-LABEL: floatMultiplyLeft |
| ; MIPS32: mov.s $f0,$f12 |
| ; MIPS32: mul.s $f0,$f0,$f14 |
| ; MIPS32: mul.s $f12,$f12,$f0 |
| |
| define internal float @floatMultiplyRight(float %a, float %b) { |
| entry: |
| %tmp = fmul float %a, %b |
| %result = fmul float %b, %tmp |
| ret float %result |
| } |
| ; CHECK-LABEL: floatMultiplyRight |
| ; CHECK-NEXT: sub esp,0x1c |
| ; CHECK-NEXT: movss xmm0,DWORD PTR |
| ; CHECK-NEXT: movss xmm1,DWORD PTR |
| ; CHECK-NEXT: mulss xmm0,xmm1 |
| ; CHECK-NEXT: mulss xmm1,xmm0 |
| ; MIPS32-LABEL: floatMultiplyRight |
| ; MIPS32: mov.s $f0,$f14 |
| ; MIPS32: mul.s $f12,$f12,$f0 |
| ; MIPS32: mul.s $f14,$f14,$f12 |