brintos

brintos / llvm-project-archived public Read only

0
0
Text · 13.1 KiB · 35e14e5 Raw
437 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc -mtriple=x86_64-unknown-unknown -mattr=+sse2 < %s | FileCheck %s --check-prefix=SSE3; RUN: llc -mtriple=x86_64-unknown-unknown -mattr=+avx < %s | FileCheck %s --check-prefix=AVX4; RUN: llc -mtriple=x86_64-unknown-unknown -mattr=+avx512f < %s | FileCheck %s --check-prefix=AVX5 6; Verify we fold loads into unary sse intrinsics only when optimizing for size7 8define float @rcpss(ptr %a) {9; SSE-LABEL: rcpss:10; SSE:       # %bb.0:11; SSE-NEXT:    movss {{.*#+}} xmm0 = mem[0],zero,zero,zero12; SSE-NEXT:    rcpss %xmm0, %xmm013; SSE-NEXT:    retq14;15; AVX-LABEL: rcpss:16; AVX:       # %bb.0:17; AVX-NEXT:    vmovss {{.*#+}} xmm0 = mem[0],zero,zero,zero18; AVX-NEXT:    vrcpss %xmm0, %xmm0, %xmm019; AVX-NEXT:    retq20    %ld = load float, ptr %a21    %ins = insertelement <4 x float> undef, float %ld, i32 022    %res = tail call <4 x float> @llvm.x86.sse.rcp.ss(<4 x float> %ins)23    %ext = extractelement <4 x float> %res, i32 024    ret float %ext25}26 27define float @rsqrtss(ptr %a) {28; SSE-LABEL: rsqrtss:29; SSE:       # %bb.0:30; SSE-NEXT:    movss {{.*#+}} xmm0 = mem[0],zero,zero,zero31; SSE-NEXT:    rsqrtss %xmm0, %xmm032; SSE-NEXT:    retq33;34; AVX-LABEL: rsqrtss:35; AVX:       # %bb.0:36; AVX-NEXT:    vmovss {{.*#+}} xmm0 = mem[0],zero,zero,zero37; AVX-NEXT:    vrsqrtss %xmm0, %xmm0, %xmm038; AVX-NEXT:    retq39    %ld = load float, ptr %a40    %ins = insertelement <4 x float> undef, float %ld, i32 041    %res = tail call <4 x float> @llvm.x86.sse.rsqrt.ss(<4 x float> %ins)42    %ext = extractelement <4 x float> %res, i32 043    ret float %ext44}45 46define float @sqrtss(ptr %a) {47; SSE-LABEL: sqrtss:48; SSE:       # %bb.0:49; SSE-NEXT:    movss {{.*#+}} xmm0 = mem[0],zero,zero,zero50; SSE-NEXT:    sqrtss %xmm0, %xmm051; SSE-NEXT:    retq52;53; AVX-LABEL: sqrtss:54; AVX:       # %bb.0:55; AVX-NEXT:    vmovss {{.*#+}} xmm0 = mem[0],zero,zero,zero56; AVX-NEXT:    vsqrtss %xmm0, %xmm0, %xmm057; AVX-NEXT:    retq58    %ld = load float, ptr %a59    %ins = insertelement <4 x float> undef, float %ld, i32 060    %res = tail call <4 x float> @llvm.x86.sse.sqrt.ss(<4 x float> %ins)61    %ext = extractelement <4 x float> %res, i32 062    ret float %ext63}64 65define double @sqrtsd(ptr %a) {66; SSE-LABEL: sqrtsd:67; SSE:       # %bb.0:68; SSE-NEXT:    movsd {{.*#+}} xmm0 = mem[0],zero69; SSE-NEXT:    sqrtsd %xmm0, %xmm070; SSE-NEXT:    retq71;72; AVX-LABEL: sqrtsd:73; AVX:       # %bb.0:74; AVX-NEXT:    vmovsd {{.*#+}} xmm0 = mem[0],zero75; AVX-NEXT:    vsqrtsd %xmm0, %xmm0, %xmm076; AVX-NEXT:    retq77    %ld = load double, ptr %a78    %ins = insertelement <2 x double> undef, double %ld, i32 079    %res = tail call <2 x double> @llvm.x86.sse2.sqrt.sd(<2 x double> %ins)80    %ext = extractelement <2 x double> %res, i32 081    ret double %ext82}83 84define float @rcpss_size(ptr %a) optsize {85; SSE-LABEL: rcpss_size:86; SSE:       # %bb.0:87; SSE-NEXT:    rcpss (%rdi), %xmm088; SSE-NEXT:    retq89;90; AVX-LABEL: rcpss_size:91; AVX:       # %bb.0:92; AVX-NEXT:    vrcpss (%rdi), %xmm15, %xmm093; AVX-NEXT:    retq94    %ld = load float, ptr %a95    %ins = insertelement <4 x float> undef, float %ld, i32 096    %res = tail call <4 x float> @llvm.x86.sse.rcp.ss(<4 x float> %ins)97    %ext = extractelement <4 x float> %res, i32 098    ret float %ext99}100 101define <4 x float> @rcpss_full_size(ptr %a) optsize {102; SSE-LABEL: rcpss_full_size:103; SSE:       # %bb.0:104; SSE-NEXT:    rcpss (%rdi), %xmm0105; SSE-NEXT:    retq106;107; AVX-LABEL: rcpss_full_size:108; AVX:       # %bb.0:109; AVX-NEXT:    vrcpss (%rdi), %xmm15, %xmm0110; AVX-NEXT:    retq111    %ld = load <4 x float>, ptr %a112    %res = tail call <4 x float> @llvm.x86.sse.rcp.ss(<4 x float> %ld)113    ret <4 x float> %res114}115 116define float @rcpss_pgso(ptr %a) !prof !14 {117; SSE-LABEL: rcpss_pgso:118; SSE:       # %bb.0:119; SSE-NEXT:    rcpss (%rdi), %xmm0120; SSE-NEXT:    retq121;122; AVX-LABEL: rcpss_pgso:123; AVX:       # %bb.0:124; AVX-NEXT:    vrcpss (%rdi), %xmm15, %xmm0125; AVX-NEXT:    retq126    %ld = load float, ptr %a127    %ins = insertelement <4 x float> undef, float %ld, i32 0128    %res = tail call <4 x float> @llvm.x86.sse.rcp.ss(<4 x float> %ins)129    %ext = extractelement <4 x float> %res, i32 0130    ret float %ext131}132 133define <4 x float> @rcpss_full_pgso(ptr %a) !prof !14 {134; SSE-LABEL: rcpss_full_pgso:135; SSE:       # %bb.0:136; SSE-NEXT:    rcpss (%rdi), %xmm0137; SSE-NEXT:    retq138;139; AVX-LABEL: rcpss_full_pgso:140; AVX:       # %bb.0:141; AVX-NEXT:    vrcpss (%rdi), %xmm15, %xmm0142; AVX-NEXT:    retq143    %ld = load <4 x float>, ptr %a144    %res = tail call <4 x float> @llvm.x86.sse.rcp.ss(<4 x float> %ld)145    ret <4 x float> %res146}147 148define float @rsqrtss_size(ptr %a) optsize {149; SSE-LABEL: rsqrtss_size:150; SSE:       # %bb.0:151; SSE-NEXT:    rsqrtss (%rdi), %xmm0152; SSE-NEXT:    retq153;154; AVX-LABEL: rsqrtss_size:155; AVX:       # %bb.0:156; AVX-NEXT:    vrsqrtss (%rdi), %xmm15, %xmm0157; AVX-NEXT:    retq158    %ld = load float, ptr %a159    %ins = insertelement <4 x float> undef, float %ld, i32 0160    %res = tail call <4 x float> @llvm.x86.sse.rsqrt.ss(<4 x float> %ins)161    %ext = extractelement <4 x float> %res, i32 0162    ret float %ext163}164 165define <4 x float> @rsqrtss_full_size(ptr %a) optsize {166; SSE-LABEL: rsqrtss_full_size:167; SSE:       # %bb.0:168; SSE-NEXT:    rsqrtss (%rdi), %xmm0169; SSE-NEXT:    retq170;171; AVX-LABEL: rsqrtss_full_size:172; AVX:       # %bb.0:173; AVX-NEXT:    vrsqrtss (%rdi), %xmm15, %xmm0174; AVX-NEXT:    retq175    %ld = load <4 x float>, ptr %a176    %res = tail call <4 x float> @llvm.x86.sse.rsqrt.ss(<4 x float> %ld)177    ret <4 x float> %res178}179 180define float @rsqrtss_pgso(ptr %a) !prof !14 {181; SSE-LABEL: rsqrtss_pgso:182; SSE:       # %bb.0:183; SSE-NEXT:    rsqrtss (%rdi), %xmm0184; SSE-NEXT:    retq185;186; AVX-LABEL: rsqrtss_pgso:187; AVX:       # %bb.0:188; AVX-NEXT:    vrsqrtss (%rdi), %xmm15, %xmm0189; AVX-NEXT:    retq190    %ld = load float, ptr %a191    %ins = insertelement <4 x float> undef, float %ld, i32 0192    %res = tail call <4 x float> @llvm.x86.sse.rsqrt.ss(<4 x float> %ins)193    %ext = extractelement <4 x float> %res, i32 0194    ret float %ext195}196 197define <4 x float> @rsqrtss_full_pgso(ptr %a) !prof !14 {198; SSE-LABEL: rsqrtss_full_pgso:199; SSE:       # %bb.0:200; SSE-NEXT:    rsqrtss (%rdi), %xmm0201; SSE-NEXT:    retq202;203; AVX-LABEL: rsqrtss_full_pgso:204; AVX:       # %bb.0:205; AVX-NEXT:    vrsqrtss (%rdi), %xmm15, %xmm0206; AVX-NEXT:    retq207    %ld = load <4 x float>, ptr %a208    %res = tail call <4 x float> @llvm.x86.sse.rsqrt.ss(<4 x float> %ld)209    ret <4 x float> %res210}211 212define float @sqrtss_size(ptr %a) optsize{213; SSE-LABEL: sqrtss_size:214; SSE:       # %bb.0:215; SSE-NEXT:    sqrtss (%rdi), %xmm0216; SSE-NEXT:    retq217;218; AVX-LABEL: sqrtss_size:219; AVX:       # %bb.0:220; AVX-NEXT:    vsqrtss (%rdi), %xmm15, %xmm0221; AVX-NEXT:    retq222    %ld = load float, ptr %a223    %ins = insertelement <4 x float> undef, float %ld, i32 0224    %res = tail call <4 x float> @llvm.x86.sse.sqrt.ss(<4 x float> %ins)225    %ext = extractelement <4 x float> %res, i32 0226    ret float %ext227}228 229define <4 x float> @sqrtss_full_size(ptr %a) optsize{230; SSE-LABEL: sqrtss_full_size:231; SSE:       # %bb.0:232; SSE-NEXT:    movaps (%rdi), %xmm0233; SSE-NEXT:    sqrtss %xmm0, %xmm0234; SSE-NEXT:    retq235;236; AVX-LABEL: sqrtss_full_size:237; AVX:       # %bb.0:238; AVX-NEXT:    vmovaps (%rdi), %xmm0239; AVX-NEXT:    vsqrtss %xmm0, %xmm0, %xmm0240; AVX-NEXT:    retq241    %ld = load <4 x float>, ptr %a242    %res = tail call <4 x float> @llvm.x86.sse.sqrt.ss(<4 x float> %ld)243    ret <4 x float> %res244}245 246define <4 x float> @sqrtss_full_size_volatile(ptr %a) optsize{247; SSE-LABEL: sqrtss_full_size_volatile:248; SSE:       # %bb.0:249; SSE-NEXT:    movaps (%rdi), %xmm0250; SSE-NEXT:    sqrtss %xmm0, %xmm0251; SSE-NEXT:    retq252;253; AVX-LABEL: sqrtss_full_size_volatile:254; AVX:       # %bb.0:255; AVX-NEXT:    vmovaps (%rdi), %xmm0256; AVX-NEXT:    vsqrtss %xmm0, %xmm0, %xmm0257; AVX-NEXT:    retq258    %ld = load volatile <4 x float>, ptr %a259    %res = tail call <4 x float> @llvm.x86.sse.sqrt.ss(<4 x float> %ld)260    ret <4 x float> %res261}262 263define float @sqrtss_pgso(ptr %a) !prof !14 {264; SSE-LABEL: sqrtss_pgso:265; SSE:       # %bb.0:266; SSE-NEXT:    sqrtss (%rdi), %xmm0267; SSE-NEXT:    retq268;269; AVX-LABEL: sqrtss_pgso:270; AVX:       # %bb.0:271; AVX-NEXT:    vsqrtss (%rdi), %xmm15, %xmm0272; AVX-NEXT:    retq273    %ld = load float, ptr %a274    %ins = insertelement <4 x float> undef, float %ld, i32 0275    %res = tail call <4 x float> @llvm.x86.sse.sqrt.ss(<4 x float> %ins)276    %ext = extractelement <4 x float> %res, i32 0277    ret float %ext278}279 280define <4 x float> @sqrtss_full_pgso(ptr %a) !prof !14 {281; SSE-LABEL: sqrtss_full_pgso:282; SSE:       # %bb.0:283; SSE-NEXT:    movaps (%rdi), %xmm0284; SSE-NEXT:    sqrtss %xmm0, %xmm0285; SSE-NEXT:    retq286;287; AVX-LABEL: sqrtss_full_pgso:288; AVX:       # %bb.0:289; AVX-NEXT:    vmovaps (%rdi), %xmm0290; AVX-NEXT:    vsqrtss %xmm0, %xmm0, %xmm0291; AVX-NEXT:    retq292    %ld = load <4 x float>, ptr %a293    %res = tail call <4 x float> @llvm.x86.sse.sqrt.ss(<4 x float> %ld)294    ret <4 x float> %res295}296 297define <4 x float> @sqrtss_full_pgso_volatile(ptr %a) !prof !14 {298; SSE-LABEL: sqrtss_full_pgso_volatile:299; SSE:       # %bb.0:300; SSE-NEXT:    movaps (%rdi), %xmm0301; SSE-NEXT:    sqrtss %xmm0, %xmm0302; SSE-NEXT:    retq303;304; AVX-LABEL: sqrtss_full_pgso_volatile:305; AVX:       # %bb.0:306; AVX-NEXT:    vmovaps (%rdi), %xmm0307; AVX-NEXT:    vsqrtss %xmm0, %xmm0, %xmm0308; AVX-NEXT:    retq309    %ld = load volatile <4 x float>, ptr %a310    %res = tail call <4 x float> @llvm.x86.sse.sqrt.ss(<4 x float> %ld)311    ret <4 x float> %res312}313 314define double @sqrtsd_size(ptr %a) optsize {315; SSE-LABEL: sqrtsd_size:316; SSE:       # %bb.0:317; SSE-NEXT:    sqrtsd (%rdi), %xmm0318; SSE-NEXT:    retq319;320; AVX-LABEL: sqrtsd_size:321; AVX:       # %bb.0:322; AVX-NEXT:    vsqrtsd (%rdi), %xmm15, %xmm0323; AVX-NEXT:    retq324    %ld = load double, ptr %a325    %ins = insertelement <2 x double> undef, double %ld, i32 0326    %res = tail call <2 x double> @llvm.x86.sse2.sqrt.sd(<2 x double> %ins)327    %ext = extractelement <2 x double> %res, i32 0328    ret double %ext329}330 331define <2 x double> @sqrtsd_full_size(ptr %a) optsize {332; SSE-LABEL: sqrtsd_full_size:333; SSE:       # %bb.0:334; SSE-NEXT:    movapd (%rdi), %xmm0335; SSE-NEXT:    sqrtsd %xmm0, %xmm0336; SSE-NEXT:    retq337;338; AVX-LABEL: sqrtsd_full_size:339; AVX:       # %bb.0:340; AVX-NEXT:    vmovapd (%rdi), %xmm0341; AVX-NEXT:    vsqrtsd %xmm0, %xmm0, %xmm0342; AVX-NEXT:    retq343    %ld = load <2 x double>, ptr %a344    %res = tail call <2 x double> @llvm.x86.sse2.sqrt.sd(<2 x double> %ld)345    ret <2 x double> %res346}347 348define <2 x double> @sqrtsd_full_size_volatile(ptr %a) optsize {349; SSE-LABEL: sqrtsd_full_size_volatile:350; SSE:       # %bb.0:351; SSE-NEXT:    movapd (%rdi), %xmm0352; SSE-NEXT:    sqrtsd %xmm0, %xmm0353; SSE-NEXT:    retq354;355; AVX-LABEL: sqrtsd_full_size_volatile:356; AVX:       # %bb.0:357; AVX-NEXT:    vmovapd (%rdi), %xmm0358; AVX-NEXT:    vsqrtsd %xmm0, %xmm0, %xmm0359; AVX-NEXT:    retq360    %ld = load volatile <2 x double>, ptr %a361    %res = tail call <2 x double> @llvm.x86.sse2.sqrt.sd(<2 x double> %ld)362    ret <2 x double> %res363}364 365define double @sqrtsd_pgso(ptr %a) !prof !14 {366; SSE-LABEL: sqrtsd_pgso:367; SSE:       # %bb.0:368; SSE-NEXT:    sqrtsd (%rdi), %xmm0369; SSE-NEXT:    retq370;371; AVX-LABEL: sqrtsd_pgso:372; AVX:       # %bb.0:373; AVX-NEXT:    vsqrtsd (%rdi), %xmm15, %xmm0374; AVX-NEXT:    retq375    %ld = load double, ptr %a376    %ins = insertelement <2 x double> undef, double %ld, i32 0377    %res = tail call <2 x double> @llvm.x86.sse2.sqrt.sd(<2 x double> %ins)378    %ext = extractelement <2 x double> %res, i32 0379    ret double %ext380}381 382define <2 x double> @sqrtsd_full_pgso(ptr %a) !prof !14 {383; SSE-LABEL: sqrtsd_full_pgso:384; SSE:       # %bb.0:385; SSE-NEXT:    movapd (%rdi), %xmm0386; SSE-NEXT:    sqrtsd %xmm0, %xmm0387; SSE-NEXT:    retq388;389; AVX-LABEL: sqrtsd_full_pgso:390; AVX:       # %bb.0:391; AVX-NEXT:    vmovapd (%rdi), %xmm0392; AVX-NEXT:    vsqrtsd %xmm0, %xmm0, %xmm0393; AVX-NEXT:    retq394    %ld = load <2 x double>, ptr %a395    %res = tail call <2 x double> @llvm.x86.sse2.sqrt.sd(<2 x double> %ld)396    ret <2 x double> %res397}398 399define <2 x double> @sqrtsd_full_pgso_volatile(ptr %a) !prof !14 {400; SSE-LABEL: sqrtsd_full_pgso_volatile:401; SSE:       # %bb.0:402; SSE-NEXT:    movapd (%rdi), %xmm0403; SSE-NEXT:    sqrtsd %xmm0, %xmm0404; SSE-NEXT:    retq405;406; AVX-LABEL: sqrtsd_full_pgso_volatile:407; AVX:       # %bb.0:408; AVX-NEXT:    vmovapd (%rdi), %xmm0409; AVX-NEXT:    vsqrtsd %xmm0, %xmm0, %xmm0410; AVX-NEXT:    retq411    %ld = load volatile <2 x double>, ptr %a412    %res = tail call <2 x double> @llvm.x86.sse2.sqrt.sd(<2 x double> %ld)413    ret <2 x double> %res414}415 416declare <4 x float> @llvm.x86.sse.rcp.ss(<4 x float>) nounwind readnone417declare <4 x float> @llvm.x86.sse.rsqrt.ss(<4 x float>) nounwind readnone418declare <4 x float> @llvm.x86.sse.sqrt.ss(<4 x float>) nounwind readnone419declare <2 x double> @llvm.x86.sse2.sqrt.sd(<2 x double>) nounwind readnone420 421!llvm.module.flags = !{!0}422!0 = !{i32 1, !"ProfileSummary", !1}423!1 = !{!2, !3, !4, !5, !6, !7, !8, !9}424!2 = !{!"ProfileFormat", !"InstrProf"}425!3 = !{!"TotalCount", i64 10000}426!4 = !{!"MaxCount", i64 10}427!5 = !{!"MaxInternalCount", i64 1}428!6 = !{!"MaxFunctionCount", i64 1000}429!7 = !{!"NumCounts", i64 3}430!8 = !{!"NumFunctions", i64 3}431!9 = !{!"DetailedSummary", !10}432!10 = !{!11, !12, !13}433!11 = !{i32 10000, i64 100, i32 1}434!12 = !{i32 999000, i64 100, i32 1}435!13 = !{i32 999999, i64 1, i32 2}436!14 = !{!"function_entry_count", i64 0}437