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