1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc < %s -mtriple=i686-unknown-unknown -mattr=+sse2 | FileCheck %s --check-prefix=CHECK --check-prefix=X86 3; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse2 | FileCheck %s --check-prefix=CHECK --check-prefix=X64 4 5define i32 @extractelt_undef_insertelt(i32 %x, i32 %y) { 6; CHECK-LABEL: extractelt_undef_insertelt: 7; CHECK: # %bb.0: 8; CHECK-NEXT: ret{{[l|q]}} 9 %b = insertelement <4 x i32> zeroinitializer, i32 %x, i64 3 10 %c = icmp uge i32 %y, %y 11 %d = extractelement <4 x i32> %b, i1 %c 12 ret i32 %d 13} 14 15define i8 @extractelt_bitcast(i32 %x) nounwind { 16; X86-LABEL: extractelt_bitcast: 17; X86: # %bb.0: 18; X86-NEXT: movzbl {{[0-9]+}}(%esp), %eax 19; X86-NEXT: retl 20; 21; X64-LABEL: extractelt_bitcast: 22; X64: # %bb.0: 23; X64-NEXT: movl %edi, %eax 24; X64-NEXT: # kill: def $al killed $al killed $eax 25; X64-NEXT: retq 26 %bc = bitcast i32 %x to <4 x i8> 27 %ext = extractelement <4 x i8> %bc, i32 0 28 ret i8 %ext 29} 30 31define i8 @extractelt_bitcast_extra_use(i32 %x, ptr %p) nounwind { 32; X86-LABEL: extractelt_bitcast_extra_use: 33; X86: # %bb.0: 34; X86-NEXT: movl {{[0-9]+}}(%esp), %eax 35; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx 36; X86-NEXT: movl %eax, (%ecx) 37; X86-NEXT: # kill: def $al killed $al killed $eax 38; X86-NEXT: retl 39; 40; X64-LABEL: extractelt_bitcast_extra_use: 41; X64: # %bb.0: 42; X64-NEXT: movl %edi, %eax 43; X64-NEXT: movl %edi, (%rsi) 44; X64-NEXT: # kill: def $al killed $al killed $eax 45; X64-NEXT: retq 46 %bc = bitcast i32 %x to <4 x i8> 47 store <4 x i8> %bc, ptr %p 48 %ext = extractelement <4 x i8> %bc, i32 0 49 ret i8 %ext 50} 51 52define i32 @trunc_i64_to_i32_le(i64 %x) { 53; X86-LABEL: trunc_i64_to_i32_le: 54; X86: # %bb.0: 55; X86-NEXT: movl {{[0-9]+}}(%esp), %eax 56; X86-NEXT: retl 57; 58; X64-LABEL: trunc_i64_to_i32_le: 59; X64: # %bb.0: 60; X64-NEXT: movq %rdi, %rax 61; X64-NEXT: # kill: def $eax killed $eax killed $rax 62; X64-NEXT: retq 63 %ins = insertelement <2 x i64> undef, i64 %x, i32 0 64 %bc = bitcast <2 x i64> %ins to <4 x i32> 65 %ext = extractelement <4 x i32> %bc, i32 0 66 ret i32 %ext 67} 68 69define i16 @trunc_i64_to_i16_le(i64 %x) { 70; X86-LABEL: trunc_i64_to_i16_le: 71; X86: # %bb.0: 72; X86-NEXT: movl {{[0-9]+}}(%esp), %eax 73; X86-NEXT: # kill: def $ax killed $ax killed $eax 74; X86-NEXT: retl 75; 76; X64-LABEL: trunc_i64_to_i16_le: 77; X64: # %bb.0: 78; X64-NEXT: movq %rdi, %rax 79; X64-NEXT: # kill: def $ax killed $ax killed $rax 80; X64-NEXT: retq 81 %ins = insertelement <2 x i64> undef, i64 %x, i32 0 82 %bc = bitcast <2 x i64> %ins to <8 x i16> 83 %ext = extractelement <8 x i16> %bc, i32 0 84 ret i16 %ext 85} 86 87define i8 @trunc_i32_to_i8_le(i32 %x) { 88; X86-LABEL: trunc_i32_to_i8_le: 89; X86: # %bb.0: 90; X86-NEXT: movzbl {{[0-9]+}}(%esp), %eax 91; X86-NEXT: retl 92; 93; X64-LABEL: trunc_i32_to_i8_le: 94; X64: # %bb.0: 95; X64-NEXT: movl %edi, %eax 96; X64-NEXT: # kill: def $al killed $al killed $eax 97; X64-NEXT: retq 98 %ins = insertelement <4 x i32> undef, i32 %x, i32 0 99 %bc = bitcast <4 x i32> %ins to <16 x i8> 100 %ext = extractelement <16 x i8> %bc, i32 0 101 ret i8 %ext 102} 103 104