731 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -mtriple=i686-unknown-unknown -mattr=+sse2 -O3 | FileCheck %s --check-prefixes=SSE-X863; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse2 -O3 | FileCheck %s --check-prefixes=SSE-X644; RUN: llc < %s -mtriple=i686-unknown-unknown -mattr=+fma -O3 | FileCheck %s --check-prefixes=AVX-X865; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+fma -O3 | FileCheck %s --check-prefixes=AVX-X646; RUN: llc < %s -mtriple=i686-unknown-unknown -mattr=+avx512f -mattr=+avx512vl -O3 | FileCheck %s --check-prefixes=AVX-X867; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f -mattr=+avx512vl -O3 | FileCheck %s --check-prefixes=AVX-X648; RUN: llc < %s -mtriple=i686-unknown-unknown -mattr=-sse -O3 | FileCheck %s --check-prefixes=X879 10declare double @llvm.experimental.constrained.fadd.f64(double, double, metadata, metadata)11declare float @llvm.experimental.constrained.fadd.f32(float, float, metadata, metadata)12declare double @llvm.experimental.constrained.fsub.f64(double, double, metadata, metadata)13declare float @llvm.experimental.constrained.fsub.f32(float, float, metadata, metadata)14declare double @llvm.experimental.constrained.fmul.f64(double, double, metadata, metadata)15declare float @llvm.experimental.constrained.fmul.f32(float, float, metadata, metadata)16declare double @llvm.experimental.constrained.fdiv.f64(double, double, metadata, metadata)17declare float @llvm.experimental.constrained.fdiv.f32(float, float, metadata, metadata)18declare double @llvm.experimental.constrained.fpext.f64.f32(float, metadata)19declare float @llvm.experimental.constrained.fptrunc.f32.f64(double, metadata, metadata)20declare float @llvm.experimental.constrained.sqrt.f32(float, metadata, metadata)21declare double @llvm.experimental.constrained.sqrt.f64(double, metadata, metadata)22declare float @llvm.experimental.constrained.fma.f32(float, float, float, metadata, metadata)23declare double @llvm.experimental.constrained.fma.f64(double, double, double, metadata, metadata)24 25define double @fadd_f64(double %a, double %b) nounwind strictfp {26; SSE-X86-LABEL: fadd_f64:27; SSE-X86: # %bb.0:28; SSE-X86-NEXT: pushl %ebp29; SSE-X86-NEXT: movl %esp, %ebp30; SSE-X86-NEXT: andl $-8, %esp31; SSE-X86-NEXT: subl $8, %esp32; SSE-X86-NEXT: movsd {{.*#+}} xmm0 = mem[0],zero33; SSE-X86-NEXT: addsd 16(%ebp), %xmm034; SSE-X86-NEXT: movsd %xmm0, (%esp)35; SSE-X86-NEXT: fldl (%esp)36; SSE-X86-NEXT: wait37; SSE-X86-NEXT: movl %ebp, %esp38; SSE-X86-NEXT: popl %ebp39; SSE-X86-NEXT: retl40;41; SSE-X64-LABEL: fadd_f64:42; SSE-X64: # %bb.0:43; SSE-X64-NEXT: addsd %xmm1, %xmm044; SSE-X64-NEXT: retq45;46; AVX-X86-LABEL: fadd_f64:47; AVX-X86: # %bb.0:48; AVX-X86-NEXT: pushl %ebp49; AVX-X86-NEXT: movl %esp, %ebp50; AVX-X86-NEXT: andl $-8, %esp51; AVX-X86-NEXT: subl $8, %esp52; AVX-X86-NEXT: vmovsd {{.*#+}} xmm0 = mem[0],zero53; AVX-X86-NEXT: vaddsd 16(%ebp), %xmm0, %xmm054; AVX-X86-NEXT: vmovsd %xmm0, (%esp)55; AVX-X86-NEXT: fldl (%esp)56; AVX-X86-NEXT: wait57; AVX-X86-NEXT: movl %ebp, %esp58; AVX-X86-NEXT: popl %ebp59; AVX-X86-NEXT: retl60;61; AVX-X64-LABEL: fadd_f64:62; AVX-X64: # %bb.0:63; AVX-X64-NEXT: vaddsd %xmm1, %xmm0, %xmm064; AVX-X64-NEXT: retq65;66; X87-LABEL: fadd_f64:67; X87: # %bb.0:68; X87-NEXT: fldl {{[0-9]+}}(%esp)69; X87-NEXT: faddl {{[0-9]+}}(%esp)70; X87-NEXT: wait71; X87-NEXT: retl72 %ret = call double @llvm.experimental.constrained.fadd.f64(double %a, double %b,73 metadata !"round.dynamic",74 metadata !"fpexcept.strict") #075 ret double %ret76}77 78define float @fadd_f32(float %a, float %b) nounwind strictfp {79; SSE-X86-LABEL: fadd_f32:80; SSE-X86: # %bb.0:81; SSE-X86-NEXT: pushl %eax82; SSE-X86-NEXT: movss {{.*#+}} xmm0 = mem[0],zero,zero,zero83; SSE-X86-NEXT: addss {{[0-9]+}}(%esp), %xmm084; SSE-X86-NEXT: movss %xmm0, (%esp)85; SSE-X86-NEXT: flds (%esp)86; SSE-X86-NEXT: wait87; SSE-X86-NEXT: popl %eax88; SSE-X86-NEXT: retl89;90; SSE-X64-LABEL: fadd_f32:91; SSE-X64: # %bb.0:92; SSE-X64-NEXT: addss %xmm1, %xmm093; SSE-X64-NEXT: retq94;95; AVX-X86-LABEL: fadd_f32:96; AVX-X86: # %bb.0:97; AVX-X86-NEXT: pushl %eax98; AVX-X86-NEXT: vmovss {{.*#+}} xmm0 = mem[0],zero,zero,zero99; AVX-X86-NEXT: vaddss {{[0-9]+}}(%esp), %xmm0, %xmm0100; AVX-X86-NEXT: vmovss %xmm0, (%esp)101; AVX-X86-NEXT: flds (%esp)102; AVX-X86-NEXT: wait103; AVX-X86-NEXT: popl %eax104; AVX-X86-NEXT: retl105;106; AVX-X64-LABEL: fadd_f32:107; AVX-X64: # %bb.0:108; AVX-X64-NEXT: vaddss %xmm1, %xmm0, %xmm0109; AVX-X64-NEXT: retq110;111; X87-LABEL: fadd_f32:112; X87: # %bb.0:113; X87-NEXT: flds {{[0-9]+}}(%esp)114; X87-NEXT: fadds {{[0-9]+}}(%esp)115; X87-NEXT: wait116; X87-NEXT: retl117 %ret = call float @llvm.experimental.constrained.fadd.f32(float %a, float %b,118 metadata !"round.dynamic",119 metadata !"fpexcept.strict") #0120 ret float %ret121}122 123define double @fsub_f64(double %a, double %b) nounwind strictfp {124; SSE-X86-LABEL: fsub_f64:125; SSE-X86: # %bb.0:126; SSE-X86-NEXT: pushl %ebp127; SSE-X86-NEXT: movl %esp, %ebp128; SSE-X86-NEXT: andl $-8, %esp129; SSE-X86-NEXT: subl $8, %esp130; SSE-X86-NEXT: movsd {{.*#+}} xmm0 = mem[0],zero131; SSE-X86-NEXT: subsd 16(%ebp), %xmm0132; SSE-X86-NEXT: movsd %xmm0, (%esp)133; SSE-X86-NEXT: fldl (%esp)134; SSE-X86-NEXT: wait135; SSE-X86-NEXT: movl %ebp, %esp136; SSE-X86-NEXT: popl %ebp137; SSE-X86-NEXT: retl138;139; SSE-X64-LABEL: fsub_f64:140; SSE-X64: # %bb.0:141; SSE-X64-NEXT: subsd %xmm1, %xmm0142; SSE-X64-NEXT: retq143;144; AVX-X86-LABEL: fsub_f64:145; AVX-X86: # %bb.0:146; AVX-X86-NEXT: pushl %ebp147; AVX-X86-NEXT: movl %esp, %ebp148; AVX-X86-NEXT: andl $-8, %esp149; AVX-X86-NEXT: subl $8, %esp150; AVX-X86-NEXT: vmovsd {{.*#+}} xmm0 = mem[0],zero151; AVX-X86-NEXT: vsubsd 16(%ebp), %xmm0, %xmm0152; AVX-X86-NEXT: vmovsd %xmm0, (%esp)153; AVX-X86-NEXT: fldl (%esp)154; AVX-X86-NEXT: wait155; AVX-X86-NEXT: movl %ebp, %esp156; AVX-X86-NEXT: popl %ebp157; AVX-X86-NEXT: retl158;159; AVX-X64-LABEL: fsub_f64:160; AVX-X64: # %bb.0:161; AVX-X64-NEXT: vsubsd %xmm1, %xmm0, %xmm0162; AVX-X64-NEXT: retq163;164; X87-LABEL: fsub_f64:165; X87: # %bb.0:166; X87-NEXT: fldl {{[0-9]+}}(%esp)167; X87-NEXT: fsubl {{[0-9]+}}(%esp)168; X87-NEXT: wait169; X87-NEXT: retl170 %ret = call double @llvm.experimental.constrained.fsub.f64(double %a, double %b,171 metadata !"round.dynamic",172 metadata !"fpexcept.strict") #0173 ret double %ret174}175 176define float @fsub_f32(float %a, float %b) nounwind strictfp {177; SSE-X86-LABEL: fsub_f32:178; SSE-X86: # %bb.0:179; SSE-X86-NEXT: pushl %eax180; SSE-X86-NEXT: movss {{.*#+}} xmm0 = mem[0],zero,zero,zero181; SSE-X86-NEXT: subss {{[0-9]+}}(%esp), %xmm0182; SSE-X86-NEXT: movss %xmm0, (%esp)183; SSE-X86-NEXT: flds (%esp)184; SSE-X86-NEXT: wait185; SSE-X86-NEXT: popl %eax186; SSE-X86-NEXT: retl187;188; SSE-X64-LABEL: fsub_f32:189; SSE-X64: # %bb.0:190; SSE-X64-NEXT: subss %xmm1, %xmm0191; SSE-X64-NEXT: retq192;193; AVX-X86-LABEL: fsub_f32:194; AVX-X86: # %bb.0:195; AVX-X86-NEXT: pushl %eax196; AVX-X86-NEXT: vmovss {{.*#+}} xmm0 = mem[0],zero,zero,zero197; AVX-X86-NEXT: vsubss {{[0-9]+}}(%esp), %xmm0, %xmm0198; AVX-X86-NEXT: vmovss %xmm0, (%esp)199; AVX-X86-NEXT: flds (%esp)200; AVX-X86-NEXT: wait201; AVX-X86-NEXT: popl %eax202; AVX-X86-NEXT: retl203;204; AVX-X64-LABEL: fsub_f32:205; AVX-X64: # %bb.0:206; AVX-X64-NEXT: vsubss %xmm1, %xmm0, %xmm0207; AVX-X64-NEXT: retq208;209; X87-LABEL: fsub_f32:210; X87: # %bb.0:211; X87-NEXT: flds {{[0-9]+}}(%esp)212; X87-NEXT: fsubs {{[0-9]+}}(%esp)213; X87-NEXT: wait214; X87-NEXT: retl215 %ret = call float @llvm.experimental.constrained.fsub.f32(float %a, float %b,216 metadata !"round.dynamic",217 metadata !"fpexcept.strict") #0218 ret float %ret219}220 221define double @fmul_f64(double %a, double %b) nounwind strictfp {222; SSE-X86-LABEL: fmul_f64:223; SSE-X86: # %bb.0:224; SSE-X86-NEXT: pushl %ebp225; SSE-X86-NEXT: movl %esp, %ebp226; SSE-X86-NEXT: andl $-8, %esp227; SSE-X86-NEXT: subl $8, %esp228; SSE-X86-NEXT: movsd {{.*#+}} xmm0 = mem[0],zero229; SSE-X86-NEXT: mulsd 16(%ebp), %xmm0230; SSE-X86-NEXT: movsd %xmm0, (%esp)231; SSE-X86-NEXT: fldl (%esp)232; SSE-X86-NEXT: wait233; SSE-X86-NEXT: movl %ebp, %esp234; SSE-X86-NEXT: popl %ebp235; SSE-X86-NEXT: retl236;237; SSE-X64-LABEL: fmul_f64:238; SSE-X64: # %bb.0:239; SSE-X64-NEXT: mulsd %xmm1, %xmm0240; SSE-X64-NEXT: retq241;242; AVX-X86-LABEL: fmul_f64:243; AVX-X86: # %bb.0:244; AVX-X86-NEXT: pushl %ebp245; AVX-X86-NEXT: movl %esp, %ebp246; AVX-X86-NEXT: andl $-8, %esp247; AVX-X86-NEXT: subl $8, %esp248; AVX-X86-NEXT: vmovsd {{.*#+}} xmm0 = mem[0],zero249; AVX-X86-NEXT: vmulsd 16(%ebp), %xmm0, %xmm0250; AVX-X86-NEXT: vmovsd %xmm0, (%esp)251; AVX-X86-NEXT: fldl (%esp)252; AVX-X86-NEXT: wait253; AVX-X86-NEXT: movl %ebp, %esp254; AVX-X86-NEXT: popl %ebp255; AVX-X86-NEXT: retl256;257; AVX-X64-LABEL: fmul_f64:258; AVX-X64: # %bb.0:259; AVX-X64-NEXT: vmulsd %xmm1, %xmm0, %xmm0260; AVX-X64-NEXT: retq261;262; X87-LABEL: fmul_f64:263; X87: # %bb.0:264; X87-NEXT: fldl {{[0-9]+}}(%esp)265; X87-NEXT: fmull {{[0-9]+}}(%esp)266; X87-NEXT: wait267; X87-NEXT: retl268 %ret = call double @llvm.experimental.constrained.fmul.f64(double %a, double %b,269 metadata !"round.dynamic",270 metadata !"fpexcept.strict") #0271 ret double %ret272}273 274define float @fmul_f32(float %a, float %b) nounwind strictfp {275; SSE-X86-LABEL: fmul_f32:276; SSE-X86: # %bb.0:277; SSE-X86-NEXT: pushl %eax278; SSE-X86-NEXT: movss {{.*#+}} xmm0 = mem[0],zero,zero,zero279; SSE-X86-NEXT: mulss {{[0-9]+}}(%esp), %xmm0280; SSE-X86-NEXT: movss %xmm0, (%esp)281; SSE-X86-NEXT: flds (%esp)282; SSE-X86-NEXT: wait283; SSE-X86-NEXT: popl %eax284; SSE-X86-NEXT: retl285;286; SSE-X64-LABEL: fmul_f32:287; SSE-X64: # %bb.0:288; SSE-X64-NEXT: mulss %xmm1, %xmm0289; SSE-X64-NEXT: retq290;291; AVX-X86-LABEL: fmul_f32:292; AVX-X86: # %bb.0:293; AVX-X86-NEXT: pushl %eax294; AVX-X86-NEXT: vmovss {{.*#+}} xmm0 = mem[0],zero,zero,zero295; AVX-X86-NEXT: vmulss {{[0-9]+}}(%esp), %xmm0, %xmm0296; AVX-X86-NEXT: vmovss %xmm0, (%esp)297; AVX-X86-NEXT: flds (%esp)298; AVX-X86-NEXT: wait299; AVX-X86-NEXT: popl %eax300; AVX-X86-NEXT: retl301;302; AVX-X64-LABEL: fmul_f32:303; AVX-X64: # %bb.0:304; AVX-X64-NEXT: vmulss %xmm1, %xmm0, %xmm0305; AVX-X64-NEXT: retq306;307; X87-LABEL: fmul_f32:308; X87: # %bb.0:309; X87-NEXT: flds {{[0-9]+}}(%esp)310; X87-NEXT: fmuls {{[0-9]+}}(%esp)311; X87-NEXT: wait312; X87-NEXT: retl313 %ret = call float @llvm.experimental.constrained.fmul.f32(float %a, float %b,314 metadata !"round.dynamic",315 metadata !"fpexcept.strict") #0316 ret float %ret317}318 319define double @fdiv_f64(double %a, double %b) nounwind strictfp {320; SSE-X86-LABEL: fdiv_f64:321; SSE-X86: # %bb.0:322; SSE-X86-NEXT: pushl %ebp323; SSE-X86-NEXT: movl %esp, %ebp324; SSE-X86-NEXT: andl $-8, %esp325; SSE-X86-NEXT: subl $8, %esp326; SSE-X86-NEXT: movsd {{.*#+}} xmm0 = mem[0],zero327; SSE-X86-NEXT: divsd 16(%ebp), %xmm0328; SSE-X86-NEXT: movsd %xmm0, (%esp)329; SSE-X86-NEXT: fldl (%esp)330; SSE-X86-NEXT: wait331; SSE-X86-NEXT: movl %ebp, %esp332; SSE-X86-NEXT: popl %ebp333; SSE-X86-NEXT: retl334;335; SSE-X64-LABEL: fdiv_f64:336; SSE-X64: # %bb.0:337; SSE-X64-NEXT: divsd %xmm1, %xmm0338; SSE-X64-NEXT: retq339;340; AVX-X86-LABEL: fdiv_f64:341; AVX-X86: # %bb.0:342; AVX-X86-NEXT: pushl %ebp343; AVX-X86-NEXT: movl %esp, %ebp344; AVX-X86-NEXT: andl $-8, %esp345; AVX-X86-NEXT: subl $8, %esp346; AVX-X86-NEXT: vmovsd {{.*#+}} xmm0 = mem[0],zero347; AVX-X86-NEXT: vdivsd 16(%ebp), %xmm0, %xmm0348; AVX-X86-NEXT: vmovsd %xmm0, (%esp)349; AVX-X86-NEXT: fldl (%esp)350; AVX-X86-NEXT: wait351; AVX-X86-NEXT: movl %ebp, %esp352; AVX-X86-NEXT: popl %ebp353; AVX-X86-NEXT: retl354;355; AVX-X64-LABEL: fdiv_f64:356; AVX-X64: # %bb.0:357; AVX-X64-NEXT: vdivsd %xmm1, %xmm0, %xmm0358; AVX-X64-NEXT: retq359;360; X87-LABEL: fdiv_f64:361; X87: # %bb.0:362; X87-NEXT: fldl {{[0-9]+}}(%esp)363; X87-NEXT: fdivl {{[0-9]+}}(%esp)364; X87-NEXT: wait365; X87-NEXT: retl366 %ret = call double @llvm.experimental.constrained.fdiv.f64(double %a, double %b,367 metadata !"round.dynamic",368 metadata !"fpexcept.strict") #0369 ret double %ret370}371 372define float @fdiv_f32(float %a, float %b) nounwind strictfp {373; SSE-X86-LABEL: fdiv_f32:374; SSE-X86: # %bb.0:375; SSE-X86-NEXT: pushl %eax376; SSE-X86-NEXT: movss {{.*#+}} xmm0 = mem[0],zero,zero,zero377; SSE-X86-NEXT: divss {{[0-9]+}}(%esp), %xmm0378; SSE-X86-NEXT: movss %xmm0, (%esp)379; SSE-X86-NEXT: flds (%esp)380; SSE-X86-NEXT: wait381; SSE-X86-NEXT: popl %eax382; SSE-X86-NEXT: retl383;384; SSE-X64-LABEL: fdiv_f32:385; SSE-X64: # %bb.0:386; SSE-X64-NEXT: divss %xmm1, %xmm0387; SSE-X64-NEXT: retq388;389; AVX-X86-LABEL: fdiv_f32:390; AVX-X86: # %bb.0:391; AVX-X86-NEXT: pushl %eax392; AVX-X86-NEXT: vmovss {{.*#+}} xmm0 = mem[0],zero,zero,zero393; AVX-X86-NEXT: vdivss {{[0-9]+}}(%esp), %xmm0, %xmm0394; AVX-X86-NEXT: vmovss %xmm0, (%esp)395; AVX-X86-NEXT: flds (%esp)396; AVX-X86-NEXT: wait397; AVX-X86-NEXT: popl %eax398; AVX-X86-NEXT: retl399;400; AVX-X64-LABEL: fdiv_f32:401; AVX-X64: # %bb.0:402; AVX-X64-NEXT: vdivss %xmm1, %xmm0, %xmm0403; AVX-X64-NEXT: retq404;405; X87-LABEL: fdiv_f32:406; X87: # %bb.0:407; X87-NEXT: flds {{[0-9]+}}(%esp)408; X87-NEXT: fdivs {{[0-9]+}}(%esp)409; X87-NEXT: wait410; X87-NEXT: retl411 %ret = call float @llvm.experimental.constrained.fdiv.f32(float %a, float %b,412 metadata !"round.dynamic",413 metadata !"fpexcept.strict") #0414 ret float %ret415}416 417define void @fpext_f32_to_f64(ptr %val, ptr %ret) nounwind strictfp {418; SSE-X86-LABEL: fpext_f32_to_f64:419; SSE-X86: # %bb.0:420; SSE-X86-NEXT: movl {{[0-9]+}}(%esp), %eax421; SSE-X86-NEXT: movl {{[0-9]+}}(%esp), %ecx422; SSE-X86-NEXT: movss {{.*#+}} xmm0 = mem[0],zero,zero,zero423; SSE-X86-NEXT: cvtss2sd %xmm0, %xmm0424; SSE-X86-NEXT: movsd %xmm0, (%eax)425; SSE-X86-NEXT: retl426;427; SSE-X64-LABEL: fpext_f32_to_f64:428; SSE-X64: # %bb.0:429; SSE-X64-NEXT: movss {{.*#+}} xmm0 = mem[0],zero,zero,zero430; SSE-X64-NEXT: cvtss2sd %xmm0, %xmm0431; SSE-X64-NEXT: movsd %xmm0, (%rsi)432; SSE-X64-NEXT: retq433;434; AVX-X86-LABEL: fpext_f32_to_f64:435; AVX-X86: # %bb.0:436; AVX-X86-NEXT: movl {{[0-9]+}}(%esp), %eax437; AVX-X86-NEXT: movl {{[0-9]+}}(%esp), %ecx438; AVX-X86-NEXT: vmovss {{.*#+}} xmm0 = mem[0],zero,zero,zero439; AVX-X86-NEXT: vcvtss2sd %xmm0, %xmm0, %xmm0440; AVX-X86-NEXT: vmovsd %xmm0, (%eax)441; AVX-X86-NEXT: retl442;443; AVX-X64-LABEL: fpext_f32_to_f64:444; AVX-X64: # %bb.0:445; AVX-X64-NEXT: vmovss {{.*#+}} xmm0 = mem[0],zero,zero,zero446; AVX-X64-NEXT: vcvtss2sd %xmm0, %xmm0, %xmm0447; AVX-X64-NEXT: vmovsd %xmm0, (%rsi)448; AVX-X64-NEXT: retq449;450; X87-LABEL: fpext_f32_to_f64:451; X87: # %bb.0:452; X87-NEXT: movl {{[0-9]+}}(%esp), %eax453; X87-NEXT: movl {{[0-9]+}}(%esp), %ecx454; X87-NEXT: flds (%ecx)455; X87-NEXT: fstpl (%eax)456; X87-NEXT: wait457; X87-NEXT: retl458 %1 = load float, ptr %val, align 4459 %res = call double @llvm.experimental.constrained.fpext.f64.f32(float %1,460 metadata !"fpexcept.strict") #0461 store double %res, ptr %ret, align 8462 ret void463}464 465define void @fptrunc_double_to_f32(ptr %val, ptr%ret) nounwind strictfp {466; SSE-X86-LABEL: fptrunc_double_to_f32:467; SSE-X86: # %bb.0:468; SSE-X86-NEXT: movl {{[0-9]+}}(%esp), %eax469; SSE-X86-NEXT: movl {{[0-9]+}}(%esp), %ecx470; SSE-X86-NEXT: movsd {{.*#+}} xmm0 = mem[0],zero471; SSE-X86-NEXT: cvtsd2ss %xmm0, %xmm0472; SSE-X86-NEXT: movss %xmm0, (%eax)473; SSE-X86-NEXT: retl474;475; SSE-X64-LABEL: fptrunc_double_to_f32:476; SSE-X64: # %bb.0:477; SSE-X64-NEXT: movsd {{.*#+}} xmm0 = mem[0],zero478; SSE-X64-NEXT: cvtsd2ss %xmm0, %xmm0479; SSE-X64-NEXT: movss %xmm0, (%rsi)480; SSE-X64-NEXT: retq481;482; AVX-X86-LABEL: fptrunc_double_to_f32:483; AVX-X86: # %bb.0:484; AVX-X86-NEXT: movl {{[0-9]+}}(%esp), %eax485; AVX-X86-NEXT: movl {{[0-9]+}}(%esp), %ecx486; AVX-X86-NEXT: vmovsd {{.*#+}} xmm0 = mem[0],zero487; AVX-X86-NEXT: vcvtsd2ss %xmm0, %xmm0, %xmm0488; AVX-X86-NEXT: vmovss %xmm0, (%eax)489; AVX-X86-NEXT: retl490;491; AVX-X64-LABEL: fptrunc_double_to_f32:492; AVX-X64: # %bb.0:493; AVX-X64-NEXT: vmovsd {{.*#+}} xmm0 = mem[0],zero494; AVX-X64-NEXT: vcvtsd2ss %xmm0, %xmm0, %xmm0495; AVX-X64-NEXT: vmovss %xmm0, (%rsi)496; AVX-X64-NEXT: retq497;498; X87-LABEL: fptrunc_double_to_f32:499; X87: # %bb.0:500; X87-NEXT: pushl %eax501; X87-NEXT: movl {{[0-9]+}}(%esp), %eax502; X87-NEXT: movl {{[0-9]+}}(%esp), %ecx503; X87-NEXT: fldl (%ecx)504; X87-NEXT: fstps (%esp)505; X87-NEXT: flds (%esp)506; X87-NEXT: fstps (%eax)507; X87-NEXT: wait508; X87-NEXT: popl %eax509; X87-NEXT: retl510 %1 = load double, ptr %val, align 8511 %res = call float @llvm.experimental.constrained.fptrunc.f32.f64(double %1,512 metadata !"round.dynamic",513 metadata !"fpexcept.strict") #0514 store float %res, ptr %ret, align 4515 ret void516}517 518define void @fsqrt_f64(ptr %a) nounwind strictfp {519; SSE-X86-LABEL: fsqrt_f64:520; SSE-X86: # %bb.0:521; SSE-X86-NEXT: movl {{[0-9]+}}(%esp), %eax522; SSE-X86-NEXT: movsd {{.*#+}} xmm0 = mem[0],zero523; SSE-X86-NEXT: sqrtsd %xmm0, %xmm0524; SSE-X86-NEXT: movsd %xmm0, (%eax)525; SSE-X86-NEXT: retl526;527; SSE-X64-LABEL: fsqrt_f64:528; SSE-X64: # %bb.0:529; SSE-X64-NEXT: movsd {{.*#+}} xmm0 = mem[0],zero530; SSE-X64-NEXT: sqrtsd %xmm0, %xmm0531; SSE-X64-NEXT: movsd %xmm0, (%rdi)532; SSE-X64-NEXT: retq533;534; AVX-X86-LABEL: fsqrt_f64:535; AVX-X86: # %bb.0:536; AVX-X86-NEXT: movl {{[0-9]+}}(%esp), %eax537; AVX-X86-NEXT: vmovsd {{.*#+}} xmm0 = mem[0],zero538; AVX-X86-NEXT: vsqrtsd %xmm0, %xmm0, %xmm0539; AVX-X86-NEXT: vmovsd %xmm0, (%eax)540; AVX-X86-NEXT: retl541;542; AVX-X64-LABEL: fsqrt_f64:543; AVX-X64: # %bb.0:544; AVX-X64-NEXT: vmovsd {{.*#+}} xmm0 = mem[0],zero545; AVX-X64-NEXT: vsqrtsd %xmm0, %xmm0, %xmm0546; AVX-X64-NEXT: vmovsd %xmm0, (%rdi)547; AVX-X64-NEXT: retq548;549; X87-LABEL: fsqrt_f64:550; X87: # %bb.0:551; X87-NEXT: movl {{[0-9]+}}(%esp), %eax552; X87-NEXT: fldl (%eax)553; X87-NEXT: fsqrt554; X87-NEXT: fstpl (%eax)555; X87-NEXT: wait556; X87-NEXT: retl557 %1 = load double, ptr %a, align 8558 %res = call double @llvm.experimental.constrained.sqrt.f64(double %1,559 metadata !"round.dynamic",560 metadata !"fpexcept.strict") #0561 store double %res, ptr %a, align 8562 ret void563}564 565define void @fsqrt_f32(ptr %a) nounwind strictfp {566; SSE-X86-LABEL: fsqrt_f32:567; SSE-X86: # %bb.0:568; SSE-X86-NEXT: movl {{[0-9]+}}(%esp), %eax569; SSE-X86-NEXT: movss {{.*#+}} xmm0 = mem[0],zero,zero,zero570; SSE-X86-NEXT: sqrtss %xmm0, %xmm0571; SSE-X86-NEXT: movss %xmm0, (%eax)572; SSE-X86-NEXT: retl573;574; SSE-X64-LABEL: fsqrt_f32:575; SSE-X64: # %bb.0:576; SSE-X64-NEXT: movss {{.*#+}} xmm0 = mem[0],zero,zero,zero577; SSE-X64-NEXT: sqrtss %xmm0, %xmm0578; SSE-X64-NEXT: movss %xmm0, (%rdi)579; SSE-X64-NEXT: retq580;581; AVX-X86-LABEL: fsqrt_f32:582; AVX-X86: # %bb.0:583; AVX-X86-NEXT: movl {{[0-9]+}}(%esp), %eax584; AVX-X86-NEXT: vmovss {{.*#+}} xmm0 = mem[0],zero,zero,zero585; AVX-X86-NEXT: vsqrtss %xmm0, %xmm0, %xmm0586; AVX-X86-NEXT: vmovss %xmm0, (%eax)587; AVX-X86-NEXT: retl588;589; AVX-X64-LABEL: fsqrt_f32:590; AVX-X64: # %bb.0:591; AVX-X64-NEXT: vmovss {{.*#+}} xmm0 = mem[0],zero,zero,zero592; AVX-X64-NEXT: vsqrtss %xmm0, %xmm0, %xmm0593; AVX-X64-NEXT: vmovss %xmm0, (%rdi)594; AVX-X64-NEXT: retq595;596; X87-LABEL: fsqrt_f32:597; X87: # %bb.0:598; X87-NEXT: movl {{[0-9]+}}(%esp), %eax599; X87-NEXT: flds (%eax)600; X87-NEXT: fsqrt601; X87-NEXT: fstps (%eax)602; X87-NEXT: wait603; X87-NEXT: retl604 %1 = load float, ptr %a, align 4605 %res = call float @llvm.experimental.constrained.sqrt.f32(float %1,606 metadata !"round.dynamic",607 metadata !"fpexcept.strict") #0608 store float %res, ptr %a, align 4609 ret void610}611 612define double @fma_f64(double %a, double %b, double %c) nounwind strictfp {613; SSE-X86-LABEL: fma_f64:614; SSE-X86: # %bb.0:615; SSE-X86-NEXT: subl $24, %esp616; SSE-X86-NEXT: movsd {{.*#+}} xmm0 = mem[0],zero617; SSE-X86-NEXT: movsd {{.*#+}} xmm1 = mem[0],zero618; SSE-X86-NEXT: movsd {{.*#+}} xmm2 = mem[0],zero619; SSE-X86-NEXT: movsd %xmm2, {{[0-9]+}}(%esp)620; SSE-X86-NEXT: movsd %xmm1, {{[0-9]+}}(%esp)621; SSE-X86-NEXT: movsd %xmm0, (%esp)622; SSE-X86-NEXT: calll fma623; SSE-X86-NEXT: addl $24, %esp624; SSE-X86-NEXT: retl625;626; SSE-X64-LABEL: fma_f64:627; SSE-X64: # %bb.0:628; SSE-X64-NEXT: pushq %rax629; SSE-X64-NEXT: callq fma@PLT630; SSE-X64-NEXT: popq %rax631; SSE-X64-NEXT: retq632;633; AVX-X86-LABEL: fma_f64:634; AVX-X86: # %bb.0:635; AVX-X86-NEXT: pushl %ebp636; AVX-X86-NEXT: movl %esp, %ebp637; AVX-X86-NEXT: andl $-8, %esp638; AVX-X86-NEXT: subl $8, %esp639; AVX-X86-NEXT: vmovsd {{.*#+}} xmm0 = mem[0],zero640; AVX-X86-NEXT: vmovsd {{.*#+}} xmm1 = mem[0],zero641; AVX-X86-NEXT: vfmadd213sd {{.*#+}} xmm1 = (xmm0 * xmm1) + mem642; AVX-X86-NEXT: vmovsd %xmm1, (%esp)643; AVX-X86-NEXT: fldl (%esp)644; AVX-X86-NEXT: wait645; AVX-X86-NEXT: movl %ebp, %esp646; AVX-X86-NEXT: popl %ebp647; AVX-X86-NEXT: retl648;649; AVX-X64-LABEL: fma_f64:650; AVX-X64: # %bb.0:651; AVX-X64-NEXT: vfmadd213sd {{.*#+}} xmm0 = (xmm1 * xmm0) + xmm2652; AVX-X64-NEXT: retq653;654; X87-LABEL: fma_f64:655; X87: # %bb.0:656; X87-NEXT: subl $24, %esp657; X87-NEXT: fldl {{[0-9]+}}(%esp)658; X87-NEXT: fldl {{[0-9]+}}(%esp)659; X87-NEXT: fldl {{[0-9]+}}(%esp)660; X87-NEXT: fstpl {{[0-9]+}}(%esp)661; X87-NEXT: fstpl {{[0-9]+}}(%esp)662; X87-NEXT: fstpl (%esp)663; X87-NEXT: wait664; X87-NEXT: calll fma665; X87-NEXT: addl $24, %esp666; X87-NEXT: retl667 %res = call double @llvm.experimental.constrained.fma.f64(double %a, double %b, double %c,668 metadata !"round.dynamic",669 metadata !"fpexcept.strict") #0670 ret double %res671}672 673define float @fma_f32(float %a, float %b, float %c) nounwind strictfp {674; SSE-X86-LABEL: fma_f32:675; SSE-X86: # %bb.0:676; SSE-X86-NEXT: subl $12, %esp677; SSE-X86-NEXT: movss {{.*#+}} xmm0 = mem[0],zero,zero,zero678; SSE-X86-NEXT: movss {{.*#+}} xmm1 = mem[0],zero,zero,zero679; SSE-X86-NEXT: movss {{.*#+}} xmm2 = mem[0],zero,zero,zero680; SSE-X86-NEXT: movss %xmm2, {{[0-9]+}}(%esp)681; SSE-X86-NEXT: movss %xmm1, {{[0-9]+}}(%esp)682; SSE-X86-NEXT: movss %xmm0, (%esp)683; SSE-X86-NEXT: calll fmaf684; SSE-X86-NEXT: addl $12, %esp685; SSE-X86-NEXT: retl686;687; SSE-X64-LABEL: fma_f32:688; SSE-X64: # %bb.0:689; SSE-X64-NEXT: pushq %rax690; SSE-X64-NEXT: callq fmaf@PLT691; SSE-X64-NEXT: popq %rax692; SSE-X64-NEXT: retq693;694; AVX-X86-LABEL: fma_f32:695; AVX-X86: # %bb.0:696; AVX-X86-NEXT: pushl %eax697; AVX-X86-NEXT: vmovss {{.*#+}} xmm0 = mem[0],zero,zero,zero698; AVX-X86-NEXT: vmovss {{.*#+}} xmm1 = mem[0],zero,zero,zero699; AVX-X86-NEXT: vfmadd213ss {{.*#+}} xmm1 = (xmm0 * xmm1) + mem700; AVX-X86-NEXT: vmovss %xmm1, (%esp)701; AVX-X86-NEXT: flds (%esp)702; AVX-X86-NEXT: wait703; AVX-X86-NEXT: popl %eax704; AVX-X86-NEXT: retl705;706; AVX-X64-LABEL: fma_f32:707; AVX-X64: # %bb.0:708; AVX-X64-NEXT: vfmadd213ss {{.*#+}} xmm0 = (xmm1 * xmm0) + xmm2709; AVX-X64-NEXT: retq710;711; X87-LABEL: fma_f32:712; X87: # %bb.0:713; X87-NEXT: subl $12, %esp714; X87-NEXT: flds {{[0-9]+}}(%esp)715; X87-NEXT: flds {{[0-9]+}}(%esp)716; X87-NEXT: flds {{[0-9]+}}(%esp)717; X87-NEXT: fstps {{[0-9]+}}(%esp)718; X87-NEXT: fstps {{[0-9]+}}(%esp)719; X87-NEXT: fstps (%esp)720; X87-NEXT: wait721; X87-NEXT: calll fmaf722; X87-NEXT: addl $12, %esp723; X87-NEXT: retl724 %res = call float @llvm.experimental.constrained.fma.f32(float %a, float %b, float %c,725 metadata !"round.dynamic",726 metadata !"fpexcept.strict") #0727 ret float %res728}729 730attributes #0 = { strictfp }731