forked from OSchip/llvm-project
2772 lines
91 KiB
LLVM
2772 lines
91 KiB
LLVM
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
|
|
; RUN: llc < %s -mtriple=x86_64-apple-darwin -mattr=+sse4.1 | FileCheck %s --check-prefix=SSE41
|
|
; RUN: llc < %s -mtriple=x86_64-apple-darwin -mattr=+avx | FileCheck %s --check-prefix=AVX
|
|
; RUN: llc < %s -mtriple=x86_64-apple-darwin -mattr=+avx512f | FileCheck %s --check-prefix=AVX512 --check-prefix=AVX512F
|
|
; RUN: llc < %s -mtriple=x86_64-apple-darwin -mattr=+avx512vl | FileCheck %s --check-prefix=AVX512 --check-prefix=AVX512VL
|
|
|
|
define <2 x double> @floor_v2f64(<2 x double> %p) {
|
|
; SSE41-LABEL: floor_v2f64:
|
|
; SSE41: ## %bb.0:
|
|
; SSE41-NEXT: roundpd $9, %xmm0, %xmm0
|
|
; SSE41-NEXT: retq
|
|
;
|
|
; AVX-LABEL: floor_v2f64:
|
|
; AVX: ## %bb.0:
|
|
; AVX-NEXT: vroundpd $9, %xmm0, %xmm0
|
|
; AVX-NEXT: retq
|
|
;
|
|
; AVX512-LABEL: floor_v2f64:
|
|
; AVX512: ## %bb.0:
|
|
; AVX512-NEXT: vroundpd $9, %xmm0, %xmm0
|
|
; AVX512-NEXT: retq
|
|
%t = call <2 x double> @llvm.floor.v2f64(<2 x double> %p)
|
|
ret <2 x double> %t
|
|
}
|
|
declare <2 x double> @llvm.floor.v2f64(<2 x double> %p)
|
|
|
|
define <4 x float> @floor_v4f32(<4 x float> %p) {
|
|
; SSE41-LABEL: floor_v4f32:
|
|
; SSE41: ## %bb.0:
|
|
; SSE41-NEXT: roundps $9, %xmm0, %xmm0
|
|
; SSE41-NEXT: retq
|
|
;
|
|
; AVX-LABEL: floor_v4f32:
|
|
; AVX: ## %bb.0:
|
|
; AVX-NEXT: vroundps $9, %xmm0, %xmm0
|
|
; AVX-NEXT: retq
|
|
;
|
|
; AVX512-LABEL: floor_v4f32:
|
|
; AVX512: ## %bb.0:
|
|
; AVX512-NEXT: vroundps $9, %xmm0, %xmm0
|
|
; AVX512-NEXT: retq
|
|
%t = call <4 x float> @llvm.floor.v4f32(<4 x float> %p)
|
|
ret <4 x float> %t
|
|
}
|
|
declare <4 x float> @llvm.floor.v4f32(<4 x float> %p)
|
|
|
|
define <4 x double> @floor_v4f64(<4 x double> %p){
|
|
; SSE41-LABEL: floor_v4f64:
|
|
; SSE41: ## %bb.0:
|
|
; SSE41-NEXT: roundpd $9, %xmm0, %xmm0
|
|
; SSE41-NEXT: roundpd $9, %xmm1, %xmm1
|
|
; SSE41-NEXT: retq
|
|
;
|
|
; AVX-LABEL: floor_v4f64:
|
|
; AVX: ## %bb.0:
|
|
; AVX-NEXT: vroundpd $9, %ymm0, %ymm0
|
|
; AVX-NEXT: retq
|
|
;
|
|
; AVX512-LABEL: floor_v4f64:
|
|
; AVX512: ## %bb.0:
|
|
; AVX512-NEXT: vroundpd $9, %ymm0, %ymm0
|
|
; AVX512-NEXT: retq
|
|
%t = call <4 x double> @llvm.floor.v4f64(<4 x double> %p)
|
|
ret <4 x double> %t
|
|
}
|
|
declare <4 x double> @llvm.floor.v4f64(<4 x double> %p)
|
|
|
|
define <8 x float> @floor_v8f32(<8 x float> %p) {
|
|
; SSE41-LABEL: floor_v8f32:
|
|
; SSE41: ## %bb.0:
|
|
; SSE41-NEXT: roundps $9, %xmm0, %xmm0
|
|
; SSE41-NEXT: roundps $9, %xmm1, %xmm1
|
|
; SSE41-NEXT: retq
|
|
;
|
|
; AVX-LABEL: floor_v8f32:
|
|
; AVX: ## %bb.0:
|
|
; AVX-NEXT: vroundps $9, %ymm0, %ymm0
|
|
; AVX-NEXT: retq
|
|
;
|
|
; AVX512-LABEL: floor_v8f32:
|
|
; AVX512: ## %bb.0:
|
|
; AVX512-NEXT: vroundps $9, %ymm0, %ymm0
|
|
; AVX512-NEXT: retq
|
|
%t = call <8 x float> @llvm.floor.v8f32(<8 x float> %p)
|
|
ret <8 x float> %t
|
|
}
|
|
declare <8 x float> @llvm.floor.v8f32(<8 x float> %p)
|
|
|
|
define <8 x double> @floor_v8f64(<8 x double> %p){
|
|
; SSE41-LABEL: floor_v8f64:
|
|
; SSE41: ## %bb.0:
|
|
; SSE41-NEXT: roundpd $9, %xmm0, %xmm0
|
|
; SSE41-NEXT: roundpd $9, %xmm1, %xmm1
|
|
; SSE41-NEXT: roundpd $9, %xmm2, %xmm2
|
|
; SSE41-NEXT: roundpd $9, %xmm3, %xmm3
|
|
; SSE41-NEXT: retq
|
|
;
|
|
; AVX-LABEL: floor_v8f64:
|
|
; AVX: ## %bb.0:
|
|
; AVX-NEXT: vroundpd $9, %ymm0, %ymm0
|
|
; AVX-NEXT: vroundpd $9, %ymm1, %ymm1
|
|
; AVX-NEXT: retq
|
|
;
|
|
; AVX512-LABEL: floor_v8f64:
|
|
; AVX512: ## %bb.0:
|
|
; AVX512-NEXT: vrndscalepd $9, %zmm0, %zmm0
|
|
; AVX512-NEXT: retq
|
|
%t = call <8 x double> @llvm.floor.v8f64(<8 x double> %p)
|
|
ret <8 x double> %t
|
|
}
|
|
declare <8 x double> @llvm.floor.v8f64(<8 x double> %p)
|
|
|
|
define <16 x float> @floor_v16f32(<16 x float> %p) {
|
|
; SSE41-LABEL: floor_v16f32:
|
|
; SSE41: ## %bb.0:
|
|
; SSE41-NEXT: roundps $9, %xmm0, %xmm0
|
|
; SSE41-NEXT: roundps $9, %xmm1, %xmm1
|
|
; SSE41-NEXT: roundps $9, %xmm2, %xmm2
|
|
; SSE41-NEXT: roundps $9, %xmm3, %xmm3
|
|
; SSE41-NEXT: retq
|
|
;
|
|
; AVX-LABEL: floor_v16f32:
|
|
; AVX: ## %bb.0:
|
|
; AVX-NEXT: vroundps $9, %ymm0, %ymm0
|
|
; AVX-NEXT: vroundps $9, %ymm1, %ymm1
|
|
; AVX-NEXT: retq
|
|
;
|
|
; AVX512-LABEL: floor_v16f32:
|
|
; AVX512: ## %bb.0:
|
|
; AVX512-NEXT: vrndscaleps $9, %zmm0, %zmm0
|
|
; AVX512-NEXT: retq
|
|
%t = call <16 x float> @llvm.floor.v16f32(<16 x float> %p)
|
|
ret <16 x float> %t
|
|
}
|
|
declare <16 x float> @llvm.floor.v16f32(<16 x float> %p)
|
|
|
|
define <2 x double> @ceil_v2f64(<2 x double> %p) {
|
|
; SSE41-LABEL: ceil_v2f64:
|
|
; SSE41: ## %bb.0:
|
|
; SSE41-NEXT: roundpd $10, %xmm0, %xmm0
|
|
; SSE41-NEXT: retq
|
|
;
|
|
; AVX-LABEL: ceil_v2f64:
|
|
; AVX: ## %bb.0:
|
|
; AVX-NEXT: vroundpd $10, %xmm0, %xmm0
|
|
; AVX-NEXT: retq
|
|
;
|
|
; AVX512-LABEL: ceil_v2f64:
|
|
; AVX512: ## %bb.0:
|
|
; AVX512-NEXT: vroundpd $10, %xmm0, %xmm0
|
|
; AVX512-NEXT: retq
|
|
%t = call <2 x double> @llvm.ceil.v2f64(<2 x double> %p)
|
|
ret <2 x double> %t
|
|
}
|
|
declare <2 x double> @llvm.ceil.v2f64(<2 x double> %p)
|
|
|
|
define <2 x double> @ceil_v2f64_load(<2 x double>* %ptr) {
|
|
; SSE41-LABEL: ceil_v2f64_load:
|
|
; SSE41: ## %bb.0:
|
|
; SSE41-NEXT: movupd (%rdi), %xmm0
|
|
; SSE41-NEXT: roundpd $10, %xmm0, %xmm0
|
|
; SSE41-NEXT: retq
|
|
;
|
|
; AVX-LABEL: ceil_v2f64_load:
|
|
; AVX: ## %bb.0:
|
|
; AVX-NEXT: vroundpd $10, (%rdi), %xmm0
|
|
; AVX-NEXT: retq
|
|
;
|
|
; AVX512-LABEL: ceil_v2f64_load:
|
|
; AVX512: ## %bb.0:
|
|
; AVX512-NEXT: vroundpd $10, (%rdi), %xmm0
|
|
; AVX512-NEXT: retq
|
|
%p = load <2 x double>, <2 x double>* %ptr, align 1
|
|
%t = call <2 x double> @llvm.ceil.v2f64(<2 x double> %p)
|
|
ret <2 x double> %t
|
|
}
|
|
|
|
define <4 x float> @ceil_v4f32(<4 x float> %p) {
|
|
; SSE41-LABEL: ceil_v4f32:
|
|
; SSE41: ## %bb.0:
|
|
; SSE41-NEXT: roundps $10, %xmm0, %xmm0
|
|
; SSE41-NEXT: retq
|
|
;
|
|
; AVX-LABEL: ceil_v4f32:
|
|
; AVX: ## %bb.0:
|
|
; AVX-NEXT: vroundps $10, %xmm0, %xmm0
|
|
; AVX-NEXT: retq
|
|
;
|
|
; AVX512-LABEL: ceil_v4f32:
|
|
; AVX512: ## %bb.0:
|
|
; AVX512-NEXT: vroundps $10, %xmm0, %xmm0
|
|
; AVX512-NEXT: retq
|
|
%t = call <4 x float> @llvm.ceil.v4f32(<4 x float> %p)
|
|
ret <4 x float> %t
|
|
}
|
|
declare <4 x float> @llvm.ceil.v4f32(<4 x float> %p)
|
|
|
|
define <4 x float> @ceil_v4f32_load(<4 x float>* %ptr) {
|
|
; SSE41-LABEL: ceil_v4f32_load:
|
|
; SSE41: ## %bb.0:
|
|
; SSE41-NEXT: movups (%rdi), %xmm0
|
|
; SSE41-NEXT: roundps $10, %xmm0, %xmm0
|
|
; SSE41-NEXT: retq
|
|
;
|
|
; AVX-LABEL: ceil_v4f32_load:
|
|
; AVX: ## %bb.0:
|
|
; AVX-NEXT: vroundps $10, (%rdi), %xmm0
|
|
; AVX-NEXT: retq
|
|
;
|
|
; AVX512-LABEL: ceil_v4f32_load:
|
|
; AVX512: ## %bb.0:
|
|
; AVX512-NEXT: vroundps $10, (%rdi), %xmm0
|
|
; AVX512-NEXT: retq
|
|
%p = load <4 x float>, <4 x float>* %ptr, align 1
|
|
%t = call <4 x float> @llvm.ceil.v4f32(<4 x float> %p)
|
|
ret <4 x float> %t
|
|
}
|
|
|
|
define <4 x double> @ceil_v4f64(<4 x double> %p) {
|
|
; SSE41-LABEL: ceil_v4f64:
|
|
; SSE41: ## %bb.0:
|
|
; SSE41-NEXT: roundpd $10, %xmm0, %xmm0
|
|
; SSE41-NEXT: roundpd $10, %xmm1, %xmm1
|
|
; SSE41-NEXT: retq
|
|
;
|
|
; AVX-LABEL: ceil_v4f64:
|
|
; AVX: ## %bb.0:
|
|
; AVX-NEXT: vroundpd $10, %ymm0, %ymm0
|
|
; AVX-NEXT: retq
|
|
;
|
|
; AVX512-LABEL: ceil_v4f64:
|
|
; AVX512: ## %bb.0:
|
|
; AVX512-NEXT: vroundpd $10, %ymm0, %ymm0
|
|
; AVX512-NEXT: retq
|
|
%t = call <4 x double> @llvm.ceil.v4f64(<4 x double> %p)
|
|
ret <4 x double> %t
|
|
}
|
|
declare <4 x double> @llvm.ceil.v4f64(<4 x double> %p)
|
|
|
|
define <8 x float> @ceil_v8f32(<8 x float> %p) {
|
|
; SSE41-LABEL: ceil_v8f32:
|
|
; SSE41: ## %bb.0:
|
|
; SSE41-NEXT: roundps $10, %xmm0, %xmm0
|
|
; SSE41-NEXT: roundps $10, %xmm1, %xmm1
|
|
; SSE41-NEXT: retq
|
|
;
|
|
; AVX-LABEL: ceil_v8f32:
|
|
; AVX: ## %bb.0:
|
|
; AVX-NEXT: vroundps $10, %ymm0, %ymm0
|
|
; AVX-NEXT: retq
|
|
;
|
|
; AVX512-LABEL: ceil_v8f32:
|
|
; AVX512: ## %bb.0:
|
|
; AVX512-NEXT: vroundps $10, %ymm0, %ymm0
|
|
; AVX512-NEXT: retq
|
|
%t = call <8 x float> @llvm.ceil.v8f32(<8 x float> %p)
|
|
ret <8 x float> %t
|
|
}
|
|
declare <8 x float> @llvm.ceil.v8f32(<8 x float> %p)
|
|
|
|
define <8 x double> @ceil_v8f64(<8 x double> %p){
|
|
; SSE41-LABEL: ceil_v8f64:
|
|
; SSE41: ## %bb.0:
|
|
; SSE41-NEXT: roundpd $10, %xmm0, %xmm0
|
|
; SSE41-NEXT: roundpd $10, %xmm1, %xmm1
|
|
; SSE41-NEXT: roundpd $10, %xmm2, %xmm2
|
|
; SSE41-NEXT: roundpd $10, %xmm3, %xmm3
|
|
; SSE41-NEXT: retq
|
|
;
|
|
; AVX-LABEL: ceil_v8f64:
|
|
; AVX: ## %bb.0:
|
|
; AVX-NEXT: vroundpd $10, %ymm0, %ymm0
|
|
; AVX-NEXT: vroundpd $10, %ymm1, %ymm1
|
|
; AVX-NEXT: retq
|
|
;
|
|
; AVX512-LABEL: ceil_v8f64:
|
|
; AVX512: ## %bb.0:
|
|
; AVX512-NEXT: vrndscalepd $10, %zmm0, %zmm0
|
|
; AVX512-NEXT: retq
|
|
%t = call <8 x double> @llvm.ceil.v8f64(<8 x double> %p)
|
|
ret <8 x double> %t
|
|
}
|
|
declare <8 x double> @llvm.ceil.v8f64(<8 x double> %p)
|
|
|
|
define <16 x float> @ceil_v16f32(<16 x float> %p) {
|
|
; SSE41-LABEL: ceil_v16f32:
|
|
; SSE41: ## %bb.0:
|
|
; SSE41-NEXT: roundps $10, %xmm0, %xmm0
|
|
; SSE41-NEXT: roundps $10, %xmm1, %xmm1
|
|
; SSE41-NEXT: roundps $10, %xmm2, %xmm2
|
|
; SSE41-NEXT: roundps $10, %xmm3, %xmm3
|
|
; SSE41-NEXT: retq
|
|
;
|
|
; AVX-LABEL: ceil_v16f32:
|
|
; AVX: ## %bb.0:
|
|
; AVX-NEXT: vroundps $10, %ymm0, %ymm0
|
|
; AVX-NEXT: vroundps $10, %ymm1, %ymm1
|
|
; AVX-NEXT: retq
|
|
;
|
|
; AVX512-LABEL: ceil_v16f32:
|
|
; AVX512: ## %bb.0:
|
|
; AVX512-NEXT: vrndscaleps $10, %zmm0, %zmm0
|
|
; AVX512-NEXT: retq
|
|
%t = call <16 x float> @llvm.ceil.v16f32(<16 x float> %p)
|
|
ret <16 x float> %t
|
|
}
|
|
declare <16 x float> @llvm.ceil.v16f32(<16 x float> %p)
|
|
|
|
define <2 x double> @trunc_v2f64(<2 x double> %p) {
|
|
; SSE41-LABEL: trunc_v2f64:
|
|
; SSE41: ## %bb.0:
|
|
; SSE41-NEXT: roundpd $11, %xmm0, %xmm0
|
|
; SSE41-NEXT: retq
|
|
;
|
|
; AVX-LABEL: trunc_v2f64:
|
|
; AVX: ## %bb.0:
|
|
; AVX-NEXT: vroundpd $11, %xmm0, %xmm0
|
|
; AVX-NEXT: retq
|
|
;
|
|
; AVX512-LABEL: trunc_v2f64:
|
|
; AVX512: ## %bb.0:
|
|
; AVX512-NEXT: vroundpd $11, %xmm0, %xmm0
|
|
; AVX512-NEXT: retq
|
|
%t = call <2 x double> @llvm.trunc.v2f64(<2 x double> %p)
|
|
ret <2 x double> %t
|
|
}
|
|
declare <2 x double> @llvm.trunc.v2f64(<2 x double> %p)
|
|
|
|
define <4 x float> @trunc_v4f32(<4 x float> %p) {
|
|
; SSE41-LABEL: trunc_v4f32:
|
|
; SSE41: ## %bb.0:
|
|
; SSE41-NEXT: roundps $11, %xmm0, %xmm0
|
|
; SSE41-NEXT: retq
|
|
;
|
|
; AVX-LABEL: trunc_v4f32:
|
|
; AVX: ## %bb.0:
|
|
; AVX-NEXT: vroundps $11, %xmm0, %xmm0
|
|
; AVX-NEXT: retq
|
|
;
|
|
; AVX512-LABEL: trunc_v4f32:
|
|
; AVX512: ## %bb.0:
|
|
; AVX512-NEXT: vroundps $11, %xmm0, %xmm0
|
|
; AVX512-NEXT: retq
|
|
%t = call <4 x float> @llvm.trunc.v4f32(<4 x float> %p)
|
|
ret <4 x float> %t
|
|
}
|
|
declare <4 x float> @llvm.trunc.v4f32(<4 x float> %p)
|
|
|
|
define <4 x double> @trunc_v4f64(<4 x double> %p) {
|
|
; SSE41-LABEL: trunc_v4f64:
|
|
; SSE41: ## %bb.0:
|
|
; SSE41-NEXT: roundpd $11, %xmm0, %xmm0
|
|
; SSE41-NEXT: roundpd $11, %xmm1, %xmm1
|
|
; SSE41-NEXT: retq
|
|
;
|
|
; AVX-LABEL: trunc_v4f64:
|
|
; AVX: ## %bb.0:
|
|
; AVX-NEXT: vroundpd $11, %ymm0, %ymm0
|
|
; AVX-NEXT: retq
|
|
;
|
|
; AVX512-LABEL: trunc_v4f64:
|
|
; AVX512: ## %bb.0:
|
|
; AVX512-NEXT: vroundpd $11, %ymm0, %ymm0
|
|
; AVX512-NEXT: retq
|
|
%t = call <4 x double> @llvm.trunc.v4f64(<4 x double> %p)
|
|
ret <4 x double> %t
|
|
}
|
|
declare <4 x double> @llvm.trunc.v4f64(<4 x double> %p)
|
|
|
|
define <8 x float> @trunc_v8f32(<8 x float> %p) {
|
|
; SSE41-LABEL: trunc_v8f32:
|
|
; SSE41: ## %bb.0:
|
|
; SSE41-NEXT: roundps $11, %xmm0, %xmm0
|
|
; SSE41-NEXT: roundps $11, %xmm1, %xmm1
|
|
; SSE41-NEXT: retq
|
|
;
|
|
; AVX-LABEL: trunc_v8f32:
|
|
; AVX: ## %bb.0:
|
|
; AVX-NEXT: vroundps $11, %ymm0, %ymm0
|
|
; AVX-NEXT: retq
|
|
;
|
|
; AVX512-LABEL: trunc_v8f32:
|
|
; AVX512: ## %bb.0:
|
|
; AVX512-NEXT: vroundps $11, %ymm0, %ymm0
|
|
; AVX512-NEXT: retq
|
|
%t = call <8 x float> @llvm.trunc.v8f32(<8 x float> %p)
|
|
ret <8 x float> %t
|
|
}
|
|
declare <8 x float> @llvm.trunc.v8f32(<8 x float> %p)
|
|
|
|
define <8 x double> @trunc_v8f64(<8 x double> %p){
|
|
; SSE41-LABEL: trunc_v8f64:
|
|
; SSE41: ## %bb.0:
|
|
; SSE41-NEXT: roundpd $11, %xmm0, %xmm0
|
|
; SSE41-NEXT: roundpd $11, %xmm1, %xmm1
|
|
; SSE41-NEXT: roundpd $11, %xmm2, %xmm2
|
|
; SSE41-NEXT: roundpd $11, %xmm3, %xmm3
|
|
; SSE41-NEXT: retq
|
|
;
|
|
; AVX-LABEL: trunc_v8f64:
|
|
; AVX: ## %bb.0:
|
|
; AVX-NEXT: vroundpd $11, %ymm0, %ymm0
|
|
; AVX-NEXT: vroundpd $11, %ymm1, %ymm1
|
|
; AVX-NEXT: retq
|
|
;
|
|
; AVX512-LABEL: trunc_v8f64:
|
|
; AVX512: ## %bb.0:
|
|
; AVX512-NEXT: vrndscalepd $11, %zmm0, %zmm0
|
|
; AVX512-NEXT: retq
|
|
%t = call <8 x double> @llvm.trunc.v8f64(<8 x double> %p)
|
|
ret <8 x double> %t
|
|
}
|
|
declare <8 x double> @llvm.trunc.v8f64(<8 x double> %p)
|
|
|
|
define <16 x float> @trunc_v16f32(<16 x float> %p) {
|
|
; SSE41-LABEL: trunc_v16f32:
|
|
; SSE41: ## %bb.0:
|
|
; SSE41-NEXT: roundps $11, %xmm0, %xmm0
|
|
; SSE41-NEXT: roundps $11, %xmm1, %xmm1
|
|
; SSE41-NEXT: roundps $11, %xmm2, %xmm2
|
|
; SSE41-NEXT: roundps $11, %xmm3, %xmm3
|
|
; SSE41-NEXT: retq
|
|
;
|
|
; AVX-LABEL: trunc_v16f32:
|
|
; AVX: ## %bb.0:
|
|
; AVX-NEXT: vroundps $11, %ymm0, %ymm0
|
|
; AVX-NEXT: vroundps $11, %ymm1, %ymm1
|
|
; AVX-NEXT: retq
|
|
;
|
|
; AVX512-LABEL: trunc_v16f32:
|
|
; AVX512: ## %bb.0:
|
|
; AVX512-NEXT: vrndscaleps $11, %zmm0, %zmm0
|
|
; AVX512-NEXT: retq
|
|
%t = call <16 x float> @llvm.trunc.v16f32(<16 x float> %p)
|
|
ret <16 x float> %t
|
|
}
|
|
declare <16 x float> @llvm.trunc.v16f32(<16 x float> %p)
|
|
|
|
define <2 x double> @rint_v2f64(<2 x double> %p) {
|
|
; SSE41-LABEL: rint_v2f64:
|
|
; SSE41: ## %bb.0:
|
|
; SSE41-NEXT: roundpd $4, %xmm0, %xmm0
|
|
; SSE41-NEXT: retq
|
|
;
|
|
; AVX-LABEL: rint_v2f64:
|
|
; AVX: ## %bb.0:
|
|
; AVX-NEXT: vroundpd $4, %xmm0, %xmm0
|
|
; AVX-NEXT: retq
|
|
;
|
|
; AVX512-LABEL: rint_v2f64:
|
|
; AVX512: ## %bb.0:
|
|
; AVX512-NEXT: vroundpd $4, %xmm0, %xmm0
|
|
; AVX512-NEXT: retq
|
|
%t = call <2 x double> @llvm.rint.v2f64(<2 x double> %p)
|
|
ret <2 x double> %t
|
|
}
|
|
declare <2 x double> @llvm.rint.v2f64(<2 x double> %p)
|
|
|
|
define <4 x float> @rint_v4f32(<4 x float> %p) {
|
|
; SSE41-LABEL: rint_v4f32:
|
|
; SSE41: ## %bb.0:
|
|
; SSE41-NEXT: roundps $4, %xmm0, %xmm0
|
|
; SSE41-NEXT: retq
|
|
;
|
|
; AVX-LABEL: rint_v4f32:
|
|
; AVX: ## %bb.0:
|
|
; AVX-NEXT: vroundps $4, %xmm0, %xmm0
|
|
; AVX-NEXT: retq
|
|
;
|
|
; AVX512-LABEL: rint_v4f32:
|
|
; AVX512: ## %bb.0:
|
|
; AVX512-NEXT: vroundps $4, %xmm0, %xmm0
|
|
; AVX512-NEXT: retq
|
|
%t = call <4 x float> @llvm.rint.v4f32(<4 x float> %p)
|
|
ret <4 x float> %t
|
|
}
|
|
declare <4 x float> @llvm.rint.v4f32(<4 x float> %p)
|
|
|
|
define <4 x double> @rint_v4f64(<4 x double> %p) {
|
|
; SSE41-LABEL: rint_v4f64:
|
|
; SSE41: ## %bb.0:
|
|
; SSE41-NEXT: roundpd $4, %xmm0, %xmm0
|
|
; SSE41-NEXT: roundpd $4, %xmm1, %xmm1
|
|
; SSE41-NEXT: retq
|
|
;
|
|
; AVX-LABEL: rint_v4f64:
|
|
; AVX: ## %bb.0:
|
|
; AVX-NEXT: vroundpd $4, %ymm0, %ymm0
|
|
; AVX-NEXT: retq
|
|
;
|
|
; AVX512-LABEL: rint_v4f64:
|
|
; AVX512: ## %bb.0:
|
|
; AVX512-NEXT: vroundpd $4, %ymm0, %ymm0
|
|
; AVX512-NEXT: retq
|
|
%t = call <4 x double> @llvm.rint.v4f64(<4 x double> %p)
|
|
ret <4 x double> %t
|
|
}
|
|
declare <4 x double> @llvm.rint.v4f64(<4 x double> %p)
|
|
|
|
define <8 x float> @rint_v8f32(<8 x float> %p) {
|
|
; SSE41-LABEL: rint_v8f32:
|
|
; SSE41: ## %bb.0:
|
|
; SSE41-NEXT: roundps $4, %xmm0, %xmm0
|
|
; SSE41-NEXT: roundps $4, %xmm1, %xmm1
|
|
; SSE41-NEXT: retq
|
|
;
|
|
; AVX-LABEL: rint_v8f32:
|
|
; AVX: ## %bb.0:
|
|
; AVX-NEXT: vroundps $4, %ymm0, %ymm0
|
|
; AVX-NEXT: retq
|
|
;
|
|
; AVX512-LABEL: rint_v8f32:
|
|
; AVX512: ## %bb.0:
|
|
; AVX512-NEXT: vroundps $4, %ymm0, %ymm0
|
|
; AVX512-NEXT: retq
|
|
%t = call <8 x float> @llvm.rint.v8f32(<8 x float> %p)
|
|
ret <8 x float> %t
|
|
}
|
|
declare <8 x float> @llvm.rint.v8f32(<8 x float> %p)
|
|
|
|
define <8 x double> @rint_v8f64(<8 x double> %p){
|
|
; SSE41-LABEL: rint_v8f64:
|
|
; SSE41: ## %bb.0:
|
|
; SSE41-NEXT: roundpd $4, %xmm0, %xmm0
|
|
; SSE41-NEXT: roundpd $4, %xmm1, %xmm1
|
|
; SSE41-NEXT: roundpd $4, %xmm2, %xmm2
|
|
; SSE41-NEXT: roundpd $4, %xmm3, %xmm3
|
|
; SSE41-NEXT: retq
|
|
;
|
|
; AVX-LABEL: rint_v8f64:
|
|
; AVX: ## %bb.0:
|
|
; AVX-NEXT: vroundpd $4, %ymm0, %ymm0
|
|
; AVX-NEXT: vroundpd $4, %ymm1, %ymm1
|
|
; AVX-NEXT: retq
|
|
;
|
|
; AVX512-LABEL: rint_v8f64:
|
|
; AVX512: ## %bb.0:
|
|
; AVX512-NEXT: vrndscalepd $4, %zmm0, %zmm0
|
|
; AVX512-NEXT: retq
|
|
%t = call <8 x double> @llvm.rint.v8f64(<8 x double> %p)
|
|
ret <8 x double> %t
|
|
}
|
|
declare <8 x double> @llvm.rint.v8f64(<8 x double> %p)
|
|
|
|
define <16 x float> @rint_v16f32(<16 x float> %p) {
|
|
; SSE41-LABEL: rint_v16f32:
|
|
; SSE41: ## %bb.0:
|
|
; SSE41-NEXT: roundps $4, %xmm0, %xmm0
|
|
; SSE41-NEXT: roundps $4, %xmm1, %xmm1
|
|
; SSE41-NEXT: roundps $4, %xmm2, %xmm2
|
|
; SSE41-NEXT: roundps $4, %xmm3, %xmm3
|
|
; SSE41-NEXT: retq
|
|
;
|
|
; AVX-LABEL: rint_v16f32:
|
|
; AVX: ## %bb.0:
|
|
; AVX-NEXT: vroundps $4, %ymm0, %ymm0
|
|
; AVX-NEXT: vroundps $4, %ymm1, %ymm1
|
|
; AVX-NEXT: retq
|
|
;
|
|
; AVX512-LABEL: rint_v16f32:
|
|
; AVX512: ## %bb.0:
|
|
; AVX512-NEXT: vrndscaleps $4, %zmm0, %zmm0
|
|
; AVX512-NEXT: retq
|
|
%t = call <16 x float> @llvm.rint.v16f32(<16 x float> %p)
|
|
ret <16 x float> %t
|
|
}
|
|
declare <16 x float> @llvm.rint.v16f32(<16 x float> %p)
|
|
|
|
define <2 x double> @nearbyint_v2f64(<2 x double> %p) {
|
|
; SSE41-LABEL: nearbyint_v2f64:
|
|
; SSE41: ## %bb.0:
|
|
; SSE41-NEXT: roundpd $12, %xmm0, %xmm0
|
|
; SSE41-NEXT: retq
|
|
;
|
|
; AVX-LABEL: nearbyint_v2f64:
|
|
; AVX: ## %bb.0:
|
|
; AVX-NEXT: vroundpd $12, %xmm0, %xmm0
|
|
; AVX-NEXT: retq
|
|
;
|
|
; AVX512-LABEL: nearbyint_v2f64:
|
|
; AVX512: ## %bb.0:
|
|
; AVX512-NEXT: vroundpd $12, %xmm0, %xmm0
|
|
; AVX512-NEXT: retq
|
|
%t = call <2 x double> @llvm.nearbyint.v2f64(<2 x double> %p)
|
|
ret <2 x double> %t
|
|
}
|
|
declare <2 x double> @llvm.nearbyint.v2f64(<2 x double> %p)
|
|
|
|
define <4 x float> @nearbyint_v4f32(<4 x float> %p) {
|
|
; SSE41-LABEL: nearbyint_v4f32:
|
|
; SSE41: ## %bb.0:
|
|
; SSE41-NEXT: roundps $12, %xmm0, %xmm0
|
|
; SSE41-NEXT: retq
|
|
;
|
|
; AVX-LABEL: nearbyint_v4f32:
|
|
; AVX: ## %bb.0:
|
|
; AVX-NEXT: vroundps $12, %xmm0, %xmm0
|
|
; AVX-NEXT: retq
|
|
;
|
|
; AVX512-LABEL: nearbyint_v4f32:
|
|
; AVX512: ## %bb.0:
|
|
; AVX512-NEXT: vroundps $12, %xmm0, %xmm0
|
|
; AVX512-NEXT: retq
|
|
%t = call <4 x float> @llvm.nearbyint.v4f32(<4 x float> %p)
|
|
ret <4 x float> %t
|
|
}
|
|
declare <4 x float> @llvm.nearbyint.v4f32(<4 x float> %p)
|
|
|
|
define <4 x double> @nearbyint_v4f64(<4 x double> %p) {
|
|
; SSE41-LABEL: nearbyint_v4f64:
|
|
; SSE41: ## %bb.0:
|
|
; SSE41-NEXT: roundpd $12, %xmm0, %xmm0
|
|
; SSE41-NEXT: roundpd $12, %xmm1, %xmm1
|
|
; SSE41-NEXT: retq
|
|
;
|
|
; AVX-LABEL: nearbyint_v4f64:
|
|
; AVX: ## %bb.0:
|
|
; AVX-NEXT: vroundpd $12, %ymm0, %ymm0
|
|
; AVX-NEXT: retq
|
|
;
|
|
; AVX512-LABEL: nearbyint_v4f64:
|
|
; AVX512: ## %bb.0:
|
|
; AVX512-NEXT: vroundpd $12, %ymm0, %ymm0
|
|
; AVX512-NEXT: retq
|
|
%t = call <4 x double> @llvm.nearbyint.v4f64(<4 x double> %p)
|
|
ret <4 x double> %t
|
|
}
|
|
declare <4 x double> @llvm.nearbyint.v4f64(<4 x double> %p)
|
|
|
|
define <8 x float> @nearbyint_v8f32(<8 x float> %p) {
|
|
; SSE41-LABEL: nearbyint_v8f32:
|
|
; SSE41: ## %bb.0:
|
|
; SSE41-NEXT: roundps $12, %xmm0, %xmm0
|
|
; SSE41-NEXT: roundps $12, %xmm1, %xmm1
|
|
; SSE41-NEXT: retq
|
|
;
|
|
; AVX-LABEL: nearbyint_v8f32:
|
|
; AVX: ## %bb.0:
|
|
; AVX-NEXT: vroundps $12, %ymm0, %ymm0
|
|
; AVX-NEXT: retq
|
|
;
|
|
; AVX512-LABEL: nearbyint_v8f32:
|
|
; AVX512: ## %bb.0:
|
|
; AVX512-NEXT: vroundps $12, %ymm0, %ymm0
|
|
; AVX512-NEXT: retq
|
|
%t = call <8 x float> @llvm.nearbyint.v8f32(<8 x float> %p)
|
|
ret <8 x float> %t
|
|
}
|
|
declare <8 x float> @llvm.nearbyint.v8f32(<8 x float> %p)
|
|
|
|
define <8 x double> @nearbyint_v8f64(<8 x double> %p){
|
|
; SSE41-LABEL: nearbyint_v8f64:
|
|
; SSE41: ## %bb.0:
|
|
; SSE41-NEXT: roundpd $12, %xmm0, %xmm0
|
|
; SSE41-NEXT: roundpd $12, %xmm1, %xmm1
|
|
; SSE41-NEXT: roundpd $12, %xmm2, %xmm2
|
|
; SSE41-NEXT: roundpd $12, %xmm3, %xmm3
|
|
; SSE41-NEXT: retq
|
|
;
|
|
; AVX-LABEL: nearbyint_v8f64:
|
|
; AVX: ## %bb.0:
|
|
; AVX-NEXT: vroundpd $12, %ymm0, %ymm0
|
|
; AVX-NEXT: vroundpd $12, %ymm1, %ymm1
|
|
; AVX-NEXT: retq
|
|
;
|
|
; AVX512-LABEL: nearbyint_v8f64:
|
|
; AVX512: ## %bb.0:
|
|
; AVX512-NEXT: vrndscalepd $12, %zmm0, %zmm0
|
|
; AVX512-NEXT: retq
|
|
%t = call <8 x double> @llvm.nearbyint.v8f64(<8 x double> %p)
|
|
ret <8 x double> %t
|
|
}
|
|
declare <8 x double> @llvm.nearbyint.v8f64(<8 x double> %p)
|
|
|
|
define <16 x float> @nearbyint_v16f32(<16 x float> %p) {
|
|
; SSE41-LABEL: nearbyint_v16f32:
|
|
; SSE41: ## %bb.0:
|
|
; SSE41-NEXT: roundps $12, %xmm0, %xmm0
|
|
; SSE41-NEXT: roundps $12, %xmm1, %xmm1
|
|
; SSE41-NEXT: roundps $12, %xmm2, %xmm2
|
|
; SSE41-NEXT: roundps $12, %xmm3, %xmm3
|
|
; SSE41-NEXT: retq
|
|
;
|
|
; AVX-LABEL: nearbyint_v16f32:
|
|
; AVX: ## %bb.0:
|
|
; AVX-NEXT: vroundps $12, %ymm0, %ymm0
|
|
; AVX-NEXT: vroundps $12, %ymm1, %ymm1
|
|
; AVX-NEXT: retq
|
|
;
|
|
; AVX512-LABEL: nearbyint_v16f32:
|
|
; AVX512: ## %bb.0:
|
|
; AVX512-NEXT: vrndscaleps $12, %zmm0, %zmm0
|
|
; AVX512-NEXT: retq
|
|
%t = call <16 x float> @llvm.nearbyint.v16f32(<16 x float> %p)
|
|
ret <16 x float> %t
|
|
}
|
|
declare <16 x float> @llvm.nearbyint.v16f32(<16 x float> %p)
|
|
|
|
;
|
|
; Constant Folding
|
|
;
|
|
|
|
define <2 x double> @const_floor_v2f64() {
|
|
; SSE41-LABEL: const_floor_v2f64:
|
|
; SSE41: ## %bb.0:
|
|
; SSE41-NEXT: movaps {{.*#+}} xmm0 = [-2.0E+0,2.0E+0]
|
|
; SSE41-NEXT: retq
|
|
;
|
|
; AVX-LABEL: const_floor_v2f64:
|
|
; AVX: ## %bb.0:
|
|
; AVX-NEXT: vmovaps {{.*#+}} xmm0 = [-2.0E+0,2.0E+0]
|
|
; AVX-NEXT: retq
|
|
;
|
|
; AVX512-LABEL: const_floor_v2f64:
|
|
; AVX512: ## %bb.0:
|
|
; AVX512-NEXT: vmovaps {{.*#+}} xmm0 = [-2.0E+0,2.0E+0]
|
|
; AVX512-NEXT: retq
|
|
%t = call <2 x double> @llvm.floor.v2f64(<2 x double> <double -1.5, double 2.5>)
|
|
ret <2 x double> %t
|
|
}
|
|
|
|
define <4 x float> @const_floor_v4f32() {
|
|
; SSE41-LABEL: const_floor_v4f32:
|
|
; SSE41: ## %bb.0:
|
|
; SSE41-NEXT: movaps {{.*#+}} xmm0 = [-4.0E+0,6.0E+0,-9.0E+0,2.0E+0]
|
|
; SSE41-NEXT: retq
|
|
;
|
|
; AVX-LABEL: const_floor_v4f32:
|
|
; AVX: ## %bb.0:
|
|
; AVX-NEXT: vmovaps {{.*#+}} xmm0 = [-4.0E+0,6.0E+0,-9.0E+0,2.0E+0]
|
|
; AVX-NEXT: retq
|
|
;
|
|
; AVX512-LABEL: const_floor_v4f32:
|
|
; AVX512: ## %bb.0:
|
|
; AVX512-NEXT: vmovaps {{.*#+}} xmm0 = [-4.0E+0,6.0E+0,-9.0E+0,2.0E+0]
|
|
; AVX512-NEXT: retq
|
|
%t = call <4 x float> @llvm.floor.v4f32(<4 x float> <float -3.5, float 6.0, float -9.0, float 2.5>)
|
|
ret <4 x float> %t
|
|
}
|
|
|
|
define <2 x double> @const_ceil_v2f64() {
|
|
; SSE41-LABEL: const_ceil_v2f64:
|
|
; SSE41: ## %bb.0:
|
|
; SSE41-NEXT: movaps {{.*#+}} xmm0 = [-1.0E+0,3.0E+0]
|
|
; SSE41-NEXT: retq
|
|
;
|
|
; AVX-LABEL: const_ceil_v2f64:
|
|
; AVX: ## %bb.0:
|
|
; AVX-NEXT: vmovaps {{.*#+}} xmm0 = [-1.0E+0,3.0E+0]
|
|
; AVX-NEXT: retq
|
|
;
|
|
; AVX512-LABEL: const_ceil_v2f64:
|
|
; AVX512: ## %bb.0:
|
|
; AVX512-NEXT: vmovaps {{.*#+}} xmm0 = [-1.0E+0,3.0E+0]
|
|
; AVX512-NEXT: retq
|
|
%t = call <2 x double> @llvm.ceil.v2f64(<2 x double> <double -1.5, double 2.5>)
|
|
ret <2 x double> %t
|
|
}
|
|
|
|
define <4 x float> @const_ceil_v4f32() {
|
|
; SSE41-LABEL: const_ceil_v4f32:
|
|
; SSE41: ## %bb.0:
|
|
; SSE41-NEXT: movaps {{.*#+}} xmm0 = [-3.0E+0,6.0E+0,-9.0E+0,3.0E+0]
|
|
; SSE41-NEXT: retq
|
|
;
|
|
; AVX-LABEL: const_ceil_v4f32:
|
|
; AVX: ## %bb.0:
|
|
; AVX-NEXT: vmovaps {{.*#+}} xmm0 = [-3.0E+0,6.0E+0,-9.0E+0,3.0E+0]
|
|
; AVX-NEXT: retq
|
|
;
|
|
; AVX512-LABEL: const_ceil_v4f32:
|
|
; AVX512: ## %bb.0:
|
|
; AVX512-NEXT: vmovaps {{.*#+}} xmm0 = [-3.0E+0,6.0E+0,-9.0E+0,3.0E+0]
|
|
; AVX512-NEXT: retq
|
|
%t = call <4 x float> @llvm.ceil.v4f32(<4 x float> <float -3.5, float 6.0, float -9.0, float 2.5>)
|
|
ret <4 x float> %t
|
|
}
|
|
|
|
define <2 x double> @const_trunc_v2f64() {
|
|
; SSE41-LABEL: const_trunc_v2f64:
|
|
; SSE41: ## %bb.0:
|
|
; SSE41-NEXT: movaps {{.*#+}} xmm0 = [-1.0E+0,2.0E+0]
|
|
; SSE41-NEXT: retq
|
|
;
|
|
; AVX-LABEL: const_trunc_v2f64:
|
|
; AVX: ## %bb.0:
|
|
; AVX-NEXT: vmovaps {{.*#+}} xmm0 = [-1.0E+0,2.0E+0]
|
|
; AVX-NEXT: retq
|
|
;
|
|
; AVX512-LABEL: const_trunc_v2f64:
|
|
; AVX512: ## %bb.0:
|
|
; AVX512-NEXT: vmovaps {{.*#+}} xmm0 = [-1.0E+0,2.0E+0]
|
|
; AVX512-NEXT: retq
|
|
%t = call <2 x double> @llvm.trunc.v2f64(<2 x double> <double -1.5, double 2.5>)
|
|
ret <2 x double> %t
|
|
}
|
|
|
|
define <4 x float> @const_trunc_v4f32() {
|
|
; SSE41-LABEL: const_trunc_v4f32:
|
|
; SSE41: ## %bb.0:
|
|
; SSE41-NEXT: movaps {{.*#+}} xmm0 = [-3.0E+0,6.0E+0,-9.0E+0,2.0E+0]
|
|
; SSE41-NEXT: retq
|
|
;
|
|
; AVX-LABEL: const_trunc_v4f32:
|
|
; AVX: ## %bb.0:
|
|
; AVX-NEXT: vmovaps {{.*#+}} xmm0 = [-3.0E+0,6.0E+0,-9.0E+0,2.0E+0]
|
|
; AVX-NEXT: retq
|
|
;
|
|
; AVX512-LABEL: const_trunc_v4f32:
|
|
; AVX512: ## %bb.0:
|
|
; AVX512-NEXT: vmovaps {{.*#+}} xmm0 = [-3.0E+0,6.0E+0,-9.0E+0,2.0E+0]
|
|
; AVX512-NEXT: retq
|
|
%t = call <4 x float> @llvm.trunc.v4f32(<4 x float> <float -3.5, float 6.0, float -9.0, float 2.5>)
|
|
ret <4 x float> %t
|
|
}
|
|
|
|
;
|
|
; Scalar and masked instructions
|
|
;
|
|
|
|
define <4 x float> @floor_ss(<4 x float> %x, <4 x float> %y) nounwind {
|
|
; SSE41-LABEL: floor_ss:
|
|
; SSE41: ## %bb.0:
|
|
; SSE41-NEXT: roundss $1, %xmm0, %xmm1
|
|
; SSE41-NEXT: movaps %xmm1, %xmm0
|
|
; SSE41-NEXT: retq
|
|
;
|
|
; AVX-LABEL: floor_ss:
|
|
; AVX: ## %bb.0:
|
|
; AVX-NEXT: vroundss $1, %xmm0, %xmm1, %xmm0
|
|
; AVX-NEXT: retq
|
|
;
|
|
; AVX512-LABEL: floor_ss:
|
|
; AVX512: ## %bb.0:
|
|
; AVX512-NEXT: vroundss $1, %xmm0, %xmm1, %xmm0
|
|
; AVX512-NEXT: retq
|
|
%s = extractelement <4 x float> %x, i32 0
|
|
%call = call float @llvm.floor.f32(float %s)
|
|
%res = insertelement <4 x float> %y, float %call, i32 0
|
|
ret <4 x float> %res
|
|
}
|
|
declare float @llvm.floor.f32(float %s)
|
|
|
|
define <2 x double> @floor_sd(<2 x double> %x, <2 x double> %y) nounwind {
|
|
; SSE41-LABEL: floor_sd:
|
|
; SSE41: ## %bb.0:
|
|
; SSE41-NEXT: roundsd $1, %xmm0, %xmm1
|
|
; SSE41-NEXT: movapd %xmm1, %xmm0
|
|
; SSE41-NEXT: retq
|
|
;
|
|
; AVX-LABEL: floor_sd:
|
|
; AVX: ## %bb.0:
|
|
; AVX-NEXT: vroundsd $1, %xmm0, %xmm1, %xmm0
|
|
; AVX-NEXT: retq
|
|
;
|
|
; AVX512-LABEL: floor_sd:
|
|
; AVX512: ## %bb.0:
|
|
; AVX512-NEXT: vroundsd $1, %xmm0, %xmm1, %xmm0
|
|
; AVX512-NEXT: retq
|
|
%s = extractelement <2 x double> %x, i32 0
|
|
%call = call double @llvm.floor.f64(double %s)
|
|
%res = insertelement <2 x double> %y, double %call, i32 0
|
|
ret <2 x double> %res
|
|
}
|
|
declare double @llvm.floor.f64(double %s)
|
|
|
|
define <4 x float> @floor_mask_128_ps(<4 x float> %x, <4 x float> %y) nounwind {
|
|
; SSE41-LABEL: floor_mask_128_ps:
|
|
; SSE41: ## %bb.0:
|
|
; SSE41-NEXT: roundps $9, %xmm0, %xmm2
|
|
; SSE41-NEXT: cmpeqps %xmm1, %xmm0
|
|
; SSE41-NEXT: blendvps %xmm0, %xmm2, %xmm1
|
|
; SSE41-NEXT: movaps %xmm1, %xmm0
|
|
; SSE41-NEXT: retq
|
|
;
|
|
; AVX-LABEL: floor_mask_128_ps:
|
|
; AVX: ## %bb.0:
|
|
; AVX-NEXT: vcmpeqps %xmm1, %xmm0, %xmm2
|
|
; AVX-NEXT: vroundps $9, %xmm0, %xmm0
|
|
; AVX-NEXT: vblendvps %xmm2, %xmm0, %xmm1, %xmm0
|
|
; AVX-NEXT: retq
|
|
;
|
|
; AVX512F-LABEL: floor_mask_128_ps:
|
|
; AVX512F: ## %bb.0:
|
|
; AVX512F-NEXT: ## kill: def $xmm1 killed $xmm1 def $zmm1
|
|
; AVX512F-NEXT: ## kill: def $xmm0 killed $xmm0 def $zmm0
|
|
; AVX512F-NEXT: vcmpeqps %zmm1, %zmm0, %k1
|
|
; AVX512F-NEXT: vroundps $9, %xmm0, %xmm0
|
|
; AVX512F-NEXT: vblendmps %zmm0, %zmm1, %zmm0 {%k1}
|
|
; AVX512F-NEXT: ## kill: def $xmm0 killed $xmm0 killed $zmm0
|
|
; AVX512F-NEXT: vzeroupper
|
|
; AVX512F-NEXT: retq
|
|
;
|
|
; AVX512VL-LABEL: floor_mask_128_ps:
|
|
; AVX512VL: ## %bb.0:
|
|
; AVX512VL-NEXT: vcmpeqps %xmm1, %xmm0, %k1
|
|
; AVX512VL-NEXT: vrndscaleps $9, %xmm0, %xmm1 {%k1}
|
|
; AVX512VL-NEXT: vmovaps %xmm1, %xmm0
|
|
; AVX512VL-NEXT: retq
|
|
%k = fcmp oeq <4 x float> %x, %y
|
|
%call = call <4 x float> @llvm.floor.v4f32(<4 x float> %x)
|
|
%res = select <4 x i1> %k, <4 x float> %call, <4 x float> %y
|
|
ret <4 x float> %res
|
|
}
|
|
|
|
define <4 x float> @floor_maskz_128_ps(<4 x float> %x, <4 x float> %y) nounwind {
|
|
; SSE41-LABEL: floor_maskz_128_ps:
|
|
; SSE41: ## %bb.0:
|
|
; SSE41-NEXT: cmpeqps %xmm0, %xmm1
|
|
; SSE41-NEXT: roundps $9, %xmm0, %xmm0
|
|
; SSE41-NEXT: andps %xmm1, %xmm0
|
|
; SSE41-NEXT: retq
|
|
;
|
|
; AVX-LABEL: floor_maskz_128_ps:
|
|
; AVX: ## %bb.0:
|
|
; AVX-NEXT: vcmpeqps %xmm1, %xmm0, %xmm1
|
|
; AVX-NEXT: vroundps $9, %xmm0, %xmm0
|
|
; AVX-NEXT: vandps %xmm0, %xmm1, %xmm0
|
|
; AVX-NEXT: retq
|
|
;
|
|
; AVX512F-LABEL: floor_maskz_128_ps:
|
|
; AVX512F: ## %bb.0:
|
|
; AVX512F-NEXT: ## kill: def $xmm1 killed $xmm1 def $zmm1
|
|
; AVX512F-NEXT: ## kill: def $xmm0 killed $xmm0 def $zmm0
|
|
; AVX512F-NEXT: vcmpeqps %zmm1, %zmm0, %k1
|
|
; AVX512F-NEXT: vroundps $9, %xmm0, %xmm0
|
|
; AVX512F-NEXT: vmovaps %zmm0, %zmm0 {%k1} {z}
|
|
; AVX512F-NEXT: ## kill: def $xmm0 killed $xmm0 killed $zmm0
|
|
; AVX512F-NEXT: vzeroupper
|
|
; AVX512F-NEXT: retq
|
|
;
|
|
; AVX512VL-LABEL: floor_maskz_128_ps:
|
|
; AVX512VL: ## %bb.0:
|
|
; AVX512VL-NEXT: vcmpeqps %xmm1, %xmm0, %k1
|
|
; AVX512VL-NEXT: vrndscaleps $9, %xmm0, %xmm0 {%k1} {z}
|
|
; AVX512VL-NEXT: retq
|
|
%k = fcmp oeq <4 x float> %x, %y
|
|
%call = call <4 x float> @llvm.floor.v4f32(<4 x float> %x)
|
|
%res = select <4 x i1> %k, <4 x float> %call, <4 x float> zeroinitializer
|
|
ret <4 x float> %res
|
|
}
|
|
|
|
define <2 x double> @floor_mask_128_pd(<2 x double> %x, <2 x double> %y) nounwind {
|
|
; SSE41-LABEL: floor_mask_128_pd:
|
|
; SSE41: ## %bb.0:
|
|
; SSE41-NEXT: roundpd $9, %xmm0, %xmm2
|
|
; SSE41-NEXT: cmpeqpd %xmm1, %xmm0
|
|
; SSE41-NEXT: blendvpd %xmm0, %xmm2, %xmm1
|
|
; SSE41-NEXT: movapd %xmm1, %xmm0
|
|
; SSE41-NEXT: retq
|
|
;
|
|
; AVX-LABEL: floor_mask_128_pd:
|
|
; AVX: ## %bb.0:
|
|
; AVX-NEXT: vcmpeqpd %xmm1, %xmm0, %xmm2
|
|
; AVX-NEXT: vroundpd $9, %xmm0, %xmm0
|
|
; AVX-NEXT: vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
|
|
; AVX-NEXT: retq
|
|
;
|
|
; AVX512F-LABEL: floor_mask_128_pd:
|
|
; AVX512F: ## %bb.0:
|
|
; AVX512F-NEXT: ## kill: def $xmm1 killed $xmm1 def $zmm1
|
|
; AVX512F-NEXT: ## kill: def $xmm0 killed $xmm0 def $zmm0
|
|
; AVX512F-NEXT: vcmpeqpd %zmm1, %zmm0, %k1
|
|
; AVX512F-NEXT: vroundpd $9, %xmm0, %xmm0
|
|
; AVX512F-NEXT: vblendmpd %zmm0, %zmm1, %zmm0 {%k1}
|
|
; AVX512F-NEXT: ## kill: def $xmm0 killed $xmm0 killed $zmm0
|
|
; AVX512F-NEXT: vzeroupper
|
|
; AVX512F-NEXT: retq
|
|
;
|
|
; AVX512VL-LABEL: floor_mask_128_pd:
|
|
; AVX512VL: ## %bb.0:
|
|
; AVX512VL-NEXT: vcmpeqpd %xmm1, %xmm0, %k1
|
|
; AVX512VL-NEXT: vrndscalepd $9, %xmm0, %xmm1 {%k1}
|
|
; AVX512VL-NEXT: vmovapd %xmm1, %xmm0
|
|
; AVX512VL-NEXT: retq
|
|
%k = fcmp oeq <2 x double> %x, %y
|
|
%call = call <2 x double> @llvm.floor.v2f64(<2 x double> %x)
|
|
%res = select <2 x i1> %k, <2 x double> %call, <2 x double> %y
|
|
ret <2 x double> %res
|
|
}
|
|
|
|
define <2 x double> @floor_maskz_128_pd(<2 x double> %x, <2 x double> %y) nounwind {
|
|
; SSE41-LABEL: floor_maskz_128_pd:
|
|
; SSE41: ## %bb.0:
|
|
; SSE41-NEXT: cmpeqpd %xmm0, %xmm1
|
|
; SSE41-NEXT: roundpd $9, %xmm0, %xmm0
|
|
; SSE41-NEXT: andpd %xmm1, %xmm0
|
|
; SSE41-NEXT: retq
|
|
;
|
|
; AVX-LABEL: floor_maskz_128_pd:
|
|
; AVX: ## %bb.0:
|
|
; AVX-NEXT: vcmpeqpd %xmm1, %xmm0, %xmm1
|
|
; AVX-NEXT: vroundpd $9, %xmm0, %xmm0
|
|
; AVX-NEXT: vandpd %xmm0, %xmm1, %xmm0
|
|
; AVX-NEXT: retq
|
|
;
|
|
; AVX512F-LABEL: floor_maskz_128_pd:
|
|
; AVX512F: ## %bb.0:
|
|
; AVX512F-NEXT: ## kill: def $xmm1 killed $xmm1 def $zmm1
|
|
; AVX512F-NEXT: ## kill: def $xmm0 killed $xmm0 def $zmm0
|
|
; AVX512F-NEXT: vcmpeqpd %zmm1, %zmm0, %k1
|
|
; AVX512F-NEXT: vroundpd $9, %xmm0, %xmm0
|
|
; AVX512F-NEXT: vmovapd %zmm0, %zmm0 {%k1} {z}
|
|
; AVX512F-NEXT: ## kill: def $xmm0 killed $xmm0 killed $zmm0
|
|
; AVX512F-NEXT: vzeroupper
|
|
; AVX512F-NEXT: retq
|
|
;
|
|
; AVX512VL-LABEL: floor_maskz_128_pd:
|
|
; AVX512VL: ## %bb.0:
|
|
; AVX512VL-NEXT: vcmpeqpd %xmm1, %xmm0, %k1
|
|
; AVX512VL-NEXT: vrndscalepd $9, %xmm0, %xmm0 {%k1} {z}
|
|
; AVX512VL-NEXT: retq
|
|
%k = fcmp oeq <2 x double> %x, %y
|
|
%call = call <2 x double> @llvm.floor.v2f64(<2 x double> %x)
|
|
%res = select <2 x i1> %k, <2 x double> %call, <2 x double> zeroinitializer
|
|
ret <2 x double> %res
|
|
}
|
|
|
|
define <8 x float> @floor_mask_256_ps(<8 x float> %x, <8 x float> %y) nounwind {
|
|
; SSE41-LABEL: floor_mask_256_ps:
|
|
; SSE41: ## %bb.0:
|
|
; SSE41-NEXT: roundps $9, %xmm1, %xmm4
|
|
; SSE41-NEXT: cmpeqps %xmm3, %xmm1
|
|
; SSE41-NEXT: roundps $9, %xmm0, %xmm5
|
|
; SSE41-NEXT: cmpeqps %xmm2, %xmm0
|
|
; SSE41-NEXT: blendvps %xmm0, %xmm5, %xmm2
|
|
; SSE41-NEXT: movaps %xmm1, %xmm0
|
|
; SSE41-NEXT: blendvps %xmm0, %xmm4, %xmm3
|
|
; SSE41-NEXT: movaps %xmm2, %xmm0
|
|
; SSE41-NEXT: movaps %xmm3, %xmm1
|
|
; SSE41-NEXT: retq
|
|
;
|
|
; AVX-LABEL: floor_mask_256_ps:
|
|
; AVX: ## %bb.0:
|
|
; AVX-NEXT: vcmpeqps %ymm1, %ymm0, %ymm2
|
|
; AVX-NEXT: vroundps $9, %ymm0, %ymm0
|
|
; AVX-NEXT: vblendvps %ymm2, %ymm0, %ymm1, %ymm0
|
|
; AVX-NEXT: retq
|
|
;
|
|
; AVX512F-LABEL: floor_mask_256_ps:
|
|
; AVX512F: ## %bb.0:
|
|
; AVX512F-NEXT: ## kill: def $ymm1 killed $ymm1 def $zmm1
|
|
; AVX512F-NEXT: ## kill: def $ymm0 killed $ymm0 def $zmm0
|
|
; AVX512F-NEXT: vcmpeqps %zmm1, %zmm0, %k1
|
|
; AVX512F-NEXT: vroundps $9, %ymm0, %ymm0
|
|
; AVX512F-NEXT: vblendmps %zmm0, %zmm1, %zmm0 {%k1}
|
|
; AVX512F-NEXT: ## kill: def $ymm0 killed $ymm0 killed $zmm0
|
|
; AVX512F-NEXT: retq
|
|
;
|
|
; AVX512VL-LABEL: floor_mask_256_ps:
|
|
; AVX512VL: ## %bb.0:
|
|
; AVX512VL-NEXT: vcmpeqps %ymm1, %ymm0, %k1
|
|
; AVX512VL-NEXT: vrndscaleps $9, %ymm0, %ymm1 {%k1}
|
|
; AVX512VL-NEXT: vmovaps %ymm1, %ymm0
|
|
; AVX512VL-NEXT: retq
|
|
%k = fcmp oeq <8 x float> %x, %y
|
|
%call = call <8 x float> @llvm.floor.v8f32(<8 x float> %x)
|
|
%res = select <8 x i1> %k, <8 x float> %call, <8 x float> %y
|
|
ret <8 x float> %res
|
|
}
|
|
|
|
define <8 x float> @floor_maskz_256_ps(<8 x float> %x, <8 x float> %y) nounwind {
|
|
; SSE41-LABEL: floor_maskz_256_ps:
|
|
; SSE41: ## %bb.0:
|
|
; SSE41-NEXT: cmpeqps %xmm1, %xmm3
|
|
; SSE41-NEXT: cmpeqps %xmm0, %xmm2
|
|
; SSE41-NEXT: roundps $9, %xmm1, %xmm1
|
|
; SSE41-NEXT: andps %xmm3, %xmm1
|
|
; SSE41-NEXT: roundps $9, %xmm0, %xmm0
|
|
; SSE41-NEXT: andps %xmm2, %xmm0
|
|
; SSE41-NEXT: retq
|
|
;
|
|
; AVX-LABEL: floor_maskz_256_ps:
|
|
; AVX: ## %bb.0:
|
|
; AVX-NEXT: vcmpeqps %ymm1, %ymm0, %ymm1
|
|
; AVX-NEXT: vroundps $9, %ymm0, %ymm0
|
|
; AVX-NEXT: vandps %ymm0, %ymm1, %ymm0
|
|
; AVX-NEXT: retq
|
|
;
|
|
; AVX512F-LABEL: floor_maskz_256_ps:
|
|
; AVX512F: ## %bb.0:
|
|
; AVX512F-NEXT: ## kill: def $ymm1 killed $ymm1 def $zmm1
|
|
; AVX512F-NEXT: ## kill: def $ymm0 killed $ymm0 def $zmm0
|
|
; AVX512F-NEXT: vcmpeqps %zmm1, %zmm0, %k1
|
|
; AVX512F-NEXT: vroundps $9, %ymm0, %ymm0
|
|
; AVX512F-NEXT: vmovaps %zmm0, %zmm0 {%k1} {z}
|
|
; AVX512F-NEXT: ## kill: def $ymm0 killed $ymm0 killed $zmm0
|
|
; AVX512F-NEXT: retq
|
|
;
|
|
; AVX512VL-LABEL: floor_maskz_256_ps:
|
|
; AVX512VL: ## %bb.0:
|
|
; AVX512VL-NEXT: vcmpeqps %ymm1, %ymm0, %k1
|
|
; AVX512VL-NEXT: vrndscaleps $9, %ymm0, %ymm0 {%k1} {z}
|
|
; AVX512VL-NEXT: retq
|
|
%k = fcmp oeq <8 x float> %x, %y
|
|
%call = call <8 x float> @llvm.floor.v8f32(<8 x float> %x)
|
|
%res = select <8 x i1> %k, <8 x float> %call, <8 x float> zeroinitializer
|
|
ret <8 x float> %res
|
|
}
|
|
|
|
define <4 x double> @floor_mask_256_pd(<4 x double> %x, <4 x double> %y) nounwind {
|
|
; SSE41-LABEL: floor_mask_256_pd:
|
|
; SSE41: ## %bb.0:
|
|
; SSE41-NEXT: roundpd $9, %xmm1, %xmm4
|
|
; SSE41-NEXT: cmpeqpd %xmm3, %xmm1
|
|
; SSE41-NEXT: roundpd $9, %xmm0, %xmm5
|
|
; SSE41-NEXT: cmpeqpd %xmm2, %xmm0
|
|
; SSE41-NEXT: blendvpd %xmm0, %xmm5, %xmm2
|
|
; SSE41-NEXT: movapd %xmm1, %xmm0
|
|
; SSE41-NEXT: blendvpd %xmm0, %xmm4, %xmm3
|
|
; SSE41-NEXT: movapd %xmm2, %xmm0
|
|
; SSE41-NEXT: movapd %xmm3, %xmm1
|
|
; SSE41-NEXT: retq
|
|
;
|
|
; AVX-LABEL: floor_mask_256_pd:
|
|
; AVX: ## %bb.0:
|
|
; AVX-NEXT: vcmpeqpd %ymm1, %ymm0, %ymm2
|
|
; AVX-NEXT: vroundpd $9, %ymm0, %ymm0
|
|
; AVX-NEXT: vblendvpd %ymm2, %ymm0, %ymm1, %ymm0
|
|
; AVX-NEXT: retq
|
|
;
|
|
; AVX512F-LABEL: floor_mask_256_pd:
|
|
; AVX512F: ## %bb.0:
|
|
; AVX512F-NEXT: ## kill: def $ymm1 killed $ymm1 def $zmm1
|
|
; AVX512F-NEXT: ## kill: def $ymm0 killed $ymm0 def $zmm0
|
|
; AVX512F-NEXT: vcmpeqpd %zmm1, %zmm0, %k1
|
|
; AVX512F-NEXT: vroundpd $9, %ymm0, %ymm0
|
|
; AVX512F-NEXT: vblendmpd %zmm0, %zmm1, %zmm0 {%k1}
|
|
; AVX512F-NEXT: ## kill: def $ymm0 killed $ymm0 killed $zmm0
|
|
; AVX512F-NEXT: retq
|
|
;
|
|
; AVX512VL-LABEL: floor_mask_256_pd:
|
|
; AVX512VL: ## %bb.0:
|
|
; AVX512VL-NEXT: vcmpeqpd %ymm1, %ymm0, %k1
|
|
; AVX512VL-NEXT: vrndscalepd $9, %ymm0, %ymm1 {%k1}
|
|
; AVX512VL-NEXT: vmovapd %ymm1, %ymm0
|
|
; AVX512VL-NEXT: retq
|
|
%k = fcmp oeq <4 x double> %x, %y
|
|
%call = call <4 x double> @llvm.floor.v4f64(<4 x double> %x)
|
|
%res = select <4 x i1> %k, <4 x double> %call, <4 x double> %y
|
|
ret <4 x double> %res
|
|
}
|
|
|
|
define <4 x double> @floor_maskz_256_pd(<4 x double> %x, <4 x double> %y) nounwind {
|
|
; SSE41-LABEL: floor_maskz_256_pd:
|
|
; SSE41: ## %bb.0:
|
|
; SSE41-NEXT: cmpeqpd %xmm1, %xmm3
|
|
; SSE41-NEXT: cmpeqpd %xmm0, %xmm2
|
|
; SSE41-NEXT: roundpd $9, %xmm1, %xmm1
|
|
; SSE41-NEXT: andpd %xmm3, %xmm1
|
|
; SSE41-NEXT: roundpd $9, %xmm0, %xmm0
|
|
; SSE41-NEXT: andpd %xmm2, %xmm0
|
|
; SSE41-NEXT: retq
|
|
;
|
|
; AVX-LABEL: floor_maskz_256_pd:
|
|
; AVX: ## %bb.0:
|
|
; AVX-NEXT: vcmpeqpd %ymm1, %ymm0, %ymm1
|
|
; AVX-NEXT: vroundpd $9, %ymm0, %ymm0
|
|
; AVX-NEXT: vandpd %ymm0, %ymm1, %ymm0
|
|
; AVX-NEXT: retq
|
|
;
|
|
; AVX512F-LABEL: floor_maskz_256_pd:
|
|
; AVX512F: ## %bb.0:
|
|
; AVX512F-NEXT: ## kill: def $ymm1 killed $ymm1 def $zmm1
|
|
; AVX512F-NEXT: ## kill: def $ymm0 killed $ymm0 def $zmm0
|
|
; AVX512F-NEXT: vcmpeqpd %zmm1, %zmm0, %k1
|
|
; AVX512F-NEXT: vroundpd $9, %ymm0, %ymm0
|
|
; AVX512F-NEXT: vmovapd %zmm0, %zmm0 {%k1} {z}
|
|
; AVX512F-NEXT: ## kill: def $ymm0 killed $ymm0 killed $zmm0
|
|
; AVX512F-NEXT: retq
|
|
;
|
|
; AVX512VL-LABEL: floor_maskz_256_pd:
|
|
; AVX512VL: ## %bb.0:
|
|
; AVX512VL-NEXT: vcmpeqpd %ymm1, %ymm0, %k1
|
|
; AVX512VL-NEXT: vrndscalepd $9, %ymm0, %ymm0 {%k1} {z}
|
|
; AVX512VL-NEXT: retq
|
|
%k = fcmp oeq <4 x double> %x, %y
|
|
%call = call <4 x double> @llvm.floor.v4f64(<4 x double> %x)
|
|
%res = select <4 x i1> %k, <4 x double> %call, <4 x double> zeroinitializer
|
|
ret <4 x double> %res
|
|
}
|
|
|
|
define <16 x float> @floor_mask_512_ps(<16 x float> %x, <16 x float> %y) nounwind {
|
|
; SSE41-LABEL: floor_mask_512_ps:
|
|
; SSE41: ## %bb.0:
|
|
; SSE41-NEXT: roundps $9, %xmm3, %xmm8
|
|
; SSE41-NEXT: cmpeqps %xmm7, %xmm3
|
|
; SSE41-NEXT: roundps $9, %xmm2, %xmm9
|
|
; SSE41-NEXT: cmpeqps %xmm6, %xmm2
|
|
; SSE41-NEXT: roundps $9, %xmm1, %xmm10
|
|
; SSE41-NEXT: cmpeqps %xmm5, %xmm1
|
|
; SSE41-NEXT: roundps $9, %xmm0, %xmm11
|
|
; SSE41-NEXT: cmpeqps %xmm4, %xmm0
|
|
; SSE41-NEXT: blendvps %xmm0, %xmm11, %xmm4
|
|
; SSE41-NEXT: movaps %xmm1, %xmm0
|
|
; SSE41-NEXT: blendvps %xmm0, %xmm10, %xmm5
|
|
; SSE41-NEXT: movaps %xmm2, %xmm0
|
|
; SSE41-NEXT: blendvps %xmm0, %xmm9, %xmm6
|
|
; SSE41-NEXT: movaps %xmm3, %xmm0
|
|
; SSE41-NEXT: blendvps %xmm0, %xmm8, %xmm7
|
|
; SSE41-NEXT: movaps %xmm4, %xmm0
|
|
; SSE41-NEXT: movaps %xmm5, %xmm1
|
|
; SSE41-NEXT: movaps %xmm6, %xmm2
|
|
; SSE41-NEXT: movaps %xmm7, %xmm3
|
|
; SSE41-NEXT: retq
|
|
;
|
|
; AVX-LABEL: floor_mask_512_ps:
|
|
; AVX: ## %bb.0:
|
|
; AVX-NEXT: vcmpeqps %ymm3, %ymm1, %ymm4
|
|
; AVX-NEXT: vcmpeqps %ymm2, %ymm0, %ymm5
|
|
; AVX-NEXT: vroundps $9, %ymm1, %ymm1
|
|
; AVX-NEXT: vroundps $9, %ymm0, %ymm0
|
|
; AVX-NEXT: vblendvps %ymm5, %ymm0, %ymm2, %ymm0
|
|
; AVX-NEXT: vblendvps %ymm4, %ymm1, %ymm3, %ymm1
|
|
; AVX-NEXT: retq
|
|
;
|
|
; AVX512-LABEL: floor_mask_512_ps:
|
|
; AVX512: ## %bb.0:
|
|
; AVX512-NEXT: vcmpeqps %zmm1, %zmm0, %k1
|
|
; AVX512-NEXT: vrndscaleps $9, %zmm0, %zmm1 {%k1}
|
|
; AVX512-NEXT: vmovaps %zmm1, %zmm0
|
|
; AVX512-NEXT: retq
|
|
%k = fcmp oeq <16 x float> %x, %y
|
|
%call = call <16 x float> @llvm.floor.v16f32(<16 x float> %x)
|
|
%res = select <16 x i1> %k, <16 x float> %call, <16 x float> %y
|
|
ret <16 x float> %res
|
|
}
|
|
|
|
define <16 x float> @floor_maskz_512_ps(<16 x float> %x, <16 x float> %y) nounwind {
|
|
; SSE41-LABEL: floor_maskz_512_ps:
|
|
; SSE41: ## %bb.0:
|
|
; SSE41-NEXT: cmpeqps %xmm3, %xmm7
|
|
; SSE41-NEXT: cmpeqps %xmm2, %xmm6
|
|
; SSE41-NEXT: cmpeqps %xmm1, %xmm5
|
|
; SSE41-NEXT: cmpeqps %xmm0, %xmm4
|
|
; SSE41-NEXT: roundps $9, %xmm3, %xmm3
|
|
; SSE41-NEXT: andps %xmm7, %xmm3
|
|
; SSE41-NEXT: roundps $9, %xmm2, %xmm2
|
|
; SSE41-NEXT: andps %xmm6, %xmm2
|
|
; SSE41-NEXT: roundps $9, %xmm1, %xmm1
|
|
; SSE41-NEXT: andps %xmm5, %xmm1
|
|
; SSE41-NEXT: roundps $9, %xmm0, %xmm0
|
|
; SSE41-NEXT: andps %xmm4, %xmm0
|
|
; SSE41-NEXT: retq
|
|
;
|
|
; AVX-LABEL: floor_maskz_512_ps:
|
|
; AVX: ## %bb.0:
|
|
; AVX-NEXT: vcmpeqps %ymm3, %ymm1, %ymm3
|
|
; AVX-NEXT: vcmpeqps %ymm2, %ymm0, %ymm2
|
|
; AVX-NEXT: vroundps $9, %ymm1, %ymm1
|
|
; AVX-NEXT: vandps %ymm1, %ymm3, %ymm1
|
|
; AVX-NEXT: vroundps $9, %ymm0, %ymm0
|
|
; AVX-NEXT: vandps %ymm0, %ymm2, %ymm0
|
|
; AVX-NEXT: retq
|
|
;
|
|
; AVX512-LABEL: floor_maskz_512_ps:
|
|
; AVX512: ## %bb.0:
|
|
; AVX512-NEXT: vcmpeqps %zmm1, %zmm0, %k1
|
|
; AVX512-NEXT: vrndscaleps $9, %zmm0, %zmm0 {%k1} {z}
|
|
; AVX512-NEXT: retq
|
|
%k = fcmp oeq <16 x float> %x, %y
|
|
%call = call <16 x float> @llvm.floor.v16f32(<16 x float> %x)
|
|
%res = select <16 x i1> %k, <16 x float> %call, <16 x float> zeroinitializer
|
|
ret <16 x float> %res
|
|
}
|
|
|
|
define <8 x double> @floor_mask_512_pd(<8 x double> %x, <8 x double> %y) nounwind {
|
|
; SSE41-LABEL: floor_mask_512_pd:
|
|
; SSE41: ## %bb.0:
|
|
; SSE41-NEXT: roundpd $9, %xmm3, %xmm8
|
|
; SSE41-NEXT: cmpeqpd %xmm7, %xmm3
|
|
; SSE41-NEXT: roundpd $9, %xmm2, %xmm9
|
|
; SSE41-NEXT: cmpeqpd %xmm6, %xmm2
|
|
; SSE41-NEXT: roundpd $9, %xmm1, %xmm10
|
|
; SSE41-NEXT: cmpeqpd %xmm5, %xmm1
|
|
; SSE41-NEXT: roundpd $9, %xmm0, %xmm11
|
|
; SSE41-NEXT: cmpeqpd %xmm4, %xmm0
|
|
; SSE41-NEXT: blendvpd %xmm0, %xmm11, %xmm4
|
|
; SSE41-NEXT: movapd %xmm1, %xmm0
|
|
; SSE41-NEXT: blendvpd %xmm0, %xmm10, %xmm5
|
|
; SSE41-NEXT: movapd %xmm2, %xmm0
|
|
; SSE41-NEXT: blendvpd %xmm0, %xmm9, %xmm6
|
|
; SSE41-NEXT: movapd %xmm3, %xmm0
|
|
; SSE41-NEXT: blendvpd %xmm0, %xmm8, %xmm7
|
|
; SSE41-NEXT: movapd %xmm4, %xmm0
|
|
; SSE41-NEXT: movapd %xmm5, %xmm1
|
|
; SSE41-NEXT: movapd %xmm6, %xmm2
|
|
; SSE41-NEXT: movapd %xmm7, %xmm3
|
|
; SSE41-NEXT: retq
|
|
;
|
|
; AVX-LABEL: floor_mask_512_pd:
|
|
; AVX: ## %bb.0:
|
|
; AVX-NEXT: vcmpeqpd %ymm3, %ymm1, %ymm4
|
|
; AVX-NEXT: vcmpeqpd %ymm2, %ymm0, %ymm5
|
|
; AVX-NEXT: vroundpd $9, %ymm1, %ymm1
|
|
; AVX-NEXT: vroundpd $9, %ymm0, %ymm0
|
|
; AVX-NEXT: vblendvpd %ymm5, %ymm0, %ymm2, %ymm0
|
|
; AVX-NEXT: vblendvpd %ymm4, %ymm1, %ymm3, %ymm1
|
|
; AVX-NEXT: retq
|
|
;
|
|
; AVX512-LABEL: floor_mask_512_pd:
|
|
; AVX512: ## %bb.0:
|
|
; AVX512-NEXT: vcmpeqpd %zmm1, %zmm0, %k1
|
|
; AVX512-NEXT: vrndscalepd $9, %zmm0, %zmm1 {%k1}
|
|
; AVX512-NEXT: vmovapd %zmm1, %zmm0
|
|
; AVX512-NEXT: retq
|
|
%k = fcmp oeq <8 x double> %x, %y
|
|
%call = call <8 x double> @llvm.floor.v8f64(<8 x double> %x)
|
|
%res = select <8 x i1> %k, <8 x double> %call, <8 x double> %y
|
|
ret <8 x double> %res
|
|
}
|
|
|
|
define <8 x double> @floor_maskz_512_pd(<8 x double> %x, <8 x double> %y) nounwind {
|
|
; SSE41-LABEL: floor_maskz_512_pd:
|
|
; SSE41: ## %bb.0:
|
|
; SSE41-NEXT: cmpeqpd %xmm3, %xmm7
|
|
; SSE41-NEXT: cmpeqpd %xmm2, %xmm6
|
|
; SSE41-NEXT: cmpeqpd %xmm1, %xmm5
|
|
; SSE41-NEXT: cmpeqpd %xmm0, %xmm4
|
|
; SSE41-NEXT: roundpd $9, %xmm3, %xmm3
|
|
; SSE41-NEXT: andpd %xmm7, %xmm3
|
|
; SSE41-NEXT: roundpd $9, %xmm2, %xmm2
|
|
; SSE41-NEXT: andpd %xmm6, %xmm2
|
|
; SSE41-NEXT: roundpd $9, %xmm1, %xmm1
|
|
; SSE41-NEXT: andpd %xmm5, %xmm1
|
|
; SSE41-NEXT: roundpd $9, %xmm0, %xmm0
|
|
; SSE41-NEXT: andpd %xmm4, %xmm0
|
|
; SSE41-NEXT: retq
|
|
;
|
|
; AVX-LABEL: floor_maskz_512_pd:
|
|
; AVX: ## %bb.0:
|
|
; AVX-NEXT: vcmpeqpd %ymm3, %ymm1, %ymm3
|
|
; AVX-NEXT: vcmpeqpd %ymm2, %ymm0, %ymm2
|
|
; AVX-NEXT: vroundpd $9, %ymm1, %ymm1
|
|
; AVX-NEXT: vandpd %ymm1, %ymm3, %ymm1
|
|
; AVX-NEXT: vroundpd $9, %ymm0, %ymm0
|
|
; AVX-NEXT: vandpd %ymm0, %ymm2, %ymm0
|
|
; AVX-NEXT: retq
|
|
;
|
|
; AVX512-LABEL: floor_maskz_512_pd:
|
|
; AVX512: ## %bb.0:
|
|
; AVX512-NEXT: vcmpeqpd %zmm1, %zmm0, %k1
|
|
; AVX512-NEXT: vrndscalepd $9, %zmm0, %zmm0 {%k1} {z}
|
|
; AVX512-NEXT: retq
|
|
%k = fcmp oeq <8 x double> %x, %y
|
|
%call = call <8 x double> @llvm.floor.v8f64(<8 x double> %x)
|
|
%res = select <8 x i1> %k, <8 x double> %call, <8 x double> zeroinitializer
|
|
ret <8 x double> %res
|
|
}
|
|
|
|
define <4 x float> @floor_mask_ss(<4 x float> %x, <4 x float> %y, <4 x float> %w, i8 %k) nounwind {
|
|
; SSE41-LABEL: floor_mask_ss:
|
|
; SSE41: ## %bb.0:
|
|
; SSE41-NEXT: testb $1, %dil
|
|
; SSE41-NEXT: je LBB52_2
|
|
; SSE41-NEXT: ## %bb.1:
|
|
; SSE41-NEXT: xorps %xmm2, %xmm2
|
|
; SSE41-NEXT: roundss $9, %xmm0, %xmm2
|
|
; SSE41-NEXT: LBB52_2:
|
|
; SSE41-NEXT: blendps {{.*#+}} xmm1 = xmm2[0],xmm1[1,2,3]
|
|
; SSE41-NEXT: movaps %xmm1, %xmm0
|
|
; SSE41-NEXT: retq
|
|
;
|
|
; AVX-LABEL: floor_mask_ss:
|
|
; AVX: ## %bb.0:
|
|
; AVX-NEXT: testb $1, %dil
|
|
; AVX-NEXT: je LBB52_2
|
|
; AVX-NEXT: ## %bb.1:
|
|
; AVX-NEXT: vroundss $9, %xmm0, %xmm0, %xmm2
|
|
; AVX-NEXT: LBB52_2:
|
|
; AVX-NEXT: vblendps {{.*#+}} xmm0 = xmm2[0],xmm1[1,2,3]
|
|
; AVX-NEXT: retq
|
|
;
|
|
; AVX512-LABEL: floor_mask_ss:
|
|
; AVX512: ## %bb.0:
|
|
; AVX512-NEXT: kmovw %edi, %k1
|
|
; AVX512-NEXT: vrndscaless $1, %xmm0, %xmm1, %xmm2 {%k1}
|
|
; AVX512-NEXT: vmovaps %xmm2, %xmm0
|
|
; AVX512-NEXT: retq
|
|
%mask = and i8 %k, 1
|
|
%nmask = icmp eq i8 %mask, 0
|
|
%s = extractelement <4 x float> %x, i64 0
|
|
%call = tail call float @llvm.floor.f32(float %s)
|
|
%dst = extractelement <4 x float> %w, i64 0
|
|
%low = select i1 %nmask, float %dst, float %call
|
|
%res = insertelement <4 x float> %y, float %low, i64 0
|
|
ret <4 x float> %res
|
|
}
|
|
|
|
define <4 x float> @floor_maskz_ss(<4 x float> %x, <4 x float> %y, i8 %k) nounwind {
|
|
; SSE41-LABEL: floor_maskz_ss:
|
|
; SSE41: ## %bb.0:
|
|
; SSE41-NEXT: testb $1, %dil
|
|
; SSE41-NEXT: xorps %xmm2, %xmm2
|
|
; SSE41-NEXT: je LBB53_2
|
|
; SSE41-NEXT: ## %bb.1:
|
|
; SSE41-NEXT: xorps %xmm2, %xmm2
|
|
; SSE41-NEXT: roundss $9, %xmm0, %xmm2
|
|
; SSE41-NEXT: LBB53_2:
|
|
; SSE41-NEXT: blendps {{.*#+}} xmm1 = xmm2[0],xmm1[1,2,3]
|
|
; SSE41-NEXT: movaps %xmm1, %xmm0
|
|
; SSE41-NEXT: retq
|
|
;
|
|
; AVX-LABEL: floor_maskz_ss:
|
|
; AVX: ## %bb.0:
|
|
; AVX-NEXT: testb $1, %dil
|
|
; AVX-NEXT: vxorps %xmm2, %xmm2, %xmm2
|
|
; AVX-NEXT: je LBB53_2
|
|
; AVX-NEXT: ## %bb.1:
|
|
; AVX-NEXT: vroundss $9, %xmm0, %xmm0, %xmm2
|
|
; AVX-NEXT: LBB53_2:
|
|
; AVX-NEXT: vblendps {{.*#+}} xmm0 = xmm2[0],xmm1[1,2,3]
|
|
; AVX-NEXT: retq
|
|
;
|
|
; AVX512-LABEL: floor_maskz_ss:
|
|
; AVX512: ## %bb.0:
|
|
; AVX512-NEXT: kmovw %edi, %k1
|
|
; AVX512-NEXT: vrndscaless $1, %xmm0, %xmm1, %xmm0 {%k1} {z}
|
|
; AVX512-NEXT: retq
|
|
%mask = and i8 %k, 1
|
|
%nmask = icmp eq i8 %mask, 0
|
|
%s = extractelement <4 x float> %x, i64 0
|
|
%call = tail call float @llvm.floor.f32(float %s)
|
|
%low = select i1 %nmask, float zeroinitializer, float %call
|
|
%res = insertelement <4 x float> %y, float %low, i64 0
|
|
ret <4 x float> %res
|
|
}
|
|
|
|
define <2 x double> @floor_mask_sd(<2 x double> %x, <2 x double> %y, <2 x double> %w, i8 %k) nounwind {
|
|
; SSE41-LABEL: floor_mask_sd:
|
|
; SSE41: ## %bb.0:
|
|
; SSE41-NEXT: testb $1, %dil
|
|
; SSE41-NEXT: je LBB54_2
|
|
; SSE41-NEXT: ## %bb.1:
|
|
; SSE41-NEXT: xorps %xmm2, %xmm2
|
|
; SSE41-NEXT: roundsd $9, %xmm0, %xmm2
|
|
; SSE41-NEXT: LBB54_2:
|
|
; SSE41-NEXT: blendpd {{.*#+}} xmm1 = xmm2[0],xmm1[1]
|
|
; SSE41-NEXT: movapd %xmm1, %xmm0
|
|
; SSE41-NEXT: retq
|
|
;
|
|
; AVX-LABEL: floor_mask_sd:
|
|
; AVX: ## %bb.0:
|
|
; AVX-NEXT: testb $1, %dil
|
|
; AVX-NEXT: je LBB54_2
|
|
; AVX-NEXT: ## %bb.1:
|
|
; AVX-NEXT: vroundsd $9, %xmm0, %xmm0, %xmm2
|
|
; AVX-NEXT: LBB54_2:
|
|
; AVX-NEXT: vblendpd {{.*#+}} xmm0 = xmm2[0],xmm1[1]
|
|
; AVX-NEXT: retq
|
|
;
|
|
; AVX512-LABEL: floor_mask_sd:
|
|
; AVX512: ## %bb.0:
|
|
; AVX512-NEXT: kmovw %edi, %k1
|
|
; AVX512-NEXT: vrndscalesd $1, %xmm0, %xmm1, %xmm2 {%k1}
|
|
; AVX512-NEXT: vmovapd %xmm2, %xmm0
|
|
; AVX512-NEXT: retq
|
|
%mask = and i8 %k, 1
|
|
%nmask = icmp eq i8 %mask, 0
|
|
%s = extractelement <2 x double> %x, i64 0
|
|
%call = tail call double @llvm.floor.f64(double %s)
|
|
%dst = extractelement <2 x double> %w, i64 0
|
|
%low = select i1 %nmask, double %dst, double %call
|
|
%res = insertelement <2 x double> %y, double %low, i64 0
|
|
ret <2 x double> %res
|
|
}
|
|
|
|
define <2 x double> @floor_maskz_sd(<2 x double> %x, <2 x double> %y, i8 %k) nounwind {
|
|
; SSE41-LABEL: floor_maskz_sd:
|
|
; SSE41: ## %bb.0:
|
|
; SSE41-NEXT: testb $1, %dil
|
|
; SSE41-NEXT: xorpd %xmm2, %xmm2
|
|
; SSE41-NEXT: je LBB55_2
|
|
; SSE41-NEXT: ## %bb.1:
|
|
; SSE41-NEXT: xorps %xmm2, %xmm2
|
|
; SSE41-NEXT: roundsd $9, %xmm0, %xmm2
|
|
; SSE41-NEXT: LBB55_2:
|
|
; SSE41-NEXT: blendpd {{.*#+}} xmm1 = xmm2[0],xmm1[1]
|
|
; SSE41-NEXT: movapd %xmm1, %xmm0
|
|
; SSE41-NEXT: retq
|
|
;
|
|
; AVX-LABEL: floor_maskz_sd:
|
|
; AVX: ## %bb.0:
|
|
; AVX-NEXT: testb $1, %dil
|
|
; AVX-NEXT: vxorpd %xmm2, %xmm2, %xmm2
|
|
; AVX-NEXT: je LBB55_2
|
|
; AVX-NEXT: ## %bb.1:
|
|
; AVX-NEXT: vroundsd $9, %xmm0, %xmm0, %xmm2
|
|
; AVX-NEXT: LBB55_2:
|
|
; AVX-NEXT: vblendpd {{.*#+}} xmm0 = xmm2[0],xmm1[1]
|
|
; AVX-NEXT: retq
|
|
;
|
|
; AVX512-LABEL: floor_maskz_sd:
|
|
; AVX512: ## %bb.0:
|
|
; AVX512-NEXT: kmovw %edi, %k1
|
|
; AVX512-NEXT: vrndscalesd $1, %xmm0, %xmm1, %xmm0 {%k1} {z}
|
|
; AVX512-NEXT: retq
|
|
%mask = and i8 %k, 1
|
|
%nmask = icmp eq i8 %mask, 0
|
|
%s = extractelement <2 x double> %x, i64 0
|
|
%call = tail call double @llvm.floor.f64(double %s)
|
|
%low = select i1 %nmask, double zeroinitializer, double %call
|
|
%res = insertelement <2 x double> %y, double %low, i64 0
|
|
ret <2 x double> %res
|
|
}
|
|
|
|
define <4 x float> @floor_mask_ss_trunc(<4 x float> %x, <4 x float> %y, <4 x float> %w, i16 %k) nounwind {
|
|
; SSE41-LABEL: floor_mask_ss_trunc:
|
|
; SSE41: ## %bb.0:
|
|
; SSE41-NEXT: testb $1, %dil
|
|
; SSE41-NEXT: je LBB56_2
|
|
; SSE41-NEXT: ## %bb.1:
|
|
; SSE41-NEXT: xorps %xmm2, %xmm2
|
|
; SSE41-NEXT: roundss $9, %xmm0, %xmm2
|
|
; SSE41-NEXT: LBB56_2:
|
|
; SSE41-NEXT: blendps {{.*#+}} xmm1 = xmm2[0],xmm1[1,2,3]
|
|
; SSE41-NEXT: movaps %xmm1, %xmm0
|
|
; SSE41-NEXT: retq
|
|
;
|
|
; AVX-LABEL: floor_mask_ss_trunc:
|
|
; AVX: ## %bb.0:
|
|
; AVX-NEXT: testb $1, %dil
|
|
; AVX-NEXT: je LBB56_2
|
|
; AVX-NEXT: ## %bb.1:
|
|
; AVX-NEXT: vroundss $9, %xmm0, %xmm0, %xmm2
|
|
; AVX-NEXT: LBB56_2:
|
|
; AVX-NEXT: vblendps {{.*#+}} xmm0 = xmm2[0],xmm1[1,2,3]
|
|
; AVX-NEXT: retq
|
|
;
|
|
; AVX512-LABEL: floor_mask_ss_trunc:
|
|
; AVX512: ## %bb.0:
|
|
; AVX512-NEXT: kmovw %edi, %k1
|
|
; AVX512-NEXT: vrndscaless $1, %xmm0, %xmm1, %xmm2 {%k1}
|
|
; AVX512-NEXT: vmovaps %xmm2, %xmm0
|
|
; AVX512-NEXT: retq
|
|
%mask = trunc i16 %k to i1
|
|
%s = extractelement <4 x float> %x, i64 0
|
|
%call = tail call float @llvm.floor.f32(float %s)
|
|
%dst = extractelement <4 x float> %w, i64 0
|
|
%low = select i1 %mask, float %call, float %dst
|
|
%res = insertelement <4 x float> %y, float %low, i64 0
|
|
ret <4 x float> %res
|
|
}
|
|
|
|
define <4 x float> @floor_maskz_ss_trunc(<4 x float> %x, <4 x float> %y, i16 %k) nounwind {
|
|
; SSE41-LABEL: floor_maskz_ss_trunc:
|
|
; SSE41: ## %bb.0:
|
|
; SSE41-NEXT: testb $1, %dil
|
|
; SSE41-NEXT: jne LBB57_1
|
|
; SSE41-NEXT: ## %bb.2:
|
|
; SSE41-NEXT: xorps %xmm0, %xmm0
|
|
; SSE41-NEXT: jmp LBB57_3
|
|
; SSE41-NEXT: LBB57_1:
|
|
; SSE41-NEXT: roundss $9, %xmm0, %xmm0
|
|
; SSE41-NEXT: LBB57_3:
|
|
; SSE41-NEXT: blendps {{.*#+}} xmm1 = xmm0[0],xmm1[1,2,3]
|
|
; SSE41-NEXT: movaps %xmm1, %xmm0
|
|
; SSE41-NEXT: retq
|
|
;
|
|
; AVX-LABEL: floor_maskz_ss_trunc:
|
|
; AVX: ## %bb.0:
|
|
; AVX-NEXT: testb $1, %dil
|
|
; AVX-NEXT: jne LBB57_1
|
|
; AVX-NEXT: ## %bb.2:
|
|
; AVX-NEXT: vxorps %xmm0, %xmm0, %xmm0
|
|
; AVX-NEXT: vblendps {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3]
|
|
; AVX-NEXT: retq
|
|
; AVX-NEXT: LBB57_1:
|
|
; AVX-NEXT: vroundss $9, %xmm0, %xmm0, %xmm0
|
|
; AVX-NEXT: vblendps {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3]
|
|
; AVX-NEXT: retq
|
|
;
|
|
; AVX512-LABEL: floor_maskz_ss_trunc:
|
|
; AVX512: ## %bb.0:
|
|
; AVX512-NEXT: kmovw %edi, %k1
|
|
; AVX512-NEXT: vrndscaless $1, %xmm0, %xmm1, %xmm0 {%k1} {z}
|
|
; AVX512-NEXT: retq
|
|
%mask = trunc i16 %k to i1
|
|
%s = extractelement <4 x float> %x, i64 0
|
|
%call = tail call float @llvm.floor.f32(float %s)
|
|
%low = select i1 %mask, float %call, float zeroinitializer
|
|
%res = insertelement <4 x float> %y, float %low, i64 0
|
|
ret <4 x float> %res
|
|
}
|
|
|
|
define <2 x double> @floor_mask_sd_trunc(<2 x double> %x, <2 x double> %y, <2 x double> %w, i16 %k) nounwind {
|
|
; SSE41-LABEL: floor_mask_sd_trunc:
|
|
; SSE41: ## %bb.0:
|
|
; SSE41-NEXT: testb $1, %dil
|
|
; SSE41-NEXT: je LBB58_2
|
|
; SSE41-NEXT: ## %bb.1:
|
|
; SSE41-NEXT: xorps %xmm2, %xmm2
|
|
; SSE41-NEXT: roundsd $9, %xmm0, %xmm2
|
|
; SSE41-NEXT: LBB58_2:
|
|
; SSE41-NEXT: blendpd {{.*#+}} xmm1 = xmm2[0],xmm1[1]
|
|
; SSE41-NEXT: movapd %xmm1, %xmm0
|
|
; SSE41-NEXT: retq
|
|
;
|
|
; AVX-LABEL: floor_mask_sd_trunc:
|
|
; AVX: ## %bb.0:
|
|
; AVX-NEXT: testb $1, %dil
|
|
; AVX-NEXT: je LBB58_2
|
|
; AVX-NEXT: ## %bb.1:
|
|
; AVX-NEXT: vroundsd $9, %xmm0, %xmm0, %xmm2
|
|
; AVX-NEXT: LBB58_2:
|
|
; AVX-NEXT: vblendpd {{.*#+}} xmm0 = xmm2[0],xmm1[1]
|
|
; AVX-NEXT: retq
|
|
;
|
|
; AVX512-LABEL: floor_mask_sd_trunc:
|
|
; AVX512: ## %bb.0:
|
|
; AVX512-NEXT: kmovw %edi, %k1
|
|
; AVX512-NEXT: vrndscalesd $1, %xmm0, %xmm1, %xmm2 {%k1}
|
|
; AVX512-NEXT: vmovapd %xmm2, %xmm0
|
|
; AVX512-NEXT: retq
|
|
%mask = trunc i16 %k to i1
|
|
%s = extractelement <2 x double> %x, i64 0
|
|
%call = tail call double @llvm.floor.f64(double %s)
|
|
%dst = extractelement <2 x double> %w, i64 0
|
|
%low = select i1 %mask, double %call, double %dst
|
|
%res = insertelement <2 x double> %y, double %low, i64 0
|
|
ret <2 x double> %res
|
|
}
|
|
|
|
define <2 x double> @floor_maskz_sd_trunc(<2 x double> %x, <2 x double> %y, i16 %k) nounwind {
|
|
; SSE41-LABEL: floor_maskz_sd_trunc:
|
|
; SSE41: ## %bb.0:
|
|
; SSE41-NEXT: testb $1, %dil
|
|
; SSE41-NEXT: jne LBB59_1
|
|
; SSE41-NEXT: ## %bb.2:
|
|
; SSE41-NEXT: xorpd %xmm0, %xmm0
|
|
; SSE41-NEXT: jmp LBB59_3
|
|
; SSE41-NEXT: LBB59_1:
|
|
; SSE41-NEXT: roundsd $9, %xmm0, %xmm0
|
|
; SSE41-NEXT: LBB59_3:
|
|
; SSE41-NEXT: blendpd {{.*#+}} xmm1 = xmm0[0],xmm1[1]
|
|
; SSE41-NEXT: movapd %xmm1, %xmm0
|
|
; SSE41-NEXT: retq
|
|
;
|
|
; AVX-LABEL: floor_maskz_sd_trunc:
|
|
; AVX: ## %bb.0:
|
|
; AVX-NEXT: testb $1, %dil
|
|
; AVX-NEXT: jne LBB59_1
|
|
; AVX-NEXT: ## %bb.2:
|
|
; AVX-NEXT: vxorps %xmm0, %xmm0, %xmm0
|
|
; AVX-NEXT: vblendps {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,3]
|
|
; AVX-NEXT: retq
|
|
; AVX-NEXT: LBB59_1:
|
|
; AVX-NEXT: vroundsd $9, %xmm0, %xmm0, %xmm0
|
|
; AVX-NEXT: vblendpd {{.*#+}} xmm0 = xmm0[0],xmm1[1]
|
|
; AVX-NEXT: retq
|
|
;
|
|
; AVX512-LABEL: floor_maskz_sd_trunc:
|
|
; AVX512: ## %bb.0:
|
|
; AVX512-NEXT: kmovw %edi, %k1
|
|
; AVX512-NEXT: vrndscalesd $1, %xmm0, %xmm1, %xmm0 {%k1} {z}
|
|
; AVX512-NEXT: retq
|
|
%mask = trunc i16 %k to i1
|
|
%s = extractelement <2 x double> %x, i64 0
|
|
%call = tail call double @llvm.floor.f64(double %s)
|
|
%low = select i1 %mask, double %call, double zeroinitializer
|
|
%res = insertelement <2 x double> %y, double %low, i64 0
|
|
ret <2 x double> %res
|
|
}
|
|
|
|
define <4 x float> @floor_mask_ss_mask8(<4 x float> %x, <4 x float> %y, <4 x float> %w) nounwind {
|
|
; SSE41-LABEL: floor_mask_ss_mask8:
|
|
; SSE41: ## %bb.0:
|
|
; SSE41-NEXT: roundss $9, %xmm0, %xmm3
|
|
; SSE41-NEXT: cmpeqss %xmm1, %xmm0
|
|
; SSE41-NEXT: andps %xmm0, %xmm3
|
|
; SSE41-NEXT: andnps %xmm2, %xmm0
|
|
; SSE41-NEXT: orps %xmm3, %xmm0
|
|
; SSE41-NEXT: blendps {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3]
|
|
; SSE41-NEXT: retq
|
|
;
|
|
; AVX-LABEL: floor_mask_ss_mask8:
|
|
; AVX: ## %bb.0:
|
|
; AVX-NEXT: vroundss $9, %xmm0, %xmm0, %xmm3
|
|
; AVX-NEXT: vcmpeqss %xmm1, %xmm0, %xmm0
|
|
; AVX-NEXT: vblendvps %xmm0, %xmm3, %xmm2, %xmm0
|
|
; AVX-NEXT: vblendps {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3]
|
|
; AVX-NEXT: retq
|
|
;
|
|
; AVX512-LABEL: floor_mask_ss_mask8:
|
|
; AVX512: ## %bb.0:
|
|
; AVX512-NEXT: vcmpeqss %xmm1, %xmm0, %k1
|
|
; AVX512-NEXT: vrndscaless $1, %xmm0, %xmm1, %xmm2 {%k1}
|
|
; AVX512-NEXT: vmovaps %xmm2, %xmm0
|
|
; AVX512-NEXT: retq
|
|
%mask1 = fcmp oeq <4 x float> %x, %y
|
|
%mask = extractelement <4 x i1> %mask1, i64 0
|
|
%s = extractelement <4 x float> %x, i64 0
|
|
%call = tail call float @llvm.floor.f32(float %s)
|
|
%dst = extractelement <4 x float> %w, i64 0
|
|
%low = select i1 %mask, float %call, float %dst
|
|
%res = insertelement <4 x float> %y, float %low, i64 0
|
|
ret <4 x float> %res
|
|
}
|
|
|
|
define <4 x float> @floor_maskz_ss_mask8(<4 x float> %x, <4 x float> %y) nounwind {
|
|
; SSE41-LABEL: floor_maskz_ss_mask8:
|
|
; SSE41: ## %bb.0:
|
|
; SSE41-NEXT: roundss $9, %xmm0, %xmm2
|
|
; SSE41-NEXT: cmpeqss %xmm1, %xmm0
|
|
; SSE41-NEXT: andps %xmm2, %xmm0
|
|
; SSE41-NEXT: blendps {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3]
|
|
; SSE41-NEXT: retq
|
|
;
|
|
; AVX-LABEL: floor_maskz_ss_mask8:
|
|
; AVX: ## %bb.0:
|
|
; AVX-NEXT: vroundss $9, %xmm0, %xmm0, %xmm2
|
|
; AVX-NEXT: vcmpeqss %xmm1, %xmm0, %xmm0
|
|
; AVX-NEXT: vandps %xmm2, %xmm0, %xmm0
|
|
; AVX-NEXT: vblendps {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3]
|
|
; AVX-NEXT: retq
|
|
;
|
|
; AVX512-LABEL: floor_maskz_ss_mask8:
|
|
; AVX512: ## %bb.0:
|
|
; AVX512-NEXT: vcmpeqss %xmm1, %xmm0, %k1
|
|
; AVX512-NEXT: vrndscaless $1, %xmm0, %xmm1, %xmm0 {%k1} {z}
|
|
; AVX512-NEXT: retq
|
|
%mask1 = fcmp oeq <4 x float> %x, %y
|
|
%mask = extractelement <4 x i1> %mask1, i64 0
|
|
%s = extractelement <4 x float> %x, i64 0
|
|
%call = tail call float @llvm.floor.f32(float %s)
|
|
%low = select i1 %mask, float %call, float zeroinitializer
|
|
%res = insertelement <4 x float> %y, float %low, i64 0
|
|
ret <4 x float> %res
|
|
}
|
|
|
|
define <2 x double> @floor_mask_sd_mask8(<2 x double> %x, <2 x double> %y, <2 x double> %w) nounwind {
|
|
; SSE41-LABEL: floor_mask_sd_mask8:
|
|
; SSE41: ## %bb.0:
|
|
; SSE41-NEXT: roundsd $9, %xmm0, %xmm3
|
|
; SSE41-NEXT: cmpeqsd %xmm1, %xmm0
|
|
; SSE41-NEXT: andpd %xmm0, %xmm3
|
|
; SSE41-NEXT: andnpd %xmm2, %xmm0
|
|
; SSE41-NEXT: orpd %xmm3, %xmm0
|
|
; SSE41-NEXT: blendpd {{.*#+}} xmm0 = xmm0[0],xmm1[1]
|
|
; SSE41-NEXT: retq
|
|
;
|
|
; AVX-LABEL: floor_mask_sd_mask8:
|
|
; AVX: ## %bb.0:
|
|
; AVX-NEXT: vroundsd $9, %xmm0, %xmm0, %xmm3
|
|
; AVX-NEXT: vcmpeqsd %xmm1, %xmm0, %xmm0
|
|
; AVX-NEXT: vblendvpd %xmm0, %xmm3, %xmm2, %xmm0
|
|
; AVX-NEXT: vblendpd {{.*#+}} xmm0 = xmm0[0],xmm1[1]
|
|
; AVX-NEXT: retq
|
|
;
|
|
; AVX512-LABEL: floor_mask_sd_mask8:
|
|
; AVX512: ## %bb.0:
|
|
; AVX512-NEXT: vcmpeqsd %xmm1, %xmm0, %k1
|
|
; AVX512-NEXT: vrndscalesd $1, %xmm0, %xmm1, %xmm2 {%k1}
|
|
; AVX512-NEXT: vmovapd %xmm2, %xmm0
|
|
; AVX512-NEXT: retq
|
|
%mask1 = fcmp oeq <2 x double> %x, %y
|
|
%mask = extractelement <2 x i1> %mask1, i64 0
|
|
%s = extractelement <2 x double> %x, i64 0
|
|
%call = tail call double @llvm.floor.f64(double %s)
|
|
%dst = extractelement <2 x double> %w, i64 0
|
|
%low = select i1 %mask, double %call, double %dst
|
|
%res = insertelement <2 x double> %y, double %low, i64 0
|
|
ret <2 x double> %res
|
|
}
|
|
|
|
define <2 x double> @floor_maskz_sd_mask8(<2 x double> %x, <2 x double> %y) nounwind {
|
|
; SSE41-LABEL: floor_maskz_sd_mask8:
|
|
; SSE41: ## %bb.0:
|
|
; SSE41-NEXT: roundsd $9, %xmm0, %xmm2
|
|
; SSE41-NEXT: cmpeqsd %xmm1, %xmm0
|
|
; SSE41-NEXT: andpd %xmm2, %xmm0
|
|
; SSE41-NEXT: blendpd {{.*#+}} xmm0 = xmm0[0],xmm1[1]
|
|
; SSE41-NEXT: retq
|
|
;
|
|
; AVX-LABEL: floor_maskz_sd_mask8:
|
|
; AVX: ## %bb.0:
|
|
; AVX-NEXT: vroundsd $9, %xmm0, %xmm0, %xmm2
|
|
; AVX-NEXT: vcmpeqsd %xmm1, %xmm0, %xmm0
|
|
; AVX-NEXT: vandpd %xmm2, %xmm0, %xmm0
|
|
; AVX-NEXT: vblendpd {{.*#+}} xmm0 = xmm0[0],xmm1[1]
|
|
; AVX-NEXT: retq
|
|
;
|
|
; AVX512-LABEL: floor_maskz_sd_mask8:
|
|
; AVX512: ## %bb.0:
|
|
; AVX512-NEXT: vcmpeqsd %xmm1, %xmm0, %k1
|
|
; AVX512-NEXT: vrndscalesd $1, %xmm0, %xmm1, %xmm0 {%k1} {z}
|
|
; AVX512-NEXT: retq
|
|
%mask1 = fcmp oeq <2 x double> %x, %y
|
|
%mask = extractelement <2 x i1> %mask1, i64 0
|
|
%s = extractelement <2 x double> %x, i64 0
|
|
%call = tail call double @llvm.floor.f64(double %s)
|
|
%low = select i1 %mask, double %call, double zeroinitializer
|
|
%res = insertelement <2 x double> %y, double %low, i64 0
|
|
ret <2 x double> %res
|
|
}
|
|
|
|
define <4 x float> @ceil_ss(<4 x float> %x, <4 x float> %y) nounwind {
|
|
; SSE41-LABEL: ceil_ss:
|
|
; SSE41: ## %bb.0:
|
|
; SSE41-NEXT: roundss $2, %xmm0, %xmm1
|
|
; SSE41-NEXT: movaps %xmm1, %xmm0
|
|
; SSE41-NEXT: retq
|
|
;
|
|
; AVX-LABEL: ceil_ss:
|
|
; AVX: ## %bb.0:
|
|
; AVX-NEXT: vroundss $2, %xmm0, %xmm1, %xmm0
|
|
; AVX-NEXT: retq
|
|
;
|
|
; AVX512-LABEL: ceil_ss:
|
|
; AVX512: ## %bb.0:
|
|
; AVX512-NEXT: vroundss $2, %xmm0, %xmm1, %xmm0
|
|
; AVX512-NEXT: retq
|
|
%s = extractelement <4 x float> %x, i32 0
|
|
%call = call float @llvm.ceil.f32(float %s)
|
|
%res = insertelement <4 x float> %y, float %call, i32 0
|
|
ret <4 x float> %res
|
|
}
|
|
declare float @llvm.ceil.f32(float %s)
|
|
|
|
define <2 x double> @ceil_sd(<2 x double> %x, <2 x double> %y) nounwind {
|
|
; SSE41-LABEL: ceil_sd:
|
|
; SSE41: ## %bb.0:
|
|
; SSE41-NEXT: roundsd $2, %xmm0, %xmm1
|
|
; SSE41-NEXT: movapd %xmm1, %xmm0
|
|
; SSE41-NEXT: retq
|
|
;
|
|
; AVX-LABEL: ceil_sd:
|
|
; AVX: ## %bb.0:
|
|
; AVX-NEXT: vroundsd $2, %xmm0, %xmm1, %xmm0
|
|
; AVX-NEXT: retq
|
|
;
|
|
; AVX512-LABEL: ceil_sd:
|
|
; AVX512: ## %bb.0:
|
|
; AVX512-NEXT: vroundsd $2, %xmm0, %xmm1, %xmm0
|
|
; AVX512-NEXT: retq
|
|
%s = extractelement <2 x double> %x, i32 0
|
|
%call = call double @llvm.ceil.f64(double %s)
|
|
%res = insertelement <2 x double> %y, double %call, i32 0
|
|
ret <2 x double> %res
|
|
}
|
|
declare double @llvm.ceil.f64(double %s)
|
|
|
|
define <4 x float> @ceil_mask_128_ps(<4 x float> %x, <4 x float> %y) nounwind {
|
|
; SSE41-LABEL: ceil_mask_128_ps:
|
|
; SSE41: ## %bb.0:
|
|
; SSE41-NEXT: roundps $10, %xmm0, %xmm2
|
|
; SSE41-NEXT: cmpeqps %xmm1, %xmm0
|
|
; SSE41-NEXT: blendvps %xmm0, %xmm2, %xmm1
|
|
; SSE41-NEXT: movaps %xmm1, %xmm0
|
|
; SSE41-NEXT: retq
|
|
;
|
|
; AVX-LABEL: ceil_mask_128_ps:
|
|
; AVX: ## %bb.0:
|
|
; AVX-NEXT: vcmpeqps %xmm1, %xmm0, %xmm2
|
|
; AVX-NEXT: vroundps $10, %xmm0, %xmm0
|
|
; AVX-NEXT: vblendvps %xmm2, %xmm0, %xmm1, %xmm0
|
|
; AVX-NEXT: retq
|
|
;
|
|
; AVX512F-LABEL: ceil_mask_128_ps:
|
|
; AVX512F: ## %bb.0:
|
|
; AVX512F-NEXT: ## kill: def $xmm1 killed $xmm1 def $zmm1
|
|
; AVX512F-NEXT: ## kill: def $xmm0 killed $xmm0 def $zmm0
|
|
; AVX512F-NEXT: vcmpeqps %zmm1, %zmm0, %k1
|
|
; AVX512F-NEXT: vroundps $10, %xmm0, %xmm0
|
|
; AVX512F-NEXT: vblendmps %zmm0, %zmm1, %zmm0 {%k1}
|
|
; AVX512F-NEXT: ## kill: def $xmm0 killed $xmm0 killed $zmm0
|
|
; AVX512F-NEXT: vzeroupper
|
|
; AVX512F-NEXT: retq
|
|
;
|
|
; AVX512VL-LABEL: ceil_mask_128_ps:
|
|
; AVX512VL: ## %bb.0:
|
|
; AVX512VL-NEXT: vcmpeqps %xmm1, %xmm0, %k1
|
|
; AVX512VL-NEXT: vrndscaleps $10, %xmm0, %xmm1 {%k1}
|
|
; AVX512VL-NEXT: vmovaps %xmm1, %xmm0
|
|
; AVX512VL-NEXT: retq
|
|
%k = fcmp oeq <4 x float> %x, %y
|
|
%call = call <4 x float> @llvm.ceil.v4f32(<4 x float> %x)
|
|
%res = select <4 x i1> %k, <4 x float> %call, <4 x float> %y
|
|
ret <4 x float> %res
|
|
}
|
|
|
|
define <4 x float> @ceil_maskz_128_ps(<4 x float> %x, <4 x float> %y) nounwind {
|
|
; SSE41-LABEL: ceil_maskz_128_ps:
|
|
; SSE41: ## %bb.0:
|
|
; SSE41-NEXT: cmpeqps %xmm0, %xmm1
|
|
; SSE41-NEXT: roundps $10, %xmm0, %xmm0
|
|
; SSE41-NEXT: andps %xmm1, %xmm0
|
|
; SSE41-NEXT: retq
|
|
;
|
|
; AVX-LABEL: ceil_maskz_128_ps:
|
|
; AVX: ## %bb.0:
|
|
; AVX-NEXT: vcmpeqps %xmm1, %xmm0, %xmm1
|
|
; AVX-NEXT: vroundps $10, %xmm0, %xmm0
|
|
; AVX-NEXT: vandps %xmm0, %xmm1, %xmm0
|
|
; AVX-NEXT: retq
|
|
;
|
|
; AVX512F-LABEL: ceil_maskz_128_ps:
|
|
; AVX512F: ## %bb.0:
|
|
; AVX512F-NEXT: ## kill: def $xmm1 killed $xmm1 def $zmm1
|
|
; AVX512F-NEXT: ## kill: def $xmm0 killed $xmm0 def $zmm0
|
|
; AVX512F-NEXT: vcmpeqps %zmm1, %zmm0, %k1
|
|
; AVX512F-NEXT: vroundps $10, %xmm0, %xmm0
|
|
; AVX512F-NEXT: vmovaps %zmm0, %zmm0 {%k1} {z}
|
|
; AVX512F-NEXT: ## kill: def $xmm0 killed $xmm0 killed $zmm0
|
|
; AVX512F-NEXT: vzeroupper
|
|
; AVX512F-NEXT: retq
|
|
;
|
|
; AVX512VL-LABEL: ceil_maskz_128_ps:
|
|
; AVX512VL: ## %bb.0:
|
|
; AVX512VL-NEXT: vcmpeqps %xmm1, %xmm0, %k1
|
|
; AVX512VL-NEXT: vrndscaleps $10, %xmm0, %xmm0 {%k1} {z}
|
|
; AVX512VL-NEXT: retq
|
|
%k = fcmp oeq <4 x float> %x, %y
|
|
%call = call <4 x float> @llvm.ceil.v4f32(<4 x float> %x)
|
|
%res = select <4 x i1> %k, <4 x float> %call, <4 x float> zeroinitializer
|
|
ret <4 x float> %res
|
|
}
|
|
|
|
define <2 x double> @ceil_mask_128_pd(<2 x double> %x, <2 x double> %y) nounwind {
|
|
; SSE41-LABEL: ceil_mask_128_pd:
|
|
; SSE41: ## %bb.0:
|
|
; SSE41-NEXT: roundpd $10, %xmm0, %xmm2
|
|
; SSE41-NEXT: cmpeqpd %xmm1, %xmm0
|
|
; SSE41-NEXT: blendvpd %xmm0, %xmm2, %xmm1
|
|
; SSE41-NEXT: movapd %xmm1, %xmm0
|
|
; SSE41-NEXT: retq
|
|
;
|
|
; AVX-LABEL: ceil_mask_128_pd:
|
|
; AVX: ## %bb.0:
|
|
; AVX-NEXT: vcmpeqpd %xmm1, %xmm0, %xmm2
|
|
; AVX-NEXT: vroundpd $10, %xmm0, %xmm0
|
|
; AVX-NEXT: vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
|
|
; AVX-NEXT: retq
|
|
;
|
|
; AVX512F-LABEL: ceil_mask_128_pd:
|
|
; AVX512F: ## %bb.0:
|
|
; AVX512F-NEXT: ## kill: def $xmm1 killed $xmm1 def $zmm1
|
|
; AVX512F-NEXT: ## kill: def $xmm0 killed $xmm0 def $zmm0
|
|
; AVX512F-NEXT: vcmpeqpd %zmm1, %zmm0, %k1
|
|
; AVX512F-NEXT: vroundpd $10, %xmm0, %xmm0
|
|
; AVX512F-NEXT: vblendmpd %zmm0, %zmm1, %zmm0 {%k1}
|
|
; AVX512F-NEXT: ## kill: def $xmm0 killed $xmm0 killed $zmm0
|
|
; AVX512F-NEXT: vzeroupper
|
|
; AVX512F-NEXT: retq
|
|
;
|
|
; AVX512VL-LABEL: ceil_mask_128_pd:
|
|
; AVX512VL: ## %bb.0:
|
|
; AVX512VL-NEXT: vcmpeqpd %xmm1, %xmm0, %k1
|
|
; AVX512VL-NEXT: vrndscalepd $10, %xmm0, %xmm1 {%k1}
|
|
; AVX512VL-NEXT: vmovapd %xmm1, %xmm0
|
|
; AVX512VL-NEXT: retq
|
|
%k = fcmp oeq <2 x double> %x, %y
|
|
%call = call <2 x double> @llvm.ceil.v2f64(<2 x double> %x)
|
|
%res = select <2 x i1> %k, <2 x double> %call, <2 x double> %y
|
|
ret <2 x double> %res
|
|
}
|
|
|
|
define <2 x double> @ceil_maskz_128_pd(<2 x double> %x, <2 x double> %y) nounwind {
|
|
; SSE41-LABEL: ceil_maskz_128_pd:
|
|
; SSE41: ## %bb.0:
|
|
; SSE41-NEXT: cmpeqpd %xmm0, %xmm1
|
|
; SSE41-NEXT: roundpd $10, %xmm0, %xmm0
|
|
; SSE41-NEXT: andpd %xmm1, %xmm0
|
|
; SSE41-NEXT: retq
|
|
;
|
|
; AVX-LABEL: ceil_maskz_128_pd:
|
|
; AVX: ## %bb.0:
|
|
; AVX-NEXT: vcmpeqpd %xmm1, %xmm0, %xmm1
|
|
; AVX-NEXT: vroundpd $10, %xmm0, %xmm0
|
|
; AVX-NEXT: vandpd %xmm0, %xmm1, %xmm0
|
|
; AVX-NEXT: retq
|
|
;
|
|
; AVX512F-LABEL: ceil_maskz_128_pd:
|
|
; AVX512F: ## %bb.0:
|
|
; AVX512F-NEXT: ## kill: def $xmm1 killed $xmm1 def $zmm1
|
|
; AVX512F-NEXT: ## kill: def $xmm0 killed $xmm0 def $zmm0
|
|
; AVX512F-NEXT: vcmpeqpd %zmm1, %zmm0, %k1
|
|
; AVX512F-NEXT: vroundpd $10, %xmm0, %xmm0
|
|
; AVX512F-NEXT: vmovapd %zmm0, %zmm0 {%k1} {z}
|
|
; AVX512F-NEXT: ## kill: def $xmm0 killed $xmm0 killed $zmm0
|
|
; AVX512F-NEXT: vzeroupper
|
|
; AVX512F-NEXT: retq
|
|
;
|
|
; AVX512VL-LABEL: ceil_maskz_128_pd:
|
|
; AVX512VL: ## %bb.0:
|
|
; AVX512VL-NEXT: vcmpeqpd %xmm1, %xmm0, %k1
|
|
; AVX512VL-NEXT: vrndscalepd $10, %xmm0, %xmm0 {%k1} {z}
|
|
; AVX512VL-NEXT: retq
|
|
%k = fcmp oeq <2 x double> %x, %y
|
|
%call = call <2 x double> @llvm.ceil.v2f64(<2 x double> %x)
|
|
%res = select <2 x i1> %k, <2 x double> %call, <2 x double> zeroinitializer
|
|
ret <2 x double> %res
|
|
}
|
|
|
|
define <8 x float> @ceil_mask_256_ps(<8 x float> %x, <8 x float> %y) nounwind {
|
|
; SSE41-LABEL: ceil_mask_256_ps:
|
|
; SSE41: ## %bb.0:
|
|
; SSE41-NEXT: roundps $10, %xmm1, %xmm4
|
|
; SSE41-NEXT: cmpeqps %xmm3, %xmm1
|
|
; SSE41-NEXT: roundps $10, %xmm0, %xmm5
|
|
; SSE41-NEXT: cmpeqps %xmm2, %xmm0
|
|
; SSE41-NEXT: blendvps %xmm0, %xmm5, %xmm2
|
|
; SSE41-NEXT: movaps %xmm1, %xmm0
|
|
; SSE41-NEXT: blendvps %xmm0, %xmm4, %xmm3
|
|
; SSE41-NEXT: movaps %xmm2, %xmm0
|
|
; SSE41-NEXT: movaps %xmm3, %xmm1
|
|
; SSE41-NEXT: retq
|
|
;
|
|
; AVX-LABEL: ceil_mask_256_ps:
|
|
; AVX: ## %bb.0:
|
|
; AVX-NEXT: vcmpeqps %ymm1, %ymm0, %ymm2
|
|
; AVX-NEXT: vroundps $10, %ymm0, %ymm0
|
|
; AVX-NEXT: vblendvps %ymm2, %ymm0, %ymm1, %ymm0
|
|
; AVX-NEXT: retq
|
|
;
|
|
; AVX512F-LABEL: ceil_mask_256_ps:
|
|
; AVX512F: ## %bb.0:
|
|
; AVX512F-NEXT: ## kill: def $ymm1 killed $ymm1 def $zmm1
|
|
; AVX512F-NEXT: ## kill: def $ymm0 killed $ymm0 def $zmm0
|
|
; AVX512F-NEXT: vcmpeqps %zmm1, %zmm0, %k1
|
|
; AVX512F-NEXT: vroundps $10, %ymm0, %ymm0
|
|
; AVX512F-NEXT: vblendmps %zmm0, %zmm1, %zmm0 {%k1}
|
|
; AVX512F-NEXT: ## kill: def $ymm0 killed $ymm0 killed $zmm0
|
|
; AVX512F-NEXT: retq
|
|
;
|
|
; AVX512VL-LABEL: ceil_mask_256_ps:
|
|
; AVX512VL: ## %bb.0:
|
|
; AVX512VL-NEXT: vcmpeqps %ymm1, %ymm0, %k1
|
|
; AVX512VL-NEXT: vrndscaleps $10, %ymm0, %ymm1 {%k1}
|
|
; AVX512VL-NEXT: vmovaps %ymm1, %ymm0
|
|
; AVX512VL-NEXT: retq
|
|
%k = fcmp oeq <8 x float> %x, %y
|
|
%call = call <8 x float> @llvm.ceil.v8f32(<8 x float> %x)
|
|
%res = select <8 x i1> %k, <8 x float> %call, <8 x float> %y
|
|
ret <8 x float> %res
|
|
}
|
|
|
|
define <8 x float> @ceil_maskz_256_ps(<8 x float> %x, <8 x float> %y) nounwind {
|
|
; SSE41-LABEL: ceil_maskz_256_ps:
|
|
; SSE41: ## %bb.0:
|
|
; SSE41-NEXT: cmpeqps %xmm1, %xmm3
|
|
; SSE41-NEXT: cmpeqps %xmm0, %xmm2
|
|
; SSE41-NEXT: roundps $10, %xmm1, %xmm1
|
|
; SSE41-NEXT: andps %xmm3, %xmm1
|
|
; SSE41-NEXT: roundps $10, %xmm0, %xmm0
|
|
; SSE41-NEXT: andps %xmm2, %xmm0
|
|
; SSE41-NEXT: retq
|
|
;
|
|
; AVX-LABEL: ceil_maskz_256_ps:
|
|
; AVX: ## %bb.0:
|
|
; AVX-NEXT: vcmpeqps %ymm1, %ymm0, %ymm1
|
|
; AVX-NEXT: vroundps $10, %ymm0, %ymm0
|
|
; AVX-NEXT: vandps %ymm0, %ymm1, %ymm0
|
|
; AVX-NEXT: retq
|
|
;
|
|
; AVX512F-LABEL: ceil_maskz_256_ps:
|
|
; AVX512F: ## %bb.0:
|
|
; AVX512F-NEXT: ## kill: def $ymm1 killed $ymm1 def $zmm1
|
|
; AVX512F-NEXT: ## kill: def $ymm0 killed $ymm0 def $zmm0
|
|
; AVX512F-NEXT: vcmpeqps %zmm1, %zmm0, %k1
|
|
; AVX512F-NEXT: vroundps $10, %ymm0, %ymm0
|
|
; AVX512F-NEXT: vmovaps %zmm0, %zmm0 {%k1} {z}
|
|
; AVX512F-NEXT: ## kill: def $ymm0 killed $ymm0 killed $zmm0
|
|
; AVX512F-NEXT: retq
|
|
;
|
|
; AVX512VL-LABEL: ceil_maskz_256_ps:
|
|
; AVX512VL: ## %bb.0:
|
|
; AVX512VL-NEXT: vcmpeqps %ymm1, %ymm0, %k1
|
|
; AVX512VL-NEXT: vrndscaleps $10, %ymm0, %ymm0 {%k1} {z}
|
|
; AVX512VL-NEXT: retq
|
|
%k = fcmp oeq <8 x float> %x, %y
|
|
%call = call <8 x float> @llvm.ceil.v8f32(<8 x float> %x)
|
|
%res = select <8 x i1> %k, <8 x float> %call, <8 x float> zeroinitializer
|
|
ret <8 x float> %res
|
|
}
|
|
|
|
define <4 x double> @ceil_mask_256_pd(<4 x double> %x, <4 x double> %y) nounwind {
|
|
; SSE41-LABEL: ceil_mask_256_pd:
|
|
; SSE41: ## %bb.0:
|
|
; SSE41-NEXT: roundpd $10, %xmm1, %xmm4
|
|
; SSE41-NEXT: cmpeqpd %xmm3, %xmm1
|
|
; SSE41-NEXT: roundpd $10, %xmm0, %xmm5
|
|
; SSE41-NEXT: cmpeqpd %xmm2, %xmm0
|
|
; SSE41-NEXT: blendvpd %xmm0, %xmm5, %xmm2
|
|
; SSE41-NEXT: movapd %xmm1, %xmm0
|
|
; SSE41-NEXT: blendvpd %xmm0, %xmm4, %xmm3
|
|
; SSE41-NEXT: movapd %xmm2, %xmm0
|
|
; SSE41-NEXT: movapd %xmm3, %xmm1
|
|
; SSE41-NEXT: retq
|
|
;
|
|
; AVX-LABEL: ceil_mask_256_pd:
|
|
; AVX: ## %bb.0:
|
|
; AVX-NEXT: vcmpeqpd %ymm1, %ymm0, %ymm2
|
|
; AVX-NEXT: vroundpd $10, %ymm0, %ymm0
|
|
; AVX-NEXT: vblendvpd %ymm2, %ymm0, %ymm1, %ymm0
|
|
; AVX-NEXT: retq
|
|
;
|
|
; AVX512F-LABEL: ceil_mask_256_pd:
|
|
; AVX512F: ## %bb.0:
|
|
; AVX512F-NEXT: ## kill: def $ymm1 killed $ymm1 def $zmm1
|
|
; AVX512F-NEXT: ## kill: def $ymm0 killed $ymm0 def $zmm0
|
|
; AVX512F-NEXT: vcmpeqpd %zmm1, %zmm0, %k1
|
|
; AVX512F-NEXT: vroundpd $10, %ymm0, %ymm0
|
|
; AVX512F-NEXT: vblendmpd %zmm0, %zmm1, %zmm0 {%k1}
|
|
; AVX512F-NEXT: ## kill: def $ymm0 killed $ymm0 killed $zmm0
|
|
; AVX512F-NEXT: retq
|
|
;
|
|
; AVX512VL-LABEL: ceil_mask_256_pd:
|
|
; AVX512VL: ## %bb.0:
|
|
; AVX512VL-NEXT: vcmpeqpd %ymm1, %ymm0, %k1
|
|
; AVX512VL-NEXT: vrndscalepd $10, %ymm0, %ymm1 {%k1}
|
|
; AVX512VL-NEXT: vmovapd %ymm1, %ymm0
|
|
; AVX512VL-NEXT: retq
|
|
%k = fcmp oeq <4 x double> %x, %y
|
|
%call = call <4 x double> @llvm.ceil.v4f64(<4 x double> %x)
|
|
%res = select <4 x i1> %k, <4 x double> %call, <4 x double> %y
|
|
ret <4 x double> %res
|
|
}
|
|
|
|
define <4 x double> @ceil_maskz_256_pd(<4 x double> %x, <4 x double> %y) nounwind {
|
|
; SSE41-LABEL: ceil_maskz_256_pd:
|
|
; SSE41: ## %bb.0:
|
|
; SSE41-NEXT: cmpeqpd %xmm1, %xmm3
|
|
; SSE41-NEXT: cmpeqpd %xmm0, %xmm2
|
|
; SSE41-NEXT: roundpd $10, %xmm1, %xmm1
|
|
; SSE41-NEXT: andpd %xmm3, %xmm1
|
|
; SSE41-NEXT: roundpd $10, %xmm0, %xmm0
|
|
; SSE41-NEXT: andpd %xmm2, %xmm0
|
|
; SSE41-NEXT: retq
|
|
;
|
|
; AVX-LABEL: ceil_maskz_256_pd:
|
|
; AVX: ## %bb.0:
|
|
; AVX-NEXT: vcmpeqpd %ymm1, %ymm0, %ymm1
|
|
; AVX-NEXT: vroundpd $10, %ymm0, %ymm0
|
|
; AVX-NEXT: vandpd %ymm0, %ymm1, %ymm0
|
|
; AVX-NEXT: retq
|
|
;
|
|
; AVX512F-LABEL: ceil_maskz_256_pd:
|
|
; AVX512F: ## %bb.0:
|
|
; AVX512F-NEXT: ## kill: def $ymm1 killed $ymm1 def $zmm1
|
|
; AVX512F-NEXT: ## kill: def $ymm0 killed $ymm0 def $zmm0
|
|
; AVX512F-NEXT: vcmpeqpd %zmm1, %zmm0, %k1
|
|
; AVX512F-NEXT: vroundpd $10, %ymm0, %ymm0
|
|
; AVX512F-NEXT: vmovapd %zmm0, %zmm0 {%k1} {z}
|
|
; AVX512F-NEXT: ## kill: def $ymm0 killed $ymm0 killed $zmm0
|
|
; AVX512F-NEXT: retq
|
|
;
|
|
; AVX512VL-LABEL: ceil_maskz_256_pd:
|
|
; AVX512VL: ## %bb.0:
|
|
; AVX512VL-NEXT: vcmpeqpd %ymm1, %ymm0, %k1
|
|
; AVX512VL-NEXT: vrndscalepd $10, %ymm0, %ymm0 {%k1} {z}
|
|
; AVX512VL-NEXT: retq
|
|
%k = fcmp oeq <4 x double> %x, %y
|
|
%call = call <4 x double> @llvm.ceil.v4f64(<4 x double> %x)
|
|
%res = select <4 x i1> %k, <4 x double> %call, <4 x double> zeroinitializer
|
|
ret <4 x double> %res
|
|
}
|
|
|
|
define <16 x float> @ceil_mask_512_ps(<16 x float> %x, <16 x float> %y) nounwind {
|
|
; SSE41-LABEL: ceil_mask_512_ps:
|
|
; SSE41: ## %bb.0:
|
|
; SSE41-NEXT: roundps $10, %xmm3, %xmm8
|
|
; SSE41-NEXT: cmpeqps %xmm7, %xmm3
|
|
; SSE41-NEXT: roundps $10, %xmm2, %xmm9
|
|
; SSE41-NEXT: cmpeqps %xmm6, %xmm2
|
|
; SSE41-NEXT: roundps $10, %xmm1, %xmm10
|
|
; SSE41-NEXT: cmpeqps %xmm5, %xmm1
|
|
; SSE41-NEXT: roundps $10, %xmm0, %xmm11
|
|
; SSE41-NEXT: cmpeqps %xmm4, %xmm0
|
|
; SSE41-NEXT: blendvps %xmm0, %xmm11, %xmm4
|
|
; SSE41-NEXT: movaps %xmm1, %xmm0
|
|
; SSE41-NEXT: blendvps %xmm0, %xmm10, %xmm5
|
|
; SSE41-NEXT: movaps %xmm2, %xmm0
|
|
; SSE41-NEXT: blendvps %xmm0, %xmm9, %xmm6
|
|
; SSE41-NEXT: movaps %xmm3, %xmm0
|
|
; SSE41-NEXT: blendvps %xmm0, %xmm8, %xmm7
|
|
; SSE41-NEXT: movaps %xmm4, %xmm0
|
|
; SSE41-NEXT: movaps %xmm5, %xmm1
|
|
; SSE41-NEXT: movaps %xmm6, %xmm2
|
|
; SSE41-NEXT: movaps %xmm7, %xmm3
|
|
; SSE41-NEXT: retq
|
|
;
|
|
; AVX-LABEL: ceil_mask_512_ps:
|
|
; AVX: ## %bb.0:
|
|
; AVX-NEXT: vcmpeqps %ymm3, %ymm1, %ymm4
|
|
; AVX-NEXT: vcmpeqps %ymm2, %ymm0, %ymm5
|
|
; AVX-NEXT: vroundps $10, %ymm1, %ymm1
|
|
; AVX-NEXT: vroundps $10, %ymm0, %ymm0
|
|
; AVX-NEXT: vblendvps %ymm5, %ymm0, %ymm2, %ymm0
|
|
; AVX-NEXT: vblendvps %ymm4, %ymm1, %ymm3, %ymm1
|
|
; AVX-NEXT: retq
|
|
;
|
|
; AVX512-LABEL: ceil_mask_512_ps:
|
|
; AVX512: ## %bb.0:
|
|
; AVX512-NEXT: vcmpeqps %zmm1, %zmm0, %k1
|
|
; AVX512-NEXT: vrndscaleps $10, %zmm0, %zmm1 {%k1}
|
|
; AVX512-NEXT: vmovaps %zmm1, %zmm0
|
|
; AVX512-NEXT: retq
|
|
%k = fcmp oeq <16 x float> %x, %y
|
|
%call = call <16 x float> @llvm.ceil.v16f32(<16 x float> %x)
|
|
%res = select <16 x i1> %k, <16 x float> %call, <16 x float> %y
|
|
ret <16 x float> %res
|
|
}
|
|
|
|
define <16 x float> @ceil_maskz_512_ps(<16 x float> %x, <16 x float> %y) nounwind {
|
|
; SSE41-LABEL: ceil_maskz_512_ps:
|
|
; SSE41: ## %bb.0:
|
|
; SSE41-NEXT: cmpeqps %xmm3, %xmm7
|
|
; SSE41-NEXT: cmpeqps %xmm2, %xmm6
|
|
; SSE41-NEXT: cmpeqps %xmm1, %xmm5
|
|
; SSE41-NEXT: cmpeqps %xmm0, %xmm4
|
|
; SSE41-NEXT: roundps $10, %xmm3, %xmm3
|
|
; SSE41-NEXT: andps %xmm7, %xmm3
|
|
; SSE41-NEXT: roundps $10, %xmm2, %xmm2
|
|
; SSE41-NEXT: andps %xmm6, %xmm2
|
|
; SSE41-NEXT: roundps $10, %xmm1, %xmm1
|
|
; SSE41-NEXT: andps %xmm5, %xmm1
|
|
; SSE41-NEXT: roundps $10, %xmm0, %xmm0
|
|
; SSE41-NEXT: andps %xmm4, %xmm0
|
|
; SSE41-NEXT: retq
|
|
;
|
|
; AVX-LABEL: ceil_maskz_512_ps:
|
|
; AVX: ## %bb.0:
|
|
; AVX-NEXT: vcmpeqps %ymm3, %ymm1, %ymm3
|
|
; AVX-NEXT: vcmpeqps %ymm2, %ymm0, %ymm2
|
|
; AVX-NEXT: vroundps $10, %ymm1, %ymm1
|
|
; AVX-NEXT: vandps %ymm1, %ymm3, %ymm1
|
|
; AVX-NEXT: vroundps $10, %ymm0, %ymm0
|
|
; AVX-NEXT: vandps %ymm0, %ymm2, %ymm0
|
|
; AVX-NEXT: retq
|
|
;
|
|
; AVX512-LABEL: ceil_maskz_512_ps:
|
|
; AVX512: ## %bb.0:
|
|
; AVX512-NEXT: vcmpeqps %zmm1, %zmm0, %k1
|
|
; AVX512-NEXT: vrndscaleps $10, %zmm0, %zmm0 {%k1} {z}
|
|
; AVX512-NEXT: retq
|
|
%k = fcmp oeq <16 x float> %x, %y
|
|
%call = call <16 x float> @llvm.ceil.v16f32(<16 x float> %x)
|
|
%res = select <16 x i1> %k, <16 x float> %call, <16 x float> zeroinitializer
|
|
ret <16 x float> %res
|
|
}
|
|
|
|
define <8 x double> @ceil_mask_512_pd(<8 x double> %x, <8 x double> %y) nounwind {
|
|
; SSE41-LABEL: ceil_mask_512_pd:
|
|
; SSE41: ## %bb.0:
|
|
; SSE41-NEXT: roundpd $10, %xmm3, %xmm8
|
|
; SSE41-NEXT: cmpeqpd %xmm7, %xmm3
|
|
; SSE41-NEXT: roundpd $10, %xmm2, %xmm9
|
|
; SSE41-NEXT: cmpeqpd %xmm6, %xmm2
|
|
; SSE41-NEXT: roundpd $10, %xmm1, %xmm10
|
|
; SSE41-NEXT: cmpeqpd %xmm5, %xmm1
|
|
; SSE41-NEXT: roundpd $10, %xmm0, %xmm11
|
|
; SSE41-NEXT: cmpeqpd %xmm4, %xmm0
|
|
; SSE41-NEXT: blendvpd %xmm0, %xmm11, %xmm4
|
|
; SSE41-NEXT: movapd %xmm1, %xmm0
|
|
; SSE41-NEXT: blendvpd %xmm0, %xmm10, %xmm5
|
|
; SSE41-NEXT: movapd %xmm2, %xmm0
|
|
; SSE41-NEXT: blendvpd %xmm0, %xmm9, %xmm6
|
|
; SSE41-NEXT: movapd %xmm3, %xmm0
|
|
; SSE41-NEXT: blendvpd %xmm0, %xmm8, %xmm7
|
|
; SSE41-NEXT: movapd %xmm4, %xmm0
|
|
; SSE41-NEXT: movapd %xmm5, %xmm1
|
|
; SSE41-NEXT: movapd %xmm6, %xmm2
|
|
; SSE41-NEXT: movapd %xmm7, %xmm3
|
|
; SSE41-NEXT: retq
|
|
;
|
|
; AVX-LABEL: ceil_mask_512_pd:
|
|
; AVX: ## %bb.0:
|
|
; AVX-NEXT: vcmpeqpd %ymm3, %ymm1, %ymm4
|
|
; AVX-NEXT: vcmpeqpd %ymm2, %ymm0, %ymm5
|
|
; AVX-NEXT: vroundpd $10, %ymm1, %ymm1
|
|
; AVX-NEXT: vroundpd $10, %ymm0, %ymm0
|
|
; AVX-NEXT: vblendvpd %ymm5, %ymm0, %ymm2, %ymm0
|
|
; AVX-NEXT: vblendvpd %ymm4, %ymm1, %ymm3, %ymm1
|
|
; AVX-NEXT: retq
|
|
;
|
|
; AVX512-LABEL: ceil_mask_512_pd:
|
|
; AVX512: ## %bb.0:
|
|
; AVX512-NEXT: vcmpeqpd %zmm1, %zmm0, %k1
|
|
; AVX512-NEXT: vrndscalepd $10, %zmm0, %zmm1 {%k1}
|
|
; AVX512-NEXT: vmovapd %zmm1, %zmm0
|
|
; AVX512-NEXT: retq
|
|
%k = fcmp oeq <8 x double> %x, %y
|
|
%call = call <8 x double> @llvm.ceil.v8f64(<8 x double> %x)
|
|
%res = select <8 x i1> %k, <8 x double> %call, <8 x double> %y
|
|
ret <8 x double> %res
|
|
}
|
|
|
|
define <8 x double> @ceil_maskz_512_pd(<8 x double> %x, <8 x double> %y) nounwind {
|
|
; SSE41-LABEL: ceil_maskz_512_pd:
|
|
; SSE41: ## %bb.0:
|
|
; SSE41-NEXT: cmpeqpd %xmm3, %xmm7
|
|
; SSE41-NEXT: cmpeqpd %xmm2, %xmm6
|
|
; SSE41-NEXT: cmpeqpd %xmm1, %xmm5
|
|
; SSE41-NEXT: cmpeqpd %xmm0, %xmm4
|
|
; SSE41-NEXT: roundpd $10, %xmm3, %xmm3
|
|
; SSE41-NEXT: andpd %xmm7, %xmm3
|
|
; SSE41-NEXT: roundpd $10, %xmm2, %xmm2
|
|
; SSE41-NEXT: andpd %xmm6, %xmm2
|
|
; SSE41-NEXT: roundpd $10, %xmm1, %xmm1
|
|
; SSE41-NEXT: andpd %xmm5, %xmm1
|
|
; SSE41-NEXT: roundpd $10, %xmm0, %xmm0
|
|
; SSE41-NEXT: andpd %xmm4, %xmm0
|
|
; SSE41-NEXT: retq
|
|
;
|
|
; AVX-LABEL: ceil_maskz_512_pd:
|
|
; AVX: ## %bb.0:
|
|
; AVX-NEXT: vcmpeqpd %ymm3, %ymm1, %ymm3
|
|
; AVX-NEXT: vcmpeqpd %ymm2, %ymm0, %ymm2
|
|
; AVX-NEXT: vroundpd $10, %ymm1, %ymm1
|
|
; AVX-NEXT: vandpd %ymm1, %ymm3, %ymm1
|
|
; AVX-NEXT: vroundpd $10, %ymm0, %ymm0
|
|
; AVX-NEXT: vandpd %ymm0, %ymm2, %ymm0
|
|
; AVX-NEXT: retq
|
|
;
|
|
; AVX512-LABEL: ceil_maskz_512_pd:
|
|
; AVX512: ## %bb.0:
|
|
; AVX512-NEXT: vcmpeqpd %zmm1, %zmm0, %k1
|
|
; AVX512-NEXT: vrndscalepd $10, %zmm0, %zmm0 {%k1} {z}
|
|
; AVX512-NEXT: retq
|
|
%k = fcmp oeq <8 x double> %x, %y
|
|
%call = call <8 x double> @llvm.ceil.v8f64(<8 x double> %x)
|
|
%res = select <8 x i1> %k, <8 x double> %call, <8 x double> zeroinitializer
|
|
ret <8 x double> %res
|
|
}
|
|
|
|
define <4 x float> @ceil_mask_ss(<4 x float> %x, <4 x float> %y, <4 x float> %w, i8 %k) nounwind {
|
|
; SSE41-LABEL: ceil_mask_ss:
|
|
; SSE41: ## %bb.0:
|
|
; SSE41-NEXT: testb $1, %dil
|
|
; SSE41-NEXT: je LBB78_2
|
|
; SSE41-NEXT: ## %bb.1:
|
|
; SSE41-NEXT: xorps %xmm2, %xmm2
|
|
; SSE41-NEXT: roundss $10, %xmm0, %xmm2
|
|
; SSE41-NEXT: LBB78_2:
|
|
; SSE41-NEXT: blendps {{.*#+}} xmm1 = xmm2[0],xmm1[1,2,3]
|
|
; SSE41-NEXT: movaps %xmm1, %xmm0
|
|
; SSE41-NEXT: retq
|
|
;
|
|
; AVX-LABEL: ceil_mask_ss:
|
|
; AVX: ## %bb.0:
|
|
; AVX-NEXT: testb $1, %dil
|
|
; AVX-NEXT: je LBB78_2
|
|
; AVX-NEXT: ## %bb.1:
|
|
; AVX-NEXT: vroundss $10, %xmm0, %xmm0, %xmm2
|
|
; AVX-NEXT: LBB78_2:
|
|
; AVX-NEXT: vblendps {{.*#+}} xmm0 = xmm2[0],xmm1[1,2,3]
|
|
; AVX-NEXT: retq
|
|
;
|
|
; AVX512-LABEL: ceil_mask_ss:
|
|
; AVX512: ## %bb.0:
|
|
; AVX512-NEXT: kmovw %edi, %k1
|
|
; AVX512-NEXT: vrndscaless $2, %xmm0, %xmm1, %xmm2 {%k1}
|
|
; AVX512-NEXT: vmovaps %xmm2, %xmm0
|
|
; AVX512-NEXT: retq
|
|
%mask = and i8 %k, 1
|
|
%nmask = icmp eq i8 %mask, 0
|
|
%s = extractelement <4 x float> %x, i64 0
|
|
%call = tail call float @llvm.ceil.f32(float %s)
|
|
%dst = extractelement <4 x float> %w, i64 0
|
|
%low = select i1 %nmask, float %dst, float %call
|
|
%res = insertelement <4 x float> %y, float %low, i64 0
|
|
ret <4 x float> %res
|
|
}
|
|
|
|
define <4 x float> @ceil_maskz_ss(<4 x float> %x, <4 x float> %y, i8 %k) nounwind {
|
|
; SSE41-LABEL: ceil_maskz_ss:
|
|
; SSE41: ## %bb.0:
|
|
; SSE41-NEXT: testb $1, %dil
|
|
; SSE41-NEXT: xorps %xmm2, %xmm2
|
|
; SSE41-NEXT: je LBB79_2
|
|
; SSE41-NEXT: ## %bb.1:
|
|
; SSE41-NEXT: xorps %xmm2, %xmm2
|
|
; SSE41-NEXT: roundss $10, %xmm0, %xmm2
|
|
; SSE41-NEXT: LBB79_2:
|
|
; SSE41-NEXT: blendps {{.*#+}} xmm1 = xmm2[0],xmm1[1,2,3]
|
|
; SSE41-NEXT: movaps %xmm1, %xmm0
|
|
; SSE41-NEXT: retq
|
|
;
|
|
; AVX-LABEL: ceil_maskz_ss:
|
|
; AVX: ## %bb.0:
|
|
; AVX-NEXT: testb $1, %dil
|
|
; AVX-NEXT: vxorps %xmm2, %xmm2, %xmm2
|
|
; AVX-NEXT: je LBB79_2
|
|
; AVX-NEXT: ## %bb.1:
|
|
; AVX-NEXT: vroundss $10, %xmm0, %xmm0, %xmm2
|
|
; AVX-NEXT: LBB79_2:
|
|
; AVX-NEXT: vblendps {{.*#+}} xmm0 = xmm2[0],xmm1[1,2,3]
|
|
; AVX-NEXT: retq
|
|
;
|
|
; AVX512-LABEL: ceil_maskz_ss:
|
|
; AVX512: ## %bb.0:
|
|
; AVX512-NEXT: kmovw %edi, %k1
|
|
; AVX512-NEXT: vrndscaless $2, %xmm0, %xmm1, %xmm0 {%k1} {z}
|
|
; AVX512-NEXT: retq
|
|
%mask = and i8 %k, 1
|
|
%nmask = icmp eq i8 %mask, 0
|
|
%s = extractelement <4 x float> %x, i64 0
|
|
%call = tail call float @llvm.ceil.f32(float %s)
|
|
%low = select i1 %nmask, float zeroinitializer, float %call
|
|
%res = insertelement <4 x float> %y, float %low, i64 0
|
|
ret <4 x float> %res
|
|
}
|
|
|
|
define <2 x double> @ceil_mask_sd(<2 x double> %x, <2 x double> %y, <2 x double> %w, i8 %k) nounwind {
|
|
; SSE41-LABEL: ceil_mask_sd:
|
|
; SSE41: ## %bb.0:
|
|
; SSE41-NEXT: testb $1, %dil
|
|
; SSE41-NEXT: je LBB80_2
|
|
; SSE41-NEXT: ## %bb.1:
|
|
; SSE41-NEXT: xorps %xmm2, %xmm2
|
|
; SSE41-NEXT: roundsd $10, %xmm0, %xmm2
|
|
; SSE41-NEXT: LBB80_2:
|
|
; SSE41-NEXT: blendpd {{.*#+}} xmm1 = xmm2[0],xmm1[1]
|
|
; SSE41-NEXT: movapd %xmm1, %xmm0
|
|
; SSE41-NEXT: retq
|
|
;
|
|
; AVX-LABEL: ceil_mask_sd:
|
|
; AVX: ## %bb.0:
|
|
; AVX-NEXT: testb $1, %dil
|
|
; AVX-NEXT: je LBB80_2
|
|
; AVX-NEXT: ## %bb.1:
|
|
; AVX-NEXT: vroundsd $10, %xmm0, %xmm0, %xmm2
|
|
; AVX-NEXT: LBB80_2:
|
|
; AVX-NEXT: vblendpd {{.*#+}} xmm0 = xmm2[0],xmm1[1]
|
|
; AVX-NEXT: retq
|
|
;
|
|
; AVX512-LABEL: ceil_mask_sd:
|
|
; AVX512: ## %bb.0:
|
|
; AVX512-NEXT: kmovw %edi, %k1
|
|
; AVX512-NEXT: vrndscalesd $2, %xmm0, %xmm1, %xmm2 {%k1}
|
|
; AVX512-NEXT: vmovapd %xmm2, %xmm0
|
|
; AVX512-NEXT: retq
|
|
%mask = and i8 %k, 1
|
|
%nmask = icmp eq i8 %mask, 0
|
|
%s = extractelement <2 x double> %x, i64 0
|
|
%call = tail call double @llvm.ceil.f64(double %s)
|
|
%dst = extractelement <2 x double> %w, i64 0
|
|
%low = select i1 %nmask, double %dst, double %call
|
|
%res = insertelement <2 x double> %y, double %low, i64 0
|
|
ret <2 x double> %res
|
|
}
|
|
|
|
define <2 x double> @ceil_maskz_sd(<2 x double> %x, <2 x double> %y, i8 %k) nounwind {
|
|
; SSE41-LABEL: ceil_maskz_sd:
|
|
; SSE41: ## %bb.0:
|
|
; SSE41-NEXT: testb $1, %dil
|
|
; SSE41-NEXT: xorpd %xmm2, %xmm2
|
|
; SSE41-NEXT: je LBB81_2
|
|
; SSE41-NEXT: ## %bb.1:
|
|
; SSE41-NEXT: xorps %xmm2, %xmm2
|
|
; SSE41-NEXT: roundsd $10, %xmm0, %xmm2
|
|
; SSE41-NEXT: LBB81_2:
|
|
; SSE41-NEXT: blendpd {{.*#+}} xmm1 = xmm2[0],xmm1[1]
|
|
; SSE41-NEXT: movapd %xmm1, %xmm0
|
|
; SSE41-NEXT: retq
|
|
;
|
|
; AVX-LABEL: ceil_maskz_sd:
|
|
; AVX: ## %bb.0:
|
|
; AVX-NEXT: testb $1, %dil
|
|
; AVX-NEXT: vxorpd %xmm2, %xmm2, %xmm2
|
|
; AVX-NEXT: je LBB81_2
|
|
; AVX-NEXT: ## %bb.1:
|
|
; AVX-NEXT: vroundsd $10, %xmm0, %xmm0, %xmm2
|
|
; AVX-NEXT: LBB81_2:
|
|
; AVX-NEXT: vblendpd {{.*#+}} xmm0 = xmm2[0],xmm1[1]
|
|
; AVX-NEXT: retq
|
|
;
|
|
; AVX512-LABEL: ceil_maskz_sd:
|
|
; AVX512: ## %bb.0:
|
|
; AVX512-NEXT: kmovw %edi, %k1
|
|
; AVX512-NEXT: vrndscalesd $2, %xmm0, %xmm1, %xmm0 {%k1} {z}
|
|
; AVX512-NEXT: retq
|
|
%mask = and i8 %k, 1
|
|
%nmask = icmp eq i8 %mask, 0
|
|
%s = extractelement <2 x double> %x, i64 0
|
|
%call = tail call double @llvm.ceil.f64(double %s)
|
|
%low = select i1 %nmask, double zeroinitializer, double %call
|
|
%res = insertelement <2 x double> %y, double %low, i64 0
|
|
ret <2 x double> %res
|
|
}
|
|
|
|
define <4 x float> @ceil_mask_ss_trunc(<4 x float> %x, <4 x float> %y, <4 x float> %w, i16 %k) nounwind {
|
|
; SSE41-LABEL: ceil_mask_ss_trunc:
|
|
; SSE41: ## %bb.0:
|
|
; SSE41-NEXT: testb $1, %dil
|
|
; SSE41-NEXT: je LBB82_2
|
|
; SSE41-NEXT: ## %bb.1:
|
|
; SSE41-NEXT: xorps %xmm2, %xmm2
|
|
; SSE41-NEXT: roundss $10, %xmm0, %xmm2
|
|
; SSE41-NEXT: LBB82_2:
|
|
; SSE41-NEXT: blendps {{.*#+}} xmm1 = xmm2[0],xmm1[1,2,3]
|
|
; SSE41-NEXT: movaps %xmm1, %xmm0
|
|
; SSE41-NEXT: retq
|
|
;
|
|
; AVX-LABEL: ceil_mask_ss_trunc:
|
|
; AVX: ## %bb.0:
|
|
; AVX-NEXT: testb $1, %dil
|
|
; AVX-NEXT: je LBB82_2
|
|
; AVX-NEXT: ## %bb.1:
|
|
; AVX-NEXT: vroundss $10, %xmm0, %xmm0, %xmm2
|
|
; AVX-NEXT: LBB82_2:
|
|
; AVX-NEXT: vblendps {{.*#+}} xmm0 = xmm2[0],xmm1[1,2,3]
|
|
; AVX-NEXT: retq
|
|
;
|
|
; AVX512-LABEL: ceil_mask_ss_trunc:
|
|
; AVX512: ## %bb.0:
|
|
; AVX512-NEXT: kmovw %edi, %k1
|
|
; AVX512-NEXT: vrndscaless $2, %xmm0, %xmm1, %xmm2 {%k1}
|
|
; AVX512-NEXT: vmovaps %xmm2, %xmm0
|
|
; AVX512-NEXT: retq
|
|
%mask = trunc i16 %k to i1
|
|
%s = extractelement <4 x float> %x, i64 0
|
|
%call = tail call float @llvm.ceil.f32(float %s)
|
|
%dst = extractelement <4 x float> %w, i64 0
|
|
%low = select i1 %mask, float %call, float %dst
|
|
%res = insertelement <4 x float> %y, float %low, i64 0
|
|
ret <4 x float> %res
|
|
}
|
|
|
|
define <4 x float> @ceil_maskz_ss_trunc(<4 x float> %x, <4 x float> %y, i16 %k) nounwind {
|
|
; SSE41-LABEL: ceil_maskz_ss_trunc:
|
|
; SSE41: ## %bb.0:
|
|
; SSE41-NEXT: testb $1, %dil
|
|
; SSE41-NEXT: jne LBB83_1
|
|
; SSE41-NEXT: ## %bb.2:
|
|
; SSE41-NEXT: xorps %xmm0, %xmm0
|
|
; SSE41-NEXT: jmp LBB83_3
|
|
; SSE41-NEXT: LBB83_1:
|
|
; SSE41-NEXT: roundss $10, %xmm0, %xmm0
|
|
; SSE41-NEXT: LBB83_3:
|
|
; SSE41-NEXT: blendps {{.*#+}} xmm1 = xmm0[0],xmm1[1,2,3]
|
|
; SSE41-NEXT: movaps %xmm1, %xmm0
|
|
; SSE41-NEXT: retq
|
|
;
|
|
; AVX-LABEL: ceil_maskz_ss_trunc:
|
|
; AVX: ## %bb.0:
|
|
; AVX-NEXT: testb $1, %dil
|
|
; AVX-NEXT: jne LBB83_1
|
|
; AVX-NEXT: ## %bb.2:
|
|
; AVX-NEXT: vxorps %xmm0, %xmm0, %xmm0
|
|
; AVX-NEXT: vblendps {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3]
|
|
; AVX-NEXT: retq
|
|
; AVX-NEXT: LBB83_1:
|
|
; AVX-NEXT: vroundss $10, %xmm0, %xmm0, %xmm0
|
|
; AVX-NEXT: vblendps {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3]
|
|
; AVX-NEXT: retq
|
|
;
|
|
; AVX512-LABEL: ceil_maskz_ss_trunc:
|
|
; AVX512: ## %bb.0:
|
|
; AVX512-NEXT: kmovw %edi, %k1
|
|
; AVX512-NEXT: vrndscaless $2, %xmm0, %xmm1, %xmm0 {%k1} {z}
|
|
; AVX512-NEXT: retq
|
|
%mask = trunc i16 %k to i1
|
|
%s = extractelement <4 x float> %x, i64 0
|
|
%call = tail call float @llvm.ceil.f32(float %s)
|
|
%low = select i1 %mask, float %call, float zeroinitializer
|
|
%res = insertelement <4 x float> %y, float %low, i64 0
|
|
ret <4 x float> %res
|
|
}
|
|
|
|
define <2 x double> @ceil_mask_sd_trunc(<2 x double> %x, <2 x double> %y, <2 x double> %w, i16 %k) nounwind {
|
|
; SSE41-LABEL: ceil_mask_sd_trunc:
|
|
; SSE41: ## %bb.0:
|
|
; SSE41-NEXT: testb $1, %dil
|
|
; SSE41-NEXT: je LBB84_2
|
|
; SSE41-NEXT: ## %bb.1:
|
|
; SSE41-NEXT: xorps %xmm2, %xmm2
|
|
; SSE41-NEXT: roundsd $10, %xmm0, %xmm2
|
|
; SSE41-NEXT: LBB84_2:
|
|
; SSE41-NEXT: blendpd {{.*#+}} xmm1 = xmm2[0],xmm1[1]
|
|
; SSE41-NEXT: movapd %xmm1, %xmm0
|
|
; SSE41-NEXT: retq
|
|
;
|
|
; AVX-LABEL: ceil_mask_sd_trunc:
|
|
; AVX: ## %bb.0:
|
|
; AVX-NEXT: testb $1, %dil
|
|
; AVX-NEXT: je LBB84_2
|
|
; AVX-NEXT: ## %bb.1:
|
|
; AVX-NEXT: vroundsd $10, %xmm0, %xmm0, %xmm2
|
|
; AVX-NEXT: LBB84_2:
|
|
; AVX-NEXT: vblendpd {{.*#+}} xmm0 = xmm2[0],xmm1[1]
|
|
; AVX-NEXT: retq
|
|
;
|
|
; AVX512-LABEL: ceil_mask_sd_trunc:
|
|
; AVX512: ## %bb.0:
|
|
; AVX512-NEXT: kmovw %edi, %k1
|
|
; AVX512-NEXT: vrndscalesd $2, %xmm0, %xmm1, %xmm2 {%k1}
|
|
; AVX512-NEXT: vmovapd %xmm2, %xmm0
|
|
; AVX512-NEXT: retq
|
|
%mask = trunc i16 %k to i1
|
|
%s = extractelement <2 x double> %x, i64 0
|
|
%call = tail call double @llvm.ceil.f64(double %s)
|
|
%dst = extractelement <2 x double> %w, i64 0
|
|
%low = select i1 %mask, double %call, double %dst
|
|
%res = insertelement <2 x double> %y, double %low, i64 0
|
|
ret <2 x double> %res
|
|
}
|
|
|
|
define <2 x double> @ceil_maskz_sd_trunc(<2 x double> %x, <2 x double> %y, i16 %k) nounwind {
|
|
; SSE41-LABEL: ceil_maskz_sd_trunc:
|
|
; SSE41: ## %bb.0:
|
|
; SSE41-NEXT: testb $1, %dil
|
|
; SSE41-NEXT: jne LBB85_1
|
|
; SSE41-NEXT: ## %bb.2:
|
|
; SSE41-NEXT: xorpd %xmm0, %xmm0
|
|
; SSE41-NEXT: jmp LBB85_3
|
|
; SSE41-NEXT: LBB85_1:
|
|
; SSE41-NEXT: roundsd $10, %xmm0, %xmm0
|
|
; SSE41-NEXT: LBB85_3:
|
|
; SSE41-NEXT: blendpd {{.*#+}} xmm1 = xmm0[0],xmm1[1]
|
|
; SSE41-NEXT: movapd %xmm1, %xmm0
|
|
; SSE41-NEXT: retq
|
|
;
|
|
; AVX-LABEL: ceil_maskz_sd_trunc:
|
|
; AVX: ## %bb.0:
|
|
; AVX-NEXT: testb $1, %dil
|
|
; AVX-NEXT: jne LBB85_1
|
|
; AVX-NEXT: ## %bb.2:
|
|
; AVX-NEXT: vxorps %xmm0, %xmm0, %xmm0
|
|
; AVX-NEXT: vblendps {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,3]
|
|
; AVX-NEXT: retq
|
|
; AVX-NEXT: LBB85_1:
|
|
; AVX-NEXT: vroundsd $10, %xmm0, %xmm0, %xmm0
|
|
; AVX-NEXT: vblendpd {{.*#+}} xmm0 = xmm0[0],xmm1[1]
|
|
; AVX-NEXT: retq
|
|
;
|
|
; AVX512-LABEL: ceil_maskz_sd_trunc:
|
|
; AVX512: ## %bb.0:
|
|
; AVX512-NEXT: kmovw %edi, %k1
|
|
; AVX512-NEXT: vrndscalesd $2, %xmm0, %xmm1, %xmm0 {%k1} {z}
|
|
; AVX512-NEXT: retq
|
|
%mask = trunc i16 %k to i1
|
|
%s = extractelement <2 x double> %x, i64 0
|
|
%call = tail call double @llvm.ceil.f64(double %s)
|
|
%low = select i1 %mask, double %call, double zeroinitializer
|
|
%res = insertelement <2 x double> %y, double %low, i64 0
|
|
ret <2 x double> %res
|
|
}
|
|
|
|
define <4 x float> @ceil_mask_ss_mask8(<4 x float> %x, <4 x float> %y, <4 x float> %w) nounwind {
|
|
; SSE41-LABEL: ceil_mask_ss_mask8:
|
|
; SSE41: ## %bb.0:
|
|
; SSE41-NEXT: roundss $10, %xmm0, %xmm3
|
|
; SSE41-NEXT: cmpeqss %xmm1, %xmm0
|
|
; SSE41-NEXT: andps %xmm0, %xmm3
|
|
; SSE41-NEXT: andnps %xmm2, %xmm0
|
|
; SSE41-NEXT: orps %xmm3, %xmm0
|
|
; SSE41-NEXT: blendps {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3]
|
|
; SSE41-NEXT: retq
|
|
;
|
|
; AVX-LABEL: ceil_mask_ss_mask8:
|
|
; AVX: ## %bb.0:
|
|
; AVX-NEXT: vroundss $10, %xmm0, %xmm0, %xmm3
|
|
; AVX-NEXT: vcmpeqss %xmm1, %xmm0, %xmm0
|
|
; AVX-NEXT: vblendvps %xmm0, %xmm3, %xmm2, %xmm0
|
|
; AVX-NEXT: vblendps {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3]
|
|
; AVX-NEXT: retq
|
|
;
|
|
; AVX512-LABEL: ceil_mask_ss_mask8:
|
|
; AVX512: ## %bb.0:
|
|
; AVX512-NEXT: vcmpeqss %xmm1, %xmm0, %k1
|
|
; AVX512-NEXT: vrndscaless $2, %xmm0, %xmm1, %xmm2 {%k1}
|
|
; AVX512-NEXT: vmovaps %xmm2, %xmm0
|
|
; AVX512-NEXT: retq
|
|
%mask1 = fcmp oeq <4 x float> %x, %y
|
|
%mask = extractelement <4 x i1> %mask1, i64 0
|
|
%s = extractelement <4 x float> %x, i64 0
|
|
%call = tail call float @llvm.ceil.f32(float %s)
|
|
%dst = extractelement <4 x float> %w, i64 0
|
|
%low = select i1 %mask, float %call, float %dst
|
|
%res = insertelement <4 x float> %y, float %low, i64 0
|
|
ret <4 x float> %res
|
|
}
|
|
|
|
define <4 x float> @ceil_maskz_ss_mask8(<4 x float> %x, <4 x float> %y) nounwind {
|
|
; SSE41-LABEL: ceil_maskz_ss_mask8:
|
|
; SSE41: ## %bb.0:
|
|
; SSE41-NEXT: roundss $10, %xmm0, %xmm2
|
|
; SSE41-NEXT: cmpeqss %xmm1, %xmm0
|
|
; SSE41-NEXT: andps %xmm2, %xmm0
|
|
; SSE41-NEXT: blendps {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3]
|
|
; SSE41-NEXT: retq
|
|
;
|
|
; AVX-LABEL: ceil_maskz_ss_mask8:
|
|
; AVX: ## %bb.0:
|
|
; AVX-NEXT: vroundss $10, %xmm0, %xmm0, %xmm2
|
|
; AVX-NEXT: vcmpeqss %xmm1, %xmm0, %xmm0
|
|
; AVX-NEXT: vandps %xmm2, %xmm0, %xmm0
|
|
; AVX-NEXT: vblendps {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3]
|
|
; AVX-NEXT: retq
|
|
;
|
|
; AVX512-LABEL: ceil_maskz_ss_mask8:
|
|
; AVX512: ## %bb.0:
|
|
; AVX512-NEXT: vcmpeqss %xmm1, %xmm0, %k1
|
|
; AVX512-NEXT: vrndscaless $2, %xmm0, %xmm1, %xmm0 {%k1} {z}
|
|
; AVX512-NEXT: retq
|
|
%mask1 = fcmp oeq <4 x float> %x, %y
|
|
%mask = extractelement <4 x i1> %mask1, i64 0
|
|
%s = extractelement <4 x float> %x, i64 0
|
|
%call = tail call float @llvm.ceil.f32(float %s)
|
|
%low = select i1 %mask, float %call, float zeroinitializer
|
|
%res = insertelement <4 x float> %y, float %low, i64 0
|
|
ret <4 x float> %res
|
|
}
|
|
|
|
define <2 x double> @ceil_mask_sd_mask8(<2 x double> %x, <2 x double> %y, <2 x double> %w) nounwind {
|
|
; SSE41-LABEL: ceil_mask_sd_mask8:
|
|
; SSE41: ## %bb.0:
|
|
; SSE41-NEXT: roundsd $10, %xmm0, %xmm3
|
|
; SSE41-NEXT: cmpeqsd %xmm1, %xmm0
|
|
; SSE41-NEXT: andpd %xmm0, %xmm3
|
|
; SSE41-NEXT: andnpd %xmm2, %xmm0
|
|
; SSE41-NEXT: orpd %xmm3, %xmm0
|
|
; SSE41-NEXT: blendpd {{.*#+}} xmm0 = xmm0[0],xmm1[1]
|
|
; SSE41-NEXT: retq
|
|
;
|
|
; AVX-LABEL: ceil_mask_sd_mask8:
|
|
; AVX: ## %bb.0:
|
|
; AVX-NEXT: vroundsd $10, %xmm0, %xmm0, %xmm3
|
|
; AVX-NEXT: vcmpeqsd %xmm1, %xmm0, %xmm0
|
|
; AVX-NEXT: vblendvpd %xmm0, %xmm3, %xmm2, %xmm0
|
|
; AVX-NEXT: vblendpd {{.*#+}} xmm0 = xmm0[0],xmm1[1]
|
|
; AVX-NEXT: retq
|
|
;
|
|
; AVX512-LABEL: ceil_mask_sd_mask8:
|
|
; AVX512: ## %bb.0:
|
|
; AVX512-NEXT: vcmpeqsd %xmm1, %xmm0, %k1
|
|
; AVX512-NEXT: vrndscalesd $2, %xmm0, %xmm1, %xmm2 {%k1}
|
|
; AVX512-NEXT: vmovapd %xmm2, %xmm0
|
|
; AVX512-NEXT: retq
|
|
%mask1 = fcmp oeq <2 x double> %x, %y
|
|
%mask = extractelement <2 x i1> %mask1, i64 0
|
|
%s = extractelement <2 x double> %x, i64 0
|
|
%call = tail call double @llvm.ceil.f64(double %s)
|
|
%dst = extractelement <2 x double> %w, i64 0
|
|
%low = select i1 %mask, double %call, double %dst
|
|
%res = insertelement <2 x double> %y, double %low, i64 0
|
|
ret <2 x double> %res
|
|
}
|
|
|
|
define <2 x double> @ceil_maskz_sd_mask8(<2 x double> %x, <2 x double> %y) nounwind {
|
|
; SSE41-LABEL: ceil_maskz_sd_mask8:
|
|
; SSE41: ## %bb.0:
|
|
; SSE41-NEXT: roundsd $10, %xmm0, %xmm2
|
|
; SSE41-NEXT: cmpeqsd %xmm1, %xmm0
|
|
; SSE41-NEXT: andpd %xmm2, %xmm0
|
|
; SSE41-NEXT: blendpd {{.*#+}} xmm0 = xmm0[0],xmm1[1]
|
|
; SSE41-NEXT: retq
|
|
;
|
|
; AVX-LABEL: ceil_maskz_sd_mask8:
|
|
; AVX: ## %bb.0:
|
|
; AVX-NEXT: vroundsd $10, %xmm0, %xmm0, %xmm2
|
|
; AVX-NEXT: vcmpeqsd %xmm1, %xmm0, %xmm0
|
|
; AVX-NEXT: vandpd %xmm2, %xmm0, %xmm0
|
|
; AVX-NEXT: vblendpd {{.*#+}} xmm0 = xmm0[0],xmm1[1]
|
|
; AVX-NEXT: retq
|
|
;
|
|
; AVX512-LABEL: ceil_maskz_sd_mask8:
|
|
; AVX512: ## %bb.0:
|
|
; AVX512-NEXT: vcmpeqsd %xmm1, %xmm0, %k1
|
|
; AVX512-NEXT: vrndscalesd $2, %xmm0, %xmm1, %xmm0 {%k1} {z}
|
|
; AVX512-NEXT: retq
|
|
%mask1 = fcmp oeq <2 x double> %x, %y
|
|
%mask = extractelement <2 x i1> %mask1, i64 0
|
|
%s = extractelement <2 x double> %x, i64 0
|
|
%call = tail call double @llvm.ceil.f64(double %s)
|
|
%low = select i1 %mask, double %call, double zeroinitializer
|
|
%res = insertelement <2 x double> %y, double %low, i64 0
|
|
ret <2 x double> %res
|
|
}
|