[NFC][AArch64] update tests for is_fpclass (#187336)

Hopefully this is better.

One wrinkle is that `@llvm.is.fpclass.bf16` is not currently implemented
for GI. That might be easy to add but I've not been able to figure out
where the issue is exactly so far.

I'm also not totally sure `-mattr=-fp-armv8` is equivalent to softfloat,
but some tests do suggest that they are equivalent (and looking at the
assembly, that seems right).
This commit is contained in:
Folkert de Vries 2026-03-29 14:57:56 +02:00 committed by GitHub
parent 4151f5d36f
commit 2e6e36b173
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 671 additions and 213 deletions

View File

@ -0,0 +1,112 @@
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 6
; RUN: llc -mtriple=aarch64 -verify-machineinstrs -global-isel=0 %s -o - | FileCheck %s --check-prefixes=CHECK,CHECK-SD
; RUN: llc -mtriple=aarch64 -verify-machineinstrs -mattr=-fp-armv8 %s -o - | FileCheck %s --check-prefix=CHECK-NOFP
define i1 @isfinite_bf16(bfloat %x) {
; CHECK-LABEL: isfinite_bf16:
; CHECK: // %bb.0: // %entry
; CHECK-NEXT: // kill: def $h0 killed $h0 def $s0
; CHECK-NEXT: fmov w9, s0
; CHECK-NEXT: mov w8, #32640 // =0x7f80
; CHECK-NEXT: and w9, w9, #0x7fff
; CHECK-NEXT: cmp w9, w8
; CHECK-NEXT: cset w0, lt
; CHECK-NEXT: ret
;
; CHECK-NOFP-LABEL: isfinite_bf16:
; CHECK-NOFP: // %bb.0: // %entry
; CHECK-NOFP-NEXT: mov w8, #32640 // =0x7f80
; CHECK-NOFP-NEXT: and w9, w0, #0x7fff
; CHECK-NOFP-NEXT: cmp w9, w8
; CHECK-NOFP-NEXT: cset w0, lt
; CHECK-NOFP-NEXT: ret
entry:
%0 = tail call i1 @llvm.is.fpclass.bf16(bfloat %x, i32 504) ; 0x1f8 = "finite"
ret i1 %0
}
define i1 @not_isfinite_bf16(bfloat %x) {
; CHECK-LABEL: not_isfinite_bf16:
; CHECK: // %bb.0: // %entry
; CHECK-NEXT: // kill: def $h0 killed $h0 def $s0
; CHECK-NEXT: fmov w9, s0
; CHECK-NEXT: mov w8, #32639 // =0x7f7f
; CHECK-NEXT: and w9, w9, #0x7fff
; CHECK-NEXT: cmp w9, w8
; CHECK-NEXT: cset w0, gt
; CHECK-NEXT: ret
;
; CHECK-NOFP-LABEL: not_isfinite_bf16:
; CHECK-NOFP: // %bb.0: // %entry
; CHECK-NOFP-NEXT: mov w8, #32639 // =0x7f7f
; CHECK-NOFP-NEXT: and w9, w0, #0x7fff
; CHECK-NOFP-NEXT: cmp w9, w8
; CHECK-NOFP-NEXT: cset w0, gt
; CHECK-NOFP-NEXT: ret
entry:
%0 = tail call i1 @llvm.is.fpclass.bf16(bfloat %x, i32 519) ; ~0x1f8 = "~finite"
ret i1 %0
}
define <4 x i1> @isfinite_v4bf16(<4 x bfloat> %x) {
; CHECK-LABEL: isfinite_v4bf16:
; CHECK: // %bb.0: // %entry
; CHECK-NEXT: mov w8, #32640 // =0x7f80
; CHECK-NEXT: bic v0.4h, #128, lsl #8
; CHECK-NEXT: dup v1.4h, w8
; CHECK-NEXT: cmgt v0.4h, v1.4h, v0.4h
; CHECK-NEXT: ret
;
; CHECK-NOFP-LABEL: isfinite_v4bf16:
; CHECK-NOFP: // %bb.0: // %entry
; CHECK-NOFP-NEXT: mov w8, #32640 // =0x7f80
; CHECK-NOFP-NEXT: and w9, w0, #0x7fff
; CHECK-NOFP-NEXT: cmp w9, w8
; CHECK-NOFP-NEXT: and w9, w1, #0x7fff
; CHECK-NOFP-NEXT: cset w0, lt
; CHECK-NOFP-NEXT: cmp w9, w8
; CHECK-NOFP-NEXT: and w9, w2, #0x7fff
; CHECK-NOFP-NEXT: cset w1, lt
; CHECK-NOFP-NEXT: cmp w9, w8
; CHECK-NOFP-NEXT: and w9, w3, #0x7fff
; CHECK-NOFP-NEXT: cset w2, lt
; CHECK-NOFP-NEXT: cmp w9, w8
; CHECK-NOFP-NEXT: cset w3, lt
; CHECK-NOFP-NEXT: ret
entry:
%0 = tail call <4 x i1> @llvm.is.fpclass.v4bf16(<4 x bfloat> %x, i32 504) ; 0x1f8 = "finite"
ret <4 x i1> %0
}
define <4 x i1> @not_isfinite_v4bf16(<4 x bfloat> %x) {
; CHECK-LABEL: not_isfinite_v4bf16:
; CHECK: // %bb.0: // %entry
; CHECK-NEXT: mov w8, #32640 // =0x7f80
; CHECK-NEXT: bic v0.4h, #128, lsl #8
; CHECK-NEXT: dup v1.4h, w8
; CHECK-NEXT: cmge v0.4h, v0.4h, v1.4h
; CHECK-NEXT: ret
;
; CHECK-NOFP-LABEL: not_isfinite_v4bf16:
; CHECK-NOFP: // %bb.0: // %entry
; CHECK-NOFP-NEXT: mov w8, #32639 // =0x7f7f
; CHECK-NOFP-NEXT: and w9, w0, #0x7fff
; CHECK-NOFP-NEXT: cmp w9, w8
; CHECK-NOFP-NEXT: and w9, w1, #0x7fff
; CHECK-NOFP-NEXT: cset w0, gt
; CHECK-NOFP-NEXT: cmp w9, w8
; CHECK-NOFP-NEXT: and w9, w2, #0x7fff
; CHECK-NOFP-NEXT: cset w1, gt
; CHECK-NOFP-NEXT: cmp w9, w8
; CHECK-NOFP-NEXT: and w9, w3, #0x7fff
; CHECK-NOFP-NEXT: cset w2, gt
; CHECK-NOFP-NEXT: cmp w9, w8
; CHECK-NOFP-NEXT: cset w3, gt
; CHECK-NOFP-NEXT: ret
entry:
%0 = tail call <4 x i1> @llvm.is.fpclass.v4bf16(<4 x bfloat> %x, i32 519) ; ~0x1f8 = "~finite"
ret <4 x i1> %0
}
;; NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line:
; CHECK-SD: {{.*}}

View File

@ -1,60 +1,135 @@
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 6
; RUN: llc -mtriple=aarch64 -verify-machineinstrs %s -o - | FileCheck %s --check-prefixes=CHECK,CHECK-SD
; RUN: llc -mtriple=aarch64 -global-isel=0 < %s | FileCheck %s --check-prefixes=CHECK,CHECK-GI
; RUN: llc -mtriple=aarch64 -verify-machineinstrs -global-isel=0 %s -o - | FileCheck %s --check-prefixes=CHECK,CHECK-SD
; RUN: llc -mtriple=aarch64 -verify-machineinstrs -global-isel=1 %s -o - | FileCheck %s --check-prefixes=CHECK,CHECK-GI
; RUN: llc -mtriple=aarch64 -verify-machineinstrs -mattr=-fp-armv8 %s -o - | FileCheck %s --check-prefix=CHECK-NOFP
define i1 @isfinite_h(half %x) {
; CHECK-LABEL: isfinite_h:
; CHECK: // %bb.0: // %entry
; CHECK-NEXT: // kill: def $h0 killed $h0 def $s0
; CHECK-NEXT: fmov w9, s0
; CHECK-NEXT: mov w8, #31744 // =0x7c00
; CHECK-NEXT: and w9, w9, #0x7fff
; CHECK-NEXT: cmp w9, w8
; CHECK-NEXT: cset w0, lt
; CHECK-NEXT: ret
; CHECK-SD-LABEL: isfinite_h:
; CHECK-SD: // %bb.0: // %entry
; CHECK-SD-NEXT: // kill: def $h0 killed $h0 def $s0
; CHECK-SD-NEXT: fmov w9, s0
; CHECK-SD-NEXT: mov w8, #31744 // =0x7c00
; CHECK-SD-NEXT: and w9, w9, #0x7fff
; CHECK-SD-NEXT: cmp w9, w8
; CHECK-SD-NEXT: cset w0, lt
; CHECK-SD-NEXT: ret
;
; CHECK-GI-LABEL: isfinite_h:
; CHECK-GI: // %bb.0: // %entry
; CHECK-GI-NEXT: // kill: def $h0 killed $h0 def $s0
; CHECK-GI-NEXT: fmov w9, s0
; CHECK-GI-NEXT: mov w8, #31744 // =0x7c00
; CHECK-GI-NEXT: and w9, w9, #0x7fff
; CHECK-GI-NEXT: cmp w9, w8
; CHECK-GI-NEXT: cset w0, lo
; CHECK-GI-NEXT: ret
;
; CHECK-NOFP-LABEL: isfinite_h:
; CHECK-NOFP: // %bb.0: // %entry
; CHECK-NOFP-NEXT: mov w8, #31744 // =0x7c00
; CHECK-NOFP-NEXT: and w9, w0, #0x7fff
; CHECK-NOFP-NEXT: cmp w9, w8
; CHECK-NOFP-NEXT: cset w0, lt
; CHECK-NOFP-NEXT: ret
entry:
%0 = tail call i1 @llvm.is.fpclass.f16(half %x, i32 504) ; 0x1f8 = "finite"
ret i1 %0
}
define i1 @not_isfinite_h(half %x) {
; CHECK-LABEL: not_isfinite_h:
; CHECK: // %bb.0: // %entry
; CHECK-NEXT: // kill: def $h0 killed $h0 def $s0
; CHECK-NEXT: fmov w9, s0
; CHECK-NEXT: mov w8, #31743 // =0x7bff
; CHECK-NEXT: and w9, w9, #0x7fff
; CHECK-NEXT: cmp w9, w8
; CHECK-NEXT: cset w0, gt
; CHECK-NEXT: ret
; CHECK-SD-LABEL: not_isfinite_h:
; CHECK-SD: // %bb.0: // %entry
; CHECK-SD-NEXT: // kill: def $h0 killed $h0 def $s0
; CHECK-SD-NEXT: fmov w9, s0
; CHECK-SD-NEXT: mov w8, #31743 // =0x7bff
; CHECK-SD-NEXT: and w9, w9, #0x7fff
; CHECK-SD-NEXT: cmp w9, w8
; CHECK-SD-NEXT: cset w0, gt
; CHECK-SD-NEXT: ret
;
; CHECK-GI-LABEL: not_isfinite_h:
; CHECK-GI: // %bb.0: // %entry
; CHECK-GI-NEXT: // kill: def $h0 killed $h0 def $s0
; CHECK-GI-NEXT: fmov w9, s0
; CHECK-GI-NEXT: mov w8, #31744 // =0x7c00
; CHECK-GI-NEXT: and w9, w9, #0x7fff
; CHECK-GI-NEXT: cmp w9, w8
; CHECK-GI-NEXT: cset w8, eq
; CHECK-GI-NEXT: cset w9, hi
; CHECK-GI-NEXT: orr w0, w8, w9
; CHECK-GI-NEXT: ret
;
; CHECK-NOFP-LABEL: not_isfinite_h:
; CHECK-NOFP: // %bb.0: // %entry
; CHECK-NOFP-NEXT: mov w8, #31743 // =0x7bff
; CHECK-NOFP-NEXT: and w9, w0, #0x7fff
; CHECK-NOFP-NEXT: cmp w9, w8
; CHECK-NOFP-NEXT: cset w0, gt
; CHECK-NOFP-NEXT: ret
entry:
%0 = tail call i1 @llvm.is.fpclass.f16(half %x, i32 519) ; ~0x1f8 = "~finite"
ret i1 %0
}
define i1 @isfinite_f(float %x) {
; CHECK-LABEL: isfinite_f:
; CHECK: // %bb.0: // %entry
; CHECK-NEXT: fmov w9, s0
; CHECK-NEXT: mov w8, #2139095040 // =0x7f800000
; CHECK-NEXT: and w9, w9, #0x7fffffff
; CHECK-NEXT: cmp w9, w8
; CHECK-NEXT: cset w0, lt
; CHECK-NEXT: ret
; CHECK-SD-LABEL: isfinite_f:
; CHECK-SD: // %bb.0: // %entry
; CHECK-SD-NEXT: fmov w9, s0
; CHECK-SD-NEXT: mov w8, #2139095040 // =0x7f800000
; CHECK-SD-NEXT: and w9, w9, #0x7fffffff
; CHECK-SD-NEXT: cmp w9, w8
; CHECK-SD-NEXT: cset w0, lt
; CHECK-SD-NEXT: ret
;
; CHECK-GI-LABEL: isfinite_f:
; CHECK-GI: // %bb.0: // %entry
; CHECK-GI-NEXT: fmov w9, s0
; CHECK-GI-NEXT: mov w8, #2139095040 // =0x7f800000
; CHECK-GI-NEXT: and w9, w9, #0x7fffffff
; CHECK-GI-NEXT: cmp w9, w8
; CHECK-GI-NEXT: cset w0, lo
; CHECK-GI-NEXT: ret
;
; CHECK-NOFP-LABEL: isfinite_f:
; CHECK-NOFP: // %bb.0: // %entry
; CHECK-NOFP-NEXT: mov w8, #2139095040 // =0x7f800000
; CHECK-NOFP-NEXT: and w9, w0, #0x7fffffff
; CHECK-NOFP-NEXT: cmp w9, w8
; CHECK-NOFP-NEXT: cset w0, lt
; CHECK-NOFP-NEXT: ret
entry:
%0 = tail call i1 @llvm.is.fpclass.f32(float %x, i32 504) ; 0x1f8 = "finite"
ret i1 %0
}
define i1 @not_isfinite_f(float %x) {
; CHECK-LABEL: not_isfinite_f:
; CHECK: // %bb.0: // %entry
; CHECK-NEXT: fmov w9, s0
; CHECK-NEXT: mov w8, #2139095039 // =0x7f7fffff
; CHECK-NEXT: and w9, w9, #0x7fffffff
; CHECK-NEXT: cmp w9, w8
; CHECK-NEXT: cset w0, gt
; CHECK-NEXT: ret
; CHECK-SD-LABEL: not_isfinite_f:
; CHECK-SD: // %bb.0: // %entry
; CHECK-SD-NEXT: fmov w9, s0
; CHECK-SD-NEXT: mov w8, #2139095039 // =0x7f7fffff
; CHECK-SD-NEXT: and w9, w9, #0x7fffffff
; CHECK-SD-NEXT: cmp w9, w8
; CHECK-SD-NEXT: cset w0, gt
; CHECK-SD-NEXT: ret
;
; CHECK-GI-LABEL: not_isfinite_f:
; CHECK-GI: // %bb.0: // %entry
; CHECK-GI-NEXT: fmov w9, s0
; CHECK-GI-NEXT: mov w8, #2139095040 // =0x7f800000
; CHECK-GI-NEXT: and w9, w9, #0x7fffffff
; CHECK-GI-NEXT: cmp w9, w8
; CHECK-GI-NEXT: cset w8, eq
; CHECK-GI-NEXT: cset w9, hi
; CHECK-GI-NEXT: orr w0, w8, w9
; CHECK-GI-NEXT: ret
;
; CHECK-NOFP-LABEL: not_isfinite_f:
; CHECK-NOFP: // %bb.0: // %entry
; CHECK-NOFP-NEXT: mov w8, #2139095039 // =0x7f7fffff
; CHECK-NOFP-NEXT: and w9, w0, #0x7fffffff
; CHECK-NOFP-NEXT: cmp w9, w8
; CHECK-NOFP-NEXT: cset w0, gt
; CHECK-NOFP-NEXT: ret
entry:
%0 = tail call i1 @llvm.is.fpclass.f32(float %x, i32 519) ; ~0x1f8 = "~finite"
ret i1 %0
@ -62,28 +137,64 @@ entry:
define i1 @isfinite_f_strictfp(float %x) strictfp {
; CHECK-LABEL: isfinite_f_strictfp:
; CHECK: // %bb.0: // %entry
; CHECK-NEXT: fmov w9, s0
; CHECK-NEXT: mov w8, #2139095040 // =0x7f800000
; CHECK-NEXT: and w9, w9, #0x7fffffff
; CHECK-NEXT: cmp w9, w8
; CHECK-NEXT: cset w0, lt
; CHECK-NEXT: ret
; CHECK-SD-LABEL: isfinite_f_strictfp:
; CHECK-SD: // %bb.0: // %entry
; CHECK-SD-NEXT: fmov w9, s0
; CHECK-SD-NEXT: mov w8, #2139095040 // =0x7f800000
; CHECK-SD-NEXT: and w9, w9, #0x7fffffff
; CHECK-SD-NEXT: cmp w9, w8
; CHECK-SD-NEXT: cset w0, lt
; CHECK-SD-NEXT: ret
;
; CHECK-GI-LABEL: isfinite_f_strictfp:
; CHECK-GI: // %bb.0: // %entry
; CHECK-GI-NEXT: fmov w9, s0
; CHECK-GI-NEXT: mov w8, #2139095040 // =0x7f800000
; CHECK-GI-NEXT: and w9, w9, #0x7fffffff
; CHECK-GI-NEXT: cmp w9, w8
; CHECK-GI-NEXT: cset w0, lo
; CHECK-GI-NEXT: ret
;
; CHECK-NOFP-LABEL: isfinite_f_strictfp:
; CHECK-NOFP: // %bb.0: // %entry
; CHECK-NOFP-NEXT: mov w8, #2139095040 // =0x7f800000
; CHECK-NOFP-NEXT: and w9, w0, #0x7fffffff
; CHECK-NOFP-NEXT: cmp w9, w8
; CHECK-NOFP-NEXT: cset w0, lt
; CHECK-NOFP-NEXT: ret
entry:
%0 = tail call i1 @llvm.is.fpclass.f32(float %x, i32 504) strictfp ; 0x1f8 = "finite"
ret i1 %0
}
define i1 @not_isfinite_f_strictfp(float %x) strictfp {
; CHECK-LABEL: not_isfinite_f_strictfp:
; CHECK: // %bb.0: // %entry
; CHECK-NEXT: fmov w9, s0
; CHECK-NEXT: mov w8, #2139095039 // =0x7f7fffff
; CHECK-NEXT: and w9, w9, #0x7fffffff
; CHECK-NEXT: cmp w9, w8
; CHECK-NEXT: cset w0, gt
; CHECK-NEXT: ret
; CHECK-SD-LABEL: not_isfinite_f_strictfp:
; CHECK-SD: // %bb.0: // %entry
; CHECK-SD-NEXT: fmov w9, s0
; CHECK-SD-NEXT: mov w8, #2139095039 // =0x7f7fffff
; CHECK-SD-NEXT: and w9, w9, #0x7fffffff
; CHECK-SD-NEXT: cmp w9, w8
; CHECK-SD-NEXT: cset w0, gt
; CHECK-SD-NEXT: ret
;
; CHECK-GI-LABEL: not_isfinite_f_strictfp:
; CHECK-GI: // %bb.0: // %entry
; CHECK-GI-NEXT: fmov w9, s0
; CHECK-GI-NEXT: mov w8, #2139095040 // =0x7f800000
; CHECK-GI-NEXT: and w9, w9, #0x7fffffff
; CHECK-GI-NEXT: cmp w9, w8
; CHECK-GI-NEXT: cset w8, eq
; CHECK-GI-NEXT: cset w9, hi
; CHECK-GI-NEXT: orr w0, w8, w9
; CHECK-GI-NEXT: ret
;
; CHECK-NOFP-LABEL: not_isfinite_f_strictfp:
; CHECK-NOFP: // %bb.0: // %entry
; CHECK-NOFP-NEXT: mov w8, #2139095039 // =0x7f7fffff
; CHECK-NOFP-NEXT: and w9, w0, #0x7fffffff
; CHECK-NOFP-NEXT: cmp w9, w8
; CHECK-NOFP-NEXT: cset w0, gt
; CHECK-NOFP-NEXT: ret
entry:
%0 = tail call i1 @llvm.is.fpclass.f32(float %x, i32 519) strictfp ; ~0x1f8 = ~"finite"
ret i1 %0
@ -91,236 +202,471 @@ entry:
define i1 @isfinite_d(double %x) {
; CHECK-LABEL: isfinite_d:
; CHECK: // %bb.0: // %entry
; CHECK-NEXT: fmov x9, d0
; CHECK-NEXT: mov x8, #9218868437227405312 // =0x7ff0000000000000
; CHECK-NEXT: and x9, x9, #0x7fffffffffffffff
; CHECK-NEXT: cmp x9, x8
; CHECK-NEXT: cset w0, lt
; CHECK-NEXT: ret
; CHECK-SD-LABEL: isfinite_d:
; CHECK-SD: // %bb.0: // %entry
; CHECK-SD-NEXT: fmov x9, d0
; CHECK-SD-NEXT: mov x8, #9218868437227405312 // =0x7ff0000000000000
; CHECK-SD-NEXT: and x9, x9, #0x7fffffffffffffff
; CHECK-SD-NEXT: cmp x9, x8
; CHECK-SD-NEXT: cset w0, lt
; CHECK-SD-NEXT: ret
;
; CHECK-GI-LABEL: isfinite_d:
; CHECK-GI: // %bb.0: // %entry
; CHECK-GI-NEXT: fmov x9, d0
; CHECK-GI-NEXT: mov x8, #9218868437227405312 // =0x7ff0000000000000
; CHECK-GI-NEXT: and x9, x9, #0x7fffffffffffffff
; CHECK-GI-NEXT: cmp x9, x8
; CHECK-GI-NEXT: cset w0, lo
; CHECK-GI-NEXT: ret
;
; CHECK-NOFP-LABEL: isfinite_d:
; CHECK-NOFP: // %bb.0: // %entry
; CHECK-NOFP-NEXT: mov x8, #9218868437227405312 // =0x7ff0000000000000
; CHECK-NOFP-NEXT: and x9, x0, #0x7fffffffffffffff
; CHECK-NOFP-NEXT: cmp x9, x8
; CHECK-NOFP-NEXT: cset w0, lt
; CHECK-NOFP-NEXT: ret
entry:
%0 = tail call i1 @llvm.is.fpclass.f64(double %x, i32 504) ; 0x1f8 = "finite"
ret i1 %0
}
define i1 @not_isfinite_d(double %x) {
; CHECK-LABEL: not_isfinite_d:
; CHECK: // %bb.0: // %entry
; CHECK-NEXT: fmov x9, d0
; CHECK-NEXT: mov x8, #9218868437227405311 // =0x7fefffffffffffff
; CHECK-NEXT: and x9, x9, #0x7fffffffffffffff
; CHECK-NEXT: cmp x9, x8
; CHECK-NEXT: cset w0, gt
; CHECK-NEXT: ret
; CHECK-SD-LABEL: not_isfinite_d:
; CHECK-SD: // %bb.0: // %entry
; CHECK-SD-NEXT: fmov x9, d0
; CHECK-SD-NEXT: mov x8, #9218868437227405311 // =0x7fefffffffffffff
; CHECK-SD-NEXT: and x9, x9, #0x7fffffffffffffff
; CHECK-SD-NEXT: cmp x9, x8
; CHECK-SD-NEXT: cset w0, gt
; CHECK-SD-NEXT: ret
;
; CHECK-GI-LABEL: not_isfinite_d:
; CHECK-GI: // %bb.0: // %entry
; CHECK-GI-NEXT: fmov x9, d0
; CHECK-GI-NEXT: mov x8, #9218868437227405312 // =0x7ff0000000000000
; CHECK-GI-NEXT: and x9, x9, #0x7fffffffffffffff
; CHECK-GI-NEXT: cmp x9, x8
; CHECK-GI-NEXT: cset w8, eq
; CHECK-GI-NEXT: cset w9, hi
; CHECK-GI-NEXT: orr w0, w8, w9
; CHECK-GI-NEXT: ret
;
; CHECK-NOFP-LABEL: not_isfinite_d:
; CHECK-NOFP: // %bb.0: // %entry
; CHECK-NOFP-NEXT: mov x8, #9218868437227405311 // =0x7fefffffffffffff
; CHECK-NOFP-NEXT: and x9, x0, #0x7fffffffffffffff
; CHECK-NOFP-NEXT: cmp x9, x8
; CHECK-NOFP-NEXT: cset w0, gt
; CHECK-NOFP-NEXT: ret
entry:
%0 = tail call i1 @llvm.is.fpclass.f64(double %x, i32 519) ; ~0x1f8 = "~finite"
ret i1 %0
}
define i1 @isfinite_d_strictfp(double %x) {
; CHECK-LABEL: isfinite_d_strictfp:
; CHECK: // %bb.0: // %entry
; CHECK-NEXT: fmov x9, d0
; CHECK-NEXT: mov x8, #9218868437227405312 // =0x7ff0000000000000
; CHECK-NEXT: and x9, x9, #0x7fffffffffffffff
; CHECK-NEXT: cmp x9, x8
; CHECK-NEXT: cset w0, lt
; CHECK-NEXT: ret
; CHECK-SD-LABEL: isfinite_d_strictfp:
; CHECK-SD: // %bb.0: // %entry
; CHECK-SD-NEXT: fmov x9, d0
; CHECK-SD-NEXT: mov x8, #9218868437227405312 // =0x7ff0000000000000
; CHECK-SD-NEXT: and x9, x9, #0x7fffffffffffffff
; CHECK-SD-NEXT: cmp x9, x8
; CHECK-SD-NEXT: cset w0, lt
; CHECK-SD-NEXT: ret
;
; CHECK-GI-LABEL: isfinite_d_strictfp:
; CHECK-GI: // %bb.0: // %entry
; CHECK-GI-NEXT: fmov x9, d0
; CHECK-GI-NEXT: mov x8, #9218868437227405312 // =0x7ff0000000000000
; CHECK-GI-NEXT: and x9, x9, #0x7fffffffffffffff
; CHECK-GI-NEXT: cmp x9, x8
; CHECK-GI-NEXT: cset w0, lo
; CHECK-GI-NEXT: ret
;
; CHECK-NOFP-LABEL: isfinite_d_strictfp:
; CHECK-NOFP: // %bb.0: // %entry
; CHECK-NOFP-NEXT: mov x8, #9218868437227405312 // =0x7ff0000000000000
; CHECK-NOFP-NEXT: and x9, x0, #0x7fffffffffffffff
; CHECK-NOFP-NEXT: cmp x9, x8
; CHECK-NOFP-NEXT: cset w0, lt
; CHECK-NOFP-NEXT: ret
entry:
%0 = tail call i1 @llvm.is.fpclass.f64(double %x, i32 504) strictfp ; 0x1f8 = "finite"
ret i1 %0
}
define i1 @not_isfinite_d_strictfp(double %x) {
; CHECK-LABEL: not_isfinite_d_strictfp:
; CHECK: // %bb.0: // %entry
; CHECK-NEXT: fmov x9, d0
; CHECK-NEXT: mov x8, #9218868437227405311 // =0x7fefffffffffffff
; CHECK-NEXT: and x9, x9, #0x7fffffffffffffff
; CHECK-NEXT: cmp x9, x8
; CHECK-NEXT: cset w0, gt
; CHECK-NEXT: ret
; CHECK-SD-LABEL: not_isfinite_d_strictfp:
; CHECK-SD: // %bb.0: // %entry
; CHECK-SD-NEXT: fmov x9, d0
; CHECK-SD-NEXT: mov x8, #9218868437227405311 // =0x7fefffffffffffff
; CHECK-SD-NEXT: and x9, x9, #0x7fffffffffffffff
; CHECK-SD-NEXT: cmp x9, x8
; CHECK-SD-NEXT: cset w0, gt
; CHECK-SD-NEXT: ret
;
; CHECK-GI-LABEL: not_isfinite_d_strictfp:
; CHECK-GI: // %bb.0: // %entry
; CHECK-GI-NEXT: fmov x9, d0
; CHECK-GI-NEXT: mov x8, #9218868437227405312 // =0x7ff0000000000000
; CHECK-GI-NEXT: and x9, x9, #0x7fffffffffffffff
; CHECK-GI-NEXT: cmp x9, x8
; CHECK-GI-NEXT: cset w8, eq
; CHECK-GI-NEXT: cset w9, hi
; CHECK-GI-NEXT: orr w0, w8, w9
; CHECK-GI-NEXT: ret
;
; CHECK-NOFP-LABEL: not_isfinite_d_strictfp:
; CHECK-NOFP: // %bb.0: // %entry
; CHECK-NOFP-NEXT: mov x8, #9218868437227405311 // =0x7fefffffffffffff
; CHECK-NOFP-NEXT: and x9, x0, #0x7fffffffffffffff
; CHECK-NOFP-NEXT: cmp x9, x8
; CHECK-NOFP-NEXT: cset w0, gt
; CHECK-NOFP-NEXT: ret
entry:
%0 = tail call i1 @llvm.is.fpclass.f64(double %x, i32 519) strictfp ; ~0x1f8 = "~finite"
ret i1 %0
}
define i1 @isfinite_bf16(bfloat %x) {
; CHECK-LABEL: isfinite_bf16:
; CHECK: // %bb.0: // %entry
; CHECK-NEXT: // kill: def $h0 killed $h0 def $s0
; CHECK-NEXT: fmov w9, s0
; CHECK-NEXT: mov w8, #32640 // =0x7f80
; CHECK-NEXT: and w9, w9, #0x7fff
; CHECK-NEXT: cmp w9, w8
; CHECK-NEXT: cset w0, lt
; CHECK-NEXT: ret
entry:
%0 = tail call i1 @llvm.is.fpclass.bf16(bfloat %x, i32 504) ; 0x1f8 = "finite"
ret i1 %0
}
define i1 @not_isfinite_bf16(bfloat %x) {
; CHECK-LABEL: not_isfinite_bf16:
; CHECK: // %bb.0: // %entry
; CHECK-NEXT: // kill: def $h0 killed $h0 def $s0
; CHECK-NEXT: fmov w9, s0
; CHECK-NEXT: mov w8, #32639 // =0x7f7f
; CHECK-NEXT: and w9, w9, #0x7fff
; CHECK-NEXT: cmp w9, w8
; CHECK-NEXT: cset w0, gt
; CHECK-NEXT: ret
entry:
%0 = tail call i1 @llvm.is.fpclass.bf16(bfloat %x, i32 519) ; ~0x1f8 = "~finite"
ret i1 %0
}
define i1 @isfinite_f128(fp128 %x) {
; CHECK-LABEL: isfinite_f128:
; CHECK: // %bb.0: // %entry
; CHECK-NEXT: str q0, [sp, #-16]!
; CHECK-NEXT: .cfi_def_cfa_offset 16
; CHECK-NEXT: ldr x9, [sp, #8]
; CHECK-NEXT: mov x8, #9223090561878065152 // =0x7fff000000000000
; CHECK-NEXT: and x9, x9, #0x7fffffffffffffff
; CHECK-NEXT: cmp x9, x8
; CHECK-NEXT: cset w0, lt
; CHECK-NEXT: add sp, sp, #16
; CHECK-NEXT: ret
; CHECK-SD-LABEL: isfinite_f128:
; CHECK-SD: // %bb.0: // %entry
; CHECK-SD-NEXT: str q0, [sp, #-16]!
; CHECK-SD-NEXT: .cfi_def_cfa_offset 16
; CHECK-SD-NEXT: ldr x9, [sp, #8]
; CHECK-SD-NEXT: mov x8, #9223090561878065152 // =0x7fff000000000000
; CHECK-SD-NEXT: and x9, x9, #0x7fffffffffffffff
; CHECK-SD-NEXT: cmp x9, x8
; CHECK-SD-NEXT: cset w0, lt
; CHECK-SD-NEXT: add sp, sp, #16
; CHECK-SD-NEXT: ret
;
; CHECK-GI-LABEL: isfinite_f128:
; CHECK-GI: // %bb.0: // %entry
; CHECK-GI-NEXT: mov x9, v0.d[1]
; CHECK-GI-NEXT: mov x8, #9223090561878065152 // =0x7fff000000000000
; CHECK-GI-NEXT: and x9, x9, #0x7fffffffffffffff
; CHECK-GI-NEXT: cmp x9, x8
; CHECK-GI-NEXT: cset w8, lo
; CHECK-GI-NEXT: csel w0, wzr, w8, eq
; CHECK-GI-NEXT: ret
;
; CHECK-NOFP-LABEL: isfinite_f128:
; CHECK-NOFP: // %bb.0: // %entry
; CHECK-NOFP-NEXT: mov x8, #9223090561878065152 // =0x7fff000000000000
; CHECK-NOFP-NEXT: and x9, x1, #0x7fffffffffffffff
; CHECK-NOFP-NEXT: cmp x9, x8
; CHECK-NOFP-NEXT: cset w0, lt
; CHECK-NOFP-NEXT: ret
entry:
%0 = tail call i1 @llvm.is.fpclass.f128(fp128 %x, i32 504) ; 0x1f8 = "finite"
ret i1 %0
}
define i1 @not_isfinite_f128(fp128 %x) {
; CHECK-LABEL: not_isfinite_f128:
; CHECK: // %bb.0: // %entry
; CHECK-NEXT: str q0, [sp, #-16]!
; CHECK-NEXT: .cfi_def_cfa_offset 16
; CHECK-NEXT: ldr x9, [sp, #8]
; CHECK-NEXT: mov x8, #9223090561878065151 // =0x7ffeffffffffffff
; CHECK-NEXT: and x9, x9, #0x7fffffffffffffff
; CHECK-NEXT: cmp x9, x8
; CHECK-NEXT: cset w0, gt
; CHECK-NEXT: add sp, sp, #16
; CHECK-NEXT: ret
; CHECK-SD-LABEL: not_isfinite_f128:
; CHECK-SD: // %bb.0: // %entry
; CHECK-SD-NEXT: str q0, [sp, #-16]!
; CHECK-SD-NEXT: .cfi_def_cfa_offset 16
; CHECK-SD-NEXT: ldr x9, [sp, #8]
; CHECK-SD-NEXT: mov x8, #9223090561878065151 // =0x7ffeffffffffffff
; CHECK-SD-NEXT: and x9, x9, #0x7fffffffffffffff
; CHECK-SD-NEXT: cmp x9, x8
; CHECK-SD-NEXT: cset w0, gt
; CHECK-SD-NEXT: add sp, sp, #16
; CHECK-SD-NEXT: ret
;
; CHECK-GI-LABEL: not_isfinite_f128:
; CHECK-GI: // %bb.0: // %entry
; CHECK-GI-NEXT: mov x9, v0.d[1]
; CHECK-GI-NEXT: fmov x11, d0
; CHECK-GI-NEXT: mov x8, #9223090561878065152 // =0x7fff000000000000
; CHECK-GI-NEXT: and x9, x9, #0x7fffffffffffffff
; CHECK-GI-NEXT: eor x10, x9, #0x7fff000000000000
; CHECK-GI-NEXT: orr x10, x11, x10
; CHECK-GI-NEXT: cmp x10, #0
; CHECK-GI-NEXT: cset w10, eq
; CHECK-GI-NEXT: cmp x11, #0
; CHECK-GI-NEXT: cset w11, hi
; CHECK-GI-NEXT: cmp x9, x8
; CHECK-GI-NEXT: cset w8, hi
; CHECK-GI-NEXT: csel w8, w11, w8, eq
; CHECK-GI-NEXT: orr w0, w10, w8
; CHECK-GI-NEXT: ret
;
; CHECK-NOFP-LABEL: not_isfinite_f128:
; CHECK-NOFP: // %bb.0: // %entry
; CHECK-NOFP-NEXT: mov x8, #9223090561878065151 // =0x7ffeffffffffffff
; CHECK-NOFP-NEXT: and x9, x1, #0x7fffffffffffffff
; CHECK-NOFP-NEXT: cmp x9, x8
; CHECK-NOFP-NEXT: cset w0, gt
; CHECK-NOFP-NEXT: ret
entry:
%0 = tail call i1 @llvm.is.fpclass.f128(fp128 %x, i32 519) ; ~0x1f8 = "~finite"
ret i1 %0
}
define <4 x i1> @isfinite_v4h(<4 x half> %x) {
; CHECK-LABEL: isfinite_v4h:
; CHECK: // %bb.0: // %entry
; CHECK-NEXT: movi v1.4h, #124, lsl #8
; CHECK-NEXT: bic v0.4h, #128, lsl #8
; CHECK-NEXT: cmgt v0.4h, v1.4h, v0.4h
; CHECK-NEXT: ret
; CHECK-SD-LABEL: isfinite_v4h:
; CHECK-SD: // %bb.0: // %entry
; CHECK-SD-NEXT: movi v1.4h, #124, lsl #8
; CHECK-SD-NEXT: bic v0.4h, #128, lsl #8
; CHECK-SD-NEXT: cmgt v0.4h, v1.4h, v0.4h
; CHECK-SD-NEXT: ret
;
; CHECK-GI-LABEL: isfinite_v4h:
; CHECK-GI: // %bb.0: // %entry
; CHECK-GI-NEXT: movi d1, #0000000000000000
; CHECK-GI-NEXT: mvni v2.4h, #128, lsl #8
; CHECK-GI-NEXT: movi v3.4h, #124, lsl #8
; CHECK-GI-NEXT: and v0.8b, v0.8b, v2.8b
; CHECK-GI-NEXT: mov v1.h[1], wzr
; CHECK-GI-NEXT: cmhi v0.4h, v3.4h, v0.4h
; CHECK-GI-NEXT: mov v1.h[2], wzr
; CHECK-GI-NEXT: mov v1.h[3], wzr
; CHECK-GI-NEXT: orr v0.8b, v1.8b, v0.8b
; CHECK-GI-NEXT: ret
;
; CHECK-NOFP-LABEL: isfinite_v4h:
; CHECK-NOFP: // %bb.0: // %entry
; CHECK-NOFP-NEXT: mov w8, #31744 // =0x7c00
; CHECK-NOFP-NEXT: and w9, w0, #0x7fff
; CHECK-NOFP-NEXT: cmp w9, w8
; CHECK-NOFP-NEXT: and w9, w1, #0x7fff
; CHECK-NOFP-NEXT: cset w0, lt
; CHECK-NOFP-NEXT: cmp w9, w8
; CHECK-NOFP-NEXT: and w9, w2, #0x7fff
; CHECK-NOFP-NEXT: cset w1, lt
; CHECK-NOFP-NEXT: cmp w9, w8
; CHECK-NOFP-NEXT: and w9, w3, #0x7fff
; CHECK-NOFP-NEXT: cset w2, lt
; CHECK-NOFP-NEXT: cmp w9, w8
; CHECK-NOFP-NEXT: cset w3, lt
; CHECK-NOFP-NEXT: ret
entry:
%0 = tail call <4 x i1> @llvm.is.fpclass.v4f16(<4 x half> %x, i32 504) ; 0x1f8 = "finite"
ret <4 x i1> %0
}
define <4 x i1> @not_isfinite_v4h(<4 x half> %x) {
; CHECK-LABEL: not_isfinite_v4h:
; CHECK: // %bb.0: // %entry
; CHECK-NEXT: movi v1.4h, #124, lsl #8
; CHECK-NEXT: bic v0.4h, #128, lsl #8
; CHECK-NEXT: cmge v0.4h, v0.4h, v1.4h
; CHECK-NEXT: ret
; CHECK-SD-LABEL: not_isfinite_v4h:
; CHECK-SD: // %bb.0: // %entry
; CHECK-SD-NEXT: movi v1.4h, #124, lsl #8
; CHECK-SD-NEXT: bic v0.4h, #128, lsl #8
; CHECK-SD-NEXT: cmge v0.4h, v0.4h, v1.4h
; CHECK-SD-NEXT: ret
;
; CHECK-GI-LABEL: not_isfinite_v4h:
; CHECK-GI: // %bb.0: // %entry
; CHECK-GI-NEXT: movi d1, #0000000000000000
; CHECK-GI-NEXT: mvni v2.4h, #128, lsl #8
; CHECK-GI-NEXT: movi v3.4h, #124, lsl #8
; CHECK-GI-NEXT: and v0.8b, v0.8b, v2.8b
; CHECK-GI-NEXT: mov v1.h[1], wzr
; CHECK-GI-NEXT: cmeq v2.4h, v0.4h, v3.4h
; CHECK-GI-NEXT: cmhi v0.4h, v0.4h, v3.4h
; CHECK-GI-NEXT: mov v1.h[2], wzr
; CHECK-GI-NEXT: orr v0.8b, v2.8b, v0.8b
; CHECK-GI-NEXT: mov v1.h[3], wzr
; CHECK-GI-NEXT: orr v0.8b, v1.8b, v0.8b
; CHECK-GI-NEXT: ret
;
; CHECK-NOFP-LABEL: not_isfinite_v4h:
; CHECK-NOFP: // %bb.0: // %entry
; CHECK-NOFP-NEXT: mov w8, #31743 // =0x7bff
; CHECK-NOFP-NEXT: and w9, w0, #0x7fff
; CHECK-NOFP-NEXT: cmp w9, w8
; CHECK-NOFP-NEXT: and w9, w1, #0x7fff
; CHECK-NOFP-NEXT: cset w0, gt
; CHECK-NOFP-NEXT: cmp w9, w8
; CHECK-NOFP-NEXT: and w9, w2, #0x7fff
; CHECK-NOFP-NEXT: cset w1, gt
; CHECK-NOFP-NEXT: cmp w9, w8
; CHECK-NOFP-NEXT: and w9, w3, #0x7fff
; CHECK-NOFP-NEXT: cset w2, gt
; CHECK-NOFP-NEXT: cmp w9, w8
; CHECK-NOFP-NEXT: cset w3, gt
; CHECK-NOFP-NEXT: ret
entry:
%0 = tail call <4 x i1> @llvm.is.fpclass.v4f16(<4 x half> %x, i32 519) ; ~0x1f8 = "~finite"
ret <4 x i1> %0
}
define <4 x i1> @isfinite_v4f(<4 x float> %x) {
; CHECK-LABEL: isfinite_v4f:
; CHECK: // %bb.0: // %entry
; CHECK-NEXT: mvni v1.4s, #127, msl #16
; CHECK-NEXT: fabs v0.4s, v0.4s
; CHECK-NEXT: fneg v1.4s, v1.4s
; CHECK-NEXT: fcmgt v2.4s, v0.4s, v1.4s
; CHECK-NEXT: fcmgt v0.4s, v1.4s, v0.4s
; CHECK-NEXT: orr v0.16b, v0.16b, v2.16b
; CHECK-NEXT: xtn v0.4h, v0.4s
; CHECK-NEXT: ret
; CHECK-SD-LABEL: isfinite_v4f:
; CHECK-SD: // %bb.0: // %entry
; CHECK-SD-NEXT: mvni v1.4s, #127, msl #16
; CHECK-SD-NEXT: fabs v0.4s, v0.4s
; CHECK-SD-NEXT: fneg v1.4s, v1.4s
; CHECK-SD-NEXT: fcmgt v2.4s, v0.4s, v1.4s
; CHECK-SD-NEXT: fcmgt v0.4s, v1.4s, v0.4s
; CHECK-SD-NEXT: orr v0.16b, v0.16b, v2.16b
; CHECK-SD-NEXT: xtn v0.4h, v0.4s
; CHECK-SD-NEXT: ret
;
; CHECK-GI-LABEL: isfinite_v4f:
; CHECK-GI: // %bb.0: // %entry
; CHECK-GI-NEXT: movi d1, #0000000000000000
; CHECK-GI-NEXT: mvni v2.4s, #127, msl #16
; CHECK-GI-NEXT: mvni v3.4s, #128, lsl #24
; CHECK-GI-NEXT: fneg v2.4s, v2.4s
; CHECK-GI-NEXT: and v0.16b, v0.16b, v3.16b
; CHECK-GI-NEXT: mov v1.h[1], wzr
; CHECK-GI-NEXT: cmhi v0.4s, v2.4s, v0.4s
; CHECK-GI-NEXT: mov v1.h[2], wzr
; CHECK-GI-NEXT: xtn v0.4h, v0.4s
; CHECK-GI-NEXT: mov v1.h[3], wzr
; CHECK-GI-NEXT: orr v0.8b, v1.8b, v0.8b
; CHECK-GI-NEXT: ret
;
; CHECK-NOFP-LABEL: isfinite_v4f:
; CHECK-NOFP: // %bb.0: // %entry
; CHECK-NOFP-NEXT: mov w8, #2139095040 // =0x7f800000
; CHECK-NOFP-NEXT: and w9, w0, #0x7fffffff
; CHECK-NOFP-NEXT: cmp w9, w8
; CHECK-NOFP-NEXT: and w9, w1, #0x7fffffff
; CHECK-NOFP-NEXT: cset w0, lt
; CHECK-NOFP-NEXT: cmp w9, w8
; CHECK-NOFP-NEXT: and w9, w2, #0x7fffffff
; CHECK-NOFP-NEXT: cset w1, lt
; CHECK-NOFP-NEXT: cmp w9, w8
; CHECK-NOFP-NEXT: and w9, w3, #0x7fffffff
; CHECK-NOFP-NEXT: cset w2, lt
; CHECK-NOFP-NEXT: cmp w9, w8
; CHECK-NOFP-NEXT: cset w3, lt
; CHECK-NOFP-NEXT: ret
entry:
%0 = tail call <4 x i1> @llvm.is.fpclass.v4f32(<4 x float> %x, i32 504) ; 0x1f8 = "finite"
ret <4 x i1> %0
}
define <4 x i1> @not_isfinite_v4f(<4 x float> %x) {
; CHECK-LABEL: not_isfinite_v4f:
; CHECK: // %bb.0: // %entry
; CHECK-NEXT: mvni v1.4s, #127, msl #16
; CHECK-NEXT: bic v0.4s, #128, lsl #24
; CHECK-NEXT: fneg v1.4s, v1.4s
; CHECK-NEXT: cmge v0.4s, v0.4s, v1.4s
; CHECK-NEXT: xtn v0.4h, v0.4s
; CHECK-NEXT: ret
; CHECK-SD-LABEL: not_isfinite_v4f:
; CHECK-SD: // %bb.0: // %entry
; CHECK-SD-NEXT: mvni v1.4s, #127, msl #16
; CHECK-SD-NEXT: bic v0.4s, #128, lsl #24
; CHECK-SD-NEXT: fneg v1.4s, v1.4s
; CHECK-SD-NEXT: cmge v0.4s, v0.4s, v1.4s
; CHECK-SD-NEXT: xtn v0.4h, v0.4s
; CHECK-SD-NEXT: ret
;
; CHECK-GI-LABEL: not_isfinite_v4f:
; CHECK-GI: // %bb.0: // %entry
; CHECK-GI-NEXT: movi d1, #0000000000000000
; CHECK-GI-NEXT: mvni v2.4s, #127, msl #16
; CHECK-GI-NEXT: mvni v3.4s, #128, lsl #24
; CHECK-GI-NEXT: fneg v2.4s, v2.4s
; CHECK-GI-NEXT: and v0.16b, v0.16b, v3.16b
; CHECK-GI-NEXT: mov v1.h[1], wzr
; CHECK-GI-NEXT: cmeq v3.4s, v0.4s, v2.4s
; CHECK-GI-NEXT: cmhi v0.4s, v0.4s, v2.4s
; CHECK-GI-NEXT: mov v1.h[2], wzr
; CHECK-GI-NEXT: xtn v3.4h, v3.4s
; CHECK-GI-NEXT: xtn v0.4h, v0.4s
; CHECK-GI-NEXT: mov v1.h[3], wzr
; CHECK-GI-NEXT: orr v1.8b, v1.8b, v3.8b
; CHECK-GI-NEXT: orr v0.8b, v1.8b, v0.8b
; CHECK-GI-NEXT: ret
;
; CHECK-NOFP-LABEL: not_isfinite_v4f:
; CHECK-NOFP: // %bb.0: // %entry
; CHECK-NOFP-NEXT: mov w8, #2139095039 // =0x7f7fffff
; CHECK-NOFP-NEXT: and w9, w0, #0x7fffffff
; CHECK-NOFP-NEXT: cmp w9, w8
; CHECK-NOFP-NEXT: and w9, w1, #0x7fffffff
; CHECK-NOFP-NEXT: cset w0, gt
; CHECK-NOFP-NEXT: cmp w9, w8
; CHECK-NOFP-NEXT: and w9, w2, #0x7fffffff
; CHECK-NOFP-NEXT: cset w1, gt
; CHECK-NOFP-NEXT: cmp w9, w8
; CHECK-NOFP-NEXT: and w9, w3, #0x7fffffff
; CHECK-NOFP-NEXT: cset w2, gt
; CHECK-NOFP-NEXT: cmp w9, w8
; CHECK-NOFP-NEXT: cset w3, gt
; CHECK-NOFP-NEXT: ret
entry:
%0 = tail call <4 x i1> @llvm.is.fpclass.v4f32(<4 x float> %x, i32 519) ; ~0x1f8 = "~finite"
ret <4 x i1> %0
}
define <2 x i1> @isfinite_v2d(<2 x double> %x) {
; CHECK-LABEL: isfinite_v2d:
; CHECK: // %bb.0: // %entry
; CHECK-NEXT: mov x8, #9218868437227405312 // =0x7ff0000000000000
; CHECK-NEXT: fabs v0.2d, v0.2d
; CHECK-NEXT: dup v1.2d, x8
; CHECK-NEXT: fcmgt v2.2d, v0.2d, v1.2d
; CHECK-NEXT: fcmgt v0.2d, v1.2d, v0.2d
; CHECK-NEXT: orr v0.16b, v0.16b, v2.16b
; CHECK-NEXT: xtn v0.2s, v0.2d
; CHECK-NEXT: ret
; CHECK-SD-LABEL: isfinite_v2d:
; CHECK-SD: // %bb.0: // %entry
; CHECK-SD-NEXT: mov x8, #9218868437227405312 // =0x7ff0000000000000
; CHECK-SD-NEXT: fabs v0.2d, v0.2d
; CHECK-SD-NEXT: dup v1.2d, x8
; CHECK-SD-NEXT: fcmgt v2.2d, v0.2d, v1.2d
; CHECK-SD-NEXT: fcmgt v0.2d, v1.2d, v0.2d
; CHECK-SD-NEXT: orr v0.16b, v0.16b, v2.16b
; CHECK-SD-NEXT: xtn v0.2s, v0.2d
; CHECK-SD-NEXT: ret
;
; CHECK-GI-LABEL: isfinite_v2d:
; CHECK-GI: // %bb.0: // %entry
; CHECK-GI-NEXT: movi v1.2d, #0xffffffffffffffff
; CHECK-GI-NEXT: adrp x8, .LCPI16_0
; CHECK-GI-NEXT: fneg v1.2d, v1.2d
; CHECK-GI-NEXT: and v0.16b, v0.16b, v1.16b
; CHECK-GI-NEXT: ldr q1, [x8, :lo12:.LCPI16_0]
; CHECK-GI-NEXT: cmhi v0.2d, v1.2d, v0.2d
; CHECK-GI-NEXT: xtn v0.2s, v0.2d
; CHECK-GI-NEXT: ret
;
; CHECK-NOFP-LABEL: isfinite_v2d:
; CHECK-NOFP: // %bb.0: // %entry
; CHECK-NOFP-NEXT: mov x8, #9218868437227405312 // =0x7ff0000000000000
; CHECK-NOFP-NEXT: and x9, x0, #0x7fffffffffffffff
; CHECK-NOFP-NEXT: cmp x9, x8
; CHECK-NOFP-NEXT: and x9, x1, #0x7fffffffffffffff
; CHECK-NOFP-NEXT: cset w0, lt
; CHECK-NOFP-NEXT: cmp x9, x8
; CHECK-NOFP-NEXT: cset w1, lt
; CHECK-NOFP-NEXT: ret
entry:
%0 = tail call <2 x i1> @llvm.is.fpclass.v2f64(<2 x double> %x, i32 504) ; 0x1f8 = "finite"
ret <2 x i1> %0
}
define <2 x i1> @not_isfinite_v2d(<2 x double> %x) {
; CHECK-LABEL: not_isfinite_v2d:
; CHECK: // %bb.0: // %entry
; CHECK-NEXT: movi v1.2d, #0xffffffffffffffff
; CHECK-NEXT: mov x8, #9218868437227405312 // =0x7ff0000000000000
; CHECK-NEXT: fneg v1.2d, v1.2d
; CHECK-NEXT: and v0.16b, v0.16b, v1.16b
; CHECK-NEXT: dup v1.2d, x8
; CHECK-NEXT: cmge v0.2d, v0.2d, v1.2d
; CHECK-NEXT: xtn v0.2s, v0.2d
; CHECK-NEXT: ret
; CHECK-SD-LABEL: not_isfinite_v2d:
; CHECK-SD: // %bb.0: // %entry
; CHECK-SD-NEXT: movi v1.2d, #0xffffffffffffffff
; CHECK-SD-NEXT: mov x8, #9218868437227405312 // =0x7ff0000000000000
; CHECK-SD-NEXT: fneg v1.2d, v1.2d
; CHECK-SD-NEXT: and v0.16b, v0.16b, v1.16b
; CHECK-SD-NEXT: dup v1.2d, x8
; CHECK-SD-NEXT: cmge v0.2d, v0.2d, v1.2d
; CHECK-SD-NEXT: xtn v0.2s, v0.2d
; CHECK-SD-NEXT: ret
;
; CHECK-GI-LABEL: not_isfinite_v2d:
; CHECK-GI: // %bb.0: // %entry
; CHECK-GI-NEXT: movi v1.2d, #0xffffffffffffffff
; CHECK-GI-NEXT: adrp x8, .LCPI17_0
; CHECK-GI-NEXT: fneg v1.2d, v1.2d
; CHECK-GI-NEXT: and v0.16b, v0.16b, v1.16b
; CHECK-GI-NEXT: ldr q1, [x8, :lo12:.LCPI17_0]
; CHECK-GI-NEXT: cmeq v2.2d, v0.2d, v1.2d
; CHECK-GI-NEXT: cmhi v0.2d, v0.2d, v1.2d
; CHECK-GI-NEXT: orr v0.16b, v2.16b, v0.16b
; CHECK-GI-NEXT: xtn v0.2s, v0.2d
; CHECK-GI-NEXT: ret
;
; CHECK-NOFP-LABEL: not_isfinite_v2d:
; CHECK-NOFP: // %bb.0: // %entry
; CHECK-NOFP-NEXT: mov x8, #9218868437227405311 // =0x7fefffffffffffff
; CHECK-NOFP-NEXT: and x9, x0, #0x7fffffffffffffff
; CHECK-NOFP-NEXT: cmp x9, x8
; CHECK-NOFP-NEXT: and x9, x1, #0x7fffffffffffffff
; CHECK-NOFP-NEXT: cset w0, gt
; CHECK-NOFP-NEXT: cmp x9, x8
; CHECK-NOFP-NEXT: cset w1, gt
; CHECK-NOFP-NEXT: ret
entry:
%0 = tail call <2 x i1> @llvm.is.fpclass.v2f64(<2 x double> %x, i32 519) ; ~0x1f8 = "~finite"
ret <2 x i1> %0
}
define <4 x i1> @isfinite_v4bf16(<4 x bfloat> %x) {
; CHECK-LABEL: isfinite_v4bf16:
; CHECK: // %bb.0: // %entry
; CHECK-NEXT: mov w8, #32640 // =0x7f80
; CHECK-NEXT: bic v0.4h, #128, lsl #8
; CHECK-NEXT: dup v1.4h, w8
; CHECK-NEXT: cmgt v0.4h, v1.4h, v0.4h
; CHECK-NEXT: ret
entry:
%0 = tail call <4 x i1> @llvm.is.fpclass.v4bf16(<4 x bfloat> %x, i32 504) ; 0x1f8 = "finite"
ret <4 x i1> %0
}
define <4 x i1> @not_isfinite_v4bf16(<4 x bfloat> %x) {
; CHECK-LABEL: not_isfinite_v4bf16:
; CHECK: // %bb.0: // %entry
; CHECK-NEXT: mov w8, #32640 // =0x7f80
; CHECK-NEXT: bic v0.4h, #128, lsl #8
; CHECK-NEXT: dup v1.4h, w8
; CHECK-NEXT: cmge v0.4h, v0.4h, v1.4h
; CHECK-NEXT: ret
entry:
%0 = tail call <4 x i1> @llvm.is.fpclass.v4bf16(<4 x bfloat> %x, i32 519) ; ~0x1f8 = "~finite"
ret <4 x i1> %0
}
;; NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line:
; CHECK-GI: {{.*}}
; CHECK-SD: {{.*}}
; CHECK: {{.*}}