Recommit only the tests that look good this time. Correct X86 strictfp tests to follow the rules documented in the LangRef: https://llvm.org/docs/LangRef.html#constrained-floating-point-intrinsics Mostly these tests just needed the strictfp attribute on function definitions. After D154991 the constrained intrinsics have the strictfp attribute by default so they don't need it here, but other functions do. Test changes verified with D146845.
191 lines
5.9 KiB
LLVM
191 lines
5.9 KiB
LLVM
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
|
|
; RUN: llc -mtriple=x86_64-apple-macosx %s -o - | FileCheck %s --check-prefix=CHECK-SOFT
|
|
; RUN: llc -mtriple=x86_64-apple-macosx -mattr=+f16c %s -o - | FileCheck %s --check-prefix=CHECK-F16C
|
|
; RUN: llc -mtriple=x86_64-apple-macosx -mattr=+avx512fp16 %s -o - | FileCheck %s --check-prefix=CHECK-FP16
|
|
|
|
define void @truncsfhf(float %in, ptr %ptr) nounwind {
|
|
; CHECK-SOFT-LABEL: truncsfhf:
|
|
; CHECK-SOFT: ## %bb.0:
|
|
; CHECK-SOFT-NEXT: pushq %rbx
|
|
; CHECK-SOFT-NEXT: movq %rdi, %rbx
|
|
; CHECK-SOFT-NEXT: callq ___truncsfhf2
|
|
; CHECK-SOFT-NEXT: movw %ax, (%rbx)
|
|
; CHECK-SOFT-NEXT: popq %rbx
|
|
; CHECK-SOFT-NEXT: retq
|
|
;
|
|
; CHECK-F16C-LABEL: truncsfhf:
|
|
; CHECK-F16C: ## %bb.0:
|
|
; CHECK-F16C-NEXT: vcvtps2ph $4, %xmm0, %xmm0
|
|
; CHECK-F16C-NEXT: vmovd %xmm0, %eax
|
|
; CHECK-F16C-NEXT: movw %ax, (%rdi)
|
|
; CHECK-F16C-NEXT: retq
|
|
;
|
|
; CHECK-FP16-LABEL: truncsfhf:
|
|
; CHECK-FP16: ## %bb.0:
|
|
; CHECK-FP16-NEXT: vcvtss2sh %xmm0, %xmm0, %xmm0
|
|
; CHECK-FP16-NEXT: vmovsh %xmm0, (%rdi)
|
|
; CHECK-FP16-NEXT: retq
|
|
|
|
|
|
|
|
%half = fptrunc float %in to half
|
|
store half %half, ptr %ptr
|
|
ret void
|
|
}
|
|
|
|
define void @truncdfhf(double %in, ptr %ptr) nounwind {
|
|
; CHECK-SOFT-LABEL: truncdfhf:
|
|
; CHECK-SOFT: ## %bb.0:
|
|
; CHECK-SOFT-NEXT: pushq %rbx
|
|
; CHECK-SOFT-NEXT: movq %rdi, %rbx
|
|
; CHECK-SOFT-NEXT: callq ___truncdfhf2
|
|
; CHECK-SOFT-NEXT: movw %ax, (%rbx)
|
|
; CHECK-SOFT-NEXT: popq %rbx
|
|
; CHECK-SOFT-NEXT: retq
|
|
;
|
|
; CHECK-F16C-LABEL: truncdfhf:
|
|
; CHECK-F16C: ## %bb.0:
|
|
; CHECK-F16C-NEXT: pushq %rbx
|
|
; CHECK-F16C-NEXT: movq %rdi, %rbx
|
|
; CHECK-F16C-NEXT: callq ___truncdfhf2
|
|
; CHECK-F16C-NEXT: movw %ax, (%rbx)
|
|
; CHECK-F16C-NEXT: popq %rbx
|
|
; CHECK-F16C-NEXT: retq
|
|
;
|
|
; CHECK-FP16-LABEL: truncdfhf:
|
|
; CHECK-FP16: ## %bb.0:
|
|
; CHECK-FP16-NEXT: vcvtsd2sh %xmm0, %xmm0, %xmm0
|
|
; CHECK-FP16-NEXT: vmovsh %xmm0, (%rdi)
|
|
; CHECK-FP16-NEXT: retq
|
|
|
|
|
|
|
|
%half = fptrunc double %in to half
|
|
store half %half, ptr %ptr
|
|
ret void
|
|
}
|
|
|
|
define float @extendhfsf(ptr %ptr) nounwind {
|
|
; CHECK-SOFT-LABEL: extendhfsf:
|
|
; CHECK-SOFT: ## %bb.0:
|
|
; CHECK-SOFT-NEXT: pushq %rax
|
|
; CHECK-SOFT-NEXT: movzwl (%rdi), %edi
|
|
; CHECK-SOFT-NEXT: callq ___extendhfsf2
|
|
; CHECK-SOFT-NEXT: popq %rax
|
|
; CHECK-SOFT-NEXT: retq
|
|
;
|
|
; CHECK-F16C-LABEL: extendhfsf:
|
|
; CHECK-F16C: ## %bb.0:
|
|
; CHECK-F16C-NEXT: movzwl (%rdi), %eax
|
|
; CHECK-F16C-NEXT: vmovd %eax, %xmm0
|
|
; CHECK-F16C-NEXT: vcvtph2ps %xmm0, %xmm0
|
|
; CHECK-F16C-NEXT: retq
|
|
;
|
|
; CHECK-FP16-LABEL: extendhfsf:
|
|
; CHECK-FP16: ## %bb.0:
|
|
; CHECK-FP16-NEXT: vmovsh (%rdi), %xmm0
|
|
; CHECK-FP16-NEXT: vcvtsh2ss %xmm0, %xmm0, %xmm0
|
|
; CHECK-FP16-NEXT: retq
|
|
|
|
|
|
|
|
%in = load half, ptr %ptr
|
|
%float = fpext half %in to float
|
|
ret float %float
|
|
}
|
|
|
|
define void @strict_truncsfhf(float %in, ptr %ptr) nounwind strictfp {
|
|
; CHECK-SOFT-LABEL: strict_truncsfhf:
|
|
; CHECK-SOFT: ## %bb.0:
|
|
; CHECK-SOFT-NEXT: pushq %rbx
|
|
; CHECK-SOFT-NEXT: movq %rdi, %rbx
|
|
; CHECK-SOFT-NEXT: callq ___truncsfhf2
|
|
; CHECK-SOFT-NEXT: movw %ax, (%rbx)
|
|
; CHECK-SOFT-NEXT: popq %rbx
|
|
; CHECK-SOFT-NEXT: retq
|
|
;
|
|
; CHECK-F16C-LABEL: strict_truncsfhf:
|
|
; CHECK-F16C: ## %bb.0:
|
|
; CHECK-F16C-NEXT: vxorps %xmm1, %xmm1, %xmm1
|
|
; CHECK-F16C-NEXT: vblendps {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3]
|
|
; CHECK-F16C-NEXT: vcvtps2ph $4, %xmm0, %xmm0
|
|
; CHECK-F16C-NEXT: vmovd %xmm0, %eax
|
|
; CHECK-F16C-NEXT: movw %ax, (%rdi)
|
|
; CHECK-F16C-NEXT: retq
|
|
;
|
|
; CHECK-FP16-LABEL: strict_truncsfhf:
|
|
; CHECK-FP16: ## %bb.0:
|
|
; CHECK-FP16-NEXT: vcvtss2sh %xmm0, %xmm0, %xmm0
|
|
; CHECK-FP16-NEXT: vmovsh %xmm0, (%rdi)
|
|
; CHECK-FP16-NEXT: retq
|
|
|
|
|
|
|
|
%half = call half @llvm.experimental.constrained.fptrunc.f16.f32(float %in, metadata !"round.tonearest", metadata !"fpexcept.strict")
|
|
store half %half, ptr %ptr
|
|
ret void
|
|
}
|
|
|
|
define void @strict_truncdfhf(double %in, ptr %ptr) nounwind strictfp {
|
|
; CHECK-SOFT-LABEL: strict_truncdfhf:
|
|
; CHECK-SOFT: ## %bb.0:
|
|
; CHECK-SOFT-NEXT: pushq %rbx
|
|
; CHECK-SOFT-NEXT: movq %rdi, %rbx
|
|
; CHECK-SOFT-NEXT: callq ___truncdfhf2
|
|
; CHECK-SOFT-NEXT: movw %ax, (%rbx)
|
|
; CHECK-SOFT-NEXT: popq %rbx
|
|
; CHECK-SOFT-NEXT: retq
|
|
;
|
|
; CHECK-F16C-LABEL: strict_truncdfhf:
|
|
; CHECK-F16C: ## %bb.0:
|
|
; CHECK-F16C-NEXT: pushq %rbx
|
|
; CHECK-F16C-NEXT: movq %rdi, %rbx
|
|
; CHECK-F16C-NEXT: callq ___truncdfhf2
|
|
; CHECK-F16C-NEXT: movw %ax, (%rbx)
|
|
; CHECK-F16C-NEXT: popq %rbx
|
|
; CHECK-F16C-NEXT: retq
|
|
;
|
|
; CHECK-FP16-LABEL: strict_truncdfhf:
|
|
; CHECK-FP16: ## %bb.0:
|
|
; CHECK-FP16-NEXT: vcvtsd2sh %xmm0, %xmm0, %xmm0
|
|
; CHECK-FP16-NEXT: vmovsh %xmm0, (%rdi)
|
|
; CHECK-FP16-NEXT: retq
|
|
|
|
|
|
%half = call half @llvm.experimental.constrained.fptrunc.f16.f64(double %in, metadata !"round.tonearest", metadata !"fpexcept.strict")
|
|
store half %half, ptr %ptr
|
|
ret void
|
|
}
|
|
|
|
define float @strict_extendhfsf(ptr %ptr) nounwind strictfp {
|
|
; CHECK-SOFT-LABEL: strict_extendhfsf:
|
|
; CHECK-SOFT: ## %bb.0:
|
|
; CHECK-SOFT-NEXT: pushq %rax
|
|
; CHECK-SOFT-NEXT: movzwl (%rdi), %edi
|
|
; CHECK-SOFT-NEXT: callq ___extendhfsf2
|
|
; CHECK-SOFT-NEXT: popq %rax
|
|
; CHECK-SOFT-NEXT: retq
|
|
;
|
|
; CHECK-F16C-LABEL: strict_extendhfsf:
|
|
; CHECK-F16C: ## %bb.0:
|
|
; CHECK-F16C-NEXT: movzwl (%rdi), %eax
|
|
; CHECK-F16C-NEXT: vmovd %eax, %xmm0
|
|
; CHECK-F16C-NEXT: vcvtph2ps %xmm0, %xmm0
|
|
; CHECK-F16C-NEXT: retq
|
|
;
|
|
; CHECK-FP16-LABEL: strict_extendhfsf:
|
|
; CHECK-FP16: ## %bb.0:
|
|
; CHECK-FP16-NEXT: vmovsh (%rdi), %xmm0
|
|
; CHECK-FP16-NEXT: vcvtsh2ss %xmm0, %xmm0, %xmm0
|
|
; CHECK-FP16-NEXT: retq
|
|
|
|
|
|
%in = load half, ptr %ptr
|
|
%float = call float @llvm.experimental.constrained.fpext.f32.f16(half %in, metadata !"fpexcept.strict")
|
|
ret float %float
|
|
}
|
|
|
|
declare half @llvm.experimental.constrained.fptrunc.f16.f32(float, metadata, metadata)
|
|
declare half @llvm.experimental.constrained.fptrunc.f16.f64(double, metadata, metadata)
|
|
declare float @llvm.experimental.constrained.fpext.f32.f16(half, metadata)
|