533 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -mtriple=i686-- -mattr=+sse2 | FileCheck %s --check-prefixes=SSE3; RUN: llc < %s -mtriple=i686-- -mattr=+avx | FileCheck %s --check-prefixes=AVX4; RUN: llc < %s -mtriple=i686-- -mcpu=x86-64-v4 | FileCheck %s --check-prefixes=AVX5125 6define zeroext i8 @oeq_f64_i32(double %x) nounwind readnone {7; SSE-LABEL: oeq_f64_i32:8; SSE: # %bb.0: # %entry9; SSE-NEXT: movsd {{.*#+}} xmm0 = mem[0],zero10; SSE-NEXT: cvttpd2dq %xmm0, %xmm111; SSE-NEXT: cvtdq2pd %xmm1, %xmm112; SSE-NEXT: cmpeqsd %xmm0, %xmm113; SSE-NEXT: movd %xmm1, %eax14; SSE-NEXT: andl $1, %eax15; SSE-NEXT: # kill: def $al killed $al killed $eax16; SSE-NEXT: retl17;18; AVX-LABEL: oeq_f64_i32:19; AVX: # %bb.0: # %entry20; AVX-NEXT: vmovsd {{.*#+}} xmm0 = mem[0],zero21; AVX-NEXT: vcvttpd2dq %xmm0, %xmm122; AVX-NEXT: vcvtdq2pd %xmm1, %xmm123; AVX-NEXT: vcmpeqsd %xmm0, %xmm1, %xmm024; AVX-NEXT: vmovd %xmm0, %eax25; AVX-NEXT: andl $1, %eax26; AVX-NEXT: # kill: def $al killed $al killed $eax27; AVX-NEXT: retl28;29; AVX512-LABEL: oeq_f64_i32:30; AVX512: # %bb.0: # %entry31; AVX512-NEXT: vmovsd {{.*#+}} xmm0 = mem[0],zero32; AVX512-NEXT: vcvttpd2dq %xmm0, %xmm133; AVX512-NEXT: vcvtdq2pd %xmm1, %xmm134; AVX512-NEXT: vcmpeqsd %xmm0, %xmm1, %k035; AVX512-NEXT: kmovd %k0, %eax36; AVX512-NEXT: # kill: def $al killed $al killed $eax37; AVX512-NEXT: retl38entry:39 %0 = fptosi double %x to i3240 %1 = sitofp i32 %0 to double41 %2 = fcmp oeq double %1, %x42 %retval12 = zext i1 %2 to i843 ret i8 %retval1244}45 46define zeroext i8 @oeq_f64_u32(double %x) nounwind readnone {47; SSE-LABEL: oeq_f64_u32:48; SSE: # %bb.0: # %entry49; SSE-NEXT: movsd {{.*#+}} xmm0 = mem[0],zero50; SSE-NEXT: cvttsd2si %xmm0, %eax51; SSE-NEXT: movl %eax, %ecx52; SSE-NEXT: sarl $31, %ecx53; SSE-NEXT: movapd %xmm0, %xmm154; SSE-NEXT: subsd {{\.?LCPI[0-9]+_[0-9]+}}, %xmm155; SSE-NEXT: cvttsd2si %xmm1, %edx56; SSE-NEXT: andl %ecx, %edx57; SSE-NEXT: orl %eax, %edx58; SSE-NEXT: movd %edx, %xmm159; SSE-NEXT: por {{\.?LCPI[0-9]+_[0-9]+}}, %xmm160; SSE-NEXT: subsd {{\.?LCPI[0-9]+_[0-9]+}}, %xmm161; SSE-NEXT: cmpeqsd %xmm0, %xmm162; SSE-NEXT: movd %xmm1, %eax63; SSE-NEXT: andl $1, %eax64; SSE-NEXT: # kill: def $al killed $al killed $eax65; SSE-NEXT: retl66;67; AVX-LABEL: oeq_f64_u32:68; AVX: # %bb.0: # %entry69; AVX-NEXT: vmovsd {{.*#+}} xmm0 = mem[0],zero70; AVX-NEXT: vcvttsd2si %xmm0, %eax71; AVX-NEXT: movl %eax, %ecx72; AVX-NEXT: sarl $31, %ecx73; AVX-NEXT: vsubsd {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0, %xmm174; AVX-NEXT: vcvttsd2si %xmm1, %edx75; AVX-NEXT: andl %ecx, %edx76; AVX-NEXT: orl %eax, %edx77; AVX-NEXT: vmovd %edx, %xmm178; AVX-NEXT: vpor {{\.?LCPI[0-9]+_[0-9]+}}, %xmm1, %xmm179; AVX-NEXT: vsubsd {{\.?LCPI[0-9]+_[0-9]+}}, %xmm1, %xmm180; AVX-NEXT: vcmpeqsd %xmm0, %xmm1, %xmm081; AVX-NEXT: vmovd %xmm0, %eax82; AVX-NEXT: andl $1, %eax83; AVX-NEXT: # kill: def $al killed $al killed $eax84; AVX-NEXT: retl85;86; AVX512-LABEL: oeq_f64_u32:87; AVX512: # %bb.0: # %entry88; AVX512-NEXT: vmovsd {{.*#+}} xmm0 = mem[0],zero89; AVX512-NEXT: vcvttsd2usi %xmm0, %eax90; AVX512-NEXT: vcvtusi2sd %eax, %xmm7, %xmm191; AVX512-NEXT: vcmpeqsd %xmm0, %xmm1, %k092; AVX512-NEXT: kmovd %k0, %eax93; AVX512-NEXT: # kill: def $al killed $al killed $eax94; AVX512-NEXT: retl95entry:96 %0 = fptoui double %x to i3297 %1 = uitofp i32 %0 to double98 %2 = fcmp oeq double %1, %x99 %retval12 = zext i1 %2 to i8100 ret i8 %retval12101}102 103define zeroext i8 @oeq_f64_i64(double %x) nounwind readnone {104; SSE-LABEL: oeq_f64_i64:105; SSE: # %bb.0: # %entry106; SSE-NEXT: pushl %ebp107; SSE-NEXT: movl %esp, %ebp108; SSE-NEXT: andl $-8, %esp109; SSE-NEXT: subl $32, %esp110; SSE-NEXT: movsd {{.*#+}} xmm0 = mem[0],zero111; SSE-NEXT: movsd %xmm0, {{[0-9]+}}(%esp)112; SSE-NEXT: fldl {{[0-9]+}}(%esp)113; SSE-NEXT: fnstcw {{[0-9]+}}(%esp)114; SSE-NEXT: movzwl {{[0-9]+}}(%esp), %eax115; SSE-NEXT: orl $3072, %eax # imm = 0xC00116; SSE-NEXT: movw %ax, {{[0-9]+}}(%esp)117; SSE-NEXT: fldcw {{[0-9]+}}(%esp)118; SSE-NEXT: fistpll {{[0-9]+}}(%esp)119; SSE-NEXT: fldcw {{[0-9]+}}(%esp)120; SSE-NEXT: movsd {{.*#+}} xmm1 = mem[0],zero121; SSE-NEXT: movlps %xmm1, {{[0-9]+}}(%esp)122; SSE-NEXT: fildll {{[0-9]+}}(%esp)123; SSE-NEXT: fstpl {{[0-9]+}}(%esp)124; SSE-NEXT: cmpeqsd {{[0-9]+}}(%esp), %xmm0125; SSE-NEXT: movd %xmm0, %eax126; SSE-NEXT: andl $1, %eax127; SSE-NEXT: # kill: def $al killed $al killed $eax128; SSE-NEXT: movl %ebp, %esp129; SSE-NEXT: popl %ebp130; SSE-NEXT: retl131;132; AVX-LABEL: oeq_f64_i64:133; AVX: # %bb.0: # %entry134; AVX-NEXT: pushl %ebp135; AVX-NEXT: movl %esp, %ebp136; AVX-NEXT: andl $-8, %esp137; AVX-NEXT: subl $24, %esp138; AVX-NEXT: vmovsd {{.*#+}} xmm0 = mem[0],zero139; AVX-NEXT: vmovsd %xmm0, (%esp)140; AVX-NEXT: fldl (%esp)141; AVX-NEXT: fisttpll (%esp)142; AVX-NEXT: vmovsd {{.*#+}} xmm1 = mem[0],zero143; AVX-NEXT: vmovlps %xmm1, {{[0-9]+}}(%esp)144; AVX-NEXT: fildll {{[0-9]+}}(%esp)145; AVX-NEXT: fstpl {{[0-9]+}}(%esp)146; AVX-NEXT: vcmpeqsd {{[0-9]+}}(%esp), %xmm0, %xmm0147; AVX-NEXT: vmovd %xmm0, %eax148; AVX-NEXT: andl $1, %eax149; AVX-NEXT: # kill: def $al killed $al killed $eax150; AVX-NEXT: movl %ebp, %esp151; AVX-NEXT: popl %ebp152; AVX-NEXT: retl153;154; AVX512-LABEL: oeq_f64_i64:155; AVX512: # %bb.0: # %entry156; AVX512-NEXT: vmovsd {{.*#+}} xmm0 = mem[0],zero157; AVX512-NEXT: vcvttpd2qq %xmm0, %xmm1158; AVX512-NEXT: vcvtqq2pd %ymm1, %ymm1159; AVX512-NEXT: vcmpeqsd %xmm0, %xmm1, %k0160; AVX512-NEXT: kmovd %k0, %eax161; AVX512-NEXT: # kill: def $al killed $al killed $eax162; AVX512-NEXT: vzeroupper163; AVX512-NEXT: retl164entry:165 %0 = fptosi double %x to i64166 %1 = sitofp i64 %0 to double167 %2 = fcmp oeq double %1, %x168 %retval12 = zext i1 %2 to i8169 ret i8 %retval12170}171 172define zeroext i8 @oeq_f64_u64(double %x) nounwind readnone {173; SSE-LABEL: oeq_f64_u64:174; SSE: # %bb.0: # %entry175; SSE-NEXT: pushl %ebp176; SSE-NEXT: movl %esp, %ebp177; SSE-NEXT: andl $-8, %esp178; SSE-NEXT: subl $16, %esp179; SSE-NEXT: movsd {{.*#+}} xmm0 = mem[0],zero180; SSE-NEXT: movsd {{.*#+}} xmm1 = [9.2233720368547758E+18,0.0E+0]181; SSE-NEXT: ucomisd %xmm0, %xmm1182; SSE-NEXT: jbe .LBB3_2183; SSE-NEXT: # %bb.1: # %entry184; SSE-NEXT: xorpd %xmm1, %xmm1185; SSE-NEXT: .LBB3_2: # %entry186; SSE-NEXT: movapd %xmm0, %xmm2187; SSE-NEXT: subsd %xmm1, %xmm2188; SSE-NEXT: movsd %xmm2, {{[0-9]+}}(%esp)189; SSE-NEXT: setbe %al190; SSE-NEXT: fldl {{[0-9]+}}(%esp)191; SSE-NEXT: fnstcw {{[0-9]+}}(%esp)192; SSE-NEXT: movzwl {{[0-9]+}}(%esp), %ecx193; SSE-NEXT: orl $3072, %ecx # imm = 0xC00194; SSE-NEXT: movw %cx, {{[0-9]+}}(%esp)195; SSE-NEXT: fldcw {{[0-9]+}}(%esp)196; SSE-NEXT: fistpll {{[0-9]+}}(%esp)197; SSE-NEXT: fldcw {{[0-9]+}}(%esp)198; SSE-NEXT: movzbl %al, %eax199; SSE-NEXT: shll $31, %eax200; SSE-NEXT: xorl {{[0-9]+}}(%esp), %eax201; SSE-NEXT: movd %eax, %xmm1202; SSE-NEXT: movd {{.*#+}} xmm2 = mem[0],zero,zero,zero203; SSE-NEXT: punpckldq {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1]204; SSE-NEXT: punpckldq {{.*#+}} xmm2 = xmm2[0],mem[0],xmm2[1],mem[1]205; SSE-NEXT: subpd {{\.?LCPI[0-9]+_[0-9]+}}, %xmm2206; SSE-NEXT: movapd %xmm2, %xmm1207; SSE-NEXT: unpckhpd {{.*#+}} xmm1 = xmm1[1],xmm2[1]208; SSE-NEXT: addsd %xmm2, %xmm1209; SSE-NEXT: cmpeqsd %xmm0, %xmm1210; SSE-NEXT: movd %xmm1, %eax211; SSE-NEXT: andl $1, %eax212; SSE-NEXT: # kill: def $al killed $al killed $eax213; SSE-NEXT: movl %ebp, %esp214; SSE-NEXT: popl %ebp215; SSE-NEXT: retl216;217; AVX-LABEL: oeq_f64_u64:218; AVX: # %bb.0: # %entry219; AVX-NEXT: pushl %ebp220; AVX-NEXT: movl %esp, %ebp221; AVX-NEXT: andl $-8, %esp222; AVX-NEXT: subl $8, %esp223; AVX-NEXT: vmovsd {{.*#+}} xmm0 = mem[0],zero224; AVX-NEXT: vmovsd {{.*#+}} xmm1 = [9.2233720368547758E+18,0.0E+0]225; AVX-NEXT: vucomisd %xmm0, %xmm1226; AVX-NEXT: jbe .LBB3_2227; AVX-NEXT: # %bb.1: # %entry228; AVX-NEXT: vxorpd %xmm1, %xmm1, %xmm1229; AVX-NEXT: .LBB3_2: # %entry230; AVX-NEXT: vsubsd %xmm1, %xmm0, %xmm1231; AVX-NEXT: vmovsd %xmm1, (%esp)232; AVX-NEXT: fldl (%esp)233; AVX-NEXT: fisttpll (%esp)234; AVX-NEXT: setbe %al235; AVX-NEXT: movzbl %al, %eax236; AVX-NEXT: shll $31, %eax237; AVX-NEXT: xorl {{[0-9]+}}(%esp), %eax238; AVX-NEXT: vmovd {{.*#+}} xmm1 = mem[0],zero,zero,zero239; AVX-NEXT: vpinsrd $1, %eax, %xmm1, %xmm1240; AVX-NEXT: vpunpckldq {{.*#+}} xmm1 = xmm1[0],mem[0],xmm1[1],mem[1]241; AVX-NEXT: vsubpd {{\.?LCPI[0-9]+_[0-9]+}}, %xmm1, %xmm1242; AVX-NEXT: vshufpd {{.*#+}} xmm2 = xmm1[1,0]243; AVX-NEXT: vaddsd %xmm1, %xmm2, %xmm1244; AVX-NEXT: vcmpeqsd %xmm0, %xmm1, %xmm0245; AVX-NEXT: vmovd %xmm0, %eax246; AVX-NEXT: andl $1, %eax247; AVX-NEXT: # kill: def $al killed $al killed $eax248; AVX-NEXT: movl %ebp, %esp249; AVX-NEXT: popl %ebp250; AVX-NEXT: retl251;252; AVX512-LABEL: oeq_f64_u64:253; AVX512: # %bb.0: # %entry254; AVX512-NEXT: vmovsd {{.*#+}} xmm0 = mem[0],zero255; AVX512-NEXT: vcvttpd2uqq %xmm0, %xmm1256; AVX512-NEXT: vcvtuqq2pd %ymm1, %ymm1257; AVX512-NEXT: vcmpeqsd %xmm0, %xmm1, %k0258; AVX512-NEXT: kmovd %k0, %eax259; AVX512-NEXT: # kill: def $al killed $al killed $eax260; AVX512-NEXT: vzeroupper261; AVX512-NEXT: retl262entry:263 %0 = fptoui double %x to i64264 %1 = uitofp i64 %0 to double265 %2 = fcmp oeq double %1, %x266 %retval12 = zext i1 %2 to i8267 ret i8 %retval12268}269 270define zeroext i8 @une_f64_i32(double %x) nounwind readnone {271; SSE-LABEL: une_f64_i32:272; SSE: # %bb.0: # %entry273; SSE-NEXT: movsd {{.*#+}} xmm0 = mem[0],zero274; SSE-NEXT: cvttpd2dq %xmm0, %xmm1275; SSE-NEXT: cvtdq2pd %xmm1, %xmm1276; SSE-NEXT: cmpneqsd %xmm0, %xmm1277; SSE-NEXT: movd %xmm1, %eax278; SSE-NEXT: andl $1, %eax279; SSE-NEXT: # kill: def $al killed $al killed $eax280; SSE-NEXT: retl281;282; AVX-LABEL: une_f64_i32:283; AVX: # %bb.0: # %entry284; AVX-NEXT: vmovsd {{.*#+}} xmm0 = mem[0],zero285; AVX-NEXT: vcvttpd2dq %xmm0, %xmm1286; AVX-NEXT: vcvtdq2pd %xmm1, %xmm1287; AVX-NEXT: vcmpneqsd %xmm0, %xmm1, %xmm0288; AVX-NEXT: vmovd %xmm0, %eax289; AVX-NEXT: andl $1, %eax290; AVX-NEXT: # kill: def $al killed $al killed $eax291; AVX-NEXT: retl292;293; AVX512-LABEL: une_f64_i32:294; AVX512: # %bb.0: # %entry295; AVX512-NEXT: vmovsd {{.*#+}} xmm0 = mem[0],zero296; AVX512-NEXT: vcvttpd2dq %xmm0, %xmm1297; AVX512-NEXT: vcvtdq2pd %xmm1, %xmm1298; AVX512-NEXT: vcmpneqsd %xmm0, %xmm1, %k0299; AVX512-NEXT: kmovd %k0, %eax300; AVX512-NEXT: # kill: def $al killed $al killed $eax301; AVX512-NEXT: retl302entry:303 %0 = fptosi double %x to i32304 %1 = sitofp i32 %0 to double305 %2 = fcmp une double %1, %x306 %retval12 = zext i1 %2 to i8307 ret i8 %retval12308}309 310define zeroext i8 @une_f64_u32(double %x) nounwind readnone {311; SSE-LABEL: une_f64_u32:312; SSE: # %bb.0: # %entry313; SSE-NEXT: movsd {{.*#+}} xmm0 = mem[0],zero314; SSE-NEXT: cvttsd2si %xmm0, %eax315; SSE-NEXT: movl %eax, %ecx316; SSE-NEXT: sarl $31, %ecx317; SSE-NEXT: movapd %xmm0, %xmm1318; SSE-NEXT: subsd {{\.?LCPI[0-9]+_[0-9]+}}, %xmm1319; SSE-NEXT: cvttsd2si %xmm1, %edx320; SSE-NEXT: andl %ecx, %edx321; SSE-NEXT: orl %eax, %edx322; SSE-NEXT: movd %edx, %xmm1323; SSE-NEXT: por {{\.?LCPI[0-9]+_[0-9]+}}, %xmm1324; SSE-NEXT: subsd {{\.?LCPI[0-9]+_[0-9]+}}, %xmm1325; SSE-NEXT: cmpneqsd %xmm0, %xmm1326; SSE-NEXT: movd %xmm1, %eax327; SSE-NEXT: andl $1, %eax328; SSE-NEXT: # kill: def $al killed $al killed $eax329; SSE-NEXT: retl330;331; AVX-LABEL: une_f64_u32:332; AVX: # %bb.0: # %entry333; AVX-NEXT: vmovsd {{.*#+}} xmm0 = mem[0],zero334; AVX-NEXT: vcvttsd2si %xmm0, %eax335; AVX-NEXT: movl %eax, %ecx336; AVX-NEXT: sarl $31, %ecx337; AVX-NEXT: vsubsd {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0, %xmm1338; AVX-NEXT: vcvttsd2si %xmm1, %edx339; AVX-NEXT: andl %ecx, %edx340; AVX-NEXT: orl %eax, %edx341; AVX-NEXT: vmovd %edx, %xmm1342; AVX-NEXT: vpor {{\.?LCPI[0-9]+_[0-9]+}}, %xmm1, %xmm1343; AVX-NEXT: vsubsd {{\.?LCPI[0-9]+_[0-9]+}}, %xmm1, %xmm1344; AVX-NEXT: vcmpneqsd %xmm0, %xmm1, %xmm0345; AVX-NEXT: vmovd %xmm0, %eax346; AVX-NEXT: andl $1, %eax347; AVX-NEXT: # kill: def $al killed $al killed $eax348; AVX-NEXT: retl349;350; AVX512-LABEL: une_f64_u32:351; AVX512: # %bb.0: # %entry352; AVX512-NEXT: vmovsd {{.*#+}} xmm0 = mem[0],zero353; AVX512-NEXT: vcvttsd2usi %xmm0, %eax354; AVX512-NEXT: vcvtusi2sd %eax, %xmm7, %xmm1355; AVX512-NEXT: vcmpneqsd %xmm0, %xmm1, %k0356; AVX512-NEXT: kmovd %k0, %eax357; AVX512-NEXT: # kill: def $al killed $al killed $eax358; AVX512-NEXT: retl359entry:360 %0 = fptoui double %x to i32361 %1 = uitofp i32 %0 to double362 %2 = fcmp une double %1, %x363 %retval12 = zext i1 %2 to i8364 ret i8 %retval12365}366 367define zeroext i8 @une_f64_i64(double %x) nounwind readnone {368; SSE-LABEL: une_f64_i64:369; SSE: # %bb.0: # %entry370; SSE-NEXT: pushl %ebp371; SSE-NEXT: movl %esp, %ebp372; SSE-NEXT: andl $-8, %esp373; SSE-NEXT: subl $32, %esp374; SSE-NEXT: movsd {{.*#+}} xmm0 = mem[0],zero375; SSE-NEXT: movsd %xmm0, {{[0-9]+}}(%esp)376; SSE-NEXT: fldl {{[0-9]+}}(%esp)377; SSE-NEXT: fnstcw {{[0-9]+}}(%esp)378; SSE-NEXT: movzwl {{[0-9]+}}(%esp), %eax379; SSE-NEXT: orl $3072, %eax # imm = 0xC00380; SSE-NEXT: movw %ax, {{[0-9]+}}(%esp)381; SSE-NEXT: fldcw {{[0-9]+}}(%esp)382; SSE-NEXT: fistpll {{[0-9]+}}(%esp)383; SSE-NEXT: fldcw {{[0-9]+}}(%esp)384; SSE-NEXT: movsd {{.*#+}} xmm1 = mem[0],zero385; SSE-NEXT: movlps %xmm1, {{[0-9]+}}(%esp)386; SSE-NEXT: fildll {{[0-9]+}}(%esp)387; SSE-NEXT: fstpl {{[0-9]+}}(%esp)388; SSE-NEXT: cmpneqsd {{[0-9]+}}(%esp), %xmm0389; SSE-NEXT: movd %xmm0, %eax390; SSE-NEXT: andl $1, %eax391; SSE-NEXT: # kill: def $al killed $al killed $eax392; SSE-NEXT: movl %ebp, %esp393; SSE-NEXT: popl %ebp394; SSE-NEXT: retl395;396; AVX-LABEL: une_f64_i64:397; AVX: # %bb.0: # %entry398; AVX-NEXT: pushl %ebp399; AVX-NEXT: movl %esp, %ebp400; AVX-NEXT: andl $-8, %esp401; AVX-NEXT: subl $24, %esp402; AVX-NEXT: vmovsd {{.*#+}} xmm0 = mem[0],zero403; AVX-NEXT: vmovsd %xmm0, (%esp)404; AVX-NEXT: fldl (%esp)405; AVX-NEXT: fisttpll (%esp)406; AVX-NEXT: vmovsd {{.*#+}} xmm1 = mem[0],zero407; AVX-NEXT: vmovlps %xmm1, {{[0-9]+}}(%esp)408; AVX-NEXT: fildll {{[0-9]+}}(%esp)409; AVX-NEXT: fstpl {{[0-9]+}}(%esp)410; AVX-NEXT: vcmpneqsd {{[0-9]+}}(%esp), %xmm0, %xmm0411; AVX-NEXT: vmovd %xmm0, %eax412; AVX-NEXT: andl $1, %eax413; AVX-NEXT: # kill: def $al killed $al killed $eax414; AVX-NEXT: movl %ebp, %esp415; AVX-NEXT: popl %ebp416; AVX-NEXT: retl417;418; AVX512-LABEL: une_f64_i64:419; AVX512: # %bb.0: # %entry420; AVX512-NEXT: vmovsd {{.*#+}} xmm0 = mem[0],zero421; AVX512-NEXT: vcvttpd2qq %xmm0, %xmm1422; AVX512-NEXT: vcvtqq2pd %ymm1, %ymm1423; AVX512-NEXT: vcmpneqsd %xmm0, %xmm1, %k0424; AVX512-NEXT: kmovd %k0, %eax425; AVX512-NEXT: # kill: def $al killed $al killed $eax426; AVX512-NEXT: vzeroupper427; AVX512-NEXT: retl428entry:429 %0 = fptosi double %x to i64430 %1 = sitofp i64 %0 to double431 %2 = fcmp une double %1, %x432 %retval12 = zext i1 %2 to i8433 ret i8 %retval12434}435 436define zeroext i8 @une_f64_u64(double %x) nounwind readnone {437; SSE-LABEL: une_f64_u64:438; SSE: # %bb.0: # %entry439; SSE-NEXT: pushl %ebp440; SSE-NEXT: movl %esp, %ebp441; SSE-NEXT: andl $-8, %esp442; SSE-NEXT: subl $16, %esp443; SSE-NEXT: movsd {{.*#+}} xmm0 = mem[0],zero444; SSE-NEXT: movsd {{.*#+}} xmm1 = [9.2233720368547758E+18,0.0E+0]445; SSE-NEXT: ucomisd %xmm0, %xmm1446; SSE-NEXT: jbe .LBB7_2447; SSE-NEXT: # %bb.1: # %entry448; SSE-NEXT: xorpd %xmm1, %xmm1449; SSE-NEXT: .LBB7_2: # %entry450; SSE-NEXT: movapd %xmm0, %xmm2451; SSE-NEXT: subsd %xmm1, %xmm2452; SSE-NEXT: movsd %xmm2, {{[0-9]+}}(%esp)453; SSE-NEXT: setbe %al454; SSE-NEXT: fldl {{[0-9]+}}(%esp)455; SSE-NEXT: fnstcw {{[0-9]+}}(%esp)456; SSE-NEXT: movzwl {{[0-9]+}}(%esp), %ecx457; SSE-NEXT: orl $3072, %ecx # imm = 0xC00458; SSE-NEXT: movw %cx, {{[0-9]+}}(%esp)459; SSE-NEXT: fldcw {{[0-9]+}}(%esp)460; SSE-NEXT: fistpll {{[0-9]+}}(%esp)461; SSE-NEXT: fldcw {{[0-9]+}}(%esp)462; SSE-NEXT: movzbl %al, %eax463; SSE-NEXT: shll $31, %eax464; SSE-NEXT: xorl {{[0-9]+}}(%esp), %eax465; SSE-NEXT: movd %eax, %xmm1466; SSE-NEXT: movd {{.*#+}} xmm2 = mem[0],zero,zero,zero467; SSE-NEXT: punpckldq {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1]468; SSE-NEXT: punpckldq {{.*#+}} xmm2 = xmm2[0],mem[0],xmm2[1],mem[1]469; SSE-NEXT: subpd {{\.?LCPI[0-9]+_[0-9]+}}, %xmm2470; SSE-NEXT: movapd %xmm2, %xmm1471; SSE-NEXT: unpckhpd {{.*#+}} xmm1 = xmm1[1],xmm2[1]472; SSE-NEXT: addsd %xmm2, %xmm1473; SSE-NEXT: cmpneqsd %xmm0, %xmm1474; SSE-NEXT: movd %xmm1, %eax475; SSE-NEXT: andl $1, %eax476; SSE-NEXT: # kill: def $al killed $al killed $eax477; SSE-NEXT: movl %ebp, %esp478; SSE-NEXT: popl %ebp479; SSE-NEXT: retl480;481; AVX-LABEL: une_f64_u64:482; AVX: # %bb.0: # %entry483; AVX-NEXT: pushl %ebp484; AVX-NEXT: movl %esp, %ebp485; AVX-NEXT: andl $-8, %esp486; AVX-NEXT: subl $8, %esp487; AVX-NEXT: vmovsd {{.*#+}} xmm0 = mem[0],zero488; AVX-NEXT: vmovsd {{.*#+}} xmm1 = [9.2233720368547758E+18,0.0E+0]489; AVX-NEXT: vucomisd %xmm0, %xmm1490; AVX-NEXT: jbe .LBB7_2491; AVX-NEXT: # %bb.1: # %entry492; AVX-NEXT: vxorpd %xmm1, %xmm1, %xmm1493; AVX-NEXT: .LBB7_2: # %entry494; AVX-NEXT: vsubsd %xmm1, %xmm0, %xmm1495; AVX-NEXT: vmovsd %xmm1, (%esp)496; AVX-NEXT: fldl (%esp)497; AVX-NEXT: fisttpll (%esp)498; AVX-NEXT: setbe %al499; AVX-NEXT: movzbl %al, %eax500; AVX-NEXT: shll $31, %eax501; AVX-NEXT: xorl {{[0-9]+}}(%esp), %eax502; AVX-NEXT: vmovd {{.*#+}} xmm1 = mem[0],zero,zero,zero503; AVX-NEXT: vpinsrd $1, %eax, %xmm1, %xmm1504; AVX-NEXT: vpunpckldq {{.*#+}} xmm1 = xmm1[0],mem[0],xmm1[1],mem[1]505; AVX-NEXT: vsubpd {{\.?LCPI[0-9]+_[0-9]+}}, %xmm1, %xmm1506; AVX-NEXT: vshufpd {{.*#+}} xmm2 = xmm1[1,0]507; AVX-NEXT: vaddsd %xmm1, %xmm2, %xmm1508; AVX-NEXT: vcmpneqsd %xmm0, %xmm1, %xmm0509; AVX-NEXT: vmovd %xmm0, %eax510; AVX-NEXT: andl $1, %eax511; AVX-NEXT: # kill: def $al killed $al killed $eax512; AVX-NEXT: movl %ebp, %esp513; AVX-NEXT: popl %ebp514; AVX-NEXT: retl515;516; AVX512-LABEL: une_f64_u64:517; AVX512: # %bb.0: # %entry518; AVX512-NEXT: vmovsd {{.*#+}} xmm0 = mem[0],zero519; AVX512-NEXT: vcvttpd2uqq %xmm0, %xmm1520; AVX512-NEXT: vcvtuqq2pd %ymm1, %ymm1521; AVX512-NEXT: vcmpneqsd %xmm0, %xmm1, %k0522; AVX512-NEXT: kmovd %k0, %eax523; AVX512-NEXT: # kill: def $al killed $al killed $eax524; AVX512-NEXT: vzeroupper525; AVX512-NEXT: retl526entry:527 %0 = fptoui double %x to i64528 %1 = uitofp i64 %0 to double529 %2 = fcmp une double %1, %x530 %retval12 = zext i1 %2 to i8531 ret i8 %retval12532}533