318 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -mtriple=i686-unknown-unknown -mattr=+sse2 | FileCheck %s --check-prefix=X863; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse2 | FileCheck %s --check-prefix=X644 5define double @f1(double %a) {6; X86-LABEL: f1:7; X86: # %bb.0:8; X86-NEXT: pushl %ebp9; X86-NEXT: .cfi_def_cfa_offset 810; X86-NEXT: .cfi_offset %ebp, -811; X86-NEXT: movl %esp, %ebp12; X86-NEXT: .cfi_def_cfa_register %ebp13; X86-NEXT: andl $-8, %esp14; X86-NEXT: subl $8, %esp15; X86-NEXT: movsd {{.*#+}} xmm0 = mem[0],zero16; X86-NEXT: mulsd {{\.?LCPI[0-9]+_[0-9]+}}, %xmm017; X86-NEXT: movsd %xmm0, (%esp)18; X86-NEXT: fldl (%esp)19; X86-NEXT: movl %ebp, %esp20; X86-NEXT: popl %ebp21; X86-NEXT: .cfi_def_cfa %esp, 422; X86-NEXT: retl23;24; X64-LABEL: f1:25; X64: # %bb.0:26; X64-NEXT: mulsd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm027; X64-NEXT: retq28 %1 = fadd fast double %a, %a29 %2 = fadd fast double %a, %a30 %3 = fadd fast double %1, %231 ret double %332}33 34define double @f2(double %a) {35; X86-LABEL: f2:36; X86: # %bb.0:37; X86-NEXT: pushl %ebp38; X86-NEXT: .cfi_def_cfa_offset 839; X86-NEXT: .cfi_offset %ebp, -840; X86-NEXT: movl %esp, %ebp41; X86-NEXT: .cfi_def_cfa_register %ebp42; X86-NEXT: andl $-8, %esp43; X86-NEXT: subl $8, %esp44; X86-NEXT: movsd {{.*#+}} xmm0 = mem[0],zero45; X86-NEXT: addsd %xmm0, %xmm046; X86-NEXT: movapd %xmm0, %xmm147; X86-NEXT: #ARITH_FENCE48; X86-NEXT: addsd %xmm0, %xmm149; X86-NEXT: movsd %xmm1, (%esp)50; X86-NEXT: fldl (%esp)51; X86-NEXT: movl %ebp, %esp52; X86-NEXT: popl %ebp53; X86-NEXT: .cfi_def_cfa %esp, 454; X86-NEXT: retl55;56; X64-LABEL: f2:57; X64: # %bb.0:58; X64-NEXT: addsd %xmm0, %xmm059; X64-NEXT: movapd %xmm0, %xmm160; X64-NEXT: #ARITH_FENCE61; X64-NEXT: addsd %xmm1, %xmm062; X64-NEXT: retq63 %1 = fadd fast double %a, %a64 %t = call double @llvm.arithmetic.fence.f64(double %1)65 %2 = fadd fast double %a, %a66 %3 = fadd fast double %t, %267 ret double %368}69 70define <2 x float> @f3(<2 x float> %a) {71; X86-LABEL: f3:72; X86: # %bb.0:73; X86-NEXT: mulps {{\.?LCPI[0-9]+_[0-9]+}}, %xmm074; X86-NEXT: retl75;76; X64-LABEL: f3:77; X64: # %bb.0:78; X64-NEXT: mulps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm079; X64-NEXT: retq80 %1 = fadd fast <2 x float> %a, %a81 %2 = fadd fast <2 x float> %a, %a82 %3 = fadd fast <2 x float> %1, %283 ret <2 x float> %384}85 86define <2 x float> @f4(<2 x float> %a) {87; X86-LABEL: f4:88; X86: # %bb.0:89; X86-NEXT: addps %xmm0, %xmm090; X86-NEXT: movaps %xmm0, %xmm191; X86-NEXT: #ARITH_FENCE92; X86-NEXT: addps %xmm1, %xmm093; X86-NEXT: retl94;95; X64-LABEL: f4:96; X64: # %bb.0:97; X64-NEXT: addps %xmm0, %xmm098; X64-NEXT: movaps %xmm0, %xmm199; X64-NEXT: #ARITH_FENCE100; X64-NEXT: addps %xmm1, %xmm0101; X64-NEXT: retq102 %1 = fadd fast <2 x float> %a, %a103 %t = call <2 x float> @llvm.arithmetic.fence.v2f32(<2 x float> %1)104 %2 = fadd fast <2 x float> %a, %a105 %3 = fadd fast <2 x float> %t, %2106 ret <2 x float> %3107}108 109define <8 x float> @f5(<8 x float> %a) {110; X86-LABEL: f5:111; X86: # %bb.0:112; X86-NEXT: movaps {{.*#+}} xmm2 = [4.0E+0,4.0E+0,4.0E+0,4.0E+0]113; X86-NEXT: mulps %xmm2, %xmm0114; X86-NEXT: mulps %xmm2, %xmm1115; X86-NEXT: retl116;117; X64-LABEL: f5:118; X64: # %bb.0:119; X64-NEXT: movaps {{.*#+}} xmm2 = [4.0E+0,4.0E+0,4.0E+0,4.0E+0]120; X64-NEXT: mulps %xmm2, %xmm0121; X64-NEXT: mulps %xmm2, %xmm1122; X64-NEXT: retq123 %1 = fadd fast <8 x float> %a, %a124 %2 = fadd fast <8 x float> %a, %a125 %3 = fadd fast <8 x float> %1, %2126 ret <8 x float> %3127}128 129define <8 x float> @f6(<8 x float> %a) {130; X86-LABEL: f6:131; X86: # %bb.0:132; X86-NEXT: addps %xmm0, %xmm0133; X86-NEXT: addps %xmm1, %xmm1134; X86-NEXT: movaps %xmm1, %xmm2135; X86-NEXT: #ARITH_FENCE136; X86-NEXT: movaps %xmm0, %xmm3137; X86-NEXT: #ARITH_FENCE138; X86-NEXT: addps %xmm3, %xmm0139; X86-NEXT: addps %xmm2, %xmm1140; X86-NEXT: retl141;142; X64-LABEL: f6:143; X64: # %bb.0:144; X64-NEXT: addps %xmm0, %xmm0145; X64-NEXT: addps %xmm1, %xmm1146; X64-NEXT: movaps %xmm1, %xmm2147; X64-NEXT: #ARITH_FENCE148; X64-NEXT: movaps %xmm0, %xmm3149; X64-NEXT: #ARITH_FENCE150; X64-NEXT: addps %xmm3, %xmm0151; X64-NEXT: addps %xmm2, %xmm1152; X64-NEXT: retq153 %1 = fadd fast <8 x float> %a, %a154 %t = call <8 x float> @llvm.arithmetic.fence.v8f32(<8 x float> %1)155 %2 = fadd fast <8 x float> %a, %a156 %3 = fadd fast <8 x float> %t, %2157 ret <8 x float> %3158}159 160define half @f7(half %a) nounwind {161; X86-LABEL: f7:162; X86: # %bb.0:163; X86-NEXT: pinsrw $0, {{[0-9]+}}(%esp), %xmm0164; X86-NEXT: #ARITH_FENCE165; X86-NEXT: retl166;167; X64-LABEL: f7:168; X64: # %bb.0:169; X64-NEXT: #ARITH_FENCE170; X64-NEXT: retq171 %b = call half @llvm.arithmetic.fence.f16(half %a)172 ret half %b173}174 175define bfloat @f8(bfloat %a) nounwind {176; X86-LABEL: f8:177; X86: # %bb.0:178; X86-NEXT: movzwl {{[0-9]+}}(%esp), %eax179; X86-NEXT: #ARITH_FENCE180; X86-NEXT: pinsrw $0, %eax, %xmm0181; X86-NEXT: retl182;183; X64-LABEL: f8:184; X64: # %bb.0:185; X64-NEXT: pextrw $0, %xmm0, %eax186; X64-NEXT: #ARITH_FENCE187; X64-NEXT: pinsrw $0, %eax, %xmm0188; X64-NEXT: retq189 %b = call bfloat @llvm.arithmetic.fence.bf16(bfloat %a)190 ret bfloat %b191}192 193define <2 x half> @f9(<2 x half> %a) nounwind {194; X86-LABEL: f9:195; X86: # %bb.0:196; X86-NEXT: movdqa %xmm0, %xmm1197; X86-NEXT: psrld $16, %xmm1198; X86-NEXT: #ARITH_FENCE199; X86-NEXT: #ARITH_FENCE200; X86-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]201; X86-NEXT: retl202;203; X64-LABEL: f9:204; X64: # %bb.0:205; X64-NEXT: movdqa %xmm0, %xmm1206; X64-NEXT: psrld $16, %xmm1207; X64-NEXT: #ARITH_FENCE208; X64-NEXT: #ARITH_FENCE209; X64-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]210; X64-NEXT: retq211 %b = call <2 x half> @llvm.arithmetic.fence.v2f16(<2 x half> %a)212 ret <2 x half> %b213}214 215define <3 x bfloat> @f10(<3 x bfloat> %a) nounwind {216; X86-LABEL: f10:217; X86: # %bb.0:218; X86-NEXT: pextrw $0, %xmm0, %eax219; X86-NEXT: movdqa %xmm0, %xmm1220; X86-NEXT: psrld $16, %xmm1221; X86-NEXT: pextrw $0, %xmm1, %ecx222; X86-NEXT: shufps {{.*#+}} xmm0 = xmm0[1,1,1,1]223; X86-NEXT: pextrw $0, %xmm0, %edx224; X86-NEXT: #ARITH_FENCE225; X86-NEXT: #ARITH_FENCE226; X86-NEXT: #ARITH_FENCE227; X86-NEXT: pinsrw $0, %eax, %xmm0228; X86-NEXT: pinsrw $0, %ecx, %xmm1229; X86-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]230; X86-NEXT: pinsrw $0, %edx, %xmm1231; X86-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]232; X86-NEXT: retl233;234; X64-LABEL: f10:235; X64: # %bb.0:236; X64-NEXT: pextrw $0, %xmm0, %eax237; X64-NEXT: movdqa %xmm0, %xmm1238; X64-NEXT: psrld $16, %xmm1239; X64-NEXT: pextrw $0, %xmm1, %ecx240; X64-NEXT: shufps {{.*#+}} xmm0 = xmm0[1,1,1,1]241; X64-NEXT: pextrw $0, %xmm0, %edx242; X64-NEXT: #ARITH_FENCE243; X64-NEXT: #ARITH_FENCE244; X64-NEXT: #ARITH_FENCE245; X64-NEXT: pinsrw $0, %eax, %xmm0246; X64-NEXT: pinsrw $0, %ecx, %xmm1247; X64-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]248; X64-NEXT: pinsrw $0, %edx, %xmm1249; X64-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]250; X64-NEXT: retq251 %b = call <3 x bfloat> @llvm.arithmetic.fence.v3bf16(<3 x bfloat> %a)252 ret <3 x bfloat> %b253}254 255define <4 x bfloat> @f11(<4 x bfloat> %a) nounwind {256; X86-LABEL: f11:257; X86: # %bb.0:258; X86-NEXT: pushl %esi259; X86-NEXT: movdqa %xmm0, %xmm1260; X86-NEXT: psrlq $48, %xmm1261; X86-NEXT: pextrw $0, %xmm1, %eax262; X86-NEXT: movdqa %xmm0, %xmm1263; X86-NEXT: shufps {{.*#+}} xmm1 = xmm1[1,1],xmm0[1,1]264; X86-NEXT: pextrw $0, %xmm1, %edx265; X86-NEXT: pextrw $0, %xmm0, %ecx266; X86-NEXT: psrld $16, %xmm0267; X86-NEXT: pextrw $0, %xmm0, %esi268; X86-NEXT: #ARITH_FENCE269; X86-NEXT: #ARITH_FENCE270; X86-NEXT: #ARITH_FENCE271; X86-NEXT: #ARITH_FENCE272; X86-NEXT: pinsrw $0, %eax, %xmm0273; X86-NEXT: pinsrw $0, %edx, %xmm1274; X86-NEXT: punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]275; X86-NEXT: pinsrw $0, %ecx, %xmm0276; X86-NEXT: pinsrw $0, %esi, %xmm2277; X86-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1],xmm0[2],xmm2[2],xmm0[3],xmm2[3]278; X86-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]279; X86-NEXT: popl %esi280; X86-NEXT: retl281;282; X64-LABEL: f11:283; X64: # %bb.0:284; X64-NEXT: movdqa %xmm0, %xmm1285; X64-NEXT: psrlq $48, %xmm1286; X64-NEXT: pextrw $0, %xmm1, %eax287; X64-NEXT: movdqa %xmm0, %xmm1288; X64-NEXT: shufps {{.*#+}} xmm1 = xmm1[1,1],xmm0[1,1]289; X64-NEXT: pextrw $0, %xmm1, %ecx290; X64-NEXT: pextrw $0, %xmm0, %edx291; X64-NEXT: psrld $16, %xmm0292; X64-NEXT: pextrw $0, %xmm0, %esi293; X64-NEXT: #ARITH_FENCE294; X64-NEXT: #ARITH_FENCE295; X64-NEXT: #ARITH_FENCE296; X64-NEXT: #ARITH_FENCE297; X64-NEXT: pinsrw $0, %eax, %xmm0298; X64-NEXT: pinsrw $0, %ecx, %xmm1299; X64-NEXT: punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]300; X64-NEXT: pinsrw $0, %edx, %xmm0301; X64-NEXT: pinsrw $0, %esi, %xmm2302; X64-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1],xmm0[2],xmm2[2],xmm0[3],xmm2[3]303; X64-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]304; X64-NEXT: retq305 %b = call <4 x bfloat> @llvm.arithmetic.fence.v4bf16(<4 x bfloat> %a)306 ret <4 x bfloat> %b307}308 309declare half @llvm.arithmetic.fence.f16(half)310declare bfloat @llvm.arithmetic.fence.bf16(bfloat)311declare <2 x half> @llvm.arithmetic.fence.v2f16(<2 x half>)312declare <3 x bfloat> @llvm.arithmetic.fence.v3bf16(<3 x bfloat>)313declare <4 x bfloat> @llvm.arithmetic.fence.v4bf16(<4 x bfloat>)314declare float @llvm.arithmetic.fence.f32(float)315declare double @llvm.arithmetic.fence.f64(double)316declare <2 x float> @llvm.arithmetic.fence.v2f32(<2 x float>)317declare <8 x float> @llvm.arithmetic.fence.v8f32(<8 x float>)318