brintos

brintos / llvm-project-archived public Read only

0
0
Text · 11.6 KiB · bb6dc31 Raw
313 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 32; RUN: llc < %s -mtriple=x86_64-- -mattr=+avx512f | FileCheck %s --check-prefixes=CHECK,AVX512,AVX512F3; RUN: llc < %s -mtriple=x86_64-- -mattr=+avx512f,+avx512fp16 | FileCheck %s --check-prefixes=CHECK,AVX512,AVX512FP164; RUN: llc < %s -mtriple=x86_64-- -mattr=+avx512vl | FileCheck %s --check-prefixes=CHECK,AVX512VL,AVX512VLF5; RUN: llc < %s -mtriple=x86_64-- -mattr=+avx512vl,+avx512fp16 | FileCheck %s --check-prefixes=CHECK,AVX512VLFP166 7define half @test_half(half %x, i32 %exp) nounwind {8; AVX512F-LABEL: test_half:9; AVX512F:       # %bb.0: # %entry10; AVX512F-NEXT:    vcvtsi2ss %edi, %xmm15, %xmm111; AVX512F-NEXT:    vcvtph2ps %xmm0, %xmm012; AVX512F-NEXT:    vscalefss %xmm1, %xmm0, %xmm013; AVX512F-NEXT:    vcvtps2ph $4, %xmm0, %xmm014; AVX512F-NEXT:    retq15;16; AVX512FP16-LABEL: test_half:17; AVX512FP16:       # %bb.0: # %entry18; AVX512FP16-NEXT:    vcvtsi2sh %edi, %xmm31, %xmm119; AVX512FP16-NEXT:    vscalefsh %xmm1, %xmm0, %xmm020; AVX512FP16-NEXT:    retq21;22; AVX512VL-LABEL: test_half:23; AVX512VL:       # %bb.0: # %entry24; AVX512VL-NEXT:    vcvtsi2ss %edi, %xmm15, %xmm125; AVX512VL-NEXT:    vcvtph2ps %xmm0, %xmm026; AVX512VL-NEXT:    vscalefss %xmm1, %xmm0, %xmm027; AVX512VL-NEXT:    vcvtps2ph $4, %xmm0, %xmm028; AVX512VL-NEXT:    retq29;30; AVX512VLFP16-LABEL: test_half:31; AVX512VLFP16:       # %bb.0: # %entry32; AVX512VLFP16-NEXT:    vcvtsi2sh %edi, %xmm31, %xmm133; AVX512VLFP16-NEXT:    vscalefsh %xmm1, %xmm0, %xmm034; AVX512VLFP16-NEXT:    retq35entry:36  %r = tail call fast half @llvm.ldexp.f16.i32(half %x, i32 %exp)37  ret half %r38}39declare half @llvm.ldexp.f16.i32(half, i32) memory(none)40 41define float @test_float(float %x, i32 %exp) nounwind {42; CHECK-LABEL: test_float:43; CHECK:       # %bb.0: # %entry44; CHECK-NEXT:    vcvtsi2ss %edi, %xmm15, %xmm145; CHECK-NEXT:    vscalefss %xmm1, %xmm0, %xmm046; CHECK-NEXT:    retq47entry:48  %r = tail call fast float @ldexpf(float %x, i32 %exp)49  ret float %r50}51declare float @ldexpf(float, i32) memory(none)52 53define double @test_double(double %x, i32 %exp) nounwind {54; CHECK-LABEL: test_double:55; CHECK:       # %bb.0: # %entry56; CHECK-NEXT:    vcvtsi2sd %edi, %xmm15, %xmm157; CHECK-NEXT:    vscalefsd %xmm1, %xmm0, %xmm058; CHECK-NEXT:    retq59entry:60  %r = tail call fast double @ldexp(double %x, i32 %exp)61  ret double %r62}63declare double @ldexp(double, i32) memory(none)64 65define fp128 @testExpl(fp128 %x, i32 %exp) nounwind {66; CHECK-LABEL: testExpl:67; CHECK:       # %bb.0: # %entry68; CHECK-NEXT:    jmp ldexpl@PLT # TAILCALL69entry:70  %r = tail call fast fp128 @ldexpl(fp128 %x, i32 %exp)71  ret fp128 %r72}73declare fp128 @ldexpl(fp128, i32) memory(none)74 75define <8 x half> @test_ldexp_8xhalf(<8 x half> %x, <8 x i16> %exp) nounwind {76; AVX512F-LABEL: test_ldexp_8xhalf:77; AVX512F:       # %bb.0:78; AVX512F-NEXT:    vpmovsxwd %xmm1, %ymm179; AVX512F-NEXT:    vcvtph2ps %xmm0, %ymm080; AVX512F-NEXT:    vscalefps %zmm1, %zmm0, %zmm081; AVX512F-NEXT:    vcvtps2ph $4, %ymm0, %xmm082; AVX512F-NEXT:    vzeroupper83; AVX512F-NEXT:    retq84;85; AVX512FP16-LABEL: test_ldexp_8xhalf:86; AVX512FP16:       # %bb.0:87; AVX512FP16-NEXT:    vxorps %xmm2, %xmm2, %xmm288; AVX512FP16-NEXT:    vinsertf32x4 $0, %xmm0, %zmm2, %zmm089; AVX512FP16-NEXT:    vmovaps %xmm1, %xmm190; AVX512FP16-NEXT:    vscalefph %zmm1, %zmm0, %zmm091; AVX512FP16-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm092; AVX512FP16-NEXT:    vzeroupper93; AVX512FP16-NEXT:    retq94;95; AVX512VL-LABEL: test_ldexp_8xhalf:96; AVX512VL:       # %bb.0:97; AVX512VL-NEXT:    vpmovsxwd %xmm1, %ymm198; AVX512VL-NEXT:    vcvtph2ps %xmm0, %ymm099; AVX512VL-NEXT:    vscalefps %zmm1, %zmm0, %zmm0100; AVX512VL-NEXT:    vcvtps2ph $4, %ymm0, %xmm0101; AVX512VL-NEXT:    vzeroupper102; AVX512VL-NEXT:    retq103;104; AVX512VLFP16-LABEL: test_ldexp_8xhalf:105; AVX512VLFP16:       # %bb.0:106; AVX512VLFP16-NEXT:    vcvtw2ph %xmm1, %xmm1107; AVX512VLFP16-NEXT:    vscalefph %xmm1, %xmm0, %xmm0108; AVX512VLFP16-NEXT:    retq109  %r = call <8 x half> @llvm.ldexp.v8f16.v8i16(<8 x half> %x, <8 x i16> %exp)110  ret <8 x half> %r111}112declare <8 x half> @llvm.ldexp.v8f16.v8i16(<8 x half>, <8 x i16>)113 114define <4 x float> @test_ldexp_4xfloat(<4 x float> %x, <4 x i32> %exp) nounwind {115; AVX512-LABEL: test_ldexp_4xfloat:116; AVX512:       # %bb.0:117; AVX512-NEXT:    vmovaps %xmm1, %xmm1118; AVX512-NEXT:    vmovaps %xmm0, %xmm0119; AVX512-NEXT:    vscalefps %zmm1, %zmm0, %zmm0120; AVX512-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm0121; AVX512-NEXT:    vzeroupper122; AVX512-NEXT:    retq123;124; AVX512VL-LABEL: test_ldexp_4xfloat:125; AVX512VL:       # %bb.0:126; AVX512VL-NEXT:    vcvtdq2ps %xmm1, %xmm1127; AVX512VL-NEXT:    vscalefps %xmm1, %xmm0, %xmm0128; AVX512VL-NEXT:    retq129;130; AVX512VLFP16-LABEL: test_ldexp_4xfloat:131; AVX512VLFP16:       # %bb.0:132; AVX512VLFP16-NEXT:    vcvtdq2ps %xmm1, %xmm1133; AVX512VLFP16-NEXT:    vscalefps %xmm1, %xmm0, %xmm0134; AVX512VLFP16-NEXT:    retq135  %r = call <4 x float> @llvm.ldexp.v4f32.v4i32(<4 x float> %x, <4 x i32> %exp)136  ret <4 x float> %r137}138declare <4 x float> @llvm.ldexp.v4f32.v4i32(<4 x float>, <4 x i32>)139 140define <2 x double> @test_ldexp_2xdouble(<2 x double> %x, <2 x i32> %exp) nounwind {141; CHECK-LABEL: test_ldexp_2xdouble:142; CHECK:       # %bb.0:143; CHECK-NEXT:    vcvtdq2pd %xmm1, %xmm2144; CHECK-NEXT:    vscalefsd %xmm2, %xmm0, %xmm2145; CHECK-NEXT:    vshufpd {{.*#+}} xmm0 = xmm0[1,0]146; CHECK-NEXT:    vshufps {{.*#+}} xmm1 = xmm1[1,1,1,1]147; CHECK-NEXT:    vcvtdq2pd %xmm1, %xmm1148; CHECK-NEXT:    vscalefsd %xmm1, %xmm0, %xmm0149; CHECK-NEXT:    vunpcklpd {{.*#+}} xmm0 = xmm2[0],xmm0[0]150; CHECK-NEXT:    retq151  %r = call <2 x double> @llvm.ldexp.v2f64.v2i32(<2 x double> %x, <2 x i32> %exp)152  ret <2 x double> %r153}154declare <2 x double> @llvm.ldexp.v2f64.v2i32(<2 x double>, <2 x i32>)155 156define <16 x half> @test_ldexp_16xhalf(<16 x half> %x, <16 x i16> %exp) nounwind {157; AVX512F-LABEL: test_ldexp_16xhalf:158; AVX512F:       # %bb.0:159; AVX512F-NEXT:    vpmovsxwd %ymm1, %zmm1160; AVX512F-NEXT:    vcvtph2ps %ymm0, %zmm0161; AVX512F-NEXT:    vscalefps %zmm1, %zmm0, %zmm0162; AVX512F-NEXT:    vcvtps2ph $4, %zmm0, %ymm0163; AVX512F-NEXT:    retq164;165; AVX512FP16-LABEL: test_ldexp_16xhalf:166; AVX512FP16:       # %bb.0:167; AVX512FP16-NEXT:    vxorps %xmm2, %xmm2, %xmm2168; AVX512FP16-NEXT:    vinsertf64x4 $0, %ymm0, %zmm2, %zmm0169; AVX512FP16-NEXT:    vmovaps %ymm1, %ymm1170; AVX512FP16-NEXT:    vscalefph %zmm1, %zmm0, %zmm0171; AVX512FP16-NEXT:    # kill: def $ymm0 killed $ymm0 killed $zmm0172; AVX512FP16-NEXT:    retq173;174; AVX512VL-LABEL: test_ldexp_16xhalf:175; AVX512VL:       # %bb.0:176; AVX512VL-NEXT:    vpmovsxwd %ymm1, %zmm1177; AVX512VL-NEXT:    vcvtph2ps %ymm0, %zmm0178; AVX512VL-NEXT:    vscalefps %zmm1, %zmm0, %zmm0179; AVX512VL-NEXT:    vcvtps2ph $4, %zmm0, %ymm0180; AVX512VL-NEXT:    retq181;182; AVX512VLFP16-LABEL: test_ldexp_16xhalf:183; AVX512VLFP16:       # %bb.0:184; AVX512VLFP16-NEXT:    vcvtw2ph %ymm1, %ymm1185; AVX512VLFP16-NEXT:    vscalefph %ymm1, %ymm0, %ymm0186; AVX512VLFP16-NEXT:    retq187  %r = call <16 x half> @llvm.ldexp.v16f16.v16i16(<16 x half> %x, <16 x i16> %exp)188  ret <16 x half> %r189}190declare <16 x half> @llvm.ldexp.v16f16.v16i16(<16 x half>, <16 x i16>)191 192define <8 x float> @test_ldexp_8xfloat(<8 x float> %x, <8 x i32> %exp) nounwind {193; AVX512-LABEL: test_ldexp_8xfloat:194; AVX512:       # %bb.0:195; AVX512-NEXT:    vmovaps %ymm1, %ymm1196; AVX512-NEXT:    vmovaps %ymm0, %ymm0197; AVX512-NEXT:    vscalefps %zmm1, %zmm0, %zmm0198; AVX512-NEXT:    # kill: def $ymm0 killed $ymm0 killed $zmm0199; AVX512-NEXT:    retq200;201; AVX512VL-LABEL: test_ldexp_8xfloat:202; AVX512VL:       # %bb.0:203; AVX512VL-NEXT:    vcvtdq2ps %ymm1, %ymm1204; AVX512VL-NEXT:    vscalefps %ymm1, %ymm0, %ymm0205; AVX512VL-NEXT:    retq206;207; AVX512VLFP16-LABEL: test_ldexp_8xfloat:208; AVX512VLFP16:       # %bb.0:209; AVX512VLFP16-NEXT:    vcvtdq2ps %ymm1, %ymm1210; AVX512VLFP16-NEXT:    vscalefps %ymm1, %ymm0, %ymm0211; AVX512VLFP16-NEXT:    retq212  %r = call <8 x float> @llvm.ldexp.v8f32.v8i32(<8 x float> %x, <8 x i32> %exp)213  ret <8 x float> %r214}215declare <8 x float> @llvm.ldexp.v8f32.v8i32(<8 x float>, <8 x i32>)216 217define <4 x double> @test_ldexp_4xdouble(<4 x double> %x, <4 x i32> %exp) nounwind {218; AVX512-LABEL: test_ldexp_4xdouble:219; AVX512:       # %bb.0:220; AVX512-NEXT:    vmovapd %xmm1, %xmm1221; AVX512-NEXT:    vmovapd %ymm0, %ymm0222; AVX512-NEXT:    vscalefpd %zmm1, %zmm0, %zmm0223; AVX512-NEXT:    # kill: def $ymm0 killed $ymm0 killed $zmm0224; AVX512-NEXT:    retq225;226; AVX512VL-LABEL: test_ldexp_4xdouble:227; AVX512VL:       # %bb.0:228; AVX512VL-NEXT:    vcvtdq2pd %xmm1, %ymm1229; AVX512VL-NEXT:    vscalefpd %ymm1, %ymm0, %ymm0230; AVX512VL-NEXT:    retq231;232; AVX512VLFP16-LABEL: test_ldexp_4xdouble:233; AVX512VLFP16:       # %bb.0:234; AVX512VLFP16-NEXT:    vcvtdq2pd %xmm1, %ymm1235; AVX512VLFP16-NEXT:    vscalefpd %ymm1, %ymm0, %ymm0236; AVX512VLFP16-NEXT:    retq237  %r = call <4 x double> @llvm.ldexp.v4f64.v4i32(<4 x double> %x, <4 x i32> %exp)238  ret <4 x double> %r239}240declare <4 x double> @llvm.ldexp.v4f64.v4i32(<4 x double>, <4 x i32>)241 242define <32 x half> @test_ldexp_32xhalf(<32 x half> %x, <32 x i16> %exp) nounwind {243; AVX512F-LABEL: test_ldexp_32xhalf:244; AVX512F:       # %bb.0:245; AVX512F-NEXT:    vpmovsxwd %ymm1, %zmm2246; AVX512F-NEXT:    vcvtph2ps %ymm0, %zmm3247; AVX512F-NEXT:    vscalefps %zmm2, %zmm3, %zmm2248; AVX512F-NEXT:    vcvtps2ph $4, %zmm2, %ymm2249; AVX512F-NEXT:    vextracti64x4 $1, %zmm1, %ymm1250; AVX512F-NEXT:    vpmovsxwd %ymm1, %zmm1251; AVX512F-NEXT:    vextractf64x4 $1, %zmm0, %ymm0252; AVX512F-NEXT:    vcvtph2ps %ymm0, %zmm0253; AVX512F-NEXT:    vscalefps %zmm1, %zmm0, %zmm0254; AVX512F-NEXT:    vcvtps2ph $4, %zmm0, %ymm0255; AVX512F-NEXT:    vinsertf64x4 $1, %ymm0, %zmm2, %zmm0256; AVX512F-NEXT:    retq257;258; AVX512FP16-LABEL: test_ldexp_32xhalf:259; AVX512FP16:       # %bb.0:260; AVX512FP16-NEXT:    vcvtw2ph %zmm1, %zmm1261; AVX512FP16-NEXT:    vscalefph %zmm1, %zmm0, %zmm0262; AVX512FP16-NEXT:    retq263;264; AVX512VL-LABEL: test_ldexp_32xhalf:265; AVX512VL:       # %bb.0:266; AVX512VL-NEXT:    vpmovsxwd %ymm1, %zmm2267; AVX512VL-NEXT:    vcvtph2ps %ymm0, %zmm3268; AVX512VL-NEXT:    vscalefps %zmm2, %zmm3, %zmm2269; AVX512VL-NEXT:    vcvtps2ph $4, %zmm2, %ymm2270; AVX512VL-NEXT:    vextracti64x4 $1, %zmm1, %ymm1271; AVX512VL-NEXT:    vpmovsxwd %ymm1, %zmm1272; AVX512VL-NEXT:    vextractf64x4 $1, %zmm0, %ymm0273; AVX512VL-NEXT:    vcvtph2ps %ymm0, %zmm0274; AVX512VL-NEXT:    vscalefps %zmm1, %zmm0, %zmm0275; AVX512VL-NEXT:    vcvtps2ph $4, %zmm0, %ymm0276; AVX512VL-NEXT:    vinsertf64x4 $1, %ymm0, %zmm2, %zmm0277; AVX512VL-NEXT:    retq278;279; AVX512VLFP16-LABEL: test_ldexp_32xhalf:280; AVX512VLFP16:       # %bb.0:281; AVX512VLFP16-NEXT:    vcvtw2ph %zmm1, %zmm1282; AVX512VLFP16-NEXT:    vscalefph %zmm1, %zmm0, %zmm0283; AVX512VLFP16-NEXT:    retq284  %r = call <32 x half> @llvm.ldexp.v32f16.v32i16(<32 x half> %x, <32 x i16> %exp)285  ret <32 x half> %r286}287declare <32 x half> @llvm.ldexp.v32f16.v32i16(<32 x half>, <32 x i16>)288 289define <16 x float> @test_ldexp_16xfloat(<16 x float> %x, <16 x i32> %exp) nounwind {290; CHECK-LABEL: test_ldexp_16xfloat:291; CHECK:       # %bb.0:292; CHECK-NEXT:    vcvtdq2ps %zmm1, %zmm1293; CHECK-NEXT:    vscalefps %zmm1, %zmm0, %zmm0294; CHECK-NEXT:    retq295  %r = call <16 x float> @llvm.ldexp.v16f32.v16i32(<16 x float> %x, <16 x i32> %exp)296  ret <16 x float> %r297}298declare <16 x float> @llvm.ldexp.v16f32.v16i32(<16 x float>, <16 x i32>)299 300define <8 x double> @test_ldexp_8xdouble(<8 x double> %x, <8 x i32> %exp) nounwind {301; CHECK-LABEL: test_ldexp_8xdouble:302; CHECK:       # %bb.0:303; CHECK-NEXT:    vcvtdq2pd %ymm1, %zmm1304; CHECK-NEXT:    vscalefpd %zmm1, %zmm0, %zmm0305; CHECK-NEXT:    retq306  %r = call <8 x double> @llvm.ldexp.v8f64.v8i32(<8 x double> %x, <8 x i32> %exp)307  ret <8 x double> %r308}309declare <8 x double> @llvm.ldexp.v8f64.v8i32(<8 x double>, <8 x i32>)310 311;; NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line:312; AVX512VLF: {{.*}}313