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