480 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -mtriple=x86_64-apple-darwin -mattr=+sse2 | FileCheck %s --check-prefix=SSE23; RUN: llc < %s -mtriple=x86_64-apple-darwin -mattr=+sse4.1 | FileCheck %s --check-prefixes=SSE414; RUN: llc < %s -mtriple=x86_64-apple-darwin -mattr=+avx | FileCheck %s --check-prefixes=AVX,AVX15; RUN: llc < %s -mtriple=x86_64-apple-darwin -mattr=+avx512f,+avx512vl | FileCheck %s --check-prefixes=AVX,AVX512,AVX512F6; RUN: llc < %s -mtriple=x86_64-apple-darwin -mattr=+avx512fp16,+avx512vl | FileCheck %s --check-prefixes=AVX,AVX512,AVX512FP167 8define half @roundeven_f16(half %h) {9; SSE2-LABEL: roundeven_f16:10; SSE2: ## %bb.0: ## %entry11; SSE2-NEXT: pushq %rax12; SSE2-NEXT: .cfi_def_cfa_offset 1613; SSE2-NEXT: pextrw $0, %xmm0, %eax14; SSE2-NEXT: movzwl %ax, %edi15; SSE2-NEXT: callq ___extendhfsf216; SSE2-NEXT: callq _roundevenf17; SSE2-NEXT: callq ___truncsfhf218; SSE2-NEXT: ## kill: def $ax killed $ax def $eax19; SSE2-NEXT: pinsrw $0, %eax, %xmm020; SSE2-NEXT: popq %rax21; SSE2-NEXT: retq22;23; SSE41-LABEL: roundeven_f16:24; SSE41: ## %bb.0: ## %entry25; SSE41-NEXT: pushq %rax26; SSE41-NEXT: .cfi_def_cfa_offset 1627; SSE41-NEXT: pextrw $0, %xmm0, %eax28; SSE41-NEXT: movzwl %ax, %edi29; SSE41-NEXT: callq ___extendhfsf230; SSE41-NEXT: roundss $8, %xmm0, %xmm031; SSE41-NEXT: callq ___truncsfhf232; SSE41-NEXT: ## kill: def $ax killed $ax def $eax33; SSE41-NEXT: pinsrw $0, %eax, %xmm034; SSE41-NEXT: popq %rax35; SSE41-NEXT: retq36;37; AVX1-LABEL: roundeven_f16:38; AVX1: ## %bb.0: ## %entry39; AVX1-NEXT: pushq %rax40; AVX1-NEXT: .cfi_def_cfa_offset 1641; AVX1-NEXT: vpextrw $0, %xmm0, %eax42; AVX1-NEXT: movzwl %ax, %edi43; AVX1-NEXT: callq ___extendhfsf244; AVX1-NEXT: vroundss $8, %xmm0, %xmm0, %xmm045; AVX1-NEXT: callq ___truncsfhf246; AVX1-NEXT: ## kill: def $ax killed $ax def $eax47; AVX1-NEXT: vpinsrw $0, %eax, %xmm0, %xmm048; AVX1-NEXT: popq %rax49; AVX1-NEXT: retq50;51; AVX512F-LABEL: roundeven_f16:52; AVX512F: ## %bb.0: ## %entry53; AVX512F-NEXT: vcvtph2ps %xmm0, %xmm054; AVX512F-NEXT: vroundss $8, %xmm0, %xmm0, %xmm055; AVX512F-NEXT: vcvtps2ph $4, %xmm0, %xmm056; AVX512F-NEXT: retq57;58; AVX512FP16-LABEL: roundeven_f16:59; AVX512FP16: ## %bb.0: ## %entry60; AVX512FP16-NEXT: vrndscalesh $8, %xmm0, %xmm0, %xmm061; AVX512FP16-NEXT: retq62entry:63 %a = call half @llvm.roundeven.f16(half %h)64 ret half %a65}66 67define float @roundeven_f32(float %x) {68; SSE2-LABEL: roundeven_f32:69; SSE2: ## %bb.0:70; SSE2-NEXT: jmp _roundevenf ## TAILCALL71;72; SSE41-LABEL: roundeven_f32:73; SSE41: ## %bb.0:74; SSE41-NEXT: roundss $8, %xmm0, %xmm075; SSE41-NEXT: retq76;77; AVX-LABEL: roundeven_f32:78; AVX: ## %bb.0:79; AVX-NEXT: vroundss $8, %xmm0, %xmm0, %xmm080; AVX-NEXT: retq81 %a = call float @llvm.roundeven.f32(float %x)82 ret float %a83}84 85define double @roundeven_f64(double %x) {86; SSE2-LABEL: roundeven_f64:87; SSE2: ## %bb.0:88; SSE2-NEXT: jmp _roundeven ## TAILCALL89;90; SSE41-LABEL: roundeven_f64:91; SSE41: ## %bb.0:92; SSE41-NEXT: roundsd $8, %xmm0, %xmm093; SSE41-NEXT: retq94;95; AVX-LABEL: roundeven_f64:96; AVX: ## %bb.0:97; AVX-NEXT: vroundsd $8, %xmm0, %xmm0, %xmm098; AVX-NEXT: retq99 %a = call double @llvm.roundeven.f64(double %x)100 ret double %a101}102 103define <4 x float> @roundeven_v4f32(<4 x float> %x) {104; SSE2-LABEL: roundeven_v4f32:105; SSE2: ## %bb.0:106; SSE2-NEXT: subq $56, %rsp107; SSE2-NEXT: .cfi_def_cfa_offset 64108; SSE2-NEXT: movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) ## 16-byte Spill109; SSE2-NEXT: shufps {{.*#+}} xmm0 = xmm0[3,3,3,3]110; SSE2-NEXT: callq _roundevenf111; SSE2-NEXT: movaps %xmm0, (%rsp) ## 16-byte Spill112; SSE2-NEXT: movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 ## 16-byte Reload113; SSE2-NEXT: movhlps {{.*#+}} xmm0 = xmm0[1,1]114; SSE2-NEXT: callq _roundevenf115; SSE2-NEXT: unpcklps (%rsp), %xmm0 ## 16-byte Folded Reload116; SSE2-NEXT: ## xmm0 = xmm0[0],mem[0],xmm0[1],mem[1]117; SSE2-NEXT: movaps %xmm0, (%rsp) ## 16-byte Spill118; SSE2-NEXT: movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 ## 16-byte Reload119; SSE2-NEXT: callq _roundevenf120; SSE2-NEXT: movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) ## 16-byte Spill121; SSE2-NEXT: movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 ## 16-byte Reload122; SSE2-NEXT: shufps {{.*#+}} xmm0 = xmm0[1,1,1,1]123; SSE2-NEXT: callq _roundevenf124; SSE2-NEXT: movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 ## 16-byte Reload125; SSE2-NEXT: unpcklps {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]126; SSE2-NEXT: unpcklpd (%rsp), %xmm1 ## 16-byte Folded Reload127; SSE2-NEXT: ## xmm1 = xmm1[0],mem[0]128; SSE2-NEXT: movaps %xmm1, %xmm0129; SSE2-NEXT: addq $56, %rsp130; SSE2-NEXT: retq131;132; SSE41-LABEL: roundeven_v4f32:133; SSE41: ## %bb.0:134; SSE41-NEXT: roundps $8, %xmm0, %xmm0135; SSE41-NEXT: retq136;137; AVX-LABEL: roundeven_v4f32:138; AVX: ## %bb.0:139; AVX-NEXT: vroundps $8, %xmm0, %xmm0140; AVX-NEXT: retq141 %a = call <4 x float> @llvm.roundeven.v4f32(<4 x float> %x)142 ret <4 x float> %a143}144 145define <2 x double> @roundeven_v2f64(<2 x double> %x) {146; SSE2-LABEL: roundeven_v2f64:147; SSE2: ## %bb.0:148; SSE2-NEXT: subq $40, %rsp149; SSE2-NEXT: .cfi_def_cfa_offset 48150; SSE2-NEXT: movaps %xmm0, (%rsp) ## 16-byte Spill151; SSE2-NEXT: callq _roundeven152; SSE2-NEXT: movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) ## 16-byte Spill153; SSE2-NEXT: movaps (%rsp), %xmm0 ## 16-byte Reload154; SSE2-NEXT: movhlps {{.*#+}} xmm0 = xmm0[1,1]155; SSE2-NEXT: callq _roundeven156; SSE2-NEXT: movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 ## 16-byte Reload157; SSE2-NEXT: movlhps {{.*#+}} xmm1 = xmm1[0],xmm0[0]158; SSE2-NEXT: movaps %xmm1, %xmm0159; SSE2-NEXT: addq $40, %rsp160; SSE2-NEXT: retq161;162; SSE41-LABEL: roundeven_v2f64:163; SSE41: ## %bb.0:164; SSE41-NEXT: roundpd $8, %xmm0, %xmm0165; SSE41-NEXT: retq166;167; AVX-LABEL: roundeven_v2f64:168; AVX: ## %bb.0:169; AVX-NEXT: vroundpd $8, %xmm0, %xmm0170; AVX-NEXT: retq171 %a = call <2 x double> @llvm.roundeven.v2f64(<2 x double> %x)172 ret <2 x double> %a173}174 175define <8 x float> @roundeven_v8f32(<8 x float> %x) {176; SSE2-LABEL: roundeven_v8f32:177; SSE2: ## %bb.0:178; SSE2-NEXT: subq $72, %rsp179; SSE2-NEXT: .cfi_def_cfa_offset 80180; SSE2-NEXT: movaps %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) ## 16-byte Spill181; SSE2-NEXT: movaps %xmm0, (%rsp) ## 16-byte Spill182; SSE2-NEXT: shufps {{.*#+}} xmm0 = xmm0[3,3,3,3]183; SSE2-NEXT: callq _roundevenf184; SSE2-NEXT: movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) ## 16-byte Spill185; SSE2-NEXT: movaps (%rsp), %xmm0 ## 16-byte Reload186; SSE2-NEXT: movhlps {{.*#+}} xmm0 = xmm0[1,1]187; SSE2-NEXT: callq _roundevenf188; SSE2-NEXT: unpcklps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 ## 16-byte Folded Reload189; SSE2-NEXT: ## xmm0 = xmm0[0],mem[0],xmm0[1],mem[1]190; SSE2-NEXT: movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) ## 16-byte Spill191; SSE2-NEXT: movaps (%rsp), %xmm0 ## 16-byte Reload192; SSE2-NEXT: callq _roundevenf193; SSE2-NEXT: movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) ## 16-byte Spill194; SSE2-NEXT: movaps (%rsp), %xmm0 ## 16-byte Reload195; SSE2-NEXT: shufps {{.*#+}} xmm0 = xmm0[1,1,1,1]196; SSE2-NEXT: callq _roundevenf197; SSE2-NEXT: movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 ## 16-byte Reload198; SSE2-NEXT: unpcklps {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]199; SSE2-NEXT: unpcklpd {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 ## 16-byte Folded Reload200; SSE2-NEXT: ## xmm1 = xmm1[0],mem[0]201; SSE2-NEXT: movaps %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) ## 16-byte Spill202; SSE2-NEXT: movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 ## 16-byte Reload203; SSE2-NEXT: shufps {{.*#+}} xmm0 = xmm0[3,3,3,3]204; SSE2-NEXT: callq _roundevenf205; SSE2-NEXT: movaps %xmm0, (%rsp) ## 16-byte Spill206; SSE2-NEXT: movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 ## 16-byte Reload207; SSE2-NEXT: movhlps {{.*#+}} xmm0 = xmm0[1,1]208; SSE2-NEXT: callq _roundevenf209; SSE2-NEXT: unpcklps (%rsp), %xmm0 ## 16-byte Folded Reload210; SSE2-NEXT: ## xmm0 = xmm0[0],mem[0],xmm0[1],mem[1]211; SSE2-NEXT: movaps %xmm0, (%rsp) ## 16-byte Spill212; SSE2-NEXT: movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 ## 16-byte Reload213; SSE2-NEXT: callq _roundevenf214; SSE2-NEXT: movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) ## 16-byte Spill215; SSE2-NEXT: movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 ## 16-byte Reload216; SSE2-NEXT: shufps {{.*#+}} xmm0 = xmm0[1,1,1,1]217; SSE2-NEXT: callq _roundevenf218; SSE2-NEXT: movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 ## 16-byte Reload219; SSE2-NEXT: unpcklps {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]220; SSE2-NEXT: unpcklpd (%rsp), %xmm1 ## 16-byte Folded Reload221; SSE2-NEXT: ## xmm1 = xmm1[0],mem[0]222; SSE2-NEXT: movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 ## 16-byte Reload223; SSE2-NEXT: addq $72, %rsp224; SSE2-NEXT: retq225;226; SSE41-LABEL: roundeven_v8f32:227; SSE41: ## %bb.0:228; SSE41-NEXT: roundps $8, %xmm0, %xmm0229; SSE41-NEXT: roundps $8, %xmm1, %xmm1230; SSE41-NEXT: retq231;232; AVX-LABEL: roundeven_v8f32:233; AVX: ## %bb.0:234; AVX-NEXT: vroundps $8, %ymm0, %ymm0235; AVX-NEXT: retq236 %a = call <8 x float> @llvm.roundeven.v8f32(<8 x float> %x)237 ret <8 x float> %a238}239 240define <4 x double> @roundeven_v4f64(<4 x double> %x) {241; SSE2-LABEL: roundeven_v4f64:242; SSE2: ## %bb.0:243; SSE2-NEXT: subq $56, %rsp244; SSE2-NEXT: .cfi_def_cfa_offset 64245; SSE2-NEXT: movaps %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) ## 16-byte Spill246; SSE2-NEXT: movaps %xmm0, (%rsp) ## 16-byte Spill247; SSE2-NEXT: callq _roundeven248; SSE2-NEXT: movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) ## 16-byte Spill249; SSE2-NEXT: movaps (%rsp), %xmm0 ## 16-byte Reload250; SSE2-NEXT: movhlps {{.*#+}} xmm0 = xmm0[1,1]251; SSE2-NEXT: callq _roundeven252; SSE2-NEXT: movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 ## 16-byte Reload253; SSE2-NEXT: movlhps {{.*#+}} xmm1 = xmm1[0],xmm0[0]254; SSE2-NEXT: movaps %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) ## 16-byte Spill255; SSE2-NEXT: movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 ## 16-byte Reload256; SSE2-NEXT: callq _roundeven257; SSE2-NEXT: movaps %xmm0, (%rsp) ## 16-byte Spill258; SSE2-NEXT: movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 ## 16-byte Reload259; SSE2-NEXT: movhlps {{.*#+}} xmm0 = xmm0[1,1]260; SSE2-NEXT: callq _roundeven261; SSE2-NEXT: movaps (%rsp), %xmm1 ## 16-byte Reload262; SSE2-NEXT: movlhps {{.*#+}} xmm1 = xmm1[0],xmm0[0]263; SSE2-NEXT: movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 ## 16-byte Reload264; SSE2-NEXT: addq $56, %rsp265; SSE2-NEXT: retq266;267; SSE41-LABEL: roundeven_v4f64:268; SSE41: ## %bb.0:269; SSE41-NEXT: roundpd $8, %xmm0, %xmm0270; SSE41-NEXT: roundpd $8, %xmm1, %xmm1271; SSE41-NEXT: retq272;273; AVX-LABEL: roundeven_v4f64:274; AVX: ## %bb.0:275; AVX-NEXT: vroundpd $8, %ymm0, %ymm0276; AVX-NEXT: retq277 %a = call <4 x double> @llvm.roundeven.v4f64(<4 x double> %x)278 ret <4 x double> %a279}280 281define <16 x float> @roundeven_v16f32(<16 x float> %x) {282; SSE2-LABEL: roundeven_v16f32:283; SSE2: ## %bb.0:284; SSE2-NEXT: subq $104, %rsp285; SSE2-NEXT: .cfi_def_cfa_offset 112286; SSE2-NEXT: movaps %xmm3, {{[-0-9]+}}(%r{{[sb]}}p) ## 16-byte Spill287; SSE2-NEXT: movaps %xmm2, {{[-0-9]+}}(%r{{[sb]}}p) ## 16-byte Spill288; SSE2-NEXT: movaps %xmm1, (%rsp) ## 16-byte Spill289; SSE2-NEXT: movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) ## 16-byte Spill290; SSE2-NEXT: shufps {{.*#+}} xmm0 = xmm0[3,3,3,3]291; SSE2-NEXT: callq _roundevenf292; SSE2-NEXT: movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) ## 16-byte Spill293; SSE2-NEXT: movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 ## 16-byte Reload294; SSE2-NEXT: movhlps {{.*#+}} xmm0 = xmm0[1,1]295; SSE2-NEXT: callq _roundevenf296; SSE2-NEXT: unpcklps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 ## 16-byte Folded Reload297; SSE2-NEXT: ## xmm0 = xmm0[0],mem[0],xmm0[1],mem[1]298; SSE2-NEXT: movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) ## 16-byte Spill299; SSE2-NEXT: movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 ## 16-byte Reload300; SSE2-NEXT: callq _roundevenf301; SSE2-NEXT: movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) ## 16-byte Spill302; SSE2-NEXT: movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 ## 16-byte Reload303; SSE2-NEXT: shufps {{.*#+}} xmm0 = xmm0[1,1,1,1]304; SSE2-NEXT: callq _roundevenf305; SSE2-NEXT: movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 ## 16-byte Reload306; SSE2-NEXT: unpcklps {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]307; SSE2-NEXT: unpcklpd {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 ## 16-byte Folded Reload308; SSE2-NEXT: ## xmm1 = xmm1[0],mem[0]309; SSE2-NEXT: movaps %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) ## 16-byte Spill310; SSE2-NEXT: movaps (%rsp), %xmm0 ## 16-byte Reload311; SSE2-NEXT: shufps {{.*#+}} xmm0 = xmm0[3,3,3,3]312; SSE2-NEXT: callq _roundevenf313; SSE2-NEXT: movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) ## 16-byte Spill314; SSE2-NEXT: movaps (%rsp), %xmm0 ## 16-byte Reload315; SSE2-NEXT: movhlps {{.*#+}} xmm0 = xmm0[1,1]316; SSE2-NEXT: callq _roundevenf317; SSE2-NEXT: unpcklps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 ## 16-byte Folded Reload318; SSE2-NEXT: ## xmm0 = xmm0[0],mem[0],xmm0[1],mem[1]319; SSE2-NEXT: movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) ## 16-byte Spill320; SSE2-NEXT: movaps (%rsp), %xmm0 ## 16-byte Reload321; SSE2-NEXT: callq _roundevenf322; SSE2-NEXT: movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) ## 16-byte Spill323; SSE2-NEXT: movaps (%rsp), %xmm0 ## 16-byte Reload324; SSE2-NEXT: shufps {{.*#+}} xmm0 = xmm0[1,1,1,1]325; SSE2-NEXT: callq _roundevenf326; SSE2-NEXT: movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 ## 16-byte Reload327; SSE2-NEXT: unpcklps {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]328; SSE2-NEXT: unpcklpd {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 ## 16-byte Folded Reload329; SSE2-NEXT: ## xmm1 = xmm1[0],mem[0]330; SSE2-NEXT: movaps %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) ## 16-byte Spill331; SSE2-NEXT: movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 ## 16-byte Reload332; SSE2-NEXT: shufps {{.*#+}} xmm0 = xmm0[3,3,3,3]333; SSE2-NEXT: callq _roundevenf334; SSE2-NEXT: movaps %xmm0, (%rsp) ## 16-byte Spill335; SSE2-NEXT: movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 ## 16-byte Reload336; SSE2-NEXT: movhlps {{.*#+}} xmm0 = xmm0[1,1]337; SSE2-NEXT: callq _roundevenf338; SSE2-NEXT: unpcklps (%rsp), %xmm0 ## 16-byte Folded Reload339; SSE2-NEXT: ## xmm0 = xmm0[0],mem[0],xmm0[1],mem[1]340; SSE2-NEXT: movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) ## 16-byte Spill341; SSE2-NEXT: movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 ## 16-byte Reload342; SSE2-NEXT: callq _roundevenf343; SSE2-NEXT: movaps %xmm0, (%rsp) ## 16-byte Spill344; SSE2-NEXT: movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 ## 16-byte Reload345; SSE2-NEXT: shufps {{.*#+}} xmm0 = xmm0[1,1,1,1]346; SSE2-NEXT: callq _roundevenf347; SSE2-NEXT: movaps (%rsp), %xmm1 ## 16-byte Reload348; SSE2-NEXT: unpcklps {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]349; SSE2-NEXT: unpcklpd {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 ## 16-byte Folded Reload350; SSE2-NEXT: ## xmm1 = xmm1[0],mem[0]351; SSE2-NEXT: movaps %xmm1, (%rsp) ## 16-byte Spill352; SSE2-NEXT: movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 ## 16-byte Reload353; SSE2-NEXT: shufps {{.*#+}} xmm0 = xmm0[3,3,3,3]354; SSE2-NEXT: callq _roundevenf355; SSE2-NEXT: movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) ## 16-byte Spill356; SSE2-NEXT: movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 ## 16-byte Reload357; SSE2-NEXT: movhlps {{.*#+}} xmm0 = xmm0[1,1]358; SSE2-NEXT: callq _roundevenf359; SSE2-NEXT: unpcklps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 ## 16-byte Folded Reload360; SSE2-NEXT: ## xmm0 = xmm0[0],mem[0],xmm0[1],mem[1]361; SSE2-NEXT: movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) ## 16-byte Spill362; SSE2-NEXT: movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 ## 16-byte Reload363; SSE2-NEXT: callq _roundevenf364; SSE2-NEXT: movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) ## 16-byte Spill365; SSE2-NEXT: movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 ## 16-byte Reload366; SSE2-NEXT: shufps {{.*#+}} xmm0 = xmm0[1,1,1,1]367; SSE2-NEXT: callq _roundevenf368; SSE2-NEXT: movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm3 ## 16-byte Reload369; SSE2-NEXT: unpcklps {{.*#+}} xmm3 = xmm3[0],xmm0[0],xmm3[1],xmm0[1]370; SSE2-NEXT: unpcklpd {{[-0-9]+}}(%r{{[sb]}}p), %xmm3 ## 16-byte Folded Reload371; SSE2-NEXT: ## xmm3 = xmm3[0],mem[0]372; SSE2-NEXT: movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 ## 16-byte Reload373; SSE2-NEXT: movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 ## 16-byte Reload374; SSE2-NEXT: movaps (%rsp), %xmm2 ## 16-byte Reload375; SSE2-NEXT: addq $104, %rsp376; SSE2-NEXT: retq377;378; SSE41-LABEL: roundeven_v16f32:379; SSE41: ## %bb.0:380; SSE41-NEXT: roundps $8, %xmm0, %xmm0381; SSE41-NEXT: roundps $8, %xmm1, %xmm1382; SSE41-NEXT: roundps $8, %xmm2, %xmm2383; SSE41-NEXT: roundps $8, %xmm3, %xmm3384; SSE41-NEXT: retq385;386; AVX1-LABEL: roundeven_v16f32:387; AVX1: ## %bb.0:388; AVX1-NEXT: vroundps $8, %ymm0, %ymm0389; AVX1-NEXT: vroundps $8, %ymm1, %ymm1390; AVX1-NEXT: retq391;392; AVX512-LABEL: roundeven_v16f32:393; AVX512: ## %bb.0:394; AVX512-NEXT: vrndscaleps $8, %zmm0, %zmm0395; AVX512-NEXT: retq396 %a = call <16 x float> @llvm.roundeven.v16f32(<16 x float> %x)397 ret <16 x float> %a398}399 400define <8 x double> @roundeven_v8f64(<8 x double> %x) {401; SSE2-LABEL: roundeven_v8f64:402; SSE2: ## %bb.0:403; SSE2-NEXT: subq $88, %rsp404; SSE2-NEXT: .cfi_def_cfa_offset 96405; SSE2-NEXT: movaps %xmm3, {{[-0-9]+}}(%r{{[sb]}}p) ## 16-byte Spill406; SSE2-NEXT: movaps %xmm2, {{[-0-9]+}}(%r{{[sb]}}p) ## 16-byte Spill407; SSE2-NEXT: movaps %xmm1, (%rsp) ## 16-byte Spill408; SSE2-NEXT: movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) ## 16-byte Spill409; SSE2-NEXT: callq _roundeven410; SSE2-NEXT: movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) ## 16-byte Spill411; SSE2-NEXT: movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 ## 16-byte Reload412; SSE2-NEXT: movhlps {{.*#+}} xmm0 = xmm0[1,1]413; SSE2-NEXT: callq _roundeven414; SSE2-NEXT: movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 ## 16-byte Reload415; SSE2-NEXT: movlhps {{.*#+}} xmm1 = xmm1[0],xmm0[0]416; SSE2-NEXT: movaps %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) ## 16-byte Spill417; SSE2-NEXT: movaps (%rsp), %xmm0 ## 16-byte Reload418; SSE2-NEXT: callq _roundeven419; SSE2-NEXT: movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) ## 16-byte Spill420; SSE2-NEXT: movaps (%rsp), %xmm0 ## 16-byte Reload421; SSE2-NEXT: movhlps {{.*#+}} xmm0 = xmm0[1,1]422; SSE2-NEXT: callq _roundeven423; SSE2-NEXT: movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 ## 16-byte Reload424; SSE2-NEXT: movlhps {{.*#+}} xmm1 = xmm1[0],xmm0[0]425; SSE2-NEXT: movaps %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) ## 16-byte Spill426; SSE2-NEXT: movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 ## 16-byte Reload427; SSE2-NEXT: callq _roundeven428; SSE2-NEXT: movaps %xmm0, (%rsp) ## 16-byte Spill429; SSE2-NEXT: movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 ## 16-byte Reload430; SSE2-NEXT: movhlps {{.*#+}} xmm0 = xmm0[1,1]431; SSE2-NEXT: callq _roundeven432; SSE2-NEXT: movaps (%rsp), %xmm1 ## 16-byte Reload433; SSE2-NEXT: movlhps {{.*#+}} xmm1 = xmm1[0],xmm0[0]434; SSE2-NEXT: movaps %xmm1, (%rsp) ## 16-byte Spill435; SSE2-NEXT: movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 ## 16-byte Reload436; SSE2-NEXT: callq _roundeven437; SSE2-NEXT: movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) ## 16-byte Spill438; SSE2-NEXT: movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 ## 16-byte Reload439; SSE2-NEXT: movhlps {{.*#+}} xmm0 = xmm0[1,1]440; SSE2-NEXT: callq _roundeven441; SSE2-NEXT: movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm3 ## 16-byte Reload442; SSE2-NEXT: movlhps {{.*#+}} xmm3 = xmm3[0],xmm0[0]443; SSE2-NEXT: movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 ## 16-byte Reload444; SSE2-NEXT: movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 ## 16-byte Reload445; SSE2-NEXT: movaps (%rsp), %xmm2 ## 16-byte Reload446; SSE2-NEXT: addq $88, %rsp447; SSE2-NEXT: retq448;449; SSE41-LABEL: roundeven_v8f64:450; SSE41: ## %bb.0:451; SSE41-NEXT: roundpd $8, %xmm0, %xmm0452; SSE41-NEXT: roundpd $8, %xmm1, %xmm1453; SSE41-NEXT: roundpd $8, %xmm2, %xmm2454; SSE41-NEXT: roundpd $8, %xmm3, %xmm3455; SSE41-NEXT: retq456;457; AVX1-LABEL: roundeven_v8f64:458; AVX1: ## %bb.0:459; AVX1-NEXT: vroundpd $8, %ymm0, %ymm0460; AVX1-NEXT: vroundpd $8, %ymm1, %ymm1461; AVX1-NEXT: retq462;463; AVX512-LABEL: roundeven_v8f64:464; AVX512: ## %bb.0:465; AVX512-NEXT: vrndscalepd $8, %zmm0, %zmm0466; AVX512-NEXT: retq467 %a = call <8 x double> @llvm.roundeven.v8f64(<8 x double> %x)468 ret <8 x double> %a469}470 471declare half @llvm.roundeven.f16(half)472declare float @llvm.roundeven.f32(float)473declare double @llvm.roundeven.f64(double)474declare <4 x float> @llvm.roundeven.v4f32(<4 x float>)475declare <2 x double> @llvm.roundeven.v2f64(<2 x double>)476declare <8 x float> @llvm.roundeven.v8f32(<8 x float>)477declare <4 x double> @llvm.roundeven.v4f64(<4 x double>)478declare <16 x float> @llvm.roundeven.v16f32(<16 x float>)479declare <8 x double> @llvm.roundeven.v8f64(<8 x double>)480