brintos

brintos / llvm-project-archived public Read only

0
0
Text · 110.3 KiB · fe79dfe Raw
3103 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -mtriple=i686-unknown-unknown -verify-machineinstrs | FileCheck %s --check-prefix=X86-NOSSE3; RUN: llc < %s -mtriple=i686-unknown-unknown -mattr=sse -verify-machineinstrs | FileCheck %s --check-prefix=X86-SSE14; RUN: llc < %s -mtriple=i686-unknown-unknown -mattr=sse2 -verify-machineinstrs | FileCheck %s --check-prefix=X86-SSE25; RUN: llc < %s -mtriple=i686-unknown-unknown -mattr=avx -verify-machineinstrs | FileCheck %s --check-prefix=X86-AVX6; RUN: llc < %s -mtriple=i686-unknown-unknown -mattr=avx512f -verify-machineinstrs | FileCheck %s --check-prefix=X86-AVX7; RUN: llc < %s -mtriple=x86_64-unknown-unknown -verify-machineinstrs | FileCheck %s --check-prefix=X64-SSE8; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=avx -verify-machineinstrs | FileCheck %s --check-prefix=X64-AVX9; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=avx512f -verify-machineinstrs | FileCheck %s --check-prefix=X64-AVX10 11; ----- FADD -----12 13define dso_local void @fadd_32r(ptr %loc, float %val) nounwind {14; X86-NOSSE-LABEL: fadd_32r:15; X86-NOSSE:       # %bb.0:16; X86-NOSSE-NEXT:    subl $8, %esp17; X86-NOSSE-NEXT:    movl {{[0-9]+}}(%esp), %eax18; X86-NOSSE-NEXT:    movl (%eax), %ecx19; X86-NOSSE-NEXT:    movl %ecx, (%esp)20; X86-NOSSE-NEXT:    flds (%esp)21; X86-NOSSE-NEXT:    fadds {{[0-9]+}}(%esp)22; X86-NOSSE-NEXT:    fstps {{[0-9]+}}(%esp)23; X86-NOSSE-NEXT:    movl {{[0-9]+}}(%esp), %ecx24; X86-NOSSE-NEXT:    movl %ecx, (%eax)25; X86-NOSSE-NEXT:    addl $8, %esp26; X86-NOSSE-NEXT:    retl27;28; X86-SSE1-LABEL: fadd_32r:29; X86-SSE1:       # %bb.0:30; X86-SSE1-NEXT:    subl $8, %esp31; X86-SSE1-NEXT:    movl {{[0-9]+}}(%esp), %eax32; X86-SSE1-NEXT:    movl (%eax), %ecx33; X86-SSE1-NEXT:    movl %ecx, (%esp)34; X86-SSE1-NEXT:    movss {{.*#+}} xmm0 = mem[0],zero,zero,zero35; X86-SSE1-NEXT:    addss {{[0-9]+}}(%esp), %xmm036; X86-SSE1-NEXT:    movss %xmm0, {{[0-9]+}}(%esp)37; X86-SSE1-NEXT:    movl {{[0-9]+}}(%esp), %ecx38; X86-SSE1-NEXT:    movl %ecx, (%eax)39; X86-SSE1-NEXT:    addl $8, %esp40; X86-SSE1-NEXT:    retl41;42; X86-SSE2-LABEL: fadd_32r:43; X86-SSE2:       # %bb.0:44; X86-SSE2-NEXT:    movl {{[0-9]+}}(%esp), %eax45; X86-SSE2-NEXT:    movss {{.*#+}} xmm0 = mem[0],zero,zero,zero46; X86-SSE2-NEXT:    addss (%eax), %xmm047; X86-SSE2-NEXT:    movss %xmm0, (%eax)48; X86-SSE2-NEXT:    retl49;50; X86-AVX-LABEL: fadd_32r:51; X86-AVX:       # %bb.0:52; X86-AVX-NEXT:    movl {{[0-9]+}}(%esp), %eax53; X86-AVX-NEXT:    vmovss {{.*#+}} xmm0 = mem[0],zero,zero,zero54; X86-AVX-NEXT:    vaddss (%eax), %xmm0, %xmm055; X86-AVX-NEXT:    vmovss %xmm0, (%eax)56; X86-AVX-NEXT:    retl57;58; X64-SSE-LABEL: fadd_32r:59; X64-SSE:       # %bb.0:60; X64-SSE-NEXT:    addss (%rdi), %xmm061; X64-SSE-NEXT:    movss %xmm0, (%rdi)62; X64-SSE-NEXT:    retq63;64; X64-AVX-LABEL: fadd_32r:65; X64-AVX:       # %bb.0:66; X64-AVX-NEXT:    vaddss (%rdi), %xmm0, %xmm067; X64-AVX-NEXT:    vmovss %xmm0, (%rdi)68; X64-AVX-NEXT:    retq69  %1 = load atomic i32, ptr %loc seq_cst, align 470  %2 = bitcast i32 %1 to float71  %add = fadd float %2, %val72  %3 = bitcast float %add to i3273  store atomic i32 %3, ptr %loc release, align 474  ret void75}76 77define dso_local void @fadd_64r(ptr %loc, double %val) nounwind {78; X86-NOSSE-LABEL: fadd_64r:79; X86-NOSSE:       # %bb.0:80; X86-NOSSE-NEXT:    pushl %ebp81; X86-NOSSE-NEXT:    movl %esp, %ebp82; X86-NOSSE-NEXT:    andl $-8, %esp83; X86-NOSSE-NEXT:    subl $32, %esp84; X86-NOSSE-NEXT:    movl 8(%ebp), %eax85; X86-NOSSE-NEXT:    fildll (%eax)86; X86-NOSSE-NEXT:    fistpll {{[0-9]+}}(%esp)87; X86-NOSSE-NEXT:    movl {{[0-9]+}}(%esp), %ecx88; X86-NOSSE-NEXT:    movl {{[0-9]+}}(%esp), %edx89; X86-NOSSE-NEXT:    movl %edx, {{[0-9]+}}(%esp)90; X86-NOSSE-NEXT:    movl %ecx, {{[0-9]+}}(%esp)91; X86-NOSSE-NEXT:    fldl {{[0-9]+}}(%esp)92; X86-NOSSE-NEXT:    faddl 12(%ebp)93; X86-NOSSE-NEXT:    fstpl {{[0-9]+}}(%esp)94; X86-NOSSE-NEXT:    movl {{[0-9]+}}(%esp), %ecx95; X86-NOSSE-NEXT:    movl {{[0-9]+}}(%esp), %edx96; X86-NOSSE-NEXT:    movl %ecx, (%esp)97; X86-NOSSE-NEXT:    movl %edx, {{[0-9]+}}(%esp)98; X86-NOSSE-NEXT:    fildll (%esp)99; X86-NOSSE-NEXT:    fistpll (%eax)100; X86-NOSSE-NEXT:    movl %ebp, %esp101; X86-NOSSE-NEXT:    popl %ebp102; X86-NOSSE-NEXT:    retl103;104; X86-SSE1-LABEL: fadd_64r:105; X86-SSE1:       # %bb.0:106; X86-SSE1-NEXT:    pushl %ebp107; X86-SSE1-NEXT:    movl %esp, %ebp108; X86-SSE1-NEXT:    andl $-8, %esp109; X86-SSE1-NEXT:    subl $16, %esp110; X86-SSE1-NEXT:    movl 8(%ebp), %eax111; X86-SSE1-NEXT:    xorps %xmm0, %xmm0112; X86-SSE1-NEXT:    xorps %xmm1, %xmm1113; X86-SSE1-NEXT:    movlps {{.*#+}} xmm1 = mem[0,1],xmm1[2,3]114; X86-SSE1-NEXT:    movss %xmm1, (%esp)115; X86-SSE1-NEXT:    shufps {{.*#+}} xmm1 = xmm1[1,1,1,1]116; X86-SSE1-NEXT:    movss %xmm1, {{[0-9]+}}(%esp)117; X86-SSE1-NEXT:    fldl (%esp)118; X86-SSE1-NEXT:    faddl 12(%ebp)119; X86-SSE1-NEXT:    fstpl {{[0-9]+}}(%esp)120; X86-SSE1-NEXT:    movlps {{.*#+}} xmm0 = mem[0,1],xmm0[2,3]121; X86-SSE1-NEXT:    movlps %xmm0, (%eax)122; X86-SSE1-NEXT:    movl %ebp, %esp123; X86-SSE1-NEXT:    popl %ebp124; X86-SSE1-NEXT:    retl125;126; X86-SSE2-LABEL: fadd_64r:127; X86-SSE2:       # %bb.0:128; X86-SSE2-NEXT:    pushl %ebp129; X86-SSE2-NEXT:    movl %esp, %ebp130; X86-SSE2-NEXT:    andl $-8, %esp131; X86-SSE2-NEXT:    subl $8, %esp132; X86-SSE2-NEXT:    movl 8(%ebp), %eax133; X86-SSE2-NEXT:    movsd {{.*#+}} xmm0 = mem[0],zero134; X86-SSE2-NEXT:    addsd 12(%ebp), %xmm0135; X86-SSE2-NEXT:    movsd %xmm0, (%esp)136; X86-SSE2-NEXT:    movsd {{.*#+}} xmm0 = mem[0],zero137; X86-SSE2-NEXT:    movlps %xmm0, (%eax)138; X86-SSE2-NEXT:    movl %ebp, %esp139; X86-SSE2-NEXT:    popl %ebp140; X86-SSE2-NEXT:    retl141;142; X86-AVX-LABEL: fadd_64r:143; X86-AVX:       # %bb.0:144; X86-AVX-NEXT:    pushl %ebp145; X86-AVX-NEXT:    movl %esp, %ebp146; X86-AVX-NEXT:    andl $-8, %esp147; X86-AVX-NEXT:    subl $8, %esp148; X86-AVX-NEXT:    movl 8(%ebp), %eax149; X86-AVX-NEXT:    vmovsd {{.*#+}} xmm0 = mem[0],zero150; X86-AVX-NEXT:    vaddsd 12(%ebp), %xmm0, %xmm0151; X86-AVX-NEXT:    vmovsd %xmm0, (%esp)152; X86-AVX-NEXT:    vmovsd {{.*#+}} xmm0 = mem[0],zero153; X86-AVX-NEXT:    vmovlps %xmm0, (%eax)154; X86-AVX-NEXT:    movl %ebp, %esp155; X86-AVX-NEXT:    popl %ebp156; X86-AVX-NEXT:    retl157;158; X64-SSE-LABEL: fadd_64r:159; X64-SSE:       # %bb.0:160; X64-SSE-NEXT:    addsd (%rdi), %xmm0161; X64-SSE-NEXT:    movsd %xmm0, (%rdi)162; X64-SSE-NEXT:    retq163;164; X64-AVX-LABEL: fadd_64r:165; X64-AVX:       # %bb.0:166; X64-AVX-NEXT:    vaddsd (%rdi), %xmm0, %xmm0167; X64-AVX-NEXT:    vmovsd %xmm0, (%rdi)168; X64-AVX-NEXT:    retq169  %1 = load atomic i64, ptr %loc seq_cst, align 8170  %2 = bitcast i64 %1 to double171  %add = fadd double %2, %val172  %3 = bitcast double %add to i64173  store atomic i64 %3, ptr %loc release, align 8174  ret void175}176 177@glob32 = dso_local global float 0.000000e+00, align 4178@glob64 = dso_local global double 0.000000e+00, align 8179 180; Floating-point add to a global using an immediate.181define dso_local void @fadd_32g() nounwind {182; X86-NOSSE-LABEL: fadd_32g:183; X86-NOSSE:       # %bb.0:184; X86-NOSSE-NEXT:    subl $8, %esp185; X86-NOSSE-NEXT:    movl glob32, %eax186; X86-NOSSE-NEXT:    movl %eax, (%esp)187; X86-NOSSE-NEXT:    fld1188; X86-NOSSE-NEXT:    fadds (%esp)189; X86-NOSSE-NEXT:    fstps {{[0-9]+}}(%esp)190; X86-NOSSE-NEXT:    movl {{[0-9]+}}(%esp), %eax191; X86-NOSSE-NEXT:    movl %eax, glob32192; X86-NOSSE-NEXT:    addl $8, %esp193; X86-NOSSE-NEXT:    retl194;195; X86-SSE1-LABEL: fadd_32g:196; X86-SSE1:       # %bb.0:197; X86-SSE1-NEXT:    subl $8, %esp198; X86-SSE1-NEXT:    movl glob32, %eax199; X86-SSE1-NEXT:    movl %eax, (%esp)200; X86-SSE1-NEXT:    movss {{.*#+}} xmm0 = mem[0],zero,zero,zero201; X86-SSE1-NEXT:    addss {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0202; X86-SSE1-NEXT:    movss %xmm0, {{[0-9]+}}(%esp)203; X86-SSE1-NEXT:    movl {{[0-9]+}}(%esp), %eax204; X86-SSE1-NEXT:    movl %eax, glob32205; X86-SSE1-NEXT:    addl $8, %esp206; X86-SSE1-NEXT:    retl207;208; X86-SSE2-LABEL: fadd_32g:209; X86-SSE2:       # %bb.0:210; X86-SSE2-NEXT:    movss {{.*#+}} xmm0 = [1.0E+0,0.0E+0,0.0E+0,0.0E+0]211; X86-SSE2-NEXT:    addss glob32, %xmm0212; X86-SSE2-NEXT:    movss %xmm0, glob32213; X86-SSE2-NEXT:    retl214;215; X86-AVX-LABEL: fadd_32g:216; X86-AVX:       # %bb.0:217; X86-AVX-NEXT:    vmovss {{.*#+}} xmm0 = [1.0E+0,0.0E+0,0.0E+0,0.0E+0]218; X86-AVX-NEXT:    vaddss glob32, %xmm0, %xmm0219; X86-AVX-NEXT:    vmovss %xmm0, glob32220; X86-AVX-NEXT:    retl221;222; X64-SSE-LABEL: fadd_32g:223; X64-SSE:       # %bb.0:224; X64-SSE-NEXT:    movss {{.*#+}} xmm0 = [1.0E+0,0.0E+0,0.0E+0,0.0E+0]225; X64-SSE-NEXT:    addss glob32(%rip), %xmm0226; X64-SSE-NEXT:    movss %xmm0, glob32(%rip)227; X64-SSE-NEXT:    retq228;229; X64-AVX-LABEL: fadd_32g:230; X64-AVX:       # %bb.0:231; X64-AVX-NEXT:    vmovss {{.*#+}} xmm0 = [1.0E+0,0.0E+0,0.0E+0,0.0E+0]232; X64-AVX-NEXT:    vaddss glob32(%rip), %xmm0, %xmm0233; X64-AVX-NEXT:    vmovss %xmm0, glob32(%rip)234; X64-AVX-NEXT:    retq235  %i = load atomic i32, ptr @glob32 monotonic, align 4236  %f = bitcast i32 %i to float237  %add = fadd float %f, 1.000000e+00238  %s = bitcast float %add to i32239  store atomic i32 %s, ptr @glob32 monotonic, align 4240  ret void241}242 243define dso_local void @fadd_64g() nounwind {244; X86-NOSSE-LABEL: fadd_64g:245; X86-NOSSE:       # %bb.0:246; X86-NOSSE-NEXT:    pushl %ebp247; X86-NOSSE-NEXT:    movl %esp, %ebp248; X86-NOSSE-NEXT:    andl $-8, %esp249; X86-NOSSE-NEXT:    subl $32, %esp250; X86-NOSSE-NEXT:    fildll glob64251; X86-NOSSE-NEXT:    fistpll {{[0-9]+}}(%esp)252; X86-NOSSE-NEXT:    movl {{[0-9]+}}(%esp), %eax253; X86-NOSSE-NEXT:    movl {{[0-9]+}}(%esp), %ecx254; X86-NOSSE-NEXT:    movl %ecx, {{[0-9]+}}(%esp)255; X86-NOSSE-NEXT:    movl %eax, {{[0-9]+}}(%esp)256; X86-NOSSE-NEXT:    fld1257; X86-NOSSE-NEXT:    faddl {{[0-9]+}}(%esp)258; X86-NOSSE-NEXT:    fstpl {{[0-9]+}}(%esp)259; X86-NOSSE-NEXT:    movl {{[0-9]+}}(%esp), %eax260; X86-NOSSE-NEXT:    movl {{[0-9]+}}(%esp), %ecx261; X86-NOSSE-NEXT:    movl %eax, (%esp)262; X86-NOSSE-NEXT:    movl %ecx, {{[0-9]+}}(%esp)263; X86-NOSSE-NEXT:    fildll (%esp)264; X86-NOSSE-NEXT:    fistpll glob64265; X86-NOSSE-NEXT:    movl %ebp, %esp266; X86-NOSSE-NEXT:    popl %ebp267; X86-NOSSE-NEXT:    retl268;269; X86-SSE1-LABEL: fadd_64g:270; X86-SSE1:       # %bb.0:271; X86-SSE1-NEXT:    pushl %ebp272; X86-SSE1-NEXT:    movl %esp, %ebp273; X86-SSE1-NEXT:    andl $-8, %esp274; X86-SSE1-NEXT:    subl $16, %esp275; X86-SSE1-NEXT:    xorps %xmm0, %xmm0276; X86-SSE1-NEXT:    xorps %xmm1, %xmm1277; X86-SSE1-NEXT:    movlps {{.*#+}} xmm1 = mem[0,1],xmm1[2,3]278; X86-SSE1-NEXT:    movss %xmm1, (%esp)279; X86-SSE1-NEXT:    shufps {{.*#+}} xmm1 = xmm1[1,1,1,1]280; X86-SSE1-NEXT:    movss %xmm1, {{[0-9]+}}(%esp)281; X86-SSE1-NEXT:    fld1282; X86-SSE1-NEXT:    faddl (%esp)283; X86-SSE1-NEXT:    fstpl {{[0-9]+}}(%esp)284; X86-SSE1-NEXT:    movlps {{.*#+}} xmm0 = mem[0,1],xmm0[2,3]285; X86-SSE1-NEXT:    movlps %xmm0, glob64286; X86-SSE1-NEXT:    movl %ebp, %esp287; X86-SSE1-NEXT:    popl %ebp288; X86-SSE1-NEXT:    retl289;290; X86-SSE2-LABEL: fadd_64g:291; X86-SSE2:       # %bb.0:292; X86-SSE2-NEXT:    pushl %ebp293; X86-SSE2-NEXT:    movl %esp, %ebp294; X86-SSE2-NEXT:    andl $-8, %esp295; X86-SSE2-NEXT:    subl $8, %esp296; X86-SSE2-NEXT:    movsd {{.*#+}} xmm0 = mem[0],zero297; X86-SSE2-NEXT:    addsd {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0298; X86-SSE2-NEXT:    movsd %xmm0, (%esp)299; X86-SSE2-NEXT:    movsd {{.*#+}} xmm0 = mem[0],zero300; X86-SSE2-NEXT:    movlps %xmm0, glob64301; X86-SSE2-NEXT:    movl %ebp, %esp302; X86-SSE2-NEXT:    popl %ebp303; X86-SSE2-NEXT:    retl304;305; X86-AVX-LABEL: fadd_64g:306; X86-AVX:       # %bb.0:307; X86-AVX-NEXT:    pushl %ebp308; X86-AVX-NEXT:    movl %esp, %ebp309; X86-AVX-NEXT:    andl $-8, %esp310; X86-AVX-NEXT:    subl $8, %esp311; X86-AVX-NEXT:    vmovsd {{.*#+}} xmm0 = mem[0],zero312; X86-AVX-NEXT:    vaddsd {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0, %xmm0313; X86-AVX-NEXT:    vmovsd %xmm0, (%esp)314; X86-AVX-NEXT:    vmovsd {{.*#+}} xmm0 = mem[0],zero315; X86-AVX-NEXT:    vmovlps %xmm0, glob64316; X86-AVX-NEXT:    movl %ebp, %esp317; X86-AVX-NEXT:    popl %ebp318; X86-AVX-NEXT:    retl319;320; X64-SSE-LABEL: fadd_64g:321; X64-SSE:       # %bb.0:322; X64-SSE-NEXT:    movsd {{.*#+}} xmm0 = [1.0E+0,0.0E+0]323; X64-SSE-NEXT:    addsd glob64(%rip), %xmm0324; X64-SSE-NEXT:    movsd %xmm0, glob64(%rip)325; X64-SSE-NEXT:    retq326;327; X64-AVX-LABEL: fadd_64g:328; X64-AVX:       # %bb.0:329; X64-AVX-NEXT:    vmovsd {{.*#+}} xmm0 = [1.0E+0,0.0E+0]330; X64-AVX-NEXT:    vaddsd glob64(%rip), %xmm0, %xmm0331; X64-AVX-NEXT:    vmovsd %xmm0, glob64(%rip)332; X64-AVX-NEXT:    retq333  %i = load atomic i64, ptr @glob64 monotonic, align 8334  %f = bitcast i64 %i to double335  %add = fadd double %f, 1.000000e+00336  %s = bitcast double %add to i64337  store atomic i64 %s, ptr @glob64 monotonic, align 8338  ret void339}340 341; Floating-point add to a hard-coded immediate location using an immediate.342define dso_local void @fadd_32imm() nounwind {343; X86-NOSSE-LABEL: fadd_32imm:344; X86-NOSSE:       # %bb.0:345; X86-NOSSE-NEXT:    subl $8, %esp346; X86-NOSSE-NEXT:    movl -559038737, %eax347; X86-NOSSE-NEXT:    movl %eax, (%esp)348; X86-NOSSE-NEXT:    fld1349; X86-NOSSE-NEXT:    fadds (%esp)350; X86-NOSSE-NEXT:    fstps {{[0-9]+}}(%esp)351; X86-NOSSE-NEXT:    movl {{[0-9]+}}(%esp), %eax352; X86-NOSSE-NEXT:    movl %eax, -559038737353; X86-NOSSE-NEXT:    addl $8, %esp354; X86-NOSSE-NEXT:    retl355;356; X86-SSE1-LABEL: fadd_32imm:357; X86-SSE1:       # %bb.0:358; X86-SSE1-NEXT:    subl $8, %esp359; X86-SSE1-NEXT:    movl -559038737, %eax360; X86-SSE1-NEXT:    movl %eax, (%esp)361; X86-SSE1-NEXT:    movss {{.*#+}} xmm0 = mem[0],zero,zero,zero362; X86-SSE1-NEXT:    addss {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0363; X86-SSE1-NEXT:    movss %xmm0, {{[0-9]+}}(%esp)364; X86-SSE1-NEXT:    movl {{[0-9]+}}(%esp), %eax365; X86-SSE1-NEXT:    movl %eax, -559038737366; X86-SSE1-NEXT:    addl $8, %esp367; X86-SSE1-NEXT:    retl368;369; X86-SSE2-LABEL: fadd_32imm:370; X86-SSE2:       # %bb.0:371; X86-SSE2-NEXT:    movss {{.*#+}} xmm0 = [1.0E+0,0.0E+0,0.0E+0,0.0E+0]372; X86-SSE2-NEXT:    addss -559038737, %xmm0373; X86-SSE2-NEXT:    movss %xmm0, -559038737374; X86-SSE2-NEXT:    retl375;376; X86-AVX-LABEL: fadd_32imm:377; X86-AVX:       # %bb.0:378; X86-AVX-NEXT:    vmovss {{.*#+}} xmm0 = [1.0E+0,0.0E+0,0.0E+0,0.0E+0]379; X86-AVX-NEXT:    vaddss -559038737, %xmm0, %xmm0380; X86-AVX-NEXT:    vmovss %xmm0, -559038737381; X86-AVX-NEXT:    retl382;383; X64-SSE-LABEL: fadd_32imm:384; X64-SSE:       # %bb.0:385; X64-SSE-NEXT:    movl $3735928559, %eax # imm = 0xDEADBEEF386; X64-SSE-NEXT:    movss {{.*#+}} xmm0 = [1.0E+0,0.0E+0,0.0E+0,0.0E+0]387; X64-SSE-NEXT:    addss (%rax), %xmm0388; X64-SSE-NEXT:    movss %xmm0, (%rax)389; X64-SSE-NEXT:    retq390;391; X64-AVX-LABEL: fadd_32imm:392; X64-AVX:       # %bb.0:393; X64-AVX-NEXT:    movl $3735928559, %eax # imm = 0xDEADBEEF394; X64-AVX-NEXT:    vmovss {{.*#+}} xmm0 = [1.0E+0,0.0E+0,0.0E+0,0.0E+0]395; X64-AVX-NEXT:    vaddss (%rax), %xmm0, %xmm0396; X64-AVX-NEXT:    vmovss %xmm0, (%rax)397; X64-AVX-NEXT:    retq398  %i = load atomic i32, ptr inttoptr (i32 3735928559 to ptr) monotonic, align 4399  %f = bitcast i32 %i to float400  %add = fadd float %f, 1.000000e+00401  %s = bitcast float %add to i32402  store atomic i32 %s, ptr inttoptr (i32 3735928559 to ptr) monotonic, align 4403  ret void404}405 406define dso_local void @fadd_64imm() nounwind {407; X86-NOSSE-LABEL: fadd_64imm:408; X86-NOSSE:       # %bb.0:409; X86-NOSSE-NEXT:    pushl %ebp410; X86-NOSSE-NEXT:    movl %esp, %ebp411; X86-NOSSE-NEXT:    andl $-8, %esp412; X86-NOSSE-NEXT:    subl $32, %esp413; X86-NOSSE-NEXT:    fildll -559038737414; X86-NOSSE-NEXT:    fistpll {{[0-9]+}}(%esp)415; X86-NOSSE-NEXT:    movl {{[0-9]+}}(%esp), %eax416; X86-NOSSE-NEXT:    movl {{[0-9]+}}(%esp), %ecx417; X86-NOSSE-NEXT:    movl %ecx, {{[0-9]+}}(%esp)418; X86-NOSSE-NEXT:    movl %eax, {{[0-9]+}}(%esp)419; X86-NOSSE-NEXT:    fld1420; X86-NOSSE-NEXT:    faddl {{[0-9]+}}(%esp)421; X86-NOSSE-NEXT:    fstpl {{[0-9]+}}(%esp)422; X86-NOSSE-NEXT:    movl {{[0-9]+}}(%esp), %eax423; X86-NOSSE-NEXT:    movl {{[0-9]+}}(%esp), %ecx424; X86-NOSSE-NEXT:    movl %eax, (%esp)425; X86-NOSSE-NEXT:    movl %ecx, {{[0-9]+}}(%esp)426; X86-NOSSE-NEXT:    fildll (%esp)427; X86-NOSSE-NEXT:    fistpll -559038737428; X86-NOSSE-NEXT:    movl %ebp, %esp429; X86-NOSSE-NEXT:    popl %ebp430; X86-NOSSE-NEXT:    retl431;432; X86-SSE1-LABEL: fadd_64imm:433; X86-SSE1:       # %bb.0:434; X86-SSE1-NEXT:    pushl %ebp435; X86-SSE1-NEXT:    movl %esp, %ebp436; X86-SSE1-NEXT:    andl $-8, %esp437; X86-SSE1-NEXT:    subl $16, %esp438; X86-SSE1-NEXT:    xorps %xmm0, %xmm0439; X86-SSE1-NEXT:    xorps %xmm1, %xmm1440; X86-SSE1-NEXT:    movlps {{.*#+}} xmm1 = mem[0,1],xmm1[2,3]441; X86-SSE1-NEXT:    movss %xmm1, (%esp)442; X86-SSE1-NEXT:    shufps {{.*#+}} xmm1 = xmm1[1,1,1,1]443; X86-SSE1-NEXT:    movss %xmm1, {{[0-9]+}}(%esp)444; X86-SSE1-NEXT:    fld1445; X86-SSE1-NEXT:    faddl (%esp)446; X86-SSE1-NEXT:    fstpl {{[0-9]+}}(%esp)447; X86-SSE1-NEXT:    movlps {{.*#+}} xmm0 = mem[0,1],xmm0[2,3]448; X86-SSE1-NEXT:    movlps %xmm0, -559038737449; X86-SSE1-NEXT:    movl %ebp, %esp450; X86-SSE1-NEXT:    popl %ebp451; X86-SSE1-NEXT:    retl452;453; X86-SSE2-LABEL: fadd_64imm:454; X86-SSE2:       # %bb.0:455; X86-SSE2-NEXT:    pushl %ebp456; X86-SSE2-NEXT:    movl %esp, %ebp457; X86-SSE2-NEXT:    andl $-8, %esp458; X86-SSE2-NEXT:    subl $8, %esp459; X86-SSE2-NEXT:    movsd {{.*#+}} xmm0 = mem[0],zero460; X86-SSE2-NEXT:    addsd {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0461; X86-SSE2-NEXT:    movsd %xmm0, (%esp)462; X86-SSE2-NEXT:    movsd {{.*#+}} xmm0 = mem[0],zero463; X86-SSE2-NEXT:    movlps %xmm0, -559038737464; X86-SSE2-NEXT:    movl %ebp, %esp465; X86-SSE2-NEXT:    popl %ebp466; X86-SSE2-NEXT:    retl467;468; X86-AVX-LABEL: fadd_64imm:469; X86-AVX:       # %bb.0:470; X86-AVX-NEXT:    pushl %ebp471; X86-AVX-NEXT:    movl %esp, %ebp472; X86-AVX-NEXT:    andl $-8, %esp473; X86-AVX-NEXT:    subl $8, %esp474; X86-AVX-NEXT:    vmovsd {{.*#+}} xmm0 = mem[0],zero475; X86-AVX-NEXT:    vaddsd {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0, %xmm0476; X86-AVX-NEXT:    vmovsd %xmm0, (%esp)477; X86-AVX-NEXT:    vmovsd {{.*#+}} xmm0 = mem[0],zero478; X86-AVX-NEXT:    vmovlps %xmm0, -559038737479; X86-AVX-NEXT:    movl %ebp, %esp480; X86-AVX-NEXT:    popl %ebp481; X86-AVX-NEXT:    retl482;483; X64-SSE-LABEL: fadd_64imm:484; X64-SSE:       # %bb.0:485; X64-SSE-NEXT:    movl $3735928559, %eax # imm = 0xDEADBEEF486; X64-SSE-NEXT:    movsd {{.*#+}} xmm0 = [1.0E+0,0.0E+0]487; X64-SSE-NEXT:    addsd (%rax), %xmm0488; X64-SSE-NEXT:    movsd %xmm0, (%rax)489; X64-SSE-NEXT:    retq490;491; X64-AVX-LABEL: fadd_64imm:492; X64-AVX:       # %bb.0:493; X64-AVX-NEXT:    movl $3735928559, %eax # imm = 0xDEADBEEF494; X64-AVX-NEXT:    vmovsd {{.*#+}} xmm0 = [1.0E+0,0.0E+0]495; X64-AVX-NEXT:    vaddsd (%rax), %xmm0, %xmm0496; X64-AVX-NEXT:    vmovsd %xmm0, (%rax)497; X64-AVX-NEXT:    retq498  %i = load atomic i64, ptr inttoptr (i64 3735928559 to ptr) monotonic, align 8499  %f = bitcast i64 %i to double500  %add = fadd double %f, 1.000000e+00501  %s = bitcast double %add to i64502  store atomic i64 %s, ptr inttoptr (i64 3735928559 to ptr) monotonic, align 8503  ret void504}505 506; Floating-point add to a stack location.507define dso_local void @fadd_32stack() nounwind {508; X86-NOSSE-LABEL: fadd_32stack:509; X86-NOSSE:       # %bb.0:510; X86-NOSSE-NEXT:    subl $12, %esp511; X86-NOSSE-NEXT:    movl {{[0-9]+}}(%esp), %eax512; X86-NOSSE-NEXT:    movl %eax, (%esp)513; X86-NOSSE-NEXT:    fld1514; X86-NOSSE-NEXT:    fadds (%esp)515; X86-NOSSE-NEXT:    fstps {{[0-9]+}}(%esp)516; X86-NOSSE-NEXT:    movl {{[0-9]+}}(%esp), %eax517; X86-NOSSE-NEXT:    movl %eax, {{[0-9]+}}(%esp)518; X86-NOSSE-NEXT:    addl $12, %esp519; X86-NOSSE-NEXT:    retl520;521; X86-SSE1-LABEL: fadd_32stack:522; X86-SSE1:       # %bb.0:523; X86-SSE1-NEXT:    subl $12, %esp524; X86-SSE1-NEXT:    movl {{[0-9]+}}(%esp), %eax525; X86-SSE1-NEXT:    movl %eax, (%esp)526; X86-SSE1-NEXT:    movss {{.*#+}} xmm0 = mem[0],zero,zero,zero527; X86-SSE1-NEXT:    addss {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0528; X86-SSE1-NEXT:    movss %xmm0, {{[0-9]+}}(%esp)529; X86-SSE1-NEXT:    movl {{[0-9]+}}(%esp), %eax530; X86-SSE1-NEXT:    movl %eax, {{[0-9]+}}(%esp)531; X86-SSE1-NEXT:    addl $12, %esp532; X86-SSE1-NEXT:    retl533;534; X86-SSE2-LABEL: fadd_32stack:535; X86-SSE2:       # %bb.0:536; X86-SSE2-NEXT:    pushl %eax537; X86-SSE2-NEXT:    movss {{.*#+}} xmm0 = [1.0E+0,0.0E+0,0.0E+0,0.0E+0]538; X86-SSE2-NEXT:    addss (%esp), %xmm0539; X86-SSE2-NEXT:    movss %xmm0, (%esp)540; X86-SSE2-NEXT:    popl %eax541; X86-SSE2-NEXT:    retl542;543; X86-AVX-LABEL: fadd_32stack:544; X86-AVX:       # %bb.0:545; X86-AVX-NEXT:    pushl %eax546; X86-AVX-NEXT:    vmovss {{.*#+}} xmm0 = [1.0E+0,0.0E+0,0.0E+0,0.0E+0]547; X86-AVX-NEXT:    vaddss (%esp), %xmm0, %xmm0548; X86-AVX-NEXT:    vmovss %xmm0, (%esp)549; X86-AVX-NEXT:    popl %eax550; X86-AVX-NEXT:    retl551;552; X64-SSE-LABEL: fadd_32stack:553; X64-SSE:       # %bb.0:554; X64-SSE-NEXT:    movss {{.*#+}} xmm0 = [1.0E+0,0.0E+0,0.0E+0,0.0E+0]555; X64-SSE-NEXT:    addss -{{[0-9]+}}(%rsp), %xmm0556; X64-SSE-NEXT:    movss %xmm0, -{{[0-9]+}}(%rsp)557; X64-SSE-NEXT:    retq558;559; X64-AVX-LABEL: fadd_32stack:560; X64-AVX:       # %bb.0:561; X64-AVX-NEXT:    vmovss {{.*#+}} xmm0 = [1.0E+0,0.0E+0,0.0E+0,0.0E+0]562; X64-AVX-NEXT:    vaddss -{{[0-9]+}}(%rsp), %xmm0, %xmm0563; X64-AVX-NEXT:    vmovss %xmm0, -{{[0-9]+}}(%rsp)564; X64-AVX-NEXT:    retq565  %ptr = alloca i32, align 4566  %load = load atomic i32, ptr %ptr acquire, align 4567  %bc0 = bitcast i32 %load to float568  %fadd = fadd float 1.000000e+00, %bc0569  %bc1 = bitcast float %fadd to i32570  store atomic i32 %bc1, ptr %ptr release, align 4571  ret void572}573 574define dso_local void @fadd_64stack() nounwind {575; X86-NOSSE-LABEL: fadd_64stack:576; X86-NOSSE:       # %bb.0:577; X86-NOSSE-NEXT:    pushl %ebp578; X86-NOSSE-NEXT:    movl %esp, %ebp579; X86-NOSSE-NEXT:    andl $-8, %esp580; X86-NOSSE-NEXT:    subl $40, %esp581; X86-NOSSE-NEXT:    fildll {{[0-9]+}}(%esp)582; X86-NOSSE-NEXT:    fistpll {{[0-9]+}}(%esp)583; X86-NOSSE-NEXT:    movl {{[0-9]+}}(%esp), %eax584; X86-NOSSE-NEXT:    movl {{[0-9]+}}(%esp), %ecx585; X86-NOSSE-NEXT:    movl %ecx, {{[0-9]+}}(%esp)586; X86-NOSSE-NEXT:    movl %eax, {{[0-9]+}}(%esp)587; X86-NOSSE-NEXT:    fld1588; X86-NOSSE-NEXT:    faddl {{[0-9]+}}(%esp)589; X86-NOSSE-NEXT:    fstpl {{[0-9]+}}(%esp)590; X86-NOSSE-NEXT:    movl {{[0-9]+}}(%esp), %eax591; X86-NOSSE-NEXT:    movl {{[0-9]+}}(%esp), %ecx592; X86-NOSSE-NEXT:    movl %eax, (%esp)593; X86-NOSSE-NEXT:    movl %ecx, {{[0-9]+}}(%esp)594; X86-NOSSE-NEXT:    fildll (%esp)595; X86-NOSSE-NEXT:    fistpll {{[0-9]+}}(%esp)596; X86-NOSSE-NEXT:    movl %ebp, %esp597; X86-NOSSE-NEXT:    popl %ebp598; X86-NOSSE-NEXT:    retl599;600; X86-SSE1-LABEL: fadd_64stack:601; X86-SSE1:       # %bb.0:602; X86-SSE1-NEXT:    pushl %ebp603; X86-SSE1-NEXT:    movl %esp, %ebp604; X86-SSE1-NEXT:    andl $-8, %esp605; X86-SSE1-NEXT:    subl $24, %esp606; X86-SSE1-NEXT:    xorps %xmm0, %xmm0607; X86-SSE1-NEXT:    xorps %xmm1, %xmm1608; X86-SSE1-NEXT:    movlps {{.*#+}} xmm1 = mem[0,1],xmm1[2,3]609; X86-SSE1-NEXT:    movss %xmm1, (%esp)610; X86-SSE1-NEXT:    shufps {{.*#+}} xmm1 = xmm1[1,1,1,1]611; X86-SSE1-NEXT:    movss %xmm1, {{[0-9]+}}(%esp)612; X86-SSE1-NEXT:    fld1613; X86-SSE1-NEXT:    faddl (%esp)614; X86-SSE1-NEXT:    fstpl {{[0-9]+}}(%esp)615; X86-SSE1-NEXT:    movlps {{.*#+}} xmm0 = mem[0,1],xmm0[2,3]616; X86-SSE1-NEXT:    movlps %xmm0, {{[0-9]+}}(%esp)617; X86-SSE1-NEXT:    movl %ebp, %esp618; X86-SSE1-NEXT:    popl %ebp619; X86-SSE1-NEXT:    retl620;621; X86-SSE2-LABEL: fadd_64stack:622; X86-SSE2:       # %bb.0:623; X86-SSE2-NEXT:    pushl %ebp624; X86-SSE2-NEXT:    movl %esp, %ebp625; X86-SSE2-NEXT:    andl $-8, %esp626; X86-SSE2-NEXT:    subl $16, %esp627; X86-SSE2-NEXT:    movsd {{.*#+}} xmm0 = mem[0],zero628; X86-SSE2-NEXT:    addsd {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0629; X86-SSE2-NEXT:    movsd %xmm0, (%esp)630; X86-SSE2-NEXT:    movsd {{.*#+}} xmm0 = mem[0],zero631; X86-SSE2-NEXT:    movlps %xmm0, {{[0-9]+}}(%esp)632; X86-SSE2-NEXT:    movl %ebp, %esp633; X86-SSE2-NEXT:    popl %ebp634; X86-SSE2-NEXT:    retl635;636; X86-AVX-LABEL: fadd_64stack:637; X86-AVX:       # %bb.0:638; X86-AVX-NEXT:    pushl %ebp639; X86-AVX-NEXT:    movl %esp, %ebp640; X86-AVX-NEXT:    andl $-8, %esp641; X86-AVX-NEXT:    subl $16, %esp642; X86-AVX-NEXT:    vmovsd {{.*#+}} xmm0 = mem[0],zero643; X86-AVX-NEXT:    vaddsd {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0, %xmm0644; X86-AVX-NEXT:    vmovsd %xmm0, (%esp)645; X86-AVX-NEXT:    vmovsd {{.*#+}} xmm0 = mem[0],zero646; X86-AVX-NEXT:    vmovlps %xmm0, {{[0-9]+}}(%esp)647; X86-AVX-NEXT:    movl %ebp, %esp648; X86-AVX-NEXT:    popl %ebp649; X86-AVX-NEXT:    retl650;651; X64-SSE-LABEL: fadd_64stack:652; X64-SSE:       # %bb.0:653; X64-SSE-NEXT:    movsd {{.*#+}} xmm0 = [1.0E+0,0.0E+0]654; X64-SSE-NEXT:    addsd -{{[0-9]+}}(%rsp), %xmm0655; X64-SSE-NEXT:    movsd %xmm0, -{{[0-9]+}}(%rsp)656; X64-SSE-NEXT:    retq657;658; X64-AVX-LABEL: fadd_64stack:659; X64-AVX:       # %bb.0:660; X64-AVX-NEXT:    vmovsd {{.*#+}} xmm0 = [1.0E+0,0.0E+0]661; X64-AVX-NEXT:    vaddsd -{{[0-9]+}}(%rsp), %xmm0, %xmm0662; X64-AVX-NEXT:    vmovsd %xmm0, -{{[0-9]+}}(%rsp)663; X64-AVX-NEXT:    retq664  %ptr = alloca i64, align 8665  %load = load atomic i64, ptr %ptr acquire, align 8666  %bc0 = bitcast i64 %load to double667  %fadd = fadd double 1.000000e+00, %bc0668  %bc1 = bitcast double %fadd to i64669  store atomic i64 %bc1, ptr %ptr release, align 8670  ret void671}672 673define dso_local void @fadd_array(ptr %arg, double %arg1, i64 %arg2) nounwind {674; X86-NOSSE-LABEL: fadd_array:675; X86-NOSSE:       # %bb.0: # %bb676; X86-NOSSE-NEXT:    pushl %ebp677; X86-NOSSE-NEXT:    movl %esp, %ebp678; X86-NOSSE-NEXT:    pushl %esi679; X86-NOSSE-NEXT:    andl $-8, %esp680; X86-NOSSE-NEXT:    subl $40, %esp681; X86-NOSSE-NEXT:    movl 20(%ebp), %eax682; X86-NOSSE-NEXT:    movl 8(%ebp), %ecx683; X86-NOSSE-NEXT:    fildll (%ecx,%eax,8)684; X86-NOSSE-NEXT:    fistpll {{[0-9]+}}(%esp)685; X86-NOSSE-NEXT:    movl {{[0-9]+}}(%esp), %edx686; X86-NOSSE-NEXT:    movl {{[0-9]+}}(%esp), %esi687; X86-NOSSE-NEXT:    movl %esi, {{[0-9]+}}(%esp)688; X86-NOSSE-NEXT:    movl %edx, {{[0-9]+}}(%esp)689; X86-NOSSE-NEXT:    fldl {{[0-9]+}}(%esp)690; X86-NOSSE-NEXT:    faddl 12(%ebp)691; X86-NOSSE-NEXT:    fstpl {{[0-9]+}}(%esp)692; X86-NOSSE-NEXT:    movl {{[0-9]+}}(%esp), %edx693; X86-NOSSE-NEXT:    movl {{[0-9]+}}(%esp), %esi694; X86-NOSSE-NEXT:    movl %edx, (%esp)695; X86-NOSSE-NEXT:    movl %esi, {{[0-9]+}}(%esp)696; X86-NOSSE-NEXT:    fildll (%esp)697; X86-NOSSE-NEXT:    fistpll (%ecx,%eax,8)698; X86-NOSSE-NEXT:    leal -4(%ebp), %esp699; X86-NOSSE-NEXT:    popl %esi700; X86-NOSSE-NEXT:    popl %ebp701; X86-NOSSE-NEXT:    retl702;703; X86-SSE1-LABEL: fadd_array:704; X86-SSE1:       # %bb.0: # %bb705; X86-SSE1-NEXT:    pushl %ebp706; X86-SSE1-NEXT:    movl %esp, %ebp707; X86-SSE1-NEXT:    andl $-8, %esp708; X86-SSE1-NEXT:    subl $16, %esp709; X86-SSE1-NEXT:    movl 20(%ebp), %eax710; X86-SSE1-NEXT:    movl 8(%ebp), %ecx711; X86-SSE1-NEXT:    xorps %xmm0, %xmm0712; X86-SSE1-NEXT:    xorps %xmm1, %xmm1713; X86-SSE1-NEXT:    movlps {{.*#+}} xmm1 = mem[0,1],xmm1[2,3]714; X86-SSE1-NEXT:    movss %xmm1, (%esp)715; X86-SSE1-NEXT:    shufps {{.*#+}} xmm1 = xmm1[1,1,1,1]716; X86-SSE1-NEXT:    movss %xmm1, {{[0-9]+}}(%esp)717; X86-SSE1-NEXT:    fldl (%esp)718; X86-SSE1-NEXT:    faddl 12(%ebp)719; X86-SSE1-NEXT:    fstpl {{[0-9]+}}(%esp)720; X86-SSE1-NEXT:    movlps {{.*#+}} xmm0 = mem[0,1],xmm0[2,3]721; X86-SSE1-NEXT:    movlps %xmm0, (%ecx,%eax,8)722; X86-SSE1-NEXT:    movl %ebp, %esp723; X86-SSE1-NEXT:    popl %ebp724; X86-SSE1-NEXT:    retl725;726; X86-SSE2-LABEL: fadd_array:727; X86-SSE2:       # %bb.0: # %bb728; X86-SSE2-NEXT:    pushl %ebp729; X86-SSE2-NEXT:    movl %esp, %ebp730; X86-SSE2-NEXT:    andl $-8, %esp731; X86-SSE2-NEXT:    subl $8, %esp732; X86-SSE2-NEXT:    movl 20(%ebp), %eax733; X86-SSE2-NEXT:    movl 8(%ebp), %ecx734; X86-SSE2-NEXT:    movsd {{.*#+}} xmm0 = mem[0],zero735; X86-SSE2-NEXT:    addsd 12(%ebp), %xmm0736; X86-SSE2-NEXT:    movsd %xmm0, (%esp)737; X86-SSE2-NEXT:    movsd {{.*#+}} xmm0 = mem[0],zero738; X86-SSE2-NEXT:    movlps %xmm0, (%ecx,%eax,8)739; X86-SSE2-NEXT:    movl %ebp, %esp740; X86-SSE2-NEXT:    popl %ebp741; X86-SSE2-NEXT:    retl742;743; X86-AVX-LABEL: fadd_array:744; X86-AVX:       # %bb.0: # %bb745; X86-AVX-NEXT:    pushl %ebp746; X86-AVX-NEXT:    movl %esp, %ebp747; X86-AVX-NEXT:    andl $-8, %esp748; X86-AVX-NEXT:    subl $8, %esp749; X86-AVX-NEXT:    movl 20(%ebp), %eax750; X86-AVX-NEXT:    movl 8(%ebp), %ecx751; X86-AVX-NEXT:    vmovsd {{.*#+}} xmm0 = mem[0],zero752; X86-AVX-NEXT:    vaddsd 12(%ebp), %xmm0, %xmm0753; X86-AVX-NEXT:    vmovsd %xmm0, (%esp)754; X86-AVX-NEXT:    vmovsd {{.*#+}} xmm0 = mem[0],zero755; X86-AVX-NEXT:    vmovlps %xmm0, (%ecx,%eax,8)756; X86-AVX-NEXT:    movl %ebp, %esp757; X86-AVX-NEXT:    popl %ebp758; X86-AVX-NEXT:    retl759;760; X64-SSE-LABEL: fadd_array:761; X64-SSE:       # %bb.0: # %bb762; X64-SSE-NEXT:    addsd (%rdi,%rsi,8), %xmm0763; X64-SSE-NEXT:    movsd %xmm0, (%rdi,%rsi,8)764; X64-SSE-NEXT:    retq765;766; X64-AVX-LABEL: fadd_array:767; X64-AVX:       # %bb.0: # %bb768; X64-AVX-NEXT:    vaddsd (%rdi,%rsi,8), %xmm0, %xmm0769; X64-AVX-NEXT:    vmovsd %xmm0, (%rdi,%rsi,8)770; X64-AVX-NEXT:    retq771bb:772  %tmp4 = getelementptr inbounds i64, ptr %arg, i64 %arg2773  %tmp6 = load atomic i64, ptr %tmp4 monotonic, align 8774  %tmp7 = bitcast i64 %tmp6 to double775  %tmp8 = fadd double %tmp7, %arg1776  %tmp9 = bitcast double %tmp8 to i64777  store atomic i64 %tmp9, ptr %tmp4 monotonic, align 8778  ret void779}780 781; ----- FSUB -----782 783define dso_local void @fsub_32r(ptr %loc, float %val) nounwind {784; X86-NOSSE-LABEL: fsub_32r:785; X86-NOSSE:       # %bb.0:786; X86-NOSSE-NEXT:    subl $8, %esp787; X86-NOSSE-NEXT:    movl {{[0-9]+}}(%esp), %eax788; X86-NOSSE-NEXT:    movl (%eax), %ecx789; X86-NOSSE-NEXT:    movl %ecx, (%esp)790; X86-NOSSE-NEXT:    flds (%esp)791; X86-NOSSE-NEXT:    fsubs {{[0-9]+}}(%esp)792; X86-NOSSE-NEXT:    fstps {{[0-9]+}}(%esp)793; X86-NOSSE-NEXT:    movl {{[0-9]+}}(%esp), %ecx794; X86-NOSSE-NEXT:    movl %ecx, (%eax)795; X86-NOSSE-NEXT:    addl $8, %esp796; X86-NOSSE-NEXT:    retl797;798; X86-SSE1-LABEL: fsub_32r:799; X86-SSE1:       # %bb.0:800; X86-SSE1-NEXT:    subl $8, %esp801; X86-SSE1-NEXT:    movl {{[0-9]+}}(%esp), %eax802; X86-SSE1-NEXT:    movl (%eax), %ecx803; X86-SSE1-NEXT:    movl %ecx, (%esp)804; X86-SSE1-NEXT:    movss {{.*#+}} xmm0 = mem[0],zero,zero,zero805; X86-SSE1-NEXT:    subss {{[0-9]+}}(%esp), %xmm0806; X86-SSE1-NEXT:    movss %xmm0, {{[0-9]+}}(%esp)807; X86-SSE1-NEXT:    movl {{[0-9]+}}(%esp), %ecx808; X86-SSE1-NEXT:    movl %ecx, (%eax)809; X86-SSE1-NEXT:    addl $8, %esp810; X86-SSE1-NEXT:    retl811;812; X86-SSE2-LABEL: fsub_32r:813; X86-SSE2:       # %bb.0:814; X86-SSE2-NEXT:    movl {{[0-9]+}}(%esp), %eax815; X86-SSE2-NEXT:    movss {{.*#+}} xmm0 = mem[0],zero,zero,zero816; X86-SSE2-NEXT:    subss {{[0-9]+}}(%esp), %xmm0817; X86-SSE2-NEXT:    movss %xmm0, (%eax)818; X86-SSE2-NEXT:    retl819;820; X86-AVX-LABEL: fsub_32r:821; X86-AVX:       # %bb.0:822; X86-AVX-NEXT:    movl {{[0-9]+}}(%esp), %eax823; X86-AVX-NEXT:    vmovss {{.*#+}} xmm0 = mem[0],zero,zero,zero824; X86-AVX-NEXT:    vsubss {{[0-9]+}}(%esp), %xmm0, %xmm0825; X86-AVX-NEXT:    vmovss %xmm0, (%eax)826; X86-AVX-NEXT:    retl827;828; X64-SSE-LABEL: fsub_32r:829; X64-SSE:       # %bb.0:830; X64-SSE-NEXT:    movss {{.*#+}} xmm1 = mem[0],zero,zero,zero831; X64-SSE-NEXT:    subss %xmm0, %xmm1832; X64-SSE-NEXT:    movss %xmm1, (%rdi)833; X64-SSE-NEXT:    retq834;835; X64-AVX-LABEL: fsub_32r:836; X64-AVX:       # %bb.0:837; X64-AVX-NEXT:    vmovss {{.*#+}} xmm1 = mem[0],zero,zero,zero838; X64-AVX-NEXT:    vsubss %xmm0, %xmm1, %xmm0839; X64-AVX-NEXT:    vmovss %xmm0, (%rdi)840; X64-AVX-NEXT:    retq841  %1 = load atomic i32, ptr %loc seq_cst, align 4842  %2 = bitcast i32 %1 to float843  %sub = fsub float %2, %val844  %3 = bitcast float %sub to i32845  store atomic i32 %3, ptr %loc release, align 4846  ret void847}848 849define dso_local void @fsub_64r(ptr %loc, double %val) nounwind {850; X86-NOSSE-LABEL: fsub_64r:851; X86-NOSSE:       # %bb.0:852; X86-NOSSE-NEXT:    pushl %ebp853; X86-NOSSE-NEXT:    movl %esp, %ebp854; X86-NOSSE-NEXT:    andl $-8, %esp855; X86-NOSSE-NEXT:    subl $32, %esp856; X86-NOSSE-NEXT:    movl 8(%ebp), %eax857; X86-NOSSE-NEXT:    fildll (%eax)858; X86-NOSSE-NEXT:    fistpll {{[0-9]+}}(%esp)859; X86-NOSSE-NEXT:    movl {{[0-9]+}}(%esp), %ecx860; X86-NOSSE-NEXT:    movl {{[0-9]+}}(%esp), %edx861; X86-NOSSE-NEXT:    movl %edx, {{[0-9]+}}(%esp)862; X86-NOSSE-NEXT:    movl %ecx, {{[0-9]+}}(%esp)863; X86-NOSSE-NEXT:    fldl {{[0-9]+}}(%esp)864; X86-NOSSE-NEXT:    fsubl 12(%ebp)865; X86-NOSSE-NEXT:    fstpl {{[0-9]+}}(%esp)866; X86-NOSSE-NEXT:    movl {{[0-9]+}}(%esp), %ecx867; X86-NOSSE-NEXT:    movl {{[0-9]+}}(%esp), %edx868; X86-NOSSE-NEXT:    movl %ecx, (%esp)869; X86-NOSSE-NEXT:    movl %edx, {{[0-9]+}}(%esp)870; X86-NOSSE-NEXT:    fildll (%esp)871; X86-NOSSE-NEXT:    fistpll (%eax)872; X86-NOSSE-NEXT:    movl %ebp, %esp873; X86-NOSSE-NEXT:    popl %ebp874; X86-NOSSE-NEXT:    retl875;876; X86-SSE1-LABEL: fsub_64r:877; X86-SSE1:       # %bb.0:878; X86-SSE1-NEXT:    pushl %ebp879; X86-SSE1-NEXT:    movl %esp, %ebp880; X86-SSE1-NEXT:    andl $-8, %esp881; X86-SSE1-NEXT:    subl $16, %esp882; X86-SSE1-NEXT:    movl 8(%ebp), %eax883; X86-SSE1-NEXT:    xorps %xmm0, %xmm0884; X86-SSE1-NEXT:    xorps %xmm1, %xmm1885; X86-SSE1-NEXT:    movlps {{.*#+}} xmm1 = mem[0,1],xmm1[2,3]886; X86-SSE1-NEXT:    movss %xmm1, (%esp)887; X86-SSE1-NEXT:    shufps {{.*#+}} xmm1 = xmm1[1,1,1,1]888; X86-SSE1-NEXT:    movss %xmm1, {{[0-9]+}}(%esp)889; X86-SSE1-NEXT:    fldl (%esp)890; X86-SSE1-NEXT:    fsubl 12(%ebp)891; X86-SSE1-NEXT:    fstpl {{[0-9]+}}(%esp)892; X86-SSE1-NEXT:    movlps {{.*#+}} xmm0 = mem[0,1],xmm0[2,3]893; X86-SSE1-NEXT:    movlps %xmm0, (%eax)894; X86-SSE1-NEXT:    movl %ebp, %esp895; X86-SSE1-NEXT:    popl %ebp896; X86-SSE1-NEXT:    retl897;898; X86-SSE2-LABEL: fsub_64r:899; X86-SSE2:       # %bb.0:900; X86-SSE2-NEXT:    pushl %ebp901; X86-SSE2-NEXT:    movl %esp, %ebp902; X86-SSE2-NEXT:    andl $-8, %esp903; X86-SSE2-NEXT:    subl $8, %esp904; X86-SSE2-NEXT:    movl 8(%ebp), %eax905; X86-SSE2-NEXT:    movsd {{.*#+}} xmm0 = mem[0],zero906; X86-SSE2-NEXT:    subsd 12(%ebp), %xmm0907; X86-SSE2-NEXT:    movsd %xmm0, (%esp)908; X86-SSE2-NEXT:    movsd {{.*#+}} xmm0 = mem[0],zero909; X86-SSE2-NEXT:    movlps %xmm0, (%eax)910; X86-SSE2-NEXT:    movl %ebp, %esp911; X86-SSE2-NEXT:    popl %ebp912; X86-SSE2-NEXT:    retl913;914; X86-AVX-LABEL: fsub_64r:915; X86-AVX:       # %bb.0:916; X86-AVX-NEXT:    pushl %ebp917; X86-AVX-NEXT:    movl %esp, %ebp918; X86-AVX-NEXT:    andl $-8, %esp919; X86-AVX-NEXT:    subl $8, %esp920; X86-AVX-NEXT:    movl 8(%ebp), %eax921; X86-AVX-NEXT:    vmovsd {{.*#+}} xmm0 = mem[0],zero922; X86-AVX-NEXT:    vsubsd 12(%ebp), %xmm0, %xmm0923; X86-AVX-NEXT:    vmovsd %xmm0, (%esp)924; X86-AVX-NEXT:    vmovsd {{.*#+}} xmm0 = mem[0],zero925; X86-AVX-NEXT:    vmovlps %xmm0, (%eax)926; X86-AVX-NEXT:    movl %ebp, %esp927; X86-AVX-NEXT:    popl %ebp928; X86-AVX-NEXT:    retl929;930; X64-SSE-LABEL: fsub_64r:931; X64-SSE:       # %bb.0:932; X64-SSE-NEXT:    movsd {{.*#+}} xmm1 = mem[0],zero933; X64-SSE-NEXT:    subsd %xmm0, %xmm1934; X64-SSE-NEXT:    movsd %xmm1, (%rdi)935; X64-SSE-NEXT:    retq936;937; X64-AVX-LABEL: fsub_64r:938; X64-AVX:       # %bb.0:939; X64-AVX-NEXT:    vmovsd {{.*#+}} xmm1 = mem[0],zero940; X64-AVX-NEXT:    vsubsd %xmm0, %xmm1, %xmm0941; X64-AVX-NEXT:    vmovsd %xmm0, (%rdi)942; X64-AVX-NEXT:    retq943  %1 = load atomic i64, ptr %loc seq_cst, align 8944  %2 = bitcast i64 %1 to double945  %sub = fsub double %2, %val946  %3 = bitcast double %sub to i64947  store atomic i64 %3, ptr %loc release, align 8948  ret void949}950 951; Floating-point sub to a global using an immediate.952define dso_local void @fsub_32g() nounwind {953; X86-NOSSE-LABEL: fsub_32g:954; X86-NOSSE:       # %bb.0:955; X86-NOSSE-NEXT:    subl $8, %esp956; X86-NOSSE-NEXT:    movl glob32, %eax957; X86-NOSSE-NEXT:    movl %eax, (%esp)958; X86-NOSSE-NEXT:    fld1959; X86-NOSSE-NEXT:    fchs960; X86-NOSSE-NEXT:    fadds (%esp)961; X86-NOSSE-NEXT:    fstps {{[0-9]+}}(%esp)962; X86-NOSSE-NEXT:    movl {{[0-9]+}}(%esp), %eax963; X86-NOSSE-NEXT:    movl %eax, glob32964; X86-NOSSE-NEXT:    addl $8, %esp965; X86-NOSSE-NEXT:    retl966;967; X86-SSE1-LABEL: fsub_32g:968; X86-SSE1:       # %bb.0:969; X86-SSE1-NEXT:    subl $8, %esp970; X86-SSE1-NEXT:    movl glob32, %eax971; X86-SSE1-NEXT:    movl %eax, (%esp)972; X86-SSE1-NEXT:    movss {{.*#+}} xmm0 = mem[0],zero,zero,zero973; X86-SSE1-NEXT:    addss {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0974; X86-SSE1-NEXT:    movss %xmm0, {{[0-9]+}}(%esp)975; X86-SSE1-NEXT:    movl {{[0-9]+}}(%esp), %eax976; X86-SSE1-NEXT:    movl %eax, glob32977; X86-SSE1-NEXT:    addl $8, %esp978; X86-SSE1-NEXT:    retl979;980; X86-SSE2-LABEL: fsub_32g:981; X86-SSE2:       # %bb.0:982; X86-SSE2-NEXT:    movss {{.*#+}} xmm0 = [-1.0E+0,0.0E+0,0.0E+0,0.0E+0]983; X86-SSE2-NEXT:    addss glob32, %xmm0984; X86-SSE2-NEXT:    movss %xmm0, glob32985; X86-SSE2-NEXT:    retl986;987; X86-AVX-LABEL: fsub_32g:988; X86-AVX:       # %bb.0:989; X86-AVX-NEXT:    vmovss {{.*#+}} xmm0 = [-1.0E+0,0.0E+0,0.0E+0,0.0E+0]990; X86-AVX-NEXT:    vaddss glob32, %xmm0, %xmm0991; X86-AVX-NEXT:    vmovss %xmm0, glob32992; X86-AVX-NEXT:    retl993;994; X64-SSE-LABEL: fsub_32g:995; X64-SSE:       # %bb.0:996; X64-SSE-NEXT:    movss {{.*#+}} xmm0 = [-1.0E+0,0.0E+0,0.0E+0,0.0E+0]997; X64-SSE-NEXT:    addss glob32(%rip), %xmm0998; X64-SSE-NEXT:    movss %xmm0, glob32(%rip)999; X64-SSE-NEXT:    retq1000;1001; X64-AVX-LABEL: fsub_32g:1002; X64-AVX:       # %bb.0:1003; X64-AVX-NEXT:    vmovss {{.*#+}} xmm0 = [-1.0E+0,0.0E+0,0.0E+0,0.0E+0]1004; X64-AVX-NEXT:    vaddss glob32(%rip), %xmm0, %xmm01005; X64-AVX-NEXT:    vmovss %xmm0, glob32(%rip)1006; X64-AVX-NEXT:    retq1007  %i = load atomic i32, ptr @glob32 monotonic, align 41008  %f = bitcast i32 %i to float1009  %sub = fsub float %f, 1.000000e+001010  %s = bitcast float %sub to i321011  store atomic i32 %s, ptr @glob32 monotonic, align 41012  ret void1013}1014 1015define dso_local void @fsub_64g() nounwind {1016; X86-NOSSE-LABEL: fsub_64g:1017; X86-NOSSE:       # %bb.0:1018; X86-NOSSE-NEXT:    pushl %ebp1019; X86-NOSSE-NEXT:    movl %esp, %ebp1020; X86-NOSSE-NEXT:    andl $-8, %esp1021; X86-NOSSE-NEXT:    subl $32, %esp1022; X86-NOSSE-NEXT:    fildll glob641023; X86-NOSSE-NEXT:    fistpll {{[0-9]+}}(%esp)1024; X86-NOSSE-NEXT:    movl {{[0-9]+}}(%esp), %eax1025; X86-NOSSE-NEXT:    movl {{[0-9]+}}(%esp), %ecx1026; X86-NOSSE-NEXT:    movl %ecx, {{[0-9]+}}(%esp)1027; X86-NOSSE-NEXT:    movl %eax, {{[0-9]+}}(%esp)1028; X86-NOSSE-NEXT:    fld11029; X86-NOSSE-NEXT:    fchs1030; X86-NOSSE-NEXT:    faddl {{[0-9]+}}(%esp)1031; X86-NOSSE-NEXT:    fstpl {{[0-9]+}}(%esp)1032; X86-NOSSE-NEXT:    movl {{[0-9]+}}(%esp), %eax1033; X86-NOSSE-NEXT:    movl {{[0-9]+}}(%esp), %ecx1034; X86-NOSSE-NEXT:    movl %eax, (%esp)1035; X86-NOSSE-NEXT:    movl %ecx, {{[0-9]+}}(%esp)1036; X86-NOSSE-NEXT:    fildll (%esp)1037; X86-NOSSE-NEXT:    fistpll glob641038; X86-NOSSE-NEXT:    movl %ebp, %esp1039; X86-NOSSE-NEXT:    popl %ebp1040; X86-NOSSE-NEXT:    retl1041;1042; X86-SSE1-LABEL: fsub_64g:1043; X86-SSE1:       # %bb.0:1044; X86-SSE1-NEXT:    pushl %ebp1045; X86-SSE1-NEXT:    movl %esp, %ebp1046; X86-SSE1-NEXT:    andl $-8, %esp1047; X86-SSE1-NEXT:    subl $16, %esp1048; X86-SSE1-NEXT:    xorps %xmm0, %xmm01049; X86-SSE1-NEXT:    xorps %xmm1, %xmm11050; X86-SSE1-NEXT:    movlps {{.*#+}} xmm1 = mem[0,1],xmm1[2,3]1051; X86-SSE1-NEXT:    movss %xmm1, (%esp)1052; X86-SSE1-NEXT:    shufps {{.*#+}} xmm1 = xmm1[1,1,1,1]1053; X86-SSE1-NEXT:    movss %xmm1, {{[0-9]+}}(%esp)1054; X86-SSE1-NEXT:    fld11055; X86-SSE1-NEXT:    fchs1056; X86-SSE1-NEXT:    faddl (%esp)1057; X86-SSE1-NEXT:    fstpl {{[0-9]+}}(%esp)1058; X86-SSE1-NEXT:    movlps {{.*#+}} xmm0 = mem[0,1],xmm0[2,3]1059; X86-SSE1-NEXT:    movlps %xmm0, glob641060; X86-SSE1-NEXT:    movl %ebp, %esp1061; X86-SSE1-NEXT:    popl %ebp1062; X86-SSE1-NEXT:    retl1063;1064; X86-SSE2-LABEL: fsub_64g:1065; X86-SSE2:       # %bb.0:1066; X86-SSE2-NEXT:    pushl %ebp1067; X86-SSE2-NEXT:    movl %esp, %ebp1068; X86-SSE2-NEXT:    andl $-8, %esp1069; X86-SSE2-NEXT:    subl $8, %esp1070; X86-SSE2-NEXT:    movsd {{.*#+}} xmm0 = mem[0],zero1071; X86-SSE2-NEXT:    addsd {{\.?LCPI[0-9]+_[0-9]+}}, %xmm01072; X86-SSE2-NEXT:    movsd %xmm0, (%esp)1073; X86-SSE2-NEXT:    movsd {{.*#+}} xmm0 = mem[0],zero1074; X86-SSE2-NEXT:    movlps %xmm0, glob641075; X86-SSE2-NEXT:    movl %ebp, %esp1076; X86-SSE2-NEXT:    popl %ebp1077; X86-SSE2-NEXT:    retl1078;1079; X86-AVX-LABEL: fsub_64g:1080; X86-AVX:       # %bb.0:1081; X86-AVX-NEXT:    pushl %ebp1082; X86-AVX-NEXT:    movl %esp, %ebp1083; X86-AVX-NEXT:    andl $-8, %esp1084; X86-AVX-NEXT:    subl $8, %esp1085; X86-AVX-NEXT:    vmovsd {{.*#+}} xmm0 = mem[0],zero1086; X86-AVX-NEXT:    vaddsd {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0, %xmm01087; X86-AVX-NEXT:    vmovsd %xmm0, (%esp)1088; X86-AVX-NEXT:    vmovsd {{.*#+}} xmm0 = mem[0],zero1089; X86-AVX-NEXT:    vmovlps %xmm0, glob641090; X86-AVX-NEXT:    movl %ebp, %esp1091; X86-AVX-NEXT:    popl %ebp1092; X86-AVX-NEXT:    retl1093;1094; X64-SSE-LABEL: fsub_64g:1095; X64-SSE:       # %bb.0:1096; X64-SSE-NEXT:    movsd {{.*#+}} xmm0 = [-1.0E+0,0.0E+0]1097; X64-SSE-NEXT:    addsd glob64(%rip), %xmm01098; X64-SSE-NEXT:    movsd %xmm0, glob64(%rip)1099; X64-SSE-NEXT:    retq1100;1101; X64-AVX-LABEL: fsub_64g:1102; X64-AVX:       # %bb.0:1103; X64-AVX-NEXT:    vmovsd {{.*#+}} xmm0 = [-1.0E+0,0.0E+0]1104; X64-AVX-NEXT:    vaddsd glob64(%rip), %xmm0, %xmm01105; X64-AVX-NEXT:    vmovsd %xmm0, glob64(%rip)1106; X64-AVX-NEXT:    retq1107  %i = load atomic i64, ptr @glob64 monotonic, align 81108  %f = bitcast i64 %i to double1109  %sub = fsub double %f, 1.000000e+001110  %s = bitcast double %sub to i641111  store atomic i64 %s, ptr @glob64 monotonic, align 81112  ret void1113}1114 1115; Floating-point sub to a hard-coded immediate location using an immediate.1116define dso_local void @fsub_32imm() nounwind {1117; X86-NOSSE-LABEL: fsub_32imm:1118; X86-NOSSE:       # %bb.0:1119; X86-NOSSE-NEXT:    subl $8, %esp1120; X86-NOSSE-NEXT:    movl -559038737, %eax1121; X86-NOSSE-NEXT:    movl %eax, (%esp)1122; X86-NOSSE-NEXT:    fld11123; X86-NOSSE-NEXT:    fchs1124; X86-NOSSE-NEXT:    fadds (%esp)1125; X86-NOSSE-NEXT:    fstps {{[0-9]+}}(%esp)1126; X86-NOSSE-NEXT:    movl {{[0-9]+}}(%esp), %eax1127; X86-NOSSE-NEXT:    movl %eax, -5590387371128; X86-NOSSE-NEXT:    addl $8, %esp1129; X86-NOSSE-NEXT:    retl1130;1131; X86-SSE1-LABEL: fsub_32imm:1132; X86-SSE1:       # %bb.0:1133; X86-SSE1-NEXT:    subl $8, %esp1134; X86-SSE1-NEXT:    movl -559038737, %eax1135; X86-SSE1-NEXT:    movl %eax, (%esp)1136; X86-SSE1-NEXT:    movss {{.*#+}} xmm0 = mem[0],zero,zero,zero1137; X86-SSE1-NEXT:    addss {{\.?LCPI[0-9]+_[0-9]+}}, %xmm01138; X86-SSE1-NEXT:    movss %xmm0, {{[0-9]+}}(%esp)1139; X86-SSE1-NEXT:    movl {{[0-9]+}}(%esp), %eax1140; X86-SSE1-NEXT:    movl %eax, -5590387371141; X86-SSE1-NEXT:    addl $8, %esp1142; X86-SSE1-NEXT:    retl1143;1144; X86-SSE2-LABEL: fsub_32imm:1145; X86-SSE2:       # %bb.0:1146; X86-SSE2-NEXT:    movss {{.*#+}} xmm0 = [-1.0E+0,0.0E+0,0.0E+0,0.0E+0]1147; X86-SSE2-NEXT:    addss -559038737, %xmm01148; X86-SSE2-NEXT:    movss %xmm0, -5590387371149; X86-SSE2-NEXT:    retl1150;1151; X86-AVX-LABEL: fsub_32imm:1152; X86-AVX:       # %bb.0:1153; X86-AVX-NEXT:    vmovss {{.*#+}} xmm0 = [-1.0E+0,0.0E+0,0.0E+0,0.0E+0]1154; X86-AVX-NEXT:    vaddss -559038737, %xmm0, %xmm01155; X86-AVX-NEXT:    vmovss %xmm0, -5590387371156; X86-AVX-NEXT:    retl1157;1158; X64-SSE-LABEL: fsub_32imm:1159; X64-SSE:       # %bb.0:1160; X64-SSE-NEXT:    movl $3735928559, %eax # imm = 0xDEADBEEF1161; X64-SSE-NEXT:    movss {{.*#+}} xmm0 = [-1.0E+0,0.0E+0,0.0E+0,0.0E+0]1162; X64-SSE-NEXT:    addss (%rax), %xmm01163; X64-SSE-NEXT:    movss %xmm0, (%rax)1164; X64-SSE-NEXT:    retq1165;1166; X64-AVX-LABEL: fsub_32imm:1167; X64-AVX:       # %bb.0:1168; X64-AVX-NEXT:    movl $3735928559, %eax # imm = 0xDEADBEEF1169; X64-AVX-NEXT:    vmovss {{.*#+}} xmm0 = [-1.0E+0,0.0E+0,0.0E+0,0.0E+0]1170; X64-AVX-NEXT:    vaddss (%rax), %xmm0, %xmm01171; X64-AVX-NEXT:    vmovss %xmm0, (%rax)1172; X64-AVX-NEXT:    retq1173  %i = load atomic i32, ptr inttoptr (i32 3735928559 to ptr) monotonic, align 41174  %f = bitcast i32 %i to float1175  %sub = fsub float %f, 1.000000e+001176  %s = bitcast float %sub to i321177  store atomic i32 %s, ptr inttoptr (i32 3735928559 to ptr) monotonic, align 41178  ret void1179}1180 1181define dso_local void @fsub_64imm() nounwind {1182; X86-NOSSE-LABEL: fsub_64imm:1183; X86-NOSSE:       # %bb.0:1184; X86-NOSSE-NEXT:    pushl %ebp1185; X86-NOSSE-NEXT:    movl %esp, %ebp1186; X86-NOSSE-NEXT:    andl $-8, %esp1187; X86-NOSSE-NEXT:    subl $32, %esp1188; X86-NOSSE-NEXT:    fildll -5590387371189; X86-NOSSE-NEXT:    fistpll {{[0-9]+}}(%esp)1190; X86-NOSSE-NEXT:    movl {{[0-9]+}}(%esp), %eax1191; X86-NOSSE-NEXT:    movl {{[0-9]+}}(%esp), %ecx1192; X86-NOSSE-NEXT:    movl %ecx, {{[0-9]+}}(%esp)1193; X86-NOSSE-NEXT:    movl %eax, {{[0-9]+}}(%esp)1194; X86-NOSSE-NEXT:    fld11195; X86-NOSSE-NEXT:    fchs1196; X86-NOSSE-NEXT:    faddl {{[0-9]+}}(%esp)1197; X86-NOSSE-NEXT:    fstpl {{[0-9]+}}(%esp)1198; X86-NOSSE-NEXT:    movl {{[0-9]+}}(%esp), %eax1199; X86-NOSSE-NEXT:    movl {{[0-9]+}}(%esp), %ecx1200; X86-NOSSE-NEXT:    movl %eax, (%esp)1201; X86-NOSSE-NEXT:    movl %ecx, {{[0-9]+}}(%esp)1202; X86-NOSSE-NEXT:    fildll (%esp)1203; X86-NOSSE-NEXT:    fistpll -5590387371204; X86-NOSSE-NEXT:    movl %ebp, %esp1205; X86-NOSSE-NEXT:    popl %ebp1206; X86-NOSSE-NEXT:    retl1207;1208; X86-SSE1-LABEL: fsub_64imm:1209; X86-SSE1:       # %bb.0:1210; X86-SSE1-NEXT:    pushl %ebp1211; X86-SSE1-NEXT:    movl %esp, %ebp1212; X86-SSE1-NEXT:    andl $-8, %esp1213; X86-SSE1-NEXT:    subl $16, %esp1214; X86-SSE1-NEXT:    xorps %xmm0, %xmm01215; X86-SSE1-NEXT:    xorps %xmm1, %xmm11216; X86-SSE1-NEXT:    movlps {{.*#+}} xmm1 = mem[0,1],xmm1[2,3]1217; X86-SSE1-NEXT:    movss %xmm1, (%esp)1218; X86-SSE1-NEXT:    shufps {{.*#+}} xmm1 = xmm1[1,1,1,1]1219; X86-SSE1-NEXT:    movss %xmm1, {{[0-9]+}}(%esp)1220; X86-SSE1-NEXT:    fld11221; X86-SSE1-NEXT:    fchs1222; X86-SSE1-NEXT:    faddl (%esp)1223; X86-SSE1-NEXT:    fstpl {{[0-9]+}}(%esp)1224; X86-SSE1-NEXT:    movlps {{.*#+}} xmm0 = mem[0,1],xmm0[2,3]1225; X86-SSE1-NEXT:    movlps %xmm0, -5590387371226; X86-SSE1-NEXT:    movl %ebp, %esp1227; X86-SSE1-NEXT:    popl %ebp1228; X86-SSE1-NEXT:    retl1229;1230; X86-SSE2-LABEL: fsub_64imm:1231; X86-SSE2:       # %bb.0:1232; X86-SSE2-NEXT:    pushl %ebp1233; X86-SSE2-NEXT:    movl %esp, %ebp1234; X86-SSE2-NEXT:    andl $-8, %esp1235; X86-SSE2-NEXT:    subl $8, %esp1236; X86-SSE2-NEXT:    movsd {{.*#+}} xmm0 = mem[0],zero1237; X86-SSE2-NEXT:    addsd {{\.?LCPI[0-9]+_[0-9]+}}, %xmm01238; X86-SSE2-NEXT:    movsd %xmm0, (%esp)1239; X86-SSE2-NEXT:    movsd {{.*#+}} xmm0 = mem[0],zero1240; X86-SSE2-NEXT:    movlps %xmm0, -5590387371241; X86-SSE2-NEXT:    movl %ebp, %esp1242; X86-SSE2-NEXT:    popl %ebp1243; X86-SSE2-NEXT:    retl1244;1245; X86-AVX-LABEL: fsub_64imm:1246; X86-AVX:       # %bb.0:1247; X86-AVX-NEXT:    pushl %ebp1248; X86-AVX-NEXT:    movl %esp, %ebp1249; X86-AVX-NEXT:    andl $-8, %esp1250; X86-AVX-NEXT:    subl $8, %esp1251; X86-AVX-NEXT:    vmovsd {{.*#+}} xmm0 = mem[0],zero1252; X86-AVX-NEXT:    vaddsd {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0, %xmm01253; X86-AVX-NEXT:    vmovsd %xmm0, (%esp)1254; X86-AVX-NEXT:    vmovsd {{.*#+}} xmm0 = mem[0],zero1255; X86-AVX-NEXT:    vmovlps %xmm0, -5590387371256; X86-AVX-NEXT:    movl %ebp, %esp1257; X86-AVX-NEXT:    popl %ebp1258; X86-AVX-NEXT:    retl1259;1260; X64-SSE-LABEL: fsub_64imm:1261; X64-SSE:       # %bb.0:1262; X64-SSE-NEXT:    movl $3735928559, %eax # imm = 0xDEADBEEF1263; X64-SSE-NEXT:    movsd {{.*#+}} xmm0 = [-1.0E+0,0.0E+0]1264; X64-SSE-NEXT:    addsd (%rax), %xmm01265; X64-SSE-NEXT:    movsd %xmm0, (%rax)1266; X64-SSE-NEXT:    retq1267;1268; X64-AVX-LABEL: fsub_64imm:1269; X64-AVX:       # %bb.0:1270; X64-AVX-NEXT:    movl $3735928559, %eax # imm = 0xDEADBEEF1271; X64-AVX-NEXT:    vmovsd {{.*#+}} xmm0 = [-1.0E+0,0.0E+0]1272; X64-AVX-NEXT:    vaddsd (%rax), %xmm0, %xmm01273; X64-AVX-NEXT:    vmovsd %xmm0, (%rax)1274; X64-AVX-NEXT:    retq1275  %i = load atomic i64, ptr inttoptr (i64 3735928559 to ptr) monotonic, align 81276  %f = bitcast i64 %i to double1277  %sub = fsub double %f, 1.000000e+001278  %s = bitcast double %sub to i641279  store atomic i64 %s, ptr inttoptr (i64 3735928559 to ptr) monotonic, align 81280  ret void1281}1282 1283; Floating-point sub to a stack location.1284define dso_local void @fsub_32stack() nounwind {1285; X86-NOSSE-LABEL: fsub_32stack:1286; X86-NOSSE:       # %bb.0:1287; X86-NOSSE-NEXT:    subl $12, %esp1288; X86-NOSSE-NEXT:    movl {{[0-9]+}}(%esp), %eax1289; X86-NOSSE-NEXT:    movl %eax, (%esp)1290; X86-NOSSE-NEXT:    fld11291; X86-NOSSE-NEXT:    fsubs (%esp)1292; X86-NOSSE-NEXT:    fstps {{[0-9]+}}(%esp)1293; X86-NOSSE-NEXT:    movl {{[0-9]+}}(%esp), %eax1294; X86-NOSSE-NEXT:    movl %eax, {{[0-9]+}}(%esp)1295; X86-NOSSE-NEXT:    addl $12, %esp1296; X86-NOSSE-NEXT:    retl1297;1298; X86-SSE1-LABEL: fsub_32stack:1299; X86-SSE1:       # %bb.0:1300; X86-SSE1-NEXT:    subl $12, %esp1301; X86-SSE1-NEXT:    movl {{[0-9]+}}(%esp), %eax1302; X86-SSE1-NEXT:    movl %eax, (%esp)1303; X86-SSE1-NEXT:    movss {{.*#+}} xmm0 = [1.0E+0,0.0E+0,0.0E+0,0.0E+0]1304; X86-SSE1-NEXT:    subss (%esp), %xmm01305; X86-SSE1-NEXT:    movss %xmm0, {{[0-9]+}}(%esp)1306; X86-SSE1-NEXT:    movl {{[0-9]+}}(%esp), %eax1307; X86-SSE1-NEXT:    movl %eax, {{[0-9]+}}(%esp)1308; X86-SSE1-NEXT:    addl $12, %esp1309; X86-SSE1-NEXT:    retl1310;1311; X86-SSE2-LABEL: fsub_32stack:1312; X86-SSE2:       # %bb.0:1313; X86-SSE2-NEXT:    pushl %eax1314; X86-SSE2-NEXT:    movss {{.*#+}} xmm0 = [1.0E+0,0.0E+0,0.0E+0,0.0E+0]1315; X86-SSE2-NEXT:    subss (%esp), %xmm01316; X86-SSE2-NEXT:    movss %xmm0, (%esp)1317; X86-SSE2-NEXT:    popl %eax1318; X86-SSE2-NEXT:    retl1319;1320; X86-AVX-LABEL: fsub_32stack:1321; X86-AVX:       # %bb.0:1322; X86-AVX-NEXT:    pushl %eax1323; X86-AVX-NEXT:    vmovss {{.*#+}} xmm0 = [1.0E+0,0.0E+0,0.0E+0,0.0E+0]1324; X86-AVX-NEXT:    vsubss (%esp), %xmm0, %xmm01325; X86-AVX-NEXT:    vmovss %xmm0, (%esp)1326; X86-AVX-NEXT:    popl %eax1327; X86-AVX-NEXT:    retl1328;1329; X64-SSE-LABEL: fsub_32stack:1330; X64-SSE:       # %bb.0:1331; X64-SSE-NEXT:    movss {{.*#+}} xmm0 = [1.0E+0,0.0E+0,0.0E+0,0.0E+0]1332; X64-SSE-NEXT:    subss -{{[0-9]+}}(%rsp), %xmm01333; X64-SSE-NEXT:    movss %xmm0, -{{[0-9]+}}(%rsp)1334; X64-SSE-NEXT:    retq1335;1336; X64-AVX-LABEL: fsub_32stack:1337; X64-AVX:       # %bb.0:1338; X64-AVX-NEXT:    vmovss {{.*#+}} xmm0 = [1.0E+0,0.0E+0,0.0E+0,0.0E+0]1339; X64-AVX-NEXT:    vsubss -{{[0-9]+}}(%rsp), %xmm0, %xmm01340; X64-AVX-NEXT:    vmovss %xmm0, -{{[0-9]+}}(%rsp)1341; X64-AVX-NEXT:    retq1342  %ptr = alloca i32, align 41343  %load = load atomic i32, ptr %ptr acquire, align 41344  %bc0 = bitcast i32 %load to float1345  %fsub = fsub float 1.000000e+00, %bc01346  %bc1 = bitcast float %fsub to i321347  store atomic i32 %bc1, ptr %ptr release, align 41348  ret void1349}1350 1351define dso_local void @fsub_64stack() nounwind {1352; X86-NOSSE-LABEL: fsub_64stack:1353; X86-NOSSE:       # %bb.0:1354; X86-NOSSE-NEXT:    pushl %ebp1355; X86-NOSSE-NEXT:    movl %esp, %ebp1356; X86-NOSSE-NEXT:    andl $-8, %esp1357; X86-NOSSE-NEXT:    subl $40, %esp1358; X86-NOSSE-NEXT:    fildll {{[0-9]+}}(%esp)1359; X86-NOSSE-NEXT:    fistpll {{[0-9]+}}(%esp)1360; X86-NOSSE-NEXT:    movl {{[0-9]+}}(%esp), %eax1361; X86-NOSSE-NEXT:    movl {{[0-9]+}}(%esp), %ecx1362; X86-NOSSE-NEXT:    movl %ecx, {{[0-9]+}}(%esp)1363; X86-NOSSE-NEXT:    movl %eax, {{[0-9]+}}(%esp)1364; X86-NOSSE-NEXT:    fld11365; X86-NOSSE-NEXT:    fsubl {{[0-9]+}}(%esp)1366; X86-NOSSE-NEXT:    fstpl {{[0-9]+}}(%esp)1367; X86-NOSSE-NEXT:    movl {{[0-9]+}}(%esp), %eax1368; X86-NOSSE-NEXT:    movl {{[0-9]+}}(%esp), %ecx1369; X86-NOSSE-NEXT:    movl %eax, (%esp)1370; X86-NOSSE-NEXT:    movl %ecx, {{[0-9]+}}(%esp)1371; X86-NOSSE-NEXT:    fildll (%esp)1372; X86-NOSSE-NEXT:    fistpll {{[0-9]+}}(%esp)1373; X86-NOSSE-NEXT:    movl %ebp, %esp1374; X86-NOSSE-NEXT:    popl %ebp1375; X86-NOSSE-NEXT:    retl1376;1377; X86-SSE1-LABEL: fsub_64stack:1378; X86-SSE1:       # %bb.0:1379; X86-SSE1-NEXT:    pushl %ebp1380; X86-SSE1-NEXT:    movl %esp, %ebp1381; X86-SSE1-NEXT:    andl $-8, %esp1382; X86-SSE1-NEXT:    subl $24, %esp1383; X86-SSE1-NEXT:    xorps %xmm0, %xmm01384; X86-SSE1-NEXT:    xorps %xmm1, %xmm11385; X86-SSE1-NEXT:    movlps {{.*#+}} xmm1 = mem[0,1],xmm1[2,3]1386; X86-SSE1-NEXT:    movss %xmm1, (%esp)1387; X86-SSE1-NEXT:    shufps {{.*#+}} xmm1 = xmm1[1,1,1,1]1388; X86-SSE1-NEXT:    movss %xmm1, {{[0-9]+}}(%esp)1389; X86-SSE1-NEXT:    fld11390; X86-SSE1-NEXT:    fsubl (%esp)1391; X86-SSE1-NEXT:    fstpl {{[0-9]+}}(%esp)1392; X86-SSE1-NEXT:    movlps {{.*#+}} xmm0 = mem[0,1],xmm0[2,3]1393; X86-SSE1-NEXT:    movlps %xmm0, {{[0-9]+}}(%esp)1394; X86-SSE1-NEXT:    movl %ebp, %esp1395; X86-SSE1-NEXT:    popl %ebp1396; X86-SSE1-NEXT:    retl1397;1398; X86-SSE2-LABEL: fsub_64stack:1399; X86-SSE2:       # %bb.0:1400; X86-SSE2-NEXT:    pushl %ebp1401; X86-SSE2-NEXT:    movl %esp, %ebp1402; X86-SSE2-NEXT:    andl $-8, %esp1403; X86-SSE2-NEXT:    subl $16, %esp1404; X86-SSE2-NEXT:    movsd {{.*#+}} xmm0 = mem[0],zero1405; X86-SSE2-NEXT:    movsd {{.*#+}} xmm1 = [1.0E+0,0.0E+0]1406; X86-SSE2-NEXT:    subsd %xmm0, %xmm11407; X86-SSE2-NEXT:    movsd %xmm1, (%esp)1408; X86-SSE2-NEXT:    movsd {{.*#+}} xmm0 = mem[0],zero1409; X86-SSE2-NEXT:    movlps %xmm0, {{[0-9]+}}(%esp)1410; X86-SSE2-NEXT:    movl %ebp, %esp1411; X86-SSE2-NEXT:    popl %ebp1412; X86-SSE2-NEXT:    retl1413;1414; X86-AVX-LABEL: fsub_64stack:1415; X86-AVX:       # %bb.0:1416; X86-AVX-NEXT:    pushl %ebp1417; X86-AVX-NEXT:    movl %esp, %ebp1418; X86-AVX-NEXT:    andl $-8, %esp1419; X86-AVX-NEXT:    subl $16, %esp1420; X86-AVX-NEXT:    vmovsd {{.*#+}} xmm0 = mem[0],zero1421; X86-AVX-NEXT:    vmovsd {{.*#+}} xmm1 = [1.0E+0,0.0E+0]1422; X86-AVX-NEXT:    vsubsd %xmm0, %xmm1, %xmm01423; X86-AVX-NEXT:    vmovsd %xmm0, (%esp)1424; X86-AVX-NEXT:    vmovsd {{.*#+}} xmm0 = mem[0],zero1425; X86-AVX-NEXT:    vmovlps %xmm0, {{[0-9]+}}(%esp)1426; X86-AVX-NEXT:    movl %ebp, %esp1427; X86-AVX-NEXT:    popl %ebp1428; X86-AVX-NEXT:    retl1429;1430; X64-SSE-LABEL: fsub_64stack:1431; X64-SSE:       # %bb.0:1432; X64-SSE-NEXT:    movsd {{.*#+}} xmm0 = [1.0E+0,0.0E+0]1433; X64-SSE-NEXT:    subsd -{{[0-9]+}}(%rsp), %xmm01434; X64-SSE-NEXT:    movsd %xmm0, -{{[0-9]+}}(%rsp)1435; X64-SSE-NEXT:    retq1436;1437; X64-AVX-LABEL: fsub_64stack:1438; X64-AVX:       # %bb.0:1439; X64-AVX-NEXT:    vmovsd {{.*#+}} xmm0 = [1.0E+0,0.0E+0]1440; X64-AVX-NEXT:    vsubsd -{{[0-9]+}}(%rsp), %xmm0, %xmm01441; X64-AVX-NEXT:    vmovsd %xmm0, -{{[0-9]+}}(%rsp)1442; X64-AVX-NEXT:    retq1443  %ptr = alloca i64, align 81444  %load = load atomic i64, ptr %ptr acquire, align 81445  %bc0 = bitcast i64 %load to double1446  %fsub = fsub double 1.000000e+00, %bc01447  %bc1 = bitcast double %fsub to i641448  store atomic i64 %bc1, ptr %ptr release, align 81449  ret void1450}1451 1452define dso_local void @fsub_array(ptr %arg, double %arg1, i64 %arg2) nounwind {1453; X86-NOSSE-LABEL: fsub_array:1454; X86-NOSSE:       # %bb.0: # %bb1455; X86-NOSSE-NEXT:    pushl %ebp1456; X86-NOSSE-NEXT:    movl %esp, %ebp1457; X86-NOSSE-NEXT:    pushl %esi1458; X86-NOSSE-NEXT:    andl $-8, %esp1459; X86-NOSSE-NEXT:    subl $40, %esp1460; X86-NOSSE-NEXT:    movl 20(%ebp), %eax1461; X86-NOSSE-NEXT:    movl 8(%ebp), %ecx1462; X86-NOSSE-NEXT:    fildll (%ecx,%eax,8)1463; X86-NOSSE-NEXT:    fistpll {{[0-9]+}}(%esp)1464; X86-NOSSE-NEXT:    movl {{[0-9]+}}(%esp), %edx1465; X86-NOSSE-NEXT:    movl {{[0-9]+}}(%esp), %esi1466; X86-NOSSE-NEXT:    movl %esi, {{[0-9]+}}(%esp)1467; X86-NOSSE-NEXT:    movl %edx, {{[0-9]+}}(%esp)1468; X86-NOSSE-NEXT:    fldl {{[0-9]+}}(%esp)1469; X86-NOSSE-NEXT:    fsubl 12(%ebp)1470; X86-NOSSE-NEXT:    fstpl {{[0-9]+}}(%esp)1471; X86-NOSSE-NEXT:    movl {{[0-9]+}}(%esp), %edx1472; X86-NOSSE-NEXT:    movl {{[0-9]+}}(%esp), %esi1473; X86-NOSSE-NEXT:    movl %edx, (%esp)1474; X86-NOSSE-NEXT:    movl %esi, {{[0-9]+}}(%esp)1475; X86-NOSSE-NEXT:    fildll (%esp)1476; X86-NOSSE-NEXT:    fistpll (%ecx,%eax,8)1477; X86-NOSSE-NEXT:    leal -4(%ebp), %esp1478; X86-NOSSE-NEXT:    popl %esi1479; X86-NOSSE-NEXT:    popl %ebp1480; X86-NOSSE-NEXT:    retl1481;1482; X86-SSE1-LABEL: fsub_array:1483; X86-SSE1:       # %bb.0: # %bb1484; X86-SSE1-NEXT:    pushl %ebp1485; X86-SSE1-NEXT:    movl %esp, %ebp1486; X86-SSE1-NEXT:    andl $-8, %esp1487; X86-SSE1-NEXT:    subl $16, %esp1488; X86-SSE1-NEXT:    movl 20(%ebp), %eax1489; X86-SSE1-NEXT:    movl 8(%ebp), %ecx1490; X86-SSE1-NEXT:    xorps %xmm0, %xmm01491; X86-SSE1-NEXT:    xorps %xmm1, %xmm11492; X86-SSE1-NEXT:    movlps {{.*#+}} xmm1 = mem[0,1],xmm1[2,3]1493; X86-SSE1-NEXT:    movss %xmm1, (%esp)1494; X86-SSE1-NEXT:    shufps {{.*#+}} xmm1 = xmm1[1,1,1,1]1495; X86-SSE1-NEXT:    movss %xmm1, {{[0-9]+}}(%esp)1496; X86-SSE1-NEXT:    fldl (%esp)1497; X86-SSE1-NEXT:    fsubl 12(%ebp)1498; X86-SSE1-NEXT:    fstpl {{[0-9]+}}(%esp)1499; X86-SSE1-NEXT:    movlps {{.*#+}} xmm0 = mem[0,1],xmm0[2,3]1500; X86-SSE1-NEXT:    movlps %xmm0, (%ecx,%eax,8)1501; X86-SSE1-NEXT:    movl %ebp, %esp1502; X86-SSE1-NEXT:    popl %ebp1503; X86-SSE1-NEXT:    retl1504;1505; X86-SSE2-LABEL: fsub_array:1506; X86-SSE2:       # %bb.0: # %bb1507; X86-SSE2-NEXT:    pushl %ebp1508; X86-SSE2-NEXT:    movl %esp, %ebp1509; X86-SSE2-NEXT:    andl $-8, %esp1510; X86-SSE2-NEXT:    subl $8, %esp1511; X86-SSE2-NEXT:    movl 20(%ebp), %eax1512; X86-SSE2-NEXT:    movl 8(%ebp), %ecx1513; X86-SSE2-NEXT:    movsd {{.*#+}} xmm0 = mem[0],zero1514; X86-SSE2-NEXT:    subsd 12(%ebp), %xmm01515; X86-SSE2-NEXT:    movsd %xmm0, (%esp)1516; X86-SSE2-NEXT:    movsd {{.*#+}} xmm0 = mem[0],zero1517; X86-SSE2-NEXT:    movlps %xmm0, (%ecx,%eax,8)1518; X86-SSE2-NEXT:    movl %ebp, %esp1519; X86-SSE2-NEXT:    popl %ebp1520; X86-SSE2-NEXT:    retl1521;1522; X86-AVX-LABEL: fsub_array:1523; X86-AVX:       # %bb.0: # %bb1524; X86-AVX-NEXT:    pushl %ebp1525; X86-AVX-NEXT:    movl %esp, %ebp1526; X86-AVX-NEXT:    andl $-8, %esp1527; X86-AVX-NEXT:    subl $8, %esp1528; X86-AVX-NEXT:    movl 20(%ebp), %eax1529; X86-AVX-NEXT:    movl 8(%ebp), %ecx1530; X86-AVX-NEXT:    vmovsd {{.*#+}} xmm0 = mem[0],zero1531; X86-AVX-NEXT:    vsubsd 12(%ebp), %xmm0, %xmm01532; X86-AVX-NEXT:    vmovsd %xmm0, (%esp)1533; X86-AVX-NEXT:    vmovsd {{.*#+}} xmm0 = mem[0],zero1534; X86-AVX-NEXT:    vmovlps %xmm0, (%ecx,%eax,8)1535; X86-AVX-NEXT:    movl %ebp, %esp1536; X86-AVX-NEXT:    popl %ebp1537; X86-AVX-NEXT:    retl1538;1539; X64-SSE-LABEL: fsub_array:1540; X64-SSE:       # %bb.0: # %bb1541; X64-SSE-NEXT:    movsd {{.*#+}} xmm1 = mem[0],zero1542; X64-SSE-NEXT:    subsd %xmm0, %xmm11543; X64-SSE-NEXT:    movsd %xmm1, (%rdi,%rsi,8)1544; X64-SSE-NEXT:    retq1545;1546; X64-AVX-LABEL: fsub_array:1547; X64-AVX:       # %bb.0: # %bb1548; X64-AVX-NEXT:    vmovsd {{.*#+}} xmm1 = mem[0],zero1549; X64-AVX-NEXT:    vsubsd %xmm0, %xmm1, %xmm01550; X64-AVX-NEXT:    vmovsd %xmm0, (%rdi,%rsi,8)1551; X64-AVX-NEXT:    retq1552bb:1553  %tmp4 = getelementptr inbounds i64, ptr %arg, i64 %arg21554  %tmp6 = load atomic i64, ptr %tmp4 monotonic, align 81555  %tmp7 = bitcast i64 %tmp6 to double1556  %tmp8 = fsub double %tmp7, %arg11557  %tmp9 = bitcast double %tmp8 to i641558  store atomic i64 %tmp9, ptr %tmp4 monotonic, align 81559  ret void1560}1561 1562; ----- FMUL -----1563 1564define dso_local void @fmul_32r(ptr %loc, float %val) nounwind {1565; X86-NOSSE-LABEL: fmul_32r:1566; X86-NOSSE:       # %bb.0:1567; X86-NOSSE-NEXT:    subl $8, %esp1568; X86-NOSSE-NEXT:    movl {{[0-9]+}}(%esp), %eax1569; X86-NOSSE-NEXT:    movl (%eax), %ecx1570; X86-NOSSE-NEXT:    movl %ecx, (%esp)1571; X86-NOSSE-NEXT:    flds (%esp)1572; X86-NOSSE-NEXT:    fmuls {{[0-9]+}}(%esp)1573; X86-NOSSE-NEXT:    fstps {{[0-9]+}}(%esp)1574; X86-NOSSE-NEXT:    movl {{[0-9]+}}(%esp), %ecx1575; X86-NOSSE-NEXT:    movl %ecx, (%eax)1576; X86-NOSSE-NEXT:    addl $8, %esp1577; X86-NOSSE-NEXT:    retl1578;1579; X86-SSE1-LABEL: fmul_32r:1580; X86-SSE1:       # %bb.0:1581; X86-SSE1-NEXT:    subl $8, %esp1582; X86-SSE1-NEXT:    movl {{[0-9]+}}(%esp), %eax1583; X86-SSE1-NEXT:    movl (%eax), %ecx1584; X86-SSE1-NEXT:    movl %ecx, (%esp)1585; X86-SSE1-NEXT:    movss {{.*#+}} xmm0 = mem[0],zero,zero,zero1586; X86-SSE1-NEXT:    mulss {{[0-9]+}}(%esp), %xmm01587; X86-SSE1-NEXT:    movss %xmm0, {{[0-9]+}}(%esp)1588; X86-SSE1-NEXT:    movl {{[0-9]+}}(%esp), %ecx1589; X86-SSE1-NEXT:    movl %ecx, (%eax)1590; X86-SSE1-NEXT:    addl $8, %esp1591; X86-SSE1-NEXT:    retl1592;1593; X86-SSE2-LABEL: fmul_32r:1594; X86-SSE2:       # %bb.0:1595; X86-SSE2-NEXT:    movl {{[0-9]+}}(%esp), %eax1596; X86-SSE2-NEXT:    movss {{.*#+}} xmm0 = mem[0],zero,zero,zero1597; X86-SSE2-NEXT:    mulss (%eax), %xmm01598; X86-SSE2-NEXT:    movss %xmm0, (%eax)1599; X86-SSE2-NEXT:    retl1600;1601; X86-AVX-LABEL: fmul_32r:1602; X86-AVX:       # %bb.0:1603; X86-AVX-NEXT:    movl {{[0-9]+}}(%esp), %eax1604; X86-AVX-NEXT:    vmovss {{.*#+}} xmm0 = mem[0],zero,zero,zero1605; X86-AVX-NEXT:    vmulss (%eax), %xmm0, %xmm01606; X86-AVX-NEXT:    vmovss %xmm0, (%eax)1607; X86-AVX-NEXT:    retl1608;1609; X64-SSE-LABEL: fmul_32r:1610; X64-SSE:       # %bb.0:1611; X64-SSE-NEXT:    mulss (%rdi), %xmm01612; X64-SSE-NEXT:    movss %xmm0, (%rdi)1613; X64-SSE-NEXT:    retq1614;1615; X64-AVX-LABEL: fmul_32r:1616; X64-AVX:       # %bb.0:1617; X64-AVX-NEXT:    vmulss (%rdi), %xmm0, %xmm01618; X64-AVX-NEXT:    vmovss %xmm0, (%rdi)1619; X64-AVX-NEXT:    retq1620  %1 = load atomic i32, ptr %loc seq_cst, align 41621  %2 = bitcast i32 %1 to float1622  %mul = fmul float %2, %val1623  %3 = bitcast float %mul to i321624  store atomic i32 %3, ptr %loc release, align 41625  ret void1626}1627 1628define dso_local void @fmul_64r(ptr %loc, double %val) nounwind {1629; X86-NOSSE-LABEL: fmul_64r:1630; X86-NOSSE:       # %bb.0:1631; X86-NOSSE-NEXT:    pushl %ebp1632; X86-NOSSE-NEXT:    movl %esp, %ebp1633; X86-NOSSE-NEXT:    andl $-8, %esp1634; X86-NOSSE-NEXT:    subl $32, %esp1635; X86-NOSSE-NEXT:    movl 8(%ebp), %eax1636; X86-NOSSE-NEXT:    fildll (%eax)1637; X86-NOSSE-NEXT:    fistpll {{[0-9]+}}(%esp)1638; X86-NOSSE-NEXT:    movl {{[0-9]+}}(%esp), %ecx1639; X86-NOSSE-NEXT:    movl {{[0-9]+}}(%esp), %edx1640; X86-NOSSE-NEXT:    movl %edx, {{[0-9]+}}(%esp)1641; X86-NOSSE-NEXT:    movl %ecx, {{[0-9]+}}(%esp)1642; X86-NOSSE-NEXT:    fldl {{[0-9]+}}(%esp)1643; X86-NOSSE-NEXT:    fmull 12(%ebp)1644; X86-NOSSE-NEXT:    fstpl {{[0-9]+}}(%esp)1645; X86-NOSSE-NEXT:    movl {{[0-9]+}}(%esp), %ecx1646; X86-NOSSE-NEXT:    movl {{[0-9]+}}(%esp), %edx1647; X86-NOSSE-NEXT:    movl %ecx, (%esp)1648; X86-NOSSE-NEXT:    movl %edx, {{[0-9]+}}(%esp)1649; X86-NOSSE-NEXT:    fildll (%esp)1650; X86-NOSSE-NEXT:    fistpll (%eax)1651; X86-NOSSE-NEXT:    movl %ebp, %esp1652; X86-NOSSE-NEXT:    popl %ebp1653; X86-NOSSE-NEXT:    retl1654;1655; X86-SSE1-LABEL: fmul_64r:1656; X86-SSE1:       # %bb.0:1657; X86-SSE1-NEXT:    pushl %ebp1658; X86-SSE1-NEXT:    movl %esp, %ebp1659; X86-SSE1-NEXT:    andl $-8, %esp1660; X86-SSE1-NEXT:    subl $16, %esp1661; X86-SSE1-NEXT:    movl 8(%ebp), %eax1662; X86-SSE1-NEXT:    xorps %xmm0, %xmm01663; X86-SSE1-NEXT:    xorps %xmm1, %xmm11664; X86-SSE1-NEXT:    movlps {{.*#+}} xmm1 = mem[0,1],xmm1[2,3]1665; X86-SSE1-NEXT:    movss %xmm1, (%esp)1666; X86-SSE1-NEXT:    shufps {{.*#+}} xmm1 = xmm1[1,1,1,1]1667; X86-SSE1-NEXT:    movss %xmm1, {{[0-9]+}}(%esp)1668; X86-SSE1-NEXT:    fldl (%esp)1669; X86-SSE1-NEXT:    fmull 12(%ebp)1670; X86-SSE1-NEXT:    fstpl {{[0-9]+}}(%esp)1671; X86-SSE1-NEXT:    movlps {{.*#+}} xmm0 = mem[0,1],xmm0[2,3]1672; X86-SSE1-NEXT:    movlps %xmm0, (%eax)1673; X86-SSE1-NEXT:    movl %ebp, %esp1674; X86-SSE1-NEXT:    popl %ebp1675; X86-SSE1-NEXT:    retl1676;1677; X86-SSE2-LABEL: fmul_64r:1678; X86-SSE2:       # %bb.0:1679; X86-SSE2-NEXT:    pushl %ebp1680; X86-SSE2-NEXT:    movl %esp, %ebp1681; X86-SSE2-NEXT:    andl $-8, %esp1682; X86-SSE2-NEXT:    subl $8, %esp1683; X86-SSE2-NEXT:    movl 8(%ebp), %eax1684; X86-SSE2-NEXT:    movsd {{.*#+}} xmm0 = mem[0],zero1685; X86-SSE2-NEXT:    mulsd 12(%ebp), %xmm01686; X86-SSE2-NEXT:    movsd %xmm0, (%esp)1687; X86-SSE2-NEXT:    movsd {{.*#+}} xmm0 = mem[0],zero1688; X86-SSE2-NEXT:    movlps %xmm0, (%eax)1689; X86-SSE2-NEXT:    movl %ebp, %esp1690; X86-SSE2-NEXT:    popl %ebp1691; X86-SSE2-NEXT:    retl1692;1693; X86-AVX-LABEL: fmul_64r:1694; X86-AVX:       # %bb.0:1695; X86-AVX-NEXT:    pushl %ebp1696; X86-AVX-NEXT:    movl %esp, %ebp1697; X86-AVX-NEXT:    andl $-8, %esp1698; X86-AVX-NEXT:    subl $8, %esp1699; X86-AVX-NEXT:    movl 8(%ebp), %eax1700; X86-AVX-NEXT:    vmovsd {{.*#+}} xmm0 = mem[0],zero1701; X86-AVX-NEXT:    vmulsd 12(%ebp), %xmm0, %xmm01702; X86-AVX-NEXT:    vmovsd %xmm0, (%esp)1703; X86-AVX-NEXT:    vmovsd {{.*#+}} xmm0 = mem[0],zero1704; X86-AVX-NEXT:    vmovlps %xmm0, (%eax)1705; X86-AVX-NEXT:    movl %ebp, %esp1706; X86-AVX-NEXT:    popl %ebp1707; X86-AVX-NEXT:    retl1708;1709; X64-SSE-LABEL: fmul_64r:1710; X64-SSE:       # %bb.0:1711; X64-SSE-NEXT:    mulsd (%rdi), %xmm01712; X64-SSE-NEXT:    movsd %xmm0, (%rdi)1713; X64-SSE-NEXT:    retq1714;1715; X64-AVX-LABEL: fmul_64r:1716; X64-AVX:       # %bb.0:1717; X64-AVX-NEXT:    vmulsd (%rdi), %xmm0, %xmm01718; X64-AVX-NEXT:    vmovsd %xmm0, (%rdi)1719; X64-AVX-NEXT:    retq1720  %1 = load atomic i64, ptr %loc seq_cst, align 81721  %2 = bitcast i64 %1 to double1722  %mul = fmul double %2, %val1723  %3 = bitcast double %mul to i641724  store atomic i64 %3, ptr %loc release, align 81725  ret void1726}1727 1728; Floating-point mul to a global using an immediate.1729define dso_local void @fmul_32g() nounwind {1730; X86-NOSSE-LABEL: fmul_32g:1731; X86-NOSSE:       # %bb.0:1732; X86-NOSSE-NEXT:    subl $8, %esp1733; X86-NOSSE-NEXT:    movl glob32, %eax1734; X86-NOSSE-NEXT:    movl %eax, (%esp)1735; X86-NOSSE-NEXT:    flds (%esp)1736; X86-NOSSE-NEXT:    fmuls {{\.?LCPI[0-9]+_[0-9]+}}1737; X86-NOSSE-NEXT:    fstps {{[0-9]+}}(%esp)1738; X86-NOSSE-NEXT:    movl {{[0-9]+}}(%esp), %eax1739; X86-NOSSE-NEXT:    movl %eax, glob321740; X86-NOSSE-NEXT:    addl $8, %esp1741; X86-NOSSE-NEXT:    retl1742;1743; X86-SSE1-LABEL: fmul_32g:1744; X86-SSE1:       # %bb.0:1745; X86-SSE1-NEXT:    subl $8, %esp1746; X86-SSE1-NEXT:    movl glob32, %eax1747; X86-SSE1-NEXT:    movl %eax, (%esp)1748; X86-SSE1-NEXT:    movss {{.*#+}} xmm0 = mem[0],zero,zero,zero1749; X86-SSE1-NEXT:    mulss {{\.?LCPI[0-9]+_[0-9]+}}, %xmm01750; X86-SSE1-NEXT:    movss %xmm0, {{[0-9]+}}(%esp)1751; X86-SSE1-NEXT:    movl {{[0-9]+}}(%esp), %eax1752; X86-SSE1-NEXT:    movl %eax, glob321753; X86-SSE1-NEXT:    addl $8, %esp1754; X86-SSE1-NEXT:    retl1755;1756; X86-SSE2-LABEL: fmul_32g:1757; X86-SSE2:       # %bb.0:1758; X86-SSE2-NEXT:    movss {{.*#+}} xmm0 = [3.14159012E+0,0.0E+0,0.0E+0,0.0E+0]1759; X86-SSE2-NEXT:    mulss glob32, %xmm01760; X86-SSE2-NEXT:    movss %xmm0, glob321761; X86-SSE2-NEXT:    retl1762;1763; X86-AVX-LABEL: fmul_32g:1764; X86-AVX:       # %bb.0:1765; X86-AVX-NEXT:    vmovss {{.*#+}} xmm0 = [3.14159012E+0,0.0E+0,0.0E+0,0.0E+0]1766; X86-AVX-NEXT:    vmulss glob32, %xmm0, %xmm01767; X86-AVX-NEXT:    vmovss %xmm0, glob321768; X86-AVX-NEXT:    retl1769;1770; X64-SSE-LABEL: fmul_32g:1771; X64-SSE:       # %bb.0:1772; X64-SSE-NEXT:    movss {{.*#+}} xmm0 = [3.14159012E+0,0.0E+0,0.0E+0,0.0E+0]1773; X64-SSE-NEXT:    mulss glob32(%rip), %xmm01774; X64-SSE-NEXT:    movss %xmm0, glob32(%rip)1775; X64-SSE-NEXT:    retq1776;1777; X64-AVX-LABEL: fmul_32g:1778; X64-AVX:       # %bb.0:1779; X64-AVX-NEXT:    vmovss {{.*#+}} xmm0 = [3.14159012E+0,0.0E+0,0.0E+0,0.0E+0]1780; X64-AVX-NEXT:    vmulss glob32(%rip), %xmm0, %xmm01781; X64-AVX-NEXT:    vmovss %xmm0, glob32(%rip)1782; X64-AVX-NEXT:    retq1783  %i = load atomic i32, ptr @glob32 monotonic, align 41784  %f = bitcast i32 %i to float1785  %mul = fmul float %f, 0x400921FA000000001786  %s = bitcast float %mul to i321787  store atomic i32 %s, ptr @glob32 monotonic, align 41788  ret void1789}1790 1791define dso_local void @fmul_64g() nounwind {1792; X86-NOSSE-LABEL: fmul_64g:1793; X86-NOSSE:       # %bb.0:1794; X86-NOSSE-NEXT:    pushl %ebp1795; X86-NOSSE-NEXT:    movl %esp, %ebp1796; X86-NOSSE-NEXT:    andl $-8, %esp1797; X86-NOSSE-NEXT:    subl $32, %esp1798; X86-NOSSE-NEXT:    fildll glob641799; X86-NOSSE-NEXT:    fistpll {{[0-9]+}}(%esp)1800; X86-NOSSE-NEXT:    movl {{[0-9]+}}(%esp), %eax1801; X86-NOSSE-NEXT:    movl {{[0-9]+}}(%esp), %ecx1802; X86-NOSSE-NEXT:    movl %ecx, {{[0-9]+}}(%esp)1803; X86-NOSSE-NEXT:    movl %eax, {{[0-9]+}}(%esp)1804; X86-NOSSE-NEXT:    fldl {{[0-9]+}}(%esp)1805; X86-NOSSE-NEXT:    fmuls {{\.?LCPI[0-9]+_[0-9]+}}1806; X86-NOSSE-NEXT:    fstpl {{[0-9]+}}(%esp)1807; X86-NOSSE-NEXT:    movl {{[0-9]+}}(%esp), %eax1808; X86-NOSSE-NEXT:    movl {{[0-9]+}}(%esp), %ecx1809; X86-NOSSE-NEXT:    movl %eax, (%esp)1810; X86-NOSSE-NEXT:    movl %ecx, {{[0-9]+}}(%esp)1811; X86-NOSSE-NEXT:    fildll (%esp)1812; X86-NOSSE-NEXT:    fistpll glob641813; X86-NOSSE-NEXT:    movl %ebp, %esp1814; X86-NOSSE-NEXT:    popl %ebp1815; X86-NOSSE-NEXT:    retl1816;1817; X86-SSE1-LABEL: fmul_64g:1818; X86-SSE1:       # %bb.0:1819; X86-SSE1-NEXT:    pushl %ebp1820; X86-SSE1-NEXT:    movl %esp, %ebp1821; X86-SSE1-NEXT:    andl $-8, %esp1822; X86-SSE1-NEXT:    subl $16, %esp1823; X86-SSE1-NEXT:    xorps %xmm0, %xmm01824; X86-SSE1-NEXT:    xorps %xmm1, %xmm11825; X86-SSE1-NEXT:    movlps {{.*#+}} xmm1 = mem[0,1],xmm1[2,3]1826; X86-SSE1-NEXT:    movss %xmm1, (%esp)1827; X86-SSE1-NEXT:    shufps {{.*#+}} xmm1 = xmm1[1,1,1,1]1828; X86-SSE1-NEXT:    movss %xmm1, {{[0-9]+}}(%esp)1829; X86-SSE1-NEXT:    fldl (%esp)1830; X86-SSE1-NEXT:    fmuls {{\.?LCPI[0-9]+_[0-9]+}}1831; X86-SSE1-NEXT:    fstpl {{[0-9]+}}(%esp)1832; X86-SSE1-NEXT:    movlps {{.*#+}} xmm0 = mem[0,1],xmm0[2,3]1833; X86-SSE1-NEXT:    movlps %xmm0, glob641834; X86-SSE1-NEXT:    movl %ebp, %esp1835; X86-SSE1-NEXT:    popl %ebp1836; X86-SSE1-NEXT:    retl1837;1838; X86-SSE2-LABEL: fmul_64g:1839; X86-SSE2:       # %bb.0:1840; X86-SSE2-NEXT:    pushl %ebp1841; X86-SSE2-NEXT:    movl %esp, %ebp1842; X86-SSE2-NEXT:    andl $-8, %esp1843; X86-SSE2-NEXT:    subl $8, %esp1844; X86-SSE2-NEXT:    movsd {{.*#+}} xmm0 = mem[0],zero1845; X86-SSE2-NEXT:    mulsd {{\.?LCPI[0-9]+_[0-9]+}}, %xmm01846; X86-SSE2-NEXT:    movsd %xmm0, (%esp)1847; X86-SSE2-NEXT:    movsd {{.*#+}} xmm0 = mem[0],zero1848; X86-SSE2-NEXT:    movlps %xmm0, glob641849; X86-SSE2-NEXT:    movl %ebp, %esp1850; X86-SSE2-NEXT:    popl %ebp1851; X86-SSE2-NEXT:    retl1852;1853; X86-AVX-LABEL: fmul_64g:1854; X86-AVX:       # %bb.0:1855; X86-AVX-NEXT:    pushl %ebp1856; X86-AVX-NEXT:    movl %esp, %ebp1857; X86-AVX-NEXT:    andl $-8, %esp1858; X86-AVX-NEXT:    subl $8, %esp1859; X86-AVX-NEXT:    vmovsd {{.*#+}} xmm0 = mem[0],zero1860; X86-AVX-NEXT:    vmulsd {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0, %xmm01861; X86-AVX-NEXT:    vmovsd %xmm0, (%esp)1862; X86-AVX-NEXT:    vmovsd {{.*#+}} xmm0 = mem[0],zero1863; X86-AVX-NEXT:    vmovlps %xmm0, glob641864; X86-AVX-NEXT:    movl %ebp, %esp1865; X86-AVX-NEXT:    popl %ebp1866; X86-AVX-NEXT:    retl1867;1868; X64-SSE-LABEL: fmul_64g:1869; X64-SSE:       # %bb.0:1870; X64-SSE-NEXT:    movsd {{.*#+}} xmm0 = [3.1415901184082031E+0,0.0E+0]1871; X64-SSE-NEXT:    mulsd glob64(%rip), %xmm01872; X64-SSE-NEXT:    movsd %xmm0, glob64(%rip)1873; X64-SSE-NEXT:    retq1874;1875; X64-AVX-LABEL: fmul_64g:1876; X64-AVX:       # %bb.0:1877; X64-AVX-NEXT:    vmovsd {{.*#+}} xmm0 = [3.1415901184082031E+0,0.0E+0]1878; X64-AVX-NEXT:    vmulsd glob64(%rip), %xmm0, %xmm01879; X64-AVX-NEXT:    vmovsd %xmm0, glob64(%rip)1880; X64-AVX-NEXT:    retq1881  %i = load atomic i64, ptr @glob64 monotonic, align 81882  %f = bitcast i64 %i to double1883  %mul = fmul double %f, 0x400921FA000000001884  %s = bitcast double %mul to i641885  store atomic i64 %s, ptr @glob64 monotonic, align 81886  ret void1887}1888 1889; Floating-point mul to a hard-coded immediate location using an immediate.1890define dso_local void @fmul_32imm() nounwind {1891; X86-NOSSE-LABEL: fmul_32imm:1892; X86-NOSSE:       # %bb.0:1893; X86-NOSSE-NEXT:    subl $8, %esp1894; X86-NOSSE-NEXT:    movl -559038737, %eax1895; X86-NOSSE-NEXT:    movl %eax, (%esp)1896; X86-NOSSE-NEXT:    flds (%esp)1897; X86-NOSSE-NEXT:    fmuls {{\.?LCPI[0-9]+_[0-9]+}}1898; X86-NOSSE-NEXT:    fstps {{[0-9]+}}(%esp)1899; X86-NOSSE-NEXT:    movl {{[0-9]+}}(%esp), %eax1900; X86-NOSSE-NEXT:    movl %eax, -5590387371901; X86-NOSSE-NEXT:    addl $8, %esp1902; X86-NOSSE-NEXT:    retl1903;1904; X86-SSE1-LABEL: fmul_32imm:1905; X86-SSE1:       # %bb.0:1906; X86-SSE1-NEXT:    subl $8, %esp1907; X86-SSE1-NEXT:    movl -559038737, %eax1908; X86-SSE1-NEXT:    movl %eax, (%esp)1909; X86-SSE1-NEXT:    movss {{.*#+}} xmm0 = mem[0],zero,zero,zero1910; X86-SSE1-NEXT:    mulss {{\.?LCPI[0-9]+_[0-9]+}}, %xmm01911; X86-SSE1-NEXT:    movss %xmm0, {{[0-9]+}}(%esp)1912; X86-SSE1-NEXT:    movl {{[0-9]+}}(%esp), %eax1913; X86-SSE1-NEXT:    movl %eax, -5590387371914; X86-SSE1-NEXT:    addl $8, %esp1915; X86-SSE1-NEXT:    retl1916;1917; X86-SSE2-LABEL: fmul_32imm:1918; X86-SSE2:       # %bb.0:1919; X86-SSE2-NEXT:    movss {{.*#+}} xmm0 = [3.14159012E+0,0.0E+0,0.0E+0,0.0E+0]1920; X86-SSE2-NEXT:    mulss -559038737, %xmm01921; X86-SSE2-NEXT:    movss %xmm0, -5590387371922; X86-SSE2-NEXT:    retl1923;1924; X86-AVX-LABEL: fmul_32imm:1925; X86-AVX:       # %bb.0:1926; X86-AVX-NEXT:    vmovss {{.*#+}} xmm0 = [3.14159012E+0,0.0E+0,0.0E+0,0.0E+0]1927; X86-AVX-NEXT:    vmulss -559038737, %xmm0, %xmm01928; X86-AVX-NEXT:    vmovss %xmm0, -5590387371929; X86-AVX-NEXT:    retl1930;1931; X64-SSE-LABEL: fmul_32imm:1932; X64-SSE:       # %bb.0:1933; X64-SSE-NEXT:    movl $3735928559, %eax # imm = 0xDEADBEEF1934; X64-SSE-NEXT:    movss {{.*#+}} xmm0 = [3.14159012E+0,0.0E+0,0.0E+0,0.0E+0]1935; X64-SSE-NEXT:    mulss (%rax), %xmm01936; X64-SSE-NEXT:    movss %xmm0, (%rax)1937; X64-SSE-NEXT:    retq1938;1939; X64-AVX-LABEL: fmul_32imm:1940; X64-AVX:       # %bb.0:1941; X64-AVX-NEXT:    movl $3735928559, %eax # imm = 0xDEADBEEF1942; X64-AVX-NEXT:    vmovss {{.*#+}} xmm0 = [3.14159012E+0,0.0E+0,0.0E+0,0.0E+0]1943; X64-AVX-NEXT:    vmulss (%rax), %xmm0, %xmm01944; X64-AVX-NEXT:    vmovss %xmm0, (%rax)1945; X64-AVX-NEXT:    retq1946  %i = load atomic i32, ptr inttoptr (i32 3735928559 to ptr) monotonic, align 41947  %f = bitcast i32 %i to float1948  %mul = fmul float %f, 0x400921FA000000001949  %s = bitcast float %mul to i321950  store atomic i32 %s, ptr inttoptr (i32 3735928559 to ptr) monotonic, align 41951  ret void1952}1953 1954define dso_local void @fmul_64imm() nounwind {1955; X86-NOSSE-LABEL: fmul_64imm:1956; X86-NOSSE:       # %bb.0:1957; X86-NOSSE-NEXT:    pushl %ebp1958; X86-NOSSE-NEXT:    movl %esp, %ebp1959; X86-NOSSE-NEXT:    andl $-8, %esp1960; X86-NOSSE-NEXT:    subl $32, %esp1961; X86-NOSSE-NEXT:    fildll -5590387371962; X86-NOSSE-NEXT:    fistpll {{[0-9]+}}(%esp)1963; X86-NOSSE-NEXT:    movl {{[0-9]+}}(%esp), %eax1964; X86-NOSSE-NEXT:    movl {{[0-9]+}}(%esp), %ecx1965; X86-NOSSE-NEXT:    movl %ecx, {{[0-9]+}}(%esp)1966; X86-NOSSE-NEXT:    movl %eax, {{[0-9]+}}(%esp)1967; X86-NOSSE-NEXT:    fldl {{[0-9]+}}(%esp)1968; X86-NOSSE-NEXT:    fmuls {{\.?LCPI[0-9]+_[0-9]+}}1969; X86-NOSSE-NEXT:    fstpl {{[0-9]+}}(%esp)1970; X86-NOSSE-NEXT:    movl {{[0-9]+}}(%esp), %eax1971; X86-NOSSE-NEXT:    movl {{[0-9]+}}(%esp), %ecx1972; X86-NOSSE-NEXT:    movl %eax, (%esp)1973; X86-NOSSE-NEXT:    movl %ecx, {{[0-9]+}}(%esp)1974; X86-NOSSE-NEXT:    fildll (%esp)1975; X86-NOSSE-NEXT:    fistpll -5590387371976; X86-NOSSE-NEXT:    movl %ebp, %esp1977; X86-NOSSE-NEXT:    popl %ebp1978; X86-NOSSE-NEXT:    retl1979;1980; X86-SSE1-LABEL: fmul_64imm:1981; X86-SSE1:       # %bb.0:1982; X86-SSE1-NEXT:    pushl %ebp1983; X86-SSE1-NEXT:    movl %esp, %ebp1984; X86-SSE1-NEXT:    andl $-8, %esp1985; X86-SSE1-NEXT:    subl $16, %esp1986; X86-SSE1-NEXT:    xorps %xmm0, %xmm01987; X86-SSE1-NEXT:    xorps %xmm1, %xmm11988; X86-SSE1-NEXT:    movlps {{.*#+}} xmm1 = mem[0,1],xmm1[2,3]1989; X86-SSE1-NEXT:    movss %xmm1, (%esp)1990; X86-SSE1-NEXT:    shufps {{.*#+}} xmm1 = xmm1[1,1,1,1]1991; X86-SSE1-NEXT:    movss %xmm1, {{[0-9]+}}(%esp)1992; X86-SSE1-NEXT:    fldl (%esp)1993; X86-SSE1-NEXT:    fmuls {{\.?LCPI[0-9]+_[0-9]+}}1994; X86-SSE1-NEXT:    fstpl {{[0-9]+}}(%esp)1995; X86-SSE1-NEXT:    movlps {{.*#+}} xmm0 = mem[0,1],xmm0[2,3]1996; X86-SSE1-NEXT:    movlps %xmm0, -5590387371997; X86-SSE1-NEXT:    movl %ebp, %esp1998; X86-SSE1-NEXT:    popl %ebp1999; X86-SSE1-NEXT:    retl2000;2001; X86-SSE2-LABEL: fmul_64imm:2002; X86-SSE2:       # %bb.0:2003; X86-SSE2-NEXT:    pushl %ebp2004; X86-SSE2-NEXT:    movl %esp, %ebp2005; X86-SSE2-NEXT:    andl $-8, %esp2006; X86-SSE2-NEXT:    subl $8, %esp2007; X86-SSE2-NEXT:    movsd {{.*#+}} xmm0 = mem[0],zero2008; X86-SSE2-NEXT:    mulsd {{\.?LCPI[0-9]+_[0-9]+}}, %xmm02009; X86-SSE2-NEXT:    movsd %xmm0, (%esp)2010; X86-SSE2-NEXT:    movsd {{.*#+}} xmm0 = mem[0],zero2011; X86-SSE2-NEXT:    movlps %xmm0, -5590387372012; X86-SSE2-NEXT:    movl %ebp, %esp2013; X86-SSE2-NEXT:    popl %ebp2014; X86-SSE2-NEXT:    retl2015;2016; X86-AVX-LABEL: fmul_64imm:2017; X86-AVX:       # %bb.0:2018; X86-AVX-NEXT:    pushl %ebp2019; X86-AVX-NEXT:    movl %esp, %ebp2020; X86-AVX-NEXT:    andl $-8, %esp2021; X86-AVX-NEXT:    subl $8, %esp2022; X86-AVX-NEXT:    vmovsd {{.*#+}} xmm0 = mem[0],zero2023; X86-AVX-NEXT:    vmulsd {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0, %xmm02024; X86-AVX-NEXT:    vmovsd %xmm0, (%esp)2025; X86-AVX-NEXT:    vmovsd {{.*#+}} xmm0 = mem[0],zero2026; X86-AVX-NEXT:    vmovlps %xmm0, -5590387372027; X86-AVX-NEXT:    movl %ebp, %esp2028; X86-AVX-NEXT:    popl %ebp2029; X86-AVX-NEXT:    retl2030;2031; X64-SSE-LABEL: fmul_64imm:2032; X64-SSE:       # %bb.0:2033; X64-SSE-NEXT:    movl $3735928559, %eax # imm = 0xDEADBEEF2034; X64-SSE-NEXT:    movsd {{.*#+}} xmm0 = [3.1415901184082031E+0,0.0E+0]2035; X64-SSE-NEXT:    mulsd (%rax), %xmm02036; X64-SSE-NEXT:    movsd %xmm0, (%rax)2037; X64-SSE-NEXT:    retq2038;2039; X64-AVX-LABEL: fmul_64imm:2040; X64-AVX:       # %bb.0:2041; X64-AVX-NEXT:    movl $3735928559, %eax # imm = 0xDEADBEEF2042; X64-AVX-NEXT:    vmovsd {{.*#+}} xmm0 = [3.1415901184082031E+0,0.0E+0]2043; X64-AVX-NEXT:    vmulsd (%rax), %xmm0, %xmm02044; X64-AVX-NEXT:    vmovsd %xmm0, (%rax)2045; X64-AVX-NEXT:    retq2046  %i = load atomic i64, ptr inttoptr (i64 3735928559 to ptr) monotonic, align 82047  %f = bitcast i64 %i to double2048  %mul = fmul double %f, 0x400921FA000000002049  %s = bitcast double %mul to i642050  store atomic i64 %s, ptr inttoptr (i64 3735928559 to ptr) monotonic, align 82051  ret void2052}2053 2054; Floating-point mul to a stack location.2055define dso_local void @fmul_32stack() nounwind {2056; X86-NOSSE-LABEL: fmul_32stack:2057; X86-NOSSE:       # %bb.0:2058; X86-NOSSE-NEXT:    subl $12, %esp2059; X86-NOSSE-NEXT:    movl {{[0-9]+}}(%esp), %eax2060; X86-NOSSE-NEXT:    movl %eax, (%esp)2061; X86-NOSSE-NEXT:    flds (%esp)2062; X86-NOSSE-NEXT:    fmuls {{\.?LCPI[0-9]+_[0-9]+}}2063; X86-NOSSE-NEXT:    fstps {{[0-9]+}}(%esp)2064; X86-NOSSE-NEXT:    movl {{[0-9]+}}(%esp), %eax2065; X86-NOSSE-NEXT:    movl %eax, {{[0-9]+}}(%esp)2066; X86-NOSSE-NEXT:    addl $12, %esp2067; X86-NOSSE-NEXT:    retl2068;2069; X86-SSE1-LABEL: fmul_32stack:2070; X86-SSE1:       # %bb.0:2071; X86-SSE1-NEXT:    subl $12, %esp2072; X86-SSE1-NEXT:    movl {{[0-9]+}}(%esp), %eax2073; X86-SSE1-NEXT:    movl %eax, (%esp)2074; X86-SSE1-NEXT:    movss {{.*#+}} xmm0 = mem[0],zero,zero,zero2075; X86-SSE1-NEXT:    mulss {{\.?LCPI[0-9]+_[0-9]+}}, %xmm02076; X86-SSE1-NEXT:    movss %xmm0, {{[0-9]+}}(%esp)2077; X86-SSE1-NEXT:    movl {{[0-9]+}}(%esp), %eax2078; X86-SSE1-NEXT:    movl %eax, {{[0-9]+}}(%esp)2079; X86-SSE1-NEXT:    addl $12, %esp2080; X86-SSE1-NEXT:    retl2081;2082; X86-SSE2-LABEL: fmul_32stack:2083; X86-SSE2:       # %bb.0:2084; X86-SSE2-NEXT:    pushl %eax2085; X86-SSE2-NEXT:    movss {{.*#+}} xmm0 = [3.14159012E+0,0.0E+0,0.0E+0,0.0E+0]2086; X86-SSE2-NEXT:    mulss (%esp), %xmm02087; X86-SSE2-NEXT:    movss %xmm0, (%esp)2088; X86-SSE2-NEXT:    popl %eax2089; X86-SSE2-NEXT:    retl2090;2091; X86-AVX-LABEL: fmul_32stack:2092; X86-AVX:       # %bb.0:2093; X86-AVX-NEXT:    pushl %eax2094; X86-AVX-NEXT:    vmovss {{.*#+}} xmm0 = [3.14159012E+0,0.0E+0,0.0E+0,0.0E+0]2095; X86-AVX-NEXT:    vmulss (%esp), %xmm0, %xmm02096; X86-AVX-NEXT:    vmovss %xmm0, (%esp)2097; X86-AVX-NEXT:    popl %eax2098; X86-AVX-NEXT:    retl2099;2100; X64-SSE-LABEL: fmul_32stack:2101; X64-SSE:       # %bb.0:2102; X64-SSE-NEXT:    movss {{.*#+}} xmm0 = [3.14159012E+0,0.0E+0,0.0E+0,0.0E+0]2103; X64-SSE-NEXT:    mulss -{{[0-9]+}}(%rsp), %xmm02104; X64-SSE-NEXT:    movss %xmm0, -{{[0-9]+}}(%rsp)2105; X64-SSE-NEXT:    retq2106;2107; X64-AVX-LABEL: fmul_32stack:2108; X64-AVX:       # %bb.0:2109; X64-AVX-NEXT:    vmovss {{.*#+}} xmm0 = [3.14159012E+0,0.0E+0,0.0E+0,0.0E+0]2110; X64-AVX-NEXT:    vmulss -{{[0-9]+}}(%rsp), %xmm0, %xmm02111; X64-AVX-NEXT:    vmovss %xmm0, -{{[0-9]+}}(%rsp)2112; X64-AVX-NEXT:    retq2113  %ptr = alloca i32, align 42114  %load = load atomic i32, ptr %ptr acquire, align 42115  %bc0 = bitcast i32 %load to float2116  %fmul = fmul float 0x400921FA00000000, %bc02117  %bc1 = bitcast float %fmul to i322118  store atomic i32 %bc1, ptr %ptr release, align 42119  ret void2120}2121 2122define dso_local void @fmul_64stack() nounwind {2123; X86-NOSSE-LABEL: fmul_64stack:2124; X86-NOSSE:       # %bb.0:2125; X86-NOSSE-NEXT:    pushl %ebp2126; X86-NOSSE-NEXT:    movl %esp, %ebp2127; X86-NOSSE-NEXT:    andl $-8, %esp2128; X86-NOSSE-NEXT:    subl $40, %esp2129; X86-NOSSE-NEXT:    fildll {{[0-9]+}}(%esp)2130; X86-NOSSE-NEXT:    fistpll {{[0-9]+}}(%esp)2131; X86-NOSSE-NEXT:    movl {{[0-9]+}}(%esp), %eax2132; X86-NOSSE-NEXT:    movl {{[0-9]+}}(%esp), %ecx2133; X86-NOSSE-NEXT:    movl %ecx, {{[0-9]+}}(%esp)2134; X86-NOSSE-NEXT:    movl %eax, {{[0-9]+}}(%esp)2135; X86-NOSSE-NEXT:    fldl {{[0-9]+}}(%esp)2136; X86-NOSSE-NEXT:    fmuls {{\.?LCPI[0-9]+_[0-9]+}}2137; X86-NOSSE-NEXT:    fstpl {{[0-9]+}}(%esp)2138; X86-NOSSE-NEXT:    movl {{[0-9]+}}(%esp), %eax2139; X86-NOSSE-NEXT:    movl {{[0-9]+}}(%esp), %ecx2140; X86-NOSSE-NEXT:    movl %eax, (%esp)2141; X86-NOSSE-NEXT:    movl %ecx, {{[0-9]+}}(%esp)2142; X86-NOSSE-NEXT:    fildll (%esp)2143; X86-NOSSE-NEXT:    fistpll {{[0-9]+}}(%esp)2144; X86-NOSSE-NEXT:    movl %ebp, %esp2145; X86-NOSSE-NEXT:    popl %ebp2146; X86-NOSSE-NEXT:    retl2147;2148; X86-SSE1-LABEL: fmul_64stack:2149; X86-SSE1:       # %bb.0:2150; X86-SSE1-NEXT:    pushl %ebp2151; X86-SSE1-NEXT:    movl %esp, %ebp2152; X86-SSE1-NEXT:    andl $-8, %esp2153; X86-SSE1-NEXT:    subl $24, %esp2154; X86-SSE1-NEXT:    xorps %xmm0, %xmm02155; X86-SSE1-NEXT:    xorps %xmm1, %xmm12156; X86-SSE1-NEXT:    movlps {{.*#+}} xmm1 = mem[0,1],xmm1[2,3]2157; X86-SSE1-NEXT:    movss %xmm1, (%esp)2158; X86-SSE1-NEXT:    shufps {{.*#+}} xmm1 = xmm1[1,1,1,1]2159; X86-SSE1-NEXT:    movss %xmm1, {{[0-9]+}}(%esp)2160; X86-SSE1-NEXT:    fldl (%esp)2161; X86-SSE1-NEXT:    fmuls {{\.?LCPI[0-9]+_[0-9]+}}2162; X86-SSE1-NEXT:    fstpl {{[0-9]+}}(%esp)2163; X86-SSE1-NEXT:    movlps {{.*#+}} xmm0 = mem[0,1],xmm0[2,3]2164; X86-SSE1-NEXT:    movlps %xmm0, {{[0-9]+}}(%esp)2165; X86-SSE1-NEXT:    movl %ebp, %esp2166; X86-SSE1-NEXT:    popl %ebp2167; X86-SSE1-NEXT:    retl2168;2169; X86-SSE2-LABEL: fmul_64stack:2170; X86-SSE2:       # %bb.0:2171; X86-SSE2-NEXT:    pushl %ebp2172; X86-SSE2-NEXT:    movl %esp, %ebp2173; X86-SSE2-NEXT:    andl $-8, %esp2174; X86-SSE2-NEXT:    subl $16, %esp2175; X86-SSE2-NEXT:    movsd {{.*#+}} xmm0 = mem[0],zero2176; X86-SSE2-NEXT:    mulsd {{\.?LCPI[0-9]+_[0-9]+}}, %xmm02177; X86-SSE2-NEXT:    movsd %xmm0, (%esp)2178; X86-SSE2-NEXT:    movsd {{.*#+}} xmm0 = mem[0],zero2179; X86-SSE2-NEXT:    movlps %xmm0, {{[0-9]+}}(%esp)2180; X86-SSE2-NEXT:    movl %ebp, %esp2181; X86-SSE2-NEXT:    popl %ebp2182; X86-SSE2-NEXT:    retl2183;2184; X86-AVX-LABEL: fmul_64stack:2185; X86-AVX:       # %bb.0:2186; X86-AVX-NEXT:    pushl %ebp2187; X86-AVX-NEXT:    movl %esp, %ebp2188; X86-AVX-NEXT:    andl $-8, %esp2189; X86-AVX-NEXT:    subl $16, %esp2190; X86-AVX-NEXT:    vmovsd {{.*#+}} xmm0 = mem[0],zero2191; X86-AVX-NEXT:    vmulsd {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0, %xmm02192; X86-AVX-NEXT:    vmovsd %xmm0, (%esp)2193; X86-AVX-NEXT:    vmovsd {{.*#+}} xmm0 = mem[0],zero2194; X86-AVX-NEXT:    vmovlps %xmm0, {{[0-9]+}}(%esp)2195; X86-AVX-NEXT:    movl %ebp, %esp2196; X86-AVX-NEXT:    popl %ebp2197; X86-AVX-NEXT:    retl2198;2199; X64-SSE-LABEL: fmul_64stack:2200; X64-SSE:       # %bb.0:2201; X64-SSE-NEXT:    movsd {{.*#+}} xmm0 = [3.1415901184082031E+0,0.0E+0]2202; X64-SSE-NEXT:    mulsd -{{[0-9]+}}(%rsp), %xmm02203; X64-SSE-NEXT:    movsd %xmm0, -{{[0-9]+}}(%rsp)2204; X64-SSE-NEXT:    retq2205;2206; X64-AVX-LABEL: fmul_64stack:2207; X64-AVX:       # %bb.0:2208; X64-AVX-NEXT:    vmovsd {{.*#+}} xmm0 = [3.1415901184082031E+0,0.0E+0]2209; X64-AVX-NEXT:    vmulsd -{{[0-9]+}}(%rsp), %xmm0, %xmm02210; X64-AVX-NEXT:    vmovsd %xmm0, -{{[0-9]+}}(%rsp)2211; X64-AVX-NEXT:    retq2212  %ptr = alloca i64, align 82213  %load = load atomic i64, ptr %ptr acquire, align 82214  %bc0 = bitcast i64 %load to double2215  %fmul = fmul double 0x400921FA00000000, %bc02216  %bc1 = bitcast double %fmul to i642217  store atomic i64 %bc1, ptr %ptr release, align 82218  ret void2219}2220 2221define dso_local void @fmul_array(ptr %arg, double %arg1, i64 %arg2) nounwind {2222; X86-NOSSE-LABEL: fmul_array:2223; X86-NOSSE:       # %bb.0: # %bb2224; X86-NOSSE-NEXT:    pushl %ebp2225; X86-NOSSE-NEXT:    movl %esp, %ebp2226; X86-NOSSE-NEXT:    pushl %esi2227; X86-NOSSE-NEXT:    andl $-8, %esp2228; X86-NOSSE-NEXT:    subl $40, %esp2229; X86-NOSSE-NEXT:    movl 20(%ebp), %eax2230; X86-NOSSE-NEXT:    movl 8(%ebp), %ecx2231; X86-NOSSE-NEXT:    fildll (%ecx,%eax,8)2232; X86-NOSSE-NEXT:    fistpll {{[0-9]+}}(%esp)2233; X86-NOSSE-NEXT:    movl {{[0-9]+}}(%esp), %edx2234; X86-NOSSE-NEXT:    movl {{[0-9]+}}(%esp), %esi2235; X86-NOSSE-NEXT:    movl %esi, {{[0-9]+}}(%esp)2236; X86-NOSSE-NEXT:    movl %edx, {{[0-9]+}}(%esp)2237; X86-NOSSE-NEXT:    fldl {{[0-9]+}}(%esp)2238; X86-NOSSE-NEXT:    fmull 12(%ebp)2239; X86-NOSSE-NEXT:    fstpl {{[0-9]+}}(%esp)2240; X86-NOSSE-NEXT:    movl {{[0-9]+}}(%esp), %edx2241; X86-NOSSE-NEXT:    movl {{[0-9]+}}(%esp), %esi2242; X86-NOSSE-NEXT:    movl %edx, (%esp)2243; X86-NOSSE-NEXT:    movl %esi, {{[0-9]+}}(%esp)2244; X86-NOSSE-NEXT:    fildll (%esp)2245; X86-NOSSE-NEXT:    fistpll (%ecx,%eax,8)2246; X86-NOSSE-NEXT:    leal -4(%ebp), %esp2247; X86-NOSSE-NEXT:    popl %esi2248; X86-NOSSE-NEXT:    popl %ebp2249; X86-NOSSE-NEXT:    retl2250;2251; X86-SSE1-LABEL: fmul_array:2252; X86-SSE1:       # %bb.0: # %bb2253; X86-SSE1-NEXT:    pushl %ebp2254; X86-SSE1-NEXT:    movl %esp, %ebp2255; X86-SSE1-NEXT:    andl $-8, %esp2256; X86-SSE1-NEXT:    subl $16, %esp2257; X86-SSE1-NEXT:    movl 20(%ebp), %eax2258; X86-SSE1-NEXT:    movl 8(%ebp), %ecx2259; X86-SSE1-NEXT:    xorps %xmm0, %xmm02260; X86-SSE1-NEXT:    xorps %xmm1, %xmm12261; X86-SSE1-NEXT:    movlps {{.*#+}} xmm1 = mem[0,1],xmm1[2,3]2262; X86-SSE1-NEXT:    movss %xmm1, (%esp)2263; X86-SSE1-NEXT:    shufps {{.*#+}} xmm1 = xmm1[1,1,1,1]2264; X86-SSE1-NEXT:    movss %xmm1, {{[0-9]+}}(%esp)2265; X86-SSE1-NEXT:    fldl (%esp)2266; X86-SSE1-NEXT:    fmull 12(%ebp)2267; X86-SSE1-NEXT:    fstpl {{[0-9]+}}(%esp)2268; X86-SSE1-NEXT:    movlps {{.*#+}} xmm0 = mem[0,1],xmm0[2,3]2269; X86-SSE1-NEXT:    movlps %xmm0, (%ecx,%eax,8)2270; X86-SSE1-NEXT:    movl %ebp, %esp2271; X86-SSE1-NEXT:    popl %ebp2272; X86-SSE1-NEXT:    retl2273;2274; X86-SSE2-LABEL: fmul_array:2275; X86-SSE2:       # %bb.0: # %bb2276; X86-SSE2-NEXT:    pushl %ebp2277; X86-SSE2-NEXT:    movl %esp, %ebp2278; X86-SSE2-NEXT:    andl $-8, %esp2279; X86-SSE2-NEXT:    subl $8, %esp2280; X86-SSE2-NEXT:    movl 20(%ebp), %eax2281; X86-SSE2-NEXT:    movl 8(%ebp), %ecx2282; X86-SSE2-NEXT:    movsd {{.*#+}} xmm0 = mem[0],zero2283; X86-SSE2-NEXT:    mulsd 12(%ebp), %xmm02284; X86-SSE2-NEXT:    movsd %xmm0, (%esp)2285; X86-SSE2-NEXT:    movsd {{.*#+}} xmm0 = mem[0],zero2286; X86-SSE2-NEXT:    movlps %xmm0, (%ecx,%eax,8)2287; X86-SSE2-NEXT:    movl %ebp, %esp2288; X86-SSE2-NEXT:    popl %ebp2289; X86-SSE2-NEXT:    retl2290;2291; X86-AVX-LABEL: fmul_array:2292; X86-AVX:       # %bb.0: # %bb2293; X86-AVX-NEXT:    pushl %ebp2294; X86-AVX-NEXT:    movl %esp, %ebp2295; X86-AVX-NEXT:    andl $-8, %esp2296; X86-AVX-NEXT:    subl $8, %esp2297; X86-AVX-NEXT:    movl 20(%ebp), %eax2298; X86-AVX-NEXT:    movl 8(%ebp), %ecx2299; X86-AVX-NEXT:    vmovsd {{.*#+}} xmm0 = mem[0],zero2300; X86-AVX-NEXT:    vmulsd 12(%ebp), %xmm0, %xmm02301; X86-AVX-NEXT:    vmovsd %xmm0, (%esp)2302; X86-AVX-NEXT:    vmovsd {{.*#+}} xmm0 = mem[0],zero2303; X86-AVX-NEXT:    vmovlps %xmm0, (%ecx,%eax,8)2304; X86-AVX-NEXT:    movl %ebp, %esp2305; X86-AVX-NEXT:    popl %ebp2306; X86-AVX-NEXT:    retl2307;2308; X64-SSE-LABEL: fmul_array:2309; X64-SSE:       # %bb.0: # %bb2310; X64-SSE-NEXT:    mulsd (%rdi,%rsi,8), %xmm02311; X64-SSE-NEXT:    movsd %xmm0, (%rdi,%rsi,8)2312; X64-SSE-NEXT:    retq2313;2314; X64-AVX-LABEL: fmul_array:2315; X64-AVX:       # %bb.0: # %bb2316; X64-AVX-NEXT:    vmulsd (%rdi,%rsi,8), %xmm0, %xmm02317; X64-AVX-NEXT:    vmovsd %xmm0, (%rdi,%rsi,8)2318; X64-AVX-NEXT:    retq2319bb:2320  %tmp4 = getelementptr inbounds i64, ptr %arg, i64 %arg22321  %tmp6 = load atomic i64, ptr %tmp4 monotonic, align 82322  %tmp7 = bitcast i64 %tmp6 to double2323  %tmp8 = fmul double %tmp7, %arg12324  %tmp9 = bitcast double %tmp8 to i642325  store atomic i64 %tmp9, ptr %tmp4 monotonic, align 82326  ret void2327}2328 2329; ----- FDIV -----2330 2331define dso_local void @fdiv_32r(ptr %loc, float %val) nounwind {2332; X86-NOSSE-LABEL: fdiv_32r:2333; X86-NOSSE:       # %bb.0:2334; X86-NOSSE-NEXT:    subl $8, %esp2335; X86-NOSSE-NEXT:    movl {{[0-9]+}}(%esp), %eax2336; X86-NOSSE-NEXT:    movl (%eax), %ecx2337; X86-NOSSE-NEXT:    movl %ecx, (%esp)2338; X86-NOSSE-NEXT:    flds (%esp)2339; X86-NOSSE-NEXT:    fdivs {{[0-9]+}}(%esp)2340; X86-NOSSE-NEXT:    fstps {{[0-9]+}}(%esp)2341; X86-NOSSE-NEXT:    movl {{[0-9]+}}(%esp), %ecx2342; X86-NOSSE-NEXT:    movl %ecx, (%eax)2343; X86-NOSSE-NEXT:    addl $8, %esp2344; X86-NOSSE-NEXT:    retl2345;2346; X86-SSE1-LABEL: fdiv_32r:2347; X86-SSE1:       # %bb.0:2348; X86-SSE1-NEXT:    subl $8, %esp2349; X86-SSE1-NEXT:    movl {{[0-9]+}}(%esp), %eax2350; X86-SSE1-NEXT:    movl (%eax), %ecx2351; X86-SSE1-NEXT:    movl %ecx, (%esp)2352; X86-SSE1-NEXT:    movss {{.*#+}} xmm0 = mem[0],zero,zero,zero2353; X86-SSE1-NEXT:    divss {{[0-9]+}}(%esp), %xmm02354; X86-SSE1-NEXT:    movss %xmm0, {{[0-9]+}}(%esp)2355; X86-SSE1-NEXT:    movl {{[0-9]+}}(%esp), %ecx2356; X86-SSE1-NEXT:    movl %ecx, (%eax)2357; X86-SSE1-NEXT:    addl $8, %esp2358; X86-SSE1-NEXT:    retl2359;2360; X86-SSE2-LABEL: fdiv_32r:2361; X86-SSE2:       # %bb.0:2362; X86-SSE2-NEXT:    movl {{[0-9]+}}(%esp), %eax2363; X86-SSE2-NEXT:    movss {{.*#+}} xmm0 = mem[0],zero,zero,zero2364; X86-SSE2-NEXT:    divss {{[0-9]+}}(%esp), %xmm02365; X86-SSE2-NEXT:    movss %xmm0, (%eax)2366; X86-SSE2-NEXT:    retl2367;2368; X86-AVX-LABEL: fdiv_32r:2369; X86-AVX:       # %bb.0:2370; X86-AVX-NEXT:    movl {{[0-9]+}}(%esp), %eax2371; X86-AVX-NEXT:    vmovss {{.*#+}} xmm0 = mem[0],zero,zero,zero2372; X86-AVX-NEXT:    vdivss {{[0-9]+}}(%esp), %xmm0, %xmm02373; X86-AVX-NEXT:    vmovss %xmm0, (%eax)2374; X86-AVX-NEXT:    retl2375;2376; X64-SSE-LABEL: fdiv_32r:2377; X64-SSE:       # %bb.0:2378; X64-SSE-NEXT:    movss {{.*#+}} xmm1 = mem[0],zero,zero,zero2379; X64-SSE-NEXT:    divss %xmm0, %xmm12380; X64-SSE-NEXT:    movss %xmm1, (%rdi)2381; X64-SSE-NEXT:    retq2382;2383; X64-AVX-LABEL: fdiv_32r:2384; X64-AVX:       # %bb.0:2385; X64-AVX-NEXT:    vmovss {{.*#+}} xmm1 = mem[0],zero,zero,zero2386; X64-AVX-NEXT:    vdivss %xmm0, %xmm1, %xmm02387; X64-AVX-NEXT:    vmovss %xmm0, (%rdi)2388; X64-AVX-NEXT:    retq2389  %1 = load atomic i32, ptr %loc seq_cst, align 42390  %2 = bitcast i32 %1 to float2391  %div = fdiv float %2, %val2392  %3 = bitcast float %div to i322393  store atomic i32 %3, ptr %loc release, align 42394  ret void2395}2396 2397define dso_local void @fdiv_64r(ptr %loc, double %val) nounwind {2398; X86-NOSSE-LABEL: fdiv_64r:2399; X86-NOSSE:       # %bb.0:2400; X86-NOSSE-NEXT:    pushl %ebp2401; X86-NOSSE-NEXT:    movl %esp, %ebp2402; X86-NOSSE-NEXT:    andl $-8, %esp2403; X86-NOSSE-NEXT:    subl $32, %esp2404; X86-NOSSE-NEXT:    movl 8(%ebp), %eax2405; X86-NOSSE-NEXT:    fildll (%eax)2406; X86-NOSSE-NEXT:    fistpll {{[0-9]+}}(%esp)2407; X86-NOSSE-NEXT:    movl {{[0-9]+}}(%esp), %ecx2408; X86-NOSSE-NEXT:    movl {{[0-9]+}}(%esp), %edx2409; X86-NOSSE-NEXT:    movl %edx, {{[0-9]+}}(%esp)2410; X86-NOSSE-NEXT:    movl %ecx, {{[0-9]+}}(%esp)2411; X86-NOSSE-NEXT:    fldl {{[0-9]+}}(%esp)2412; X86-NOSSE-NEXT:    fdivl 12(%ebp)2413; X86-NOSSE-NEXT:    fstpl {{[0-9]+}}(%esp)2414; X86-NOSSE-NEXT:    movl {{[0-9]+}}(%esp), %ecx2415; X86-NOSSE-NEXT:    movl {{[0-9]+}}(%esp), %edx2416; X86-NOSSE-NEXT:    movl %ecx, (%esp)2417; X86-NOSSE-NEXT:    movl %edx, {{[0-9]+}}(%esp)2418; X86-NOSSE-NEXT:    fildll (%esp)2419; X86-NOSSE-NEXT:    fistpll (%eax)2420; X86-NOSSE-NEXT:    movl %ebp, %esp2421; X86-NOSSE-NEXT:    popl %ebp2422; X86-NOSSE-NEXT:    retl2423;2424; X86-SSE1-LABEL: fdiv_64r:2425; X86-SSE1:       # %bb.0:2426; X86-SSE1-NEXT:    pushl %ebp2427; X86-SSE1-NEXT:    movl %esp, %ebp2428; X86-SSE1-NEXT:    andl $-8, %esp2429; X86-SSE1-NEXT:    subl $16, %esp2430; X86-SSE1-NEXT:    movl 8(%ebp), %eax2431; X86-SSE1-NEXT:    xorps %xmm0, %xmm02432; X86-SSE1-NEXT:    xorps %xmm1, %xmm12433; X86-SSE1-NEXT:    movlps {{.*#+}} xmm1 = mem[0,1],xmm1[2,3]2434; X86-SSE1-NEXT:    movss %xmm1, (%esp)2435; X86-SSE1-NEXT:    shufps {{.*#+}} xmm1 = xmm1[1,1,1,1]2436; X86-SSE1-NEXT:    movss %xmm1, {{[0-9]+}}(%esp)2437; X86-SSE1-NEXT:    fldl (%esp)2438; X86-SSE1-NEXT:    fdivl 12(%ebp)2439; X86-SSE1-NEXT:    fstpl {{[0-9]+}}(%esp)2440; X86-SSE1-NEXT:    movlps {{.*#+}} xmm0 = mem[0,1],xmm0[2,3]2441; X86-SSE1-NEXT:    movlps %xmm0, (%eax)2442; X86-SSE1-NEXT:    movl %ebp, %esp2443; X86-SSE1-NEXT:    popl %ebp2444; X86-SSE1-NEXT:    retl2445;2446; X86-SSE2-LABEL: fdiv_64r:2447; X86-SSE2:       # %bb.0:2448; X86-SSE2-NEXT:    pushl %ebp2449; X86-SSE2-NEXT:    movl %esp, %ebp2450; X86-SSE2-NEXT:    andl $-8, %esp2451; X86-SSE2-NEXT:    subl $8, %esp2452; X86-SSE2-NEXT:    movl 8(%ebp), %eax2453; X86-SSE2-NEXT:    movsd {{.*#+}} xmm0 = mem[0],zero2454; X86-SSE2-NEXT:    divsd 12(%ebp), %xmm02455; X86-SSE2-NEXT:    movsd %xmm0, (%esp)2456; X86-SSE2-NEXT:    movsd {{.*#+}} xmm0 = mem[0],zero2457; X86-SSE2-NEXT:    movlps %xmm0, (%eax)2458; X86-SSE2-NEXT:    movl %ebp, %esp2459; X86-SSE2-NEXT:    popl %ebp2460; X86-SSE2-NEXT:    retl2461;2462; X86-AVX-LABEL: fdiv_64r:2463; X86-AVX:       # %bb.0:2464; X86-AVX-NEXT:    pushl %ebp2465; X86-AVX-NEXT:    movl %esp, %ebp2466; X86-AVX-NEXT:    andl $-8, %esp2467; X86-AVX-NEXT:    subl $8, %esp2468; X86-AVX-NEXT:    movl 8(%ebp), %eax2469; X86-AVX-NEXT:    vmovsd {{.*#+}} xmm0 = mem[0],zero2470; X86-AVX-NEXT:    vdivsd 12(%ebp), %xmm0, %xmm02471; X86-AVX-NEXT:    vmovsd %xmm0, (%esp)2472; X86-AVX-NEXT:    vmovsd {{.*#+}} xmm0 = mem[0],zero2473; X86-AVX-NEXT:    vmovlps %xmm0, (%eax)2474; X86-AVX-NEXT:    movl %ebp, %esp2475; X86-AVX-NEXT:    popl %ebp2476; X86-AVX-NEXT:    retl2477;2478; X64-SSE-LABEL: fdiv_64r:2479; X64-SSE:       # %bb.0:2480; X64-SSE-NEXT:    movsd {{.*#+}} xmm1 = mem[0],zero2481; X64-SSE-NEXT:    divsd %xmm0, %xmm12482; X64-SSE-NEXT:    movsd %xmm1, (%rdi)2483; X64-SSE-NEXT:    retq2484;2485; X64-AVX-LABEL: fdiv_64r:2486; X64-AVX:       # %bb.0:2487; X64-AVX-NEXT:    vmovsd {{.*#+}} xmm1 = mem[0],zero2488; X64-AVX-NEXT:    vdivsd %xmm0, %xmm1, %xmm02489; X64-AVX-NEXT:    vmovsd %xmm0, (%rdi)2490; X64-AVX-NEXT:    retq2491  %1 = load atomic i64, ptr %loc seq_cst, align 82492  %2 = bitcast i64 %1 to double2493  %div = fdiv double %2, %val2494  %3 = bitcast double %div to i642495  store atomic i64 %3, ptr %loc release, align 82496  ret void2497}2498 2499; Floating-point div to a global using an immediate.2500define dso_local void @fdiv_32g() nounwind {2501; X86-NOSSE-LABEL: fdiv_32g:2502; X86-NOSSE:       # %bb.0:2503; X86-NOSSE-NEXT:    subl $8, %esp2504; X86-NOSSE-NEXT:    movl glob32, %eax2505; X86-NOSSE-NEXT:    movl %eax, (%esp)2506; X86-NOSSE-NEXT:    flds (%esp)2507; X86-NOSSE-NEXT:    fdivs {{\.?LCPI[0-9]+_[0-9]+}}2508; X86-NOSSE-NEXT:    fstps {{[0-9]+}}(%esp)2509; X86-NOSSE-NEXT:    movl {{[0-9]+}}(%esp), %eax2510; X86-NOSSE-NEXT:    movl %eax, glob322511; X86-NOSSE-NEXT:    addl $8, %esp2512; X86-NOSSE-NEXT:    retl2513;2514; X86-SSE1-LABEL: fdiv_32g:2515; X86-SSE1:       # %bb.0:2516; X86-SSE1-NEXT:    subl $8, %esp2517; X86-SSE1-NEXT:    movl glob32, %eax2518; X86-SSE1-NEXT:    movl %eax, (%esp)2519; X86-SSE1-NEXT:    movss {{.*#+}} xmm0 = mem[0],zero,zero,zero2520; X86-SSE1-NEXT:    divss {{\.?LCPI[0-9]+_[0-9]+}}, %xmm02521; X86-SSE1-NEXT:    movss %xmm0, {{[0-9]+}}(%esp)2522; X86-SSE1-NEXT:    movl {{[0-9]+}}(%esp), %eax2523; X86-SSE1-NEXT:    movl %eax, glob322524; X86-SSE1-NEXT:    addl $8, %esp2525; X86-SSE1-NEXT:    retl2526;2527; X86-SSE2-LABEL: fdiv_32g:2528; X86-SSE2:       # %bb.0:2529; X86-SSE2-NEXT:    movss {{.*#+}} xmm0 = mem[0],zero,zero,zero2530; X86-SSE2-NEXT:    divss {{\.?LCPI[0-9]+_[0-9]+}}, %xmm02531; X86-SSE2-NEXT:    movss %xmm0, glob322532; X86-SSE2-NEXT:    retl2533;2534; X86-AVX-LABEL: fdiv_32g:2535; X86-AVX:       # %bb.0:2536; X86-AVX-NEXT:    vmovss {{.*#+}} xmm0 = mem[0],zero,zero,zero2537; X86-AVX-NEXT:    vdivss {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0, %xmm02538; X86-AVX-NEXT:    vmovss %xmm0, glob322539; X86-AVX-NEXT:    retl2540;2541; X64-SSE-LABEL: fdiv_32g:2542; X64-SSE:       # %bb.0:2543; X64-SSE-NEXT:    movss {{.*#+}} xmm0 = mem[0],zero,zero,zero2544; X64-SSE-NEXT:    divss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm02545; X64-SSE-NEXT:    movss %xmm0, glob32(%rip)2546; X64-SSE-NEXT:    retq2547;2548; X64-AVX-LABEL: fdiv_32g:2549; X64-AVX:       # %bb.0:2550; X64-AVX-NEXT:    vmovss {{.*#+}} xmm0 = mem[0],zero,zero,zero2551; X64-AVX-NEXT:    vdivss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm02552; X64-AVX-NEXT:    vmovss %xmm0, glob32(%rip)2553; X64-AVX-NEXT:    retq2554  %i = load atomic i32, ptr @glob32 monotonic, align 42555  %f = bitcast i32 %i to float2556  %div = fdiv float %f, 0x400921FA000000002557  %s = bitcast float %div to i322558  store atomic i32 %s, ptr @glob32 monotonic, align 42559  ret void2560}2561 2562define dso_local void @fdiv_64g() nounwind {2563; X86-NOSSE-LABEL: fdiv_64g:2564; X86-NOSSE:       # %bb.0:2565; X86-NOSSE-NEXT:    pushl %ebp2566; X86-NOSSE-NEXT:    movl %esp, %ebp2567; X86-NOSSE-NEXT:    andl $-8, %esp2568; X86-NOSSE-NEXT:    subl $32, %esp2569; X86-NOSSE-NEXT:    fildll glob642570; X86-NOSSE-NEXT:    fistpll {{[0-9]+}}(%esp)2571; X86-NOSSE-NEXT:    movl {{[0-9]+}}(%esp), %eax2572; X86-NOSSE-NEXT:    movl {{[0-9]+}}(%esp), %ecx2573; X86-NOSSE-NEXT:    movl %ecx, {{[0-9]+}}(%esp)2574; X86-NOSSE-NEXT:    movl %eax, {{[0-9]+}}(%esp)2575; X86-NOSSE-NEXT:    fldl {{[0-9]+}}(%esp)2576; X86-NOSSE-NEXT:    fdivs {{\.?LCPI[0-9]+_[0-9]+}}2577; X86-NOSSE-NEXT:    fstpl {{[0-9]+}}(%esp)2578; X86-NOSSE-NEXT:    movl {{[0-9]+}}(%esp), %eax2579; X86-NOSSE-NEXT:    movl {{[0-9]+}}(%esp), %ecx2580; X86-NOSSE-NEXT:    movl %eax, (%esp)2581; X86-NOSSE-NEXT:    movl %ecx, {{[0-9]+}}(%esp)2582; X86-NOSSE-NEXT:    fildll (%esp)2583; X86-NOSSE-NEXT:    fistpll glob642584; X86-NOSSE-NEXT:    movl %ebp, %esp2585; X86-NOSSE-NEXT:    popl %ebp2586; X86-NOSSE-NEXT:    retl2587;2588; X86-SSE1-LABEL: fdiv_64g:2589; X86-SSE1:       # %bb.0:2590; X86-SSE1-NEXT:    pushl %ebp2591; X86-SSE1-NEXT:    movl %esp, %ebp2592; X86-SSE1-NEXT:    andl $-8, %esp2593; X86-SSE1-NEXT:    subl $16, %esp2594; X86-SSE1-NEXT:    xorps %xmm0, %xmm02595; X86-SSE1-NEXT:    xorps %xmm1, %xmm12596; X86-SSE1-NEXT:    movlps {{.*#+}} xmm1 = mem[0,1],xmm1[2,3]2597; X86-SSE1-NEXT:    movss %xmm1, (%esp)2598; X86-SSE1-NEXT:    shufps {{.*#+}} xmm1 = xmm1[1,1,1,1]2599; X86-SSE1-NEXT:    movss %xmm1, {{[0-9]+}}(%esp)2600; X86-SSE1-NEXT:    fldl (%esp)2601; X86-SSE1-NEXT:    fdivs {{\.?LCPI[0-9]+_[0-9]+}}2602; X86-SSE1-NEXT:    fstpl {{[0-9]+}}(%esp)2603; X86-SSE1-NEXT:    movlps {{.*#+}} xmm0 = mem[0,1],xmm0[2,3]2604; X86-SSE1-NEXT:    movlps %xmm0, glob642605; X86-SSE1-NEXT:    movl %ebp, %esp2606; X86-SSE1-NEXT:    popl %ebp2607; X86-SSE1-NEXT:    retl2608;2609; X86-SSE2-LABEL: fdiv_64g:2610; X86-SSE2:       # %bb.0:2611; X86-SSE2-NEXT:    pushl %ebp2612; X86-SSE2-NEXT:    movl %esp, %ebp2613; X86-SSE2-NEXT:    andl $-8, %esp2614; X86-SSE2-NEXT:    subl $8, %esp2615; X86-SSE2-NEXT:    movsd {{.*#+}} xmm0 = mem[0],zero2616; X86-SSE2-NEXT:    divsd {{\.?LCPI[0-9]+_[0-9]+}}, %xmm02617; X86-SSE2-NEXT:    movsd %xmm0, (%esp)2618; X86-SSE2-NEXT:    movsd {{.*#+}} xmm0 = mem[0],zero2619; X86-SSE2-NEXT:    movlps %xmm0, glob642620; X86-SSE2-NEXT:    movl %ebp, %esp2621; X86-SSE2-NEXT:    popl %ebp2622; X86-SSE2-NEXT:    retl2623;2624; X86-AVX-LABEL: fdiv_64g:2625; X86-AVX:       # %bb.0:2626; X86-AVX-NEXT:    pushl %ebp2627; X86-AVX-NEXT:    movl %esp, %ebp2628; X86-AVX-NEXT:    andl $-8, %esp2629; X86-AVX-NEXT:    subl $8, %esp2630; X86-AVX-NEXT:    vmovsd {{.*#+}} xmm0 = mem[0],zero2631; X86-AVX-NEXT:    vdivsd {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0, %xmm02632; X86-AVX-NEXT:    vmovsd %xmm0, (%esp)2633; X86-AVX-NEXT:    vmovsd {{.*#+}} xmm0 = mem[0],zero2634; X86-AVX-NEXT:    vmovlps %xmm0, glob642635; X86-AVX-NEXT:    movl %ebp, %esp2636; X86-AVX-NEXT:    popl %ebp2637; X86-AVX-NEXT:    retl2638;2639; X64-SSE-LABEL: fdiv_64g:2640; X64-SSE:       # %bb.0:2641; X64-SSE-NEXT:    movsd {{.*#+}} xmm0 = mem[0],zero2642; X64-SSE-NEXT:    divsd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm02643; X64-SSE-NEXT:    movsd %xmm0, glob64(%rip)2644; X64-SSE-NEXT:    retq2645;2646; X64-AVX-LABEL: fdiv_64g:2647; X64-AVX:       # %bb.0:2648; X64-AVX-NEXT:    vmovsd {{.*#+}} xmm0 = mem[0],zero2649; X64-AVX-NEXT:    vdivsd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm02650; X64-AVX-NEXT:    vmovsd %xmm0, glob64(%rip)2651; X64-AVX-NEXT:    retq2652  %i = load atomic i64, ptr @glob64 monotonic, align 82653  %f = bitcast i64 %i to double2654  %div = fdiv double %f, 0x400921FA000000002655  %s = bitcast double %div to i642656  store atomic i64 %s, ptr @glob64 monotonic, align 82657  ret void2658}2659 2660; Floating-point div to a hard-coded immediate location using an immediate.2661define dso_local void @fdiv_32imm() nounwind {2662; X86-NOSSE-LABEL: fdiv_32imm:2663; X86-NOSSE:       # %bb.0:2664; X86-NOSSE-NEXT:    subl $8, %esp2665; X86-NOSSE-NEXT:    movl -559038737, %eax2666; X86-NOSSE-NEXT:    movl %eax, (%esp)2667; X86-NOSSE-NEXT:    flds (%esp)2668; X86-NOSSE-NEXT:    fdivs {{\.?LCPI[0-9]+_[0-9]+}}2669; X86-NOSSE-NEXT:    fstps {{[0-9]+}}(%esp)2670; X86-NOSSE-NEXT:    movl {{[0-9]+}}(%esp), %eax2671; X86-NOSSE-NEXT:    movl %eax, -5590387372672; X86-NOSSE-NEXT:    addl $8, %esp2673; X86-NOSSE-NEXT:    retl2674;2675; X86-SSE1-LABEL: fdiv_32imm:2676; X86-SSE1:       # %bb.0:2677; X86-SSE1-NEXT:    subl $8, %esp2678; X86-SSE1-NEXT:    movl -559038737, %eax2679; X86-SSE1-NEXT:    movl %eax, (%esp)2680; X86-SSE1-NEXT:    movss {{.*#+}} xmm0 = mem[0],zero,zero,zero2681; X86-SSE1-NEXT:    divss {{\.?LCPI[0-9]+_[0-9]+}}, %xmm02682; X86-SSE1-NEXT:    movss %xmm0, {{[0-9]+}}(%esp)2683; X86-SSE1-NEXT:    movl {{[0-9]+}}(%esp), %eax2684; X86-SSE1-NEXT:    movl %eax, -5590387372685; X86-SSE1-NEXT:    addl $8, %esp2686; X86-SSE1-NEXT:    retl2687;2688; X86-SSE2-LABEL: fdiv_32imm:2689; X86-SSE2:       # %bb.0:2690; X86-SSE2-NEXT:    movss {{.*#+}} xmm0 = mem[0],zero,zero,zero2691; X86-SSE2-NEXT:    divss {{\.?LCPI[0-9]+_[0-9]+}}, %xmm02692; X86-SSE2-NEXT:    movss %xmm0, -5590387372693; X86-SSE2-NEXT:    retl2694;2695; X86-AVX-LABEL: fdiv_32imm:2696; X86-AVX:       # %bb.0:2697; X86-AVX-NEXT:    vmovss {{.*#+}} xmm0 = mem[0],zero,zero,zero2698; X86-AVX-NEXT:    vdivss {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0, %xmm02699; X86-AVX-NEXT:    vmovss %xmm0, -5590387372700; X86-AVX-NEXT:    retl2701;2702; X64-SSE-LABEL: fdiv_32imm:2703; X64-SSE:       # %bb.0:2704; X64-SSE-NEXT:    movl $3735928559, %eax # imm = 0xDEADBEEF2705; X64-SSE-NEXT:    movss {{.*#+}} xmm0 = mem[0],zero,zero,zero2706; X64-SSE-NEXT:    divss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm02707; X64-SSE-NEXT:    movss %xmm0, (%rax)2708; X64-SSE-NEXT:    retq2709;2710; X64-AVX-LABEL: fdiv_32imm:2711; X64-AVX:       # %bb.0:2712; X64-AVX-NEXT:    movl $3735928559, %eax # imm = 0xDEADBEEF2713; X64-AVX-NEXT:    vmovss {{.*#+}} xmm0 = mem[0],zero,zero,zero2714; X64-AVX-NEXT:    vdivss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm02715; X64-AVX-NEXT:    vmovss %xmm0, (%rax)2716; X64-AVX-NEXT:    retq2717  %i = load atomic i32, ptr inttoptr (i32 3735928559 to ptr) monotonic, align 42718  %f = bitcast i32 %i to float2719  %div = fdiv float %f, 0x400921FA000000002720  %s = bitcast float %div to i322721  store atomic i32 %s, ptr inttoptr (i32 3735928559 to ptr) monotonic, align 42722  ret void2723}2724 2725define dso_local void @fdiv_64imm() nounwind {2726; X86-NOSSE-LABEL: fdiv_64imm:2727; X86-NOSSE:       # %bb.0:2728; X86-NOSSE-NEXT:    pushl %ebp2729; X86-NOSSE-NEXT:    movl %esp, %ebp2730; X86-NOSSE-NEXT:    andl $-8, %esp2731; X86-NOSSE-NEXT:    subl $32, %esp2732; X86-NOSSE-NEXT:    fildll -5590387372733; X86-NOSSE-NEXT:    fistpll {{[0-9]+}}(%esp)2734; X86-NOSSE-NEXT:    movl {{[0-9]+}}(%esp), %eax2735; X86-NOSSE-NEXT:    movl {{[0-9]+}}(%esp), %ecx2736; X86-NOSSE-NEXT:    movl %ecx, {{[0-9]+}}(%esp)2737; X86-NOSSE-NEXT:    movl %eax, {{[0-9]+}}(%esp)2738; X86-NOSSE-NEXT:    fldl {{[0-9]+}}(%esp)2739; X86-NOSSE-NEXT:    fdivs {{\.?LCPI[0-9]+_[0-9]+}}2740; X86-NOSSE-NEXT:    fstpl {{[0-9]+}}(%esp)2741; X86-NOSSE-NEXT:    movl {{[0-9]+}}(%esp), %eax2742; X86-NOSSE-NEXT:    movl {{[0-9]+}}(%esp), %ecx2743; X86-NOSSE-NEXT:    movl %eax, (%esp)2744; X86-NOSSE-NEXT:    movl %ecx, {{[0-9]+}}(%esp)2745; X86-NOSSE-NEXT:    fildll (%esp)2746; X86-NOSSE-NEXT:    fistpll -5590387372747; X86-NOSSE-NEXT:    movl %ebp, %esp2748; X86-NOSSE-NEXT:    popl %ebp2749; X86-NOSSE-NEXT:    retl2750;2751; X86-SSE1-LABEL: fdiv_64imm:2752; X86-SSE1:       # %bb.0:2753; X86-SSE1-NEXT:    pushl %ebp2754; X86-SSE1-NEXT:    movl %esp, %ebp2755; X86-SSE1-NEXT:    andl $-8, %esp2756; X86-SSE1-NEXT:    subl $16, %esp2757; X86-SSE1-NEXT:    xorps %xmm0, %xmm02758; X86-SSE1-NEXT:    xorps %xmm1, %xmm12759; X86-SSE1-NEXT:    movlps {{.*#+}} xmm1 = mem[0,1],xmm1[2,3]2760; X86-SSE1-NEXT:    movss %xmm1, (%esp)2761; X86-SSE1-NEXT:    shufps {{.*#+}} xmm1 = xmm1[1,1,1,1]2762; X86-SSE1-NEXT:    movss %xmm1, {{[0-9]+}}(%esp)2763; X86-SSE1-NEXT:    fldl (%esp)2764; X86-SSE1-NEXT:    fdivs {{\.?LCPI[0-9]+_[0-9]+}}2765; X86-SSE1-NEXT:    fstpl {{[0-9]+}}(%esp)2766; X86-SSE1-NEXT:    movlps {{.*#+}} xmm0 = mem[0,1],xmm0[2,3]2767; X86-SSE1-NEXT:    movlps %xmm0, -5590387372768; X86-SSE1-NEXT:    movl %ebp, %esp2769; X86-SSE1-NEXT:    popl %ebp2770; X86-SSE1-NEXT:    retl2771;2772; X86-SSE2-LABEL: fdiv_64imm:2773; X86-SSE2:       # %bb.0:2774; X86-SSE2-NEXT:    pushl %ebp2775; X86-SSE2-NEXT:    movl %esp, %ebp2776; X86-SSE2-NEXT:    andl $-8, %esp2777; X86-SSE2-NEXT:    subl $8, %esp2778; X86-SSE2-NEXT:    movsd {{.*#+}} xmm0 = mem[0],zero2779; X86-SSE2-NEXT:    divsd {{\.?LCPI[0-9]+_[0-9]+}}, %xmm02780; X86-SSE2-NEXT:    movsd %xmm0, (%esp)2781; X86-SSE2-NEXT:    movsd {{.*#+}} xmm0 = mem[0],zero2782; X86-SSE2-NEXT:    movlps %xmm0, -5590387372783; X86-SSE2-NEXT:    movl %ebp, %esp2784; X86-SSE2-NEXT:    popl %ebp2785; X86-SSE2-NEXT:    retl2786;2787; X86-AVX-LABEL: fdiv_64imm:2788; X86-AVX:       # %bb.0:2789; X86-AVX-NEXT:    pushl %ebp2790; X86-AVX-NEXT:    movl %esp, %ebp2791; X86-AVX-NEXT:    andl $-8, %esp2792; X86-AVX-NEXT:    subl $8, %esp2793; X86-AVX-NEXT:    vmovsd {{.*#+}} xmm0 = mem[0],zero2794; X86-AVX-NEXT:    vdivsd {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0, %xmm02795; X86-AVX-NEXT:    vmovsd %xmm0, (%esp)2796; X86-AVX-NEXT:    vmovsd {{.*#+}} xmm0 = mem[0],zero2797; X86-AVX-NEXT:    vmovlps %xmm0, -5590387372798; X86-AVX-NEXT:    movl %ebp, %esp2799; X86-AVX-NEXT:    popl %ebp2800; X86-AVX-NEXT:    retl2801;2802; X64-SSE-LABEL: fdiv_64imm:2803; X64-SSE:       # %bb.0:2804; X64-SSE-NEXT:    movl $3735928559, %eax # imm = 0xDEADBEEF2805; X64-SSE-NEXT:    movsd {{.*#+}} xmm0 = mem[0],zero2806; X64-SSE-NEXT:    divsd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm02807; X64-SSE-NEXT:    movsd %xmm0, (%rax)2808; X64-SSE-NEXT:    retq2809;2810; X64-AVX-LABEL: fdiv_64imm:2811; X64-AVX:       # %bb.0:2812; X64-AVX-NEXT:    movl $3735928559, %eax # imm = 0xDEADBEEF2813; X64-AVX-NEXT:    vmovsd {{.*#+}} xmm0 = mem[0],zero2814; X64-AVX-NEXT:    vdivsd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm02815; X64-AVX-NEXT:    vmovsd %xmm0, (%rax)2816; X64-AVX-NEXT:    retq2817  %i = load atomic i64, ptr inttoptr (i64 3735928559 to ptr) monotonic, align 82818  %f = bitcast i64 %i to double2819  %div = fdiv double %f, 0x400921FA000000002820  %s = bitcast double %div to i642821  store atomic i64 %s, ptr inttoptr (i64 3735928559 to ptr) monotonic, align 82822  ret void2823}2824 2825; Floating-point div to a stack location.2826define dso_local void @fdiv_32stack() nounwind {2827; X86-NOSSE-LABEL: fdiv_32stack:2828; X86-NOSSE:       # %bb.0:2829; X86-NOSSE-NEXT:    subl $12, %esp2830; X86-NOSSE-NEXT:    movl {{[0-9]+}}(%esp), %eax2831; X86-NOSSE-NEXT:    movl %eax, (%esp)2832; X86-NOSSE-NEXT:    fld12833; X86-NOSSE-NEXT:    fdivs (%esp)2834; X86-NOSSE-NEXT:    fstps {{[0-9]+}}(%esp)2835; X86-NOSSE-NEXT:    movl {{[0-9]+}}(%esp), %eax2836; X86-NOSSE-NEXT:    movl %eax, {{[0-9]+}}(%esp)2837; X86-NOSSE-NEXT:    addl $12, %esp2838; X86-NOSSE-NEXT:    retl2839;2840; X86-SSE1-LABEL: fdiv_32stack:2841; X86-SSE1:       # %bb.0:2842; X86-SSE1-NEXT:    subl $12, %esp2843; X86-SSE1-NEXT:    movl {{[0-9]+}}(%esp), %eax2844; X86-SSE1-NEXT:    movl %eax, (%esp)2845; X86-SSE1-NEXT:    movss {{.*#+}} xmm0 = [1.0E+0,0.0E+0,0.0E+0,0.0E+0]2846; X86-SSE1-NEXT:    divss (%esp), %xmm02847; X86-SSE1-NEXT:    movss %xmm0, {{[0-9]+}}(%esp)2848; X86-SSE1-NEXT:    movl {{[0-9]+}}(%esp), %eax2849; X86-SSE1-NEXT:    movl %eax, {{[0-9]+}}(%esp)2850; X86-SSE1-NEXT:    addl $12, %esp2851; X86-SSE1-NEXT:    retl2852;2853; X86-SSE2-LABEL: fdiv_32stack:2854; X86-SSE2:       # %bb.0:2855; X86-SSE2-NEXT:    pushl %eax2856; X86-SSE2-NEXT:    movss {{.*#+}} xmm0 = [1.0E+0,0.0E+0,0.0E+0,0.0E+0]2857; X86-SSE2-NEXT:    divss (%esp), %xmm02858; X86-SSE2-NEXT:    movss %xmm0, (%esp)2859; X86-SSE2-NEXT:    popl %eax2860; X86-SSE2-NEXT:    retl2861;2862; X86-AVX-LABEL: fdiv_32stack:2863; X86-AVX:       # %bb.0:2864; X86-AVX-NEXT:    pushl %eax2865; X86-AVX-NEXT:    vmovss {{.*#+}} xmm0 = [1.0E+0,0.0E+0,0.0E+0,0.0E+0]2866; X86-AVX-NEXT:    vdivss (%esp), %xmm0, %xmm02867; X86-AVX-NEXT:    vmovss %xmm0, (%esp)2868; X86-AVX-NEXT:    popl %eax2869; X86-AVX-NEXT:    retl2870;2871; X64-SSE-LABEL: fdiv_32stack:2872; X64-SSE:       # %bb.0:2873; X64-SSE-NEXT:    movss {{.*#+}} xmm0 = [1.0E+0,0.0E+0,0.0E+0,0.0E+0]2874; X64-SSE-NEXT:    divss -{{[0-9]+}}(%rsp), %xmm02875; X64-SSE-NEXT:    movss %xmm0, -{{[0-9]+}}(%rsp)2876; X64-SSE-NEXT:    retq2877;2878; X64-AVX-LABEL: fdiv_32stack:2879; X64-AVX:       # %bb.0:2880; X64-AVX-NEXT:    vmovss {{.*#+}} xmm0 = [1.0E+0,0.0E+0,0.0E+0,0.0E+0]2881; X64-AVX-NEXT:    vdivss -{{[0-9]+}}(%rsp), %xmm0, %xmm02882; X64-AVX-NEXT:    vmovss %xmm0, -{{[0-9]+}}(%rsp)2883; X64-AVX-NEXT:    retq2884  %ptr = alloca i32, align 42885  %load = load atomic i32, ptr %ptr acquire, align 42886  %bc0 = bitcast i32 %load to float2887  %fdiv = fdiv float 1.000000e+00, %bc02888  %bc1 = bitcast float %fdiv to i322889  store atomic i32 %bc1, ptr %ptr release, align 42890  ret void2891}2892 2893define dso_local void @fdiv_64stack() nounwind {2894; X86-NOSSE-LABEL: fdiv_64stack:2895; X86-NOSSE:       # %bb.0:2896; X86-NOSSE-NEXT:    pushl %ebp2897; X86-NOSSE-NEXT:    movl %esp, %ebp2898; X86-NOSSE-NEXT:    andl $-8, %esp2899; X86-NOSSE-NEXT:    subl $40, %esp2900; X86-NOSSE-NEXT:    fildll {{[0-9]+}}(%esp)2901; X86-NOSSE-NEXT:    fistpll {{[0-9]+}}(%esp)2902; X86-NOSSE-NEXT:    movl {{[0-9]+}}(%esp), %eax2903; X86-NOSSE-NEXT:    movl {{[0-9]+}}(%esp), %ecx2904; X86-NOSSE-NEXT:    movl %ecx, {{[0-9]+}}(%esp)2905; X86-NOSSE-NEXT:    movl %eax, {{[0-9]+}}(%esp)2906; X86-NOSSE-NEXT:    fld12907; X86-NOSSE-NEXT:    fdivl {{[0-9]+}}(%esp)2908; X86-NOSSE-NEXT:    fstpl {{[0-9]+}}(%esp)2909; X86-NOSSE-NEXT:    movl {{[0-9]+}}(%esp), %eax2910; X86-NOSSE-NEXT:    movl {{[0-9]+}}(%esp), %ecx2911; X86-NOSSE-NEXT:    movl %eax, (%esp)2912; X86-NOSSE-NEXT:    movl %ecx, {{[0-9]+}}(%esp)2913; X86-NOSSE-NEXT:    fildll (%esp)2914; X86-NOSSE-NEXT:    fistpll {{[0-9]+}}(%esp)2915; X86-NOSSE-NEXT:    movl %ebp, %esp2916; X86-NOSSE-NEXT:    popl %ebp2917; X86-NOSSE-NEXT:    retl2918;2919; X86-SSE1-LABEL: fdiv_64stack:2920; X86-SSE1:       # %bb.0:2921; X86-SSE1-NEXT:    pushl %ebp2922; X86-SSE1-NEXT:    movl %esp, %ebp2923; X86-SSE1-NEXT:    andl $-8, %esp2924; X86-SSE1-NEXT:    subl $24, %esp2925; X86-SSE1-NEXT:    xorps %xmm0, %xmm02926; X86-SSE1-NEXT:    xorps %xmm1, %xmm12927; X86-SSE1-NEXT:    movlps {{.*#+}} xmm1 = mem[0,1],xmm1[2,3]2928; X86-SSE1-NEXT:    movss %xmm1, (%esp)2929; X86-SSE1-NEXT:    shufps {{.*#+}} xmm1 = xmm1[1,1,1,1]2930; X86-SSE1-NEXT:    movss %xmm1, {{[0-9]+}}(%esp)2931; X86-SSE1-NEXT:    fld12932; X86-SSE1-NEXT:    fdivl (%esp)2933; X86-SSE1-NEXT:    fstpl {{[0-9]+}}(%esp)2934; X86-SSE1-NEXT:    movlps {{.*#+}} xmm0 = mem[0,1],xmm0[2,3]2935; X86-SSE1-NEXT:    movlps %xmm0, {{[0-9]+}}(%esp)2936; X86-SSE1-NEXT:    movl %ebp, %esp2937; X86-SSE1-NEXT:    popl %ebp2938; X86-SSE1-NEXT:    retl2939;2940; X86-SSE2-LABEL: fdiv_64stack:2941; X86-SSE2:       # %bb.0:2942; X86-SSE2-NEXT:    pushl %ebp2943; X86-SSE2-NEXT:    movl %esp, %ebp2944; X86-SSE2-NEXT:    andl $-8, %esp2945; X86-SSE2-NEXT:    subl $16, %esp2946; X86-SSE2-NEXT:    movsd {{.*#+}} xmm0 = mem[0],zero2947; X86-SSE2-NEXT:    movsd {{.*#+}} xmm1 = [1.0E+0,0.0E+0]2948; X86-SSE2-NEXT:    divsd %xmm0, %xmm12949; X86-SSE2-NEXT:    movsd %xmm1, (%esp)2950; X86-SSE2-NEXT:    movsd {{.*#+}} xmm0 = mem[0],zero2951; X86-SSE2-NEXT:    movlps %xmm0, {{[0-9]+}}(%esp)2952; X86-SSE2-NEXT:    movl %ebp, %esp2953; X86-SSE2-NEXT:    popl %ebp2954; X86-SSE2-NEXT:    retl2955;2956; X86-AVX-LABEL: fdiv_64stack:2957; X86-AVX:       # %bb.0:2958; X86-AVX-NEXT:    pushl %ebp2959; X86-AVX-NEXT:    movl %esp, %ebp2960; X86-AVX-NEXT:    andl $-8, %esp2961; X86-AVX-NEXT:    subl $16, %esp2962; X86-AVX-NEXT:    vmovsd {{.*#+}} xmm0 = mem[0],zero2963; X86-AVX-NEXT:    vmovsd {{.*#+}} xmm1 = [1.0E+0,0.0E+0]2964; X86-AVX-NEXT:    vdivsd %xmm0, %xmm1, %xmm02965; X86-AVX-NEXT:    vmovsd %xmm0, (%esp)2966; X86-AVX-NEXT:    vmovsd {{.*#+}} xmm0 = mem[0],zero2967; X86-AVX-NEXT:    vmovlps %xmm0, {{[0-9]+}}(%esp)2968; X86-AVX-NEXT:    movl %ebp, %esp2969; X86-AVX-NEXT:    popl %ebp2970; X86-AVX-NEXT:    retl2971;2972; X64-SSE-LABEL: fdiv_64stack:2973; X64-SSE:       # %bb.0:2974; X64-SSE-NEXT:    movsd {{.*#+}} xmm0 = [1.0E+0,0.0E+0]2975; X64-SSE-NEXT:    divsd -{{[0-9]+}}(%rsp), %xmm02976; X64-SSE-NEXT:    movsd %xmm0, -{{[0-9]+}}(%rsp)2977; X64-SSE-NEXT:    retq2978;2979; X64-AVX-LABEL: fdiv_64stack:2980; X64-AVX:       # %bb.0:2981; X64-AVX-NEXT:    vmovsd {{.*#+}} xmm0 = [1.0E+0,0.0E+0]2982; X64-AVX-NEXT:    vdivsd -{{[0-9]+}}(%rsp), %xmm0, %xmm02983; X64-AVX-NEXT:    vmovsd %xmm0, -{{[0-9]+}}(%rsp)2984; X64-AVX-NEXT:    retq2985  %ptr = alloca i64, align 82986  %load = load atomic i64, ptr %ptr acquire, align 82987  %bc0 = bitcast i64 %load to double2988  %fdiv = fdiv double 1.000000e+00, %bc02989  %bc1 = bitcast double %fdiv to i642990  store atomic i64 %bc1, ptr %ptr release, align 82991  ret void2992}2993 2994define dso_local void @fdiv_array(ptr %arg, double %arg1, i64 %arg2) nounwind {2995; X86-NOSSE-LABEL: fdiv_array:2996; X86-NOSSE:       # %bb.0: # %bb2997; X86-NOSSE-NEXT:    pushl %ebp2998; X86-NOSSE-NEXT:    movl %esp, %ebp2999; X86-NOSSE-NEXT:    pushl %esi3000; X86-NOSSE-NEXT:    andl $-8, %esp3001; X86-NOSSE-NEXT:    subl $40, %esp3002; X86-NOSSE-NEXT:    movl 20(%ebp), %eax3003; X86-NOSSE-NEXT:    movl 8(%ebp), %ecx3004; X86-NOSSE-NEXT:    fildll (%ecx,%eax,8)3005; X86-NOSSE-NEXT:    fistpll {{[0-9]+}}(%esp)3006; X86-NOSSE-NEXT:    movl {{[0-9]+}}(%esp), %edx3007; X86-NOSSE-NEXT:    movl {{[0-9]+}}(%esp), %esi3008; X86-NOSSE-NEXT:    movl %esi, {{[0-9]+}}(%esp)3009; X86-NOSSE-NEXT:    movl %edx, {{[0-9]+}}(%esp)3010; X86-NOSSE-NEXT:    fldl {{[0-9]+}}(%esp)3011; X86-NOSSE-NEXT:    fdivl 12(%ebp)3012; X86-NOSSE-NEXT:    fstpl {{[0-9]+}}(%esp)3013; X86-NOSSE-NEXT:    movl {{[0-9]+}}(%esp), %edx3014; X86-NOSSE-NEXT:    movl {{[0-9]+}}(%esp), %esi3015; X86-NOSSE-NEXT:    movl %edx, (%esp)3016; X86-NOSSE-NEXT:    movl %esi, {{[0-9]+}}(%esp)3017; X86-NOSSE-NEXT:    fildll (%esp)3018; X86-NOSSE-NEXT:    fistpll (%ecx,%eax,8)3019; X86-NOSSE-NEXT:    leal -4(%ebp), %esp3020; X86-NOSSE-NEXT:    popl %esi3021; X86-NOSSE-NEXT:    popl %ebp3022; X86-NOSSE-NEXT:    retl3023;3024; X86-SSE1-LABEL: fdiv_array:3025; X86-SSE1:       # %bb.0: # %bb3026; X86-SSE1-NEXT:    pushl %ebp3027; X86-SSE1-NEXT:    movl %esp, %ebp3028; X86-SSE1-NEXT:    andl $-8, %esp3029; X86-SSE1-NEXT:    subl $16, %esp3030; X86-SSE1-NEXT:    movl 20(%ebp), %eax3031; X86-SSE1-NEXT:    movl 8(%ebp), %ecx3032; X86-SSE1-NEXT:    xorps %xmm0, %xmm03033; X86-SSE1-NEXT:    xorps %xmm1, %xmm13034; X86-SSE1-NEXT:    movlps {{.*#+}} xmm1 = mem[0,1],xmm1[2,3]3035; X86-SSE1-NEXT:    movss %xmm1, (%esp)3036; X86-SSE1-NEXT:    shufps {{.*#+}} xmm1 = xmm1[1,1,1,1]3037; X86-SSE1-NEXT:    movss %xmm1, {{[0-9]+}}(%esp)3038; X86-SSE1-NEXT:    fldl (%esp)3039; X86-SSE1-NEXT:    fdivl 12(%ebp)3040; X86-SSE1-NEXT:    fstpl {{[0-9]+}}(%esp)3041; X86-SSE1-NEXT:    movlps {{.*#+}} xmm0 = mem[0,1],xmm0[2,3]3042; X86-SSE1-NEXT:    movlps %xmm0, (%ecx,%eax,8)3043; X86-SSE1-NEXT:    movl %ebp, %esp3044; X86-SSE1-NEXT:    popl %ebp3045; X86-SSE1-NEXT:    retl3046;3047; X86-SSE2-LABEL: fdiv_array:3048; X86-SSE2:       # %bb.0: # %bb3049; X86-SSE2-NEXT:    pushl %ebp3050; X86-SSE2-NEXT:    movl %esp, %ebp3051; X86-SSE2-NEXT:    andl $-8, %esp3052; X86-SSE2-NEXT:    subl $8, %esp3053; X86-SSE2-NEXT:    movl 20(%ebp), %eax3054; X86-SSE2-NEXT:    movl 8(%ebp), %ecx3055; X86-SSE2-NEXT:    movsd {{.*#+}} xmm0 = mem[0],zero3056; X86-SSE2-NEXT:    divsd 12(%ebp), %xmm03057; X86-SSE2-NEXT:    movsd %xmm0, (%esp)3058; X86-SSE2-NEXT:    movsd {{.*#+}} xmm0 = mem[0],zero3059; X86-SSE2-NEXT:    movlps %xmm0, (%ecx,%eax,8)3060; X86-SSE2-NEXT:    movl %ebp, %esp3061; X86-SSE2-NEXT:    popl %ebp3062; X86-SSE2-NEXT:    retl3063;3064; X86-AVX-LABEL: fdiv_array:3065; X86-AVX:       # %bb.0: # %bb3066; X86-AVX-NEXT:    pushl %ebp3067; X86-AVX-NEXT:    movl %esp, %ebp3068; X86-AVX-NEXT:    andl $-8, %esp3069; X86-AVX-NEXT:    subl $8, %esp3070; X86-AVX-NEXT:    movl 20(%ebp), %eax3071; X86-AVX-NEXT:    movl 8(%ebp), %ecx3072; X86-AVX-NEXT:    vmovsd {{.*#+}} xmm0 = mem[0],zero3073; X86-AVX-NEXT:    vdivsd 12(%ebp), %xmm0, %xmm03074; X86-AVX-NEXT:    vmovsd %xmm0, (%esp)3075; X86-AVX-NEXT:    vmovsd {{.*#+}} xmm0 = mem[0],zero3076; X86-AVX-NEXT:    vmovlps %xmm0, (%ecx,%eax,8)3077; X86-AVX-NEXT:    movl %ebp, %esp3078; X86-AVX-NEXT:    popl %ebp3079; X86-AVX-NEXT:    retl3080;3081; X64-SSE-LABEL: fdiv_array:3082; X64-SSE:       # %bb.0: # %bb3083; X64-SSE-NEXT:    movsd {{.*#+}} xmm1 = mem[0],zero3084; X64-SSE-NEXT:    divsd %xmm0, %xmm13085; X64-SSE-NEXT:    movsd %xmm1, (%rdi,%rsi,8)3086; X64-SSE-NEXT:    retq3087;3088; X64-AVX-LABEL: fdiv_array:3089; X64-AVX:       # %bb.0: # %bb3090; X64-AVX-NEXT:    vmovsd {{.*#+}} xmm1 = mem[0],zero3091; X64-AVX-NEXT:    vdivsd %xmm0, %xmm1, %xmm03092; X64-AVX-NEXT:    vmovsd %xmm0, (%rdi,%rsi,8)3093; X64-AVX-NEXT:    retq3094bb:3095  %tmp4 = getelementptr inbounds i64, ptr %arg, i64 %arg23096  %tmp6 = load atomic i64, ptr %tmp4 monotonic, align 83097  %tmp7 = bitcast i64 %tmp6 to double3098  %tmp8 = fdiv double %tmp7, %arg13099  %tmp9 = bitcast double %tmp8 to i643100  store atomic i64 %tmp9, ptr %tmp4 monotonic, align 83101  ret void3102}3103