brintos

brintos / llvm-project-archived public Read only

0
0
Text · 24.8 KiB · f1be74f Raw
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