blob: 2795035981e01cda3ccfa3228a9cdd4c1e7d1db7 [file] [log] [blame] [edit]
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5
; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=-sse2,-sse | FileCheck %s --check-prefix=NOSSE
; RUN: llc < %s -mtriple=x86_64-unknown-unknown | FileCheck %s --check-prefix=SSE
@gf = global { float, float } zeroinitializer, align 8
define void @f(<2 x float> noundef nofpclass(nan inf) %e.coerce) {
; NOSSE-LABEL: f:
; NOSSE: # %bb.0: # %entry
; NOSSE-NEXT: flds {{[0-9]+}}(%rsp)
; NOSSE-NEXT: flds {{[0-9]+}}(%rsp)
; NOSSE-NEXT: movq gf@GOTPCREL(%rip), %rax
; NOSSE-NEXT: fstps 4(%rax)
; NOSSE-NEXT: fstps (%rax)
; NOSSE-NEXT: retq
;
; SSE-LABEL: f:
; SSE: # %bb.0: # %entry
; SSE-NEXT: movq gf@GOTPCREL(%rip), %rax
; SSE-NEXT: movlps %xmm0, (%rax)
; SSE-NEXT: retq
entry:
store <2 x float> %e.coerce, ptr @gf, align 8
ret void
}
define i32 @load_metadata(ptr %0) nounwind {
; NOSSE-LABEL: load_metadata:
; NOSSE: # %bb.0:
; NOSSE-NEXT: movl (%rdi), %eax
; NOSSE-NEXT: retq
;
; SSE-LABEL: load_metadata:
; SSE: # %bb.0:
; SSE-NEXT: movl (%rdi), %eax
; SSE-NEXT: retq
%f = load float, ptr %0, align 4, !nofpclass !{i32 3}
%i = bitcast float %f to i32
ret i32 %i
}
define i32 @load_metadata_fmaximumnum(ptr %0, ptr %1) nounwind {
; NOSSE-LABEL: load_metadata_fmaximumnum:
; NOSSE: # %bb.0:
; NOSSE-NEXT: flds (%rdi)
; NOSSE-NEXT: fsts -{{[0-9]+}}(%rsp)
; NOSSE-NEXT: flds (%rsi)
; NOSSE-NEXT: fxch %st(1)
; NOSSE-NEXT: fucomi %st(1), %st
; NOSSE-NEXT: fxch %st(1)
; NOSSE-NEXT: fcmovnbe %st(1), %st
; NOSSE-NEXT: cmpl $0, -{{[0-9]+}}(%rsp)
; NOSSE-NEXT: fld %st(0)
; NOSSE-NEXT: fcmove %st(2), %st
; NOSSE-NEXT: fstp %st(2)
; NOSSE-NEXT: fldz
; NOSSE-NEXT: fxch %st(1)
; NOSSE-NEXT: fucomi %st(1), %st
; NOSSE-NEXT: fstp %st(1)
; NOSSE-NEXT: fcmove %st(1), %st
; NOSSE-NEXT: fstp %st(1)
; NOSSE-NEXT: fstps -{{[0-9]+}}(%rsp)
; NOSSE-NEXT: movl -{{[0-9]+}}(%rsp), %eax
; NOSSE-NEXT: retq
;
; SSE-LABEL: load_metadata_fmaximumnum:
; SSE: # %bb.0:
; SSE-NEXT: movss {{.*#+}} xmm0 = mem[0],zero,zero,zero
; SSE-NEXT: movaps %xmm0, %xmm1
; SSE-NEXT: maxss (%rsi), %xmm1
; SSE-NEXT: orps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
; SSE-NEXT: andps %xmm1, %xmm0
; SSE-NEXT: movd %xmm0, %eax
; SSE-NEXT: retq
%f0 = load float, ptr %0, align 4, !nofpclass !{i32 99} ; 99 == (fcNan | fcZero)
%f1 = load float, ptr %1, align 4, !nofpclass !{i32 99} ; 99 == (fcNan | fcZero)
%min = call float @llvm.maximumnum.f32(float %f0, float %f1);
%i = bitcast float %min to i32
ret i32 %i
}