194 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -mtriple=i686-unknown-linux-gnu -mattr=+sse2,-sse4.1 | FileCheck %s --check-prefix=X863; RUN: llc < %s -mtriple=x86_64-unknown-linux-gnu -mattr=+sse2,-sse4.1 | FileCheck %s --check-prefix=X644 5define void @test1(ptr %F, ptr %f) nounwind {6; X86-LABEL: test1:7; X86: # %bb.0: # %entry8; X86-NEXT: movl {{[0-9]+}}(%esp), %eax9; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx10; X86-NEXT: movss {{.*#+}} xmm0 = mem[0],zero,zero,zero11; X86-NEXT: addss %xmm0, %xmm012; X86-NEXT: movss %xmm0, (%eax)13; X86-NEXT: retl14;15; X64-LABEL: test1:16; X64: # %bb.0: # %entry17; X64-NEXT: movss {{.*#+}} xmm0 = mem[0],zero,zero,zero18; X64-NEXT: addss %xmm0, %xmm019; X64-NEXT: movss %xmm0, (%rsi)20; X64-NEXT: retq21entry:22 %tmp = load <4 x float>, ptr %F23 %tmp7 = fadd <4 x float> %tmp, %tmp24 %tmp2 = extractelement <4 x float> %tmp7, i32 025 store float %tmp2, ptr %f26 ret void27}28 29define float @test2(ptr %F, ptr %f) nounwind {30; X86-LABEL: test2:31; X86: # %bb.0: # %entry32; X86-NEXT: pushl %eax33; X86-NEXT: movl {{[0-9]+}}(%esp), %eax34; X86-NEXT: movaps (%eax), %xmm035; X86-NEXT: addps %xmm0, %xmm036; X86-NEXT: movhlps {{.*#+}} xmm0 = xmm0[1,1]37; X86-NEXT: movss %xmm0, (%esp)38; X86-NEXT: flds (%esp)39; X86-NEXT: popl %eax40; X86-NEXT: retl41;42; X64-LABEL: test2:43; X64: # %bb.0: # %entry44; X64-NEXT: movaps (%rdi), %xmm045; X64-NEXT: addps %xmm0, %xmm046; X64-NEXT: movhlps {{.*#+}} xmm0 = xmm0[1,1]47; X64-NEXT: retq48entry:49 %tmp = load <4 x float>, ptr %F50 %tmp7 = fadd <4 x float> %tmp, %tmp51 %tmp2 = extractelement <4 x float> %tmp7, i32 252 ret float %tmp253}54 55define void @test3(ptr %R, ptr %P1) nounwind {56; X86-LABEL: test3:57; X86: # %bb.0: # %entry58; X86-NEXT: movl {{[0-9]+}}(%esp), %eax59; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx60; X86-NEXT: movaps (%ecx), %xmm061; X86-NEXT: shufps {{.*#+}} xmm0 = xmm0[3,3,3,3]62; X86-NEXT: movss %xmm0, (%eax)63; X86-NEXT: retl64;65; X64-LABEL: test3:66; X64: # %bb.0: # %entry67; X64-NEXT: movaps (%rsi), %xmm068; X64-NEXT: shufps {{.*#+}} xmm0 = xmm0[3,3,3,3]69; X64-NEXT: movss %xmm0, (%rdi)70; X64-NEXT: retq71entry:72 %X = load <4 x float>, ptr %P173 %tmp = extractelement <4 x float> %X, i32 374 store float %tmp, ptr %R75 ret void76}77 78define double @test4(double %A) nounwind {79; X86-LABEL: test4:80; X86: # %bb.0: # %entry81; X86-NEXT: subl $12, %esp82; X86-NEXT: calll foo@PLT83; X86-NEXT: unpckhpd {{.*#+}} xmm0 = xmm0[1,1]84; X86-NEXT: addsd {{[0-9]+}}(%esp), %xmm085; X86-NEXT: movsd %xmm0, (%esp)86; X86-NEXT: fldl (%esp)87; X86-NEXT: addl $12, %esp88; X86-NEXT: retl89;90; X64-LABEL: test4:91; X64: # %bb.0: # %entry92; X64-NEXT: pushq %rax93; X64-NEXT: movsd %xmm0, (%rsp) # 8-byte Spill94; X64-NEXT: callq foo@PLT95; X64-NEXT: unpckhpd {{.*#+}} xmm0 = xmm0[1,1]96; X64-NEXT: addsd (%rsp), %xmm0 # 8-byte Folded Reload97; X64-NEXT: popq %rax98; X64-NEXT: retq99entry:100 %tmp1 = call <2 x double> @foo( )101 %tmp2 = extractelement <2 x double> %tmp1, i32 1102 %tmp3 = fadd double %tmp2, %A103 ret double %tmp3104}105declare <2 x double> @foo()106 107define i64 @pr150117(<31 x i8> %a0) nounwind {108; X86-LABEL: pr150117:109; X86: # %bb.0:110; X86-NEXT: pushl %ebx111; X86-NEXT: pushl %edi112; X86-NEXT: pushl %esi113; X86-NEXT: movzbl {{[0-9]+}}(%esp), %eax114; X86-NEXT: movzbl {{[0-9]+}}(%esp), %ecx115; X86-NEXT: movzbl {{[0-9]+}}(%esp), %esi116; X86-NEXT: movzbl {{[0-9]+}}(%esp), %edi117; X86-NEXT: movzbl {{[0-9]+}}(%esp), %ebx118; X86-NEXT: movl {{[0-9]+}}(%esp), %edx119; X86-NEXT: shll $8, %edx120; X86-NEXT: orl %ebx, %edx121; X86-NEXT: shll $8, %edi122; X86-NEXT: orl %esi, %edi123; X86-NEXT: shll $16, %ecx124; X86-NEXT: orl %edi, %ecx125; X86-NEXT: movl {{[0-9]+}}(%esp), %esi126; X86-NEXT: shll $24, %esi127; X86-NEXT: orl %ecx, %esi128; X86-NEXT: movd %esi, %xmm0129; X86-NEXT: pinsrw $2, %edx, %xmm0130; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx131; X86-NEXT: shll $8, %ecx132; X86-NEXT: orl %eax, %ecx133; X86-NEXT: pinsrw $3, %ecx, %xmm0134; X86-NEXT: movd %xmm0, %eax135; X86-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,1,1]136; X86-NEXT: movd %xmm0, %edx137; X86-NEXT: popl %esi138; X86-NEXT: popl %edi139; X86-NEXT: popl %ebx140; X86-NEXT: retl141;142; X64-LABEL: pr150117:143; X64: # %bb.0:144; X64-NEXT: movzbl {{[0-9]+}}(%rsp), %eax145; X64-NEXT: movzbl {{[0-9]+}}(%rsp), %ecx146; X64-NEXT: movzbl {{[0-9]+}}(%rsp), %edx147; X64-NEXT: movzbl {{[0-9]+}}(%rsp), %esi148; X64-NEXT: movzbl {{[0-9]+}}(%rsp), %edi149; X64-NEXT: movl {{[0-9]+}}(%rsp), %r8d150; X64-NEXT: shll $8, %r8d151; X64-NEXT: orl %edi, %r8d152; X64-NEXT: shll $8, %esi153; X64-NEXT: orl %edx, %esi154; X64-NEXT: shll $16, %ecx155; X64-NEXT: orl %esi, %ecx156; X64-NEXT: movl {{[0-9]+}}(%rsp), %edx157; X64-NEXT: shll $24, %edx158; X64-NEXT: orl %ecx, %edx159; X64-NEXT: movd %edx, %xmm0160; X64-NEXT: pinsrw $2, %r8d, %xmm0161; X64-NEXT: movl {{[0-9]+}}(%rsp), %ecx162; X64-NEXT: shll $8, %ecx163; X64-NEXT: orl %eax, %ecx164; X64-NEXT: pinsrw $3, %ecx, %xmm0165; X64-NEXT: movq %xmm0, %rax166; X64-NEXT: retq167 %shuffle = shufflevector <31 x i8> %a0, <31 x i8> zeroinitializer, <32 x i32> <i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison>168 %bitcast = bitcast <32 x i8> %shuffle to <4 x i64>169 %elt = extractelement <4 x i64> %bitcast, i64 0170 ret i64 %elt171}172 173; OSS-Fuzz #15662174; https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=15662175define <4 x i32> @ossfuzz15662(ptr %in) {176; X86-LABEL: ossfuzz15662:177; X86: # %bb.0:178; X86-NEXT: xorps %xmm0, %xmm0179; X86-NEXT: movaps %xmm0, (%eax)180; X86-NEXT: retl181;182; X64-LABEL: ossfuzz15662:183; X64: # %bb.0:184; X64-NEXT: xorps %xmm0, %xmm0185; X64-NEXT: movaps %xmm0, (%rax)186; X64-NEXT: retq187 %C10 = icmp ule i1 false, false188 %C3 = icmp ule i1 true, undef189 %B = sdiv i1 %C10, %C3190 %I = insertelement <4 x i32> zeroinitializer, i32 0, i1 %B191 store <4 x i32> %I, ptr undef192 ret <4 x i32> zeroinitializer193}194