|  | ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py | 
|  | ; RUN: llc -mtriple=x86_64-unknown-unknown -mattr=+mmx < %s | FileCheck %s --check-prefix=X64 | 
|  | ; RUN: llc -mtriple=i686-unknown-unknown -mattr=+mmx < %s | FileCheck %s --check-prefix=I32 | 
|  |  | 
|  |  | 
|  | ; From source: clang -02 | 
|  | ;__m64 test47(int a) | 
|  | ;{ | 
|  | ;    __m64 x = (a)? (__m64)(7): (__m64)(0); | 
|  | ; return __builtin_ia32_psllw(x, x); | 
|  | ;} | 
|  |  | 
|  | define i64 @test47(i64 %arg)  { | 
|  | ; | 
|  | ; X64-LABEL: test47: | 
|  | ; X64:       # %bb.0: | 
|  | ; X64-NEXT:    xorl %eax, %eax | 
|  | ; X64-NEXT:    testq %rdi, %rdi | 
|  | ; X64-NEXT:    movl $7, %ecx | 
|  | ; X64-NEXT:    cmoveq %rcx, %rax | 
|  | ; X64-NEXT:    movq %rax, %mm0 | 
|  | ; X64-NEXT:    psllw %mm0, %mm0 | 
|  | ; X64-NEXT:    movq %mm0, %rax | 
|  | ; X64-NEXT:    retq | 
|  | ; | 
|  | ; I32-LABEL: test47: | 
|  | ; I32:       # %bb.0: | 
|  | ; I32-NEXT:    pushl %ebp | 
|  | ; I32-NEXT:    .cfi_def_cfa_offset 8 | 
|  | ; I32-NEXT:    .cfi_offset %ebp, -8 | 
|  | ; I32-NEXT:    movl %esp, %ebp | 
|  | ; I32-NEXT:    .cfi_def_cfa_register %ebp | 
|  | ; I32-NEXT:    andl $-8, %esp | 
|  | ; I32-NEXT:    subl $16, %esp | 
|  | ; I32-NEXT:    movl 8(%ebp), %eax | 
|  | ; I32-NEXT:    orl 12(%ebp), %eax | 
|  | ; I32-NEXT:    movl $7, %eax | 
|  | ; I32-NEXT:    je .LBB0_2 | 
|  | ; I32-NEXT:  # %bb.1: | 
|  | ; I32-NEXT:    xorl %eax, %eax | 
|  | ; I32-NEXT:  .LBB0_2: | 
|  | ; I32-NEXT:    movl %eax, {{[0-9]+}}(%esp) | 
|  | ; I32-NEXT:    movl $0, {{[0-9]+}}(%esp) | 
|  | ; I32-NEXT:    movq {{[0-9]+}}(%esp), %mm0 | 
|  | ; I32-NEXT:    psllw %mm0, %mm0 | 
|  | ; I32-NEXT:    movq %mm0, (%esp) | 
|  | ; I32-NEXT:    movl (%esp), %eax | 
|  | ; I32-NEXT:    movl {{[0-9]+}}(%esp), %edx | 
|  | ; I32-NEXT:    movl %ebp, %esp | 
|  | ; I32-NEXT:    popl %ebp | 
|  | ; I32-NEXT:    .cfi_def_cfa %esp, 4 | 
|  | ; I32-NEXT:    retl | 
|  | %cond = icmp eq i64 %arg, 0 | 
|  | %slct = select i1 %cond, x86_mmx bitcast (i64 7 to x86_mmx), x86_mmx bitcast (i64 0 to x86_mmx) | 
|  | %psll = tail call x86_mmx @llvm.x86.mmx.psll.w(x86_mmx %slct, x86_mmx %slct) | 
|  | %retc = bitcast x86_mmx %psll to i64 | 
|  | ret i64 %retc | 
|  | } | 
|  |  | 
|  |  | 
|  | ; From source: clang -O2 | 
|  | ;__m64 test49(int a, long long n, long long m) | 
|  | ;{ | 
|  | ;    __m64 x = (a)? (__m64)(n): (__m64)(m); | 
|  | ; return __builtin_ia32_psllw(x, x); | 
|  | ;} | 
|  |  | 
|  | define i64 @test49(i64 %arg, i64 %x, i64 %y) { | 
|  | ; | 
|  | ; X64-LABEL: test49: | 
|  | ; X64:       # %bb.0: | 
|  | ; X64-NEXT:    testq %rdi, %rdi | 
|  | ; X64-NEXT:    cmovneq %rdx, %rsi | 
|  | ; X64-NEXT:    movq %rsi, %mm0 | 
|  | ; X64-NEXT:    psllw %mm0, %mm0 | 
|  | ; X64-NEXT:    movq %mm0, %rax | 
|  | ; X64-NEXT:    retq | 
|  | ; | 
|  | ; I32-LABEL: test49: | 
|  | ; I32:       # %bb.0: | 
|  | ; I32-NEXT:    pushl %ebp | 
|  | ; I32-NEXT:    .cfi_def_cfa_offset 8 | 
|  | ; I32-NEXT:    .cfi_offset %ebp, -8 | 
|  | ; I32-NEXT:    movl %esp, %ebp | 
|  | ; I32-NEXT:    .cfi_def_cfa_register %ebp | 
|  | ; I32-NEXT:    andl $-8, %esp | 
|  | ; I32-NEXT:    subl $8, %esp | 
|  | ; I32-NEXT:    movl 8(%ebp), %eax | 
|  | ; I32-NEXT:    orl 12(%ebp), %eax | 
|  | ; I32-NEXT:    je .LBB1_1 | 
|  | ; I32-NEXT:  # %bb.2: | 
|  | ; I32-NEXT:    leal 24(%ebp), %eax | 
|  | ; I32-NEXT:    jmp .LBB1_3 | 
|  | ; I32-NEXT:  .LBB1_1: | 
|  | ; I32-NEXT:    leal 16(%ebp), %eax | 
|  | ; I32-NEXT:  .LBB1_3: | 
|  | ; I32-NEXT:    movq (%eax), %mm0 | 
|  | ; I32-NEXT:    psllw %mm0, %mm0 | 
|  | ; I32-NEXT:    movq %mm0, (%esp) | 
|  | ; I32-NEXT:    movl (%esp), %eax | 
|  | ; I32-NEXT:    movl {{[0-9]+}}(%esp), %edx | 
|  | ; I32-NEXT:    movl %ebp, %esp | 
|  | ; I32-NEXT:    popl %ebp | 
|  | ; I32-NEXT:    .cfi_def_cfa %esp, 4 | 
|  | ; I32-NEXT:    retl | 
|  | %cond = icmp eq i64 %arg, 0 | 
|  | %xmmx = bitcast i64 %x to x86_mmx | 
|  | %ymmx = bitcast i64 %y to x86_mmx | 
|  | %slct = select i1 %cond, x86_mmx %xmmx, x86_mmx %ymmx | 
|  | %psll = tail call x86_mmx @llvm.x86.mmx.psll.w(x86_mmx %slct, x86_mmx %slct) | 
|  | %retc = bitcast x86_mmx %psll to i64 | 
|  | ret i64 %retc | 
|  | } | 
|  |  | 
|  | declare x86_mmx @llvm.x86.mmx.psll.w(x86_mmx, x86_mmx) | 
|  |  |