blob: 971d9e2a6e2b5c3146c22cb300be9804b65f1b9d [file]
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
; RUN: llc < %s -mtriple aarch64 -mattr=-bf16 | FileCheck %s --check-prefixes=CHECK,CHECK-CVT,CHECK-CVT-SD
; RUN: llc < %s -mtriple aarch64 -mattr=+bf16 | FileCheck %s --check-prefixes=CHECK,CHECK-BF16,CHECK-BF16-SD
; RUN: llc < %s -mtriple=aarch64 -mattr=+bf16,+sve | FileCheck %s --check-prefixes=CHECK,CHECK-BF16,CHECK-BF16SVE-SD
; RUN: llc < %s -mtriple aarch64 -mattr=-bf16 -global-isel -global-isel-abort=2 2>&1 | FileCheck %s --check-prefixes=CHECK,CHECK-CVT,CHECK-CVT-GI
; RUN: llc < %s -mtriple aarch64 -mattr=+bf16 -global-isel -global-isel-abort=2 2>&1 | FileCheck %s --check-prefixes=CHECK,CHECK-BF16,CHECK-BF16-GI
; CHECK-CVT-GI: warning: Instruction selection used fallback path for test_fptosi_i8
; CHECK-CVT-GI-NEXT: warning: Instruction selection used fallback path for test_fptosi_v16i8
; CHECK-CVT-GI-NEXT: warning: Instruction selection used fallback path for test_fptosi_i16
; CHECK-CVT-GI-NEXT: warning: Instruction selection used fallback path for test_fptosi_i32
; CHECK-CVT-GI-NEXT: warning: Instruction selection used fallback path for test_fptosi_i64
; CHECK-CVT-GI-NEXT: warning: Instruction selection used fallback path for test_fptoui_i8
; CHECK-CVT-GI-NEXT: warning: Instruction selection used fallback path for test_fptoui_v16i8
; CHECK-CVT-GI-NEXT: warning: Instruction selection used fallback path for test_fptoui_i16
; CHECK-CVT-GI-NEXT: warning: Instruction selection used fallback path for test_fptoui_i32
; CHECK-CVT-GI-NEXT: warning: Instruction selection used fallback path for test_fptoui_i64
; CHECK-CVT-GI-NEXT: warning: Instruction selection used fallback path for test_sitofp_i8
; CHECK-CVT-GI-NEXT: warning: Instruction selection used fallback path for test_sitofp_v16i8
; CHECK-CVT-GI-NEXT: warning: Instruction selection used fallback path for test_sitofp_i16
; CHECK-CVT-GI-NEXT: warning: Instruction selection used fallback path for test_sitofp_i32
; CHECK-CVT-GI-NEXT: warning: Instruction selection used fallback path for test_sitofp_i64
; CHECK-CVT-GI-NEXT: warning: Instruction selection used fallback path for test_uitofp_i8
; CHECK-CVT-GI-NEXT: warning: Instruction selection used fallback path for test_uitofp_v16i8
; CHECK-CVT-GI-NEXT: warning: Instruction selection used fallback path for test_uitofp_i16
; CHECK-CVT-GI-NEXT: warning: Instruction selection used fallback path for test_uitofp_i32
; CHECK-CVT-GI-NEXT: warning: Instruction selection used fallback path for test_uitofp_i64
;
; CHECK-BF16-GI: warning: Instruction selection used fallback path for test_fptosi_i8
; CHECK-BF16-GI-NEXT: warning: Instruction selection used fallback path for test_fptosi_v16i8
; CHECK-BF16-GI-NEXT: warning: Instruction selection used fallback path for test_fptosi_i16
; CHECK-BF16-GI-NEXT: warning: Instruction selection used fallback path for test_fptosi_i32
; CHECK-BF16-GI-NEXT: warning: Instruction selection used fallback path for test_fptosi_i64
; CHECK-BF16-GI-NEXT: warning: Instruction selection used fallback path for test_fptoui_i8
; CHECK-BF16-GI-NEXT: warning: Instruction selection used fallback path for test_fptoui_v16i8
; CHECK-BF16-GI-NEXT: warning: Instruction selection used fallback path for test_fptoui_i16
; CHECK-BF16-GI-NEXT: warning: Instruction selection used fallback path for test_fptoui_i32
; CHECK-BF16-GI-NEXT: warning: Instruction selection used fallback path for test_fptoui_i64
; CHECK-BF16-GI-NEXT: warning: Instruction selection used fallback path for test_sitofp_i8
; CHECK-BF16-GI-NEXT: warning: Instruction selection used fallback path for test_sitofp_v16i8
; CHECK-BF16-GI-NEXT: warning: Instruction selection used fallback path for test_sitofp_i16
; CHECK-BF16-GI-NEXT: warning: Instruction selection used fallback path for test_sitofp_i32
; CHECK-BF16-GI-NEXT: warning: Instruction selection used fallback path for test_sitofp_i64
; CHECK-BF16-GI-NEXT: warning: Instruction selection used fallback path for test_uitofp_i8
; CHECK-BF16-GI-NEXT: warning: Instruction selection used fallback path for test_uitofp_v16i8
; CHECK-BF16-GI-NEXT: warning: Instruction selection used fallback path for test_uitofp_i16
; CHECK-BF16-GI-NEXT: warning: Instruction selection used fallback path for test_uitofp_i32
; CHECK-BF16-GI-NEXT: warning: Instruction selection used fallback path for test_uitofp_i64
;
define <8 x bfloat> @test_build(<8 x bfloat> %a) {
; CHECK-CVT-SD-LABEL: test_build:
; CHECK-CVT-SD: // %bb.0:
; CHECK-CVT-SD-NEXT: mov w8, #15565 // =0x3ccd
; CHECK-CVT-SD-NEXT: dup v0.8h, w8
; CHECK-CVT-SD-NEXT: ret
;
; CHECK-BF16-SD-LABEL: test_build:
; CHECK-BF16-SD: // %bb.0:
; CHECK-BF16-SD-NEXT: mov w8, #15565 // =0x3ccd
; CHECK-BF16-SD-NEXT: dup v0.8h, w8
; CHECK-BF16-SD-NEXT: ret
;
; CHECK-BF16SVE-SD-LABEL: test_build:
; CHECK-BF16SVE-SD: // %bb.0:
; CHECK-BF16SVE-SD-NEXT: mov w8, #15565 // =0x3ccd
; CHECK-BF16SVE-SD-NEXT: dup v0.8h, w8
; CHECK-BF16SVE-SD-NEXT: ret
;
; CHECK-CVT-GI-LABEL: test_build:
; CHECK-CVT-GI: // %bb.0:
; CHECK-CVT-GI-NEXT: adrp x8, .LCPI0_0
; CHECK-CVT-GI-NEXT: ldr q0, [x8, :lo12:.LCPI0_0]
; CHECK-CVT-GI-NEXT: ret
;
; CHECK-BF16-GI-LABEL: test_build:
; CHECK-BF16-GI: // %bb.0:
; CHECK-BF16-GI-NEXT: adrp x8, .LCPI0_0
; CHECK-BF16-GI-NEXT: ldr q0, [x8, :lo12:.LCPI0_0]
; CHECK-BF16-GI-NEXT: ret
ret <8 x bfloat> <bfloat 0xR3CCD, bfloat 0xR3CCD, bfloat 0xR3CCD, bfloat 0xR3CCD, bfloat 0xR3CCD, bfloat 0xR3CCD, bfloat 0xR3CCD, bfloat 0xR3CCD>
}
define <8 x bfloat> @test_fadd(<8 x bfloat> %a, <8 x bfloat> %b) {
; CHECK-CVT-SD-LABEL: test_fadd:
; CHECK-CVT-SD: // %bb.0:
; CHECK-CVT-SD-NEXT: shll v3.4s, v1.4h, #16
; CHECK-CVT-SD-NEXT: shll v4.4s, v0.4h, #16
; CHECK-CVT-SD-NEXT: shll2 v1.4s, v1.8h, #16
; CHECK-CVT-SD-NEXT: shll2 v0.4s, v0.8h, #16
; CHECK-CVT-SD-NEXT: movi v2.4s, #1
; CHECK-CVT-SD-NEXT: movi v5.4s, #127, msl #8
; CHECK-CVT-SD-NEXT: fadd v3.4s, v4.4s, v3.4s
; CHECK-CVT-SD-NEXT: fadd v1.4s, v0.4s, v1.4s
; CHECK-CVT-SD-NEXT: ushr v0.4s, v3.4s, #16
; CHECK-CVT-SD-NEXT: ushr v4.4s, v1.4s, #16
; CHECK-CVT-SD-NEXT: and v0.16b, v0.16b, v2.16b
; CHECK-CVT-SD-NEXT: and v2.16b, v4.16b, v2.16b
; CHECK-CVT-SD-NEXT: add v0.4s, v0.4s, v3.4s
; CHECK-CVT-SD-NEXT: add v1.4s, v2.4s, v1.4s
; CHECK-CVT-SD-NEXT: addhn v0.4h, v0.4s, v5.4s
; CHECK-CVT-SD-NEXT: addhn2 v0.8h, v1.4s, v5.4s
; CHECK-CVT-SD-NEXT: ret
;
; CHECK-BF16-SD-LABEL: test_fadd:
; CHECK-BF16-SD: // %bb.0:
; CHECK-BF16-SD-NEXT: shll v2.4s, v1.4h, #16
; CHECK-BF16-SD-NEXT: shll v3.4s, v0.4h, #16
; CHECK-BF16-SD-NEXT: shll2 v1.4s, v1.8h, #16
; CHECK-BF16-SD-NEXT: shll2 v0.4s, v0.8h, #16
; CHECK-BF16-SD-NEXT: fadd v2.4s, v3.4s, v2.4s
; CHECK-BF16-SD-NEXT: fadd v1.4s, v0.4s, v1.4s
; CHECK-BF16-SD-NEXT: bfcvtn v0.4h, v2.4s
; CHECK-BF16-SD-NEXT: bfcvtn2 v0.8h, v1.4s
; CHECK-BF16-SD-NEXT: ret
;
; CHECK-BF16SVE-SD-LABEL: test_fadd:
; CHECK-BF16SVE-SD: // %bb.0:
; CHECK-BF16SVE-SD-NEXT: shll v2.4s, v1.4h, #16
; CHECK-BF16SVE-SD-NEXT: shll v3.4s, v0.4h, #16
; CHECK-BF16SVE-SD-NEXT: shll2 v1.4s, v1.8h, #16
; CHECK-BF16SVE-SD-NEXT: shll2 v0.4s, v0.8h, #16
; CHECK-BF16SVE-SD-NEXT: fadd v2.4s, v3.4s, v2.4s
; CHECK-BF16SVE-SD-NEXT: fadd v1.4s, v0.4s, v1.4s
; CHECK-BF16SVE-SD-NEXT: bfcvtn v0.4h, v2.4s
; CHECK-BF16SVE-SD-NEXT: bfcvtn2 v0.8h, v1.4s
; CHECK-BF16SVE-SD-NEXT: ret
;
; CHECK-CVT-GI-LABEL: test_fadd:
; CHECK-CVT-GI: // %bb.0:
; CHECK-CVT-GI-NEXT: shll v2.4s, v0.4h, #16
; CHECK-CVT-GI-NEXT: shll v3.4s, v1.4h, #16
; CHECK-CVT-GI-NEXT: shll2 v0.4s, v0.8h, #16
; CHECK-CVT-GI-NEXT: shll2 v1.4s, v1.8h, #16
; CHECK-CVT-GI-NEXT: movi v6.4s, #64, lsl #16
; CHECK-CVT-GI-NEXT: fadd v2.4s, v2.4s, v3.4s
; CHECK-CVT-GI-NEXT: movi v3.4s, #127, msl #8
; CHECK-CVT-GI-NEXT: fadd v0.4s, v0.4s, v1.4s
; CHECK-CVT-GI-NEXT: movi v1.4s, #1
; CHECK-CVT-GI-NEXT: ushr v4.4s, v2.4s, #16
; CHECK-CVT-GI-NEXT: fcmeq v7.4s, v2.4s, v2.4s
; CHECK-CVT-GI-NEXT: add v16.4s, v2.4s, v3.4s
; CHECK-CVT-GI-NEXT: ushr v5.4s, v0.4s, #16
; CHECK-CVT-GI-NEXT: fcmeq v17.4s, v0.4s, v0.4s
; CHECK-CVT-GI-NEXT: add v3.4s, v0.4s, v3.4s
; CHECK-CVT-GI-NEXT: orr v2.16b, v2.16b, v6.16b
; CHECK-CVT-GI-NEXT: orr v0.16b, v0.16b, v6.16b
; CHECK-CVT-GI-NEXT: and v4.16b, v4.16b, v1.16b
; CHECK-CVT-GI-NEXT: and v1.16b, v5.16b, v1.16b
; CHECK-CVT-GI-NEXT: mvn v5.16b, v7.16b
; CHECK-CVT-GI-NEXT: mvn v7.16b, v17.16b
; CHECK-CVT-GI-NEXT: add v4.4s, v16.4s, v4.4s
; CHECK-CVT-GI-NEXT: add v1.4s, v3.4s, v1.4s
; CHECK-CVT-GI-NEXT: bif v2.16b, v4.16b, v5.16b
; CHECK-CVT-GI-NEXT: bit v1.16b, v0.16b, v7.16b
; CHECK-CVT-GI-NEXT: shrn v0.4h, v2.4s, #16
; CHECK-CVT-GI-NEXT: shrn v1.4h, v1.4s, #16
; CHECK-CVT-GI-NEXT: mov v0.d[1], v1.d[0]
; CHECK-CVT-GI-NEXT: ret
;
; CHECK-BF16-GI-LABEL: test_fadd:
; CHECK-BF16-GI: // %bb.0:
; CHECK-BF16-GI-NEXT: shll v2.4s, v0.4h, #16
; CHECK-BF16-GI-NEXT: shll v3.4s, v1.4h, #16
; CHECK-BF16-GI-NEXT: shll2 v0.4s, v0.8h, #16
; CHECK-BF16-GI-NEXT: shll2 v1.4s, v1.8h, #16
; CHECK-BF16-GI-NEXT: fadd v2.4s, v2.4s, v3.4s
; CHECK-BF16-GI-NEXT: fadd v1.4s, v0.4s, v1.4s
; CHECK-BF16-GI-NEXT: bfcvtn v0.4h, v2.4s
; CHECK-BF16-GI-NEXT: bfcvtn2 v0.8h, v1.4s
; CHECK-BF16-GI-NEXT: ret
%r = fadd <8 x bfloat> %a, %b
ret <8 x bfloat> %r
}
define <8 x bfloat> @test_fadd_fast(<8 x bfloat> %a, <8 x bfloat> %b) {
; CHECK-CVT-SD-LABEL: test_fadd_fast:
; CHECK-CVT-SD: // %bb.0:
; CHECK-CVT-SD-NEXT: shll v3.4s, v1.4h, #16
; CHECK-CVT-SD-NEXT: shll v4.4s, v0.4h, #16
; CHECK-CVT-SD-NEXT: shll2 v1.4s, v1.8h, #16
; CHECK-CVT-SD-NEXT: shll2 v0.4s, v0.8h, #16
; CHECK-CVT-SD-NEXT: movi v2.4s, #1
; CHECK-CVT-SD-NEXT: movi v5.4s, #127, msl #8
; CHECK-CVT-SD-NEXT: fadd v3.4s, v4.4s, v3.4s
; CHECK-CVT-SD-NEXT: fadd v1.4s, v0.4s, v1.4s
; CHECK-CVT-SD-NEXT: ushr v0.4s, v3.4s, #16
; CHECK-CVT-SD-NEXT: ushr v4.4s, v1.4s, #16
; CHECK-CVT-SD-NEXT: and v0.16b, v0.16b, v2.16b
; CHECK-CVT-SD-NEXT: and v2.16b, v4.16b, v2.16b
; CHECK-CVT-SD-NEXT: add v0.4s, v0.4s, v3.4s
; CHECK-CVT-SD-NEXT: add v1.4s, v2.4s, v1.4s
; CHECK-CVT-SD-NEXT: addhn v0.4h, v0.4s, v5.4s
; CHECK-CVT-SD-NEXT: addhn2 v0.8h, v1.4s, v5.4s
; CHECK-CVT-SD-NEXT: ret
;
; CHECK-BF16-SD-LABEL: test_fadd_fast:
; CHECK-BF16-SD: // %bb.0:
; CHECK-BF16-SD-NEXT: shll v2.4s, v1.4h, #16
; CHECK-BF16-SD-NEXT: shll v3.4s, v0.4h, #16
; CHECK-BF16-SD-NEXT: shll2 v1.4s, v1.8h, #16
; CHECK-BF16-SD-NEXT: shll2 v0.4s, v0.8h, #16
; CHECK-BF16-SD-NEXT: fadd v2.4s, v3.4s, v2.4s
; CHECK-BF16-SD-NEXT: fadd v1.4s, v0.4s, v1.4s
; CHECK-BF16-SD-NEXT: bfcvtn v0.4h, v2.4s
; CHECK-BF16-SD-NEXT: bfcvtn2 v0.8h, v1.4s
; CHECK-BF16-SD-NEXT: ret
;
; CHECK-BF16SVE-SD-LABEL: test_fadd_fast:
; CHECK-BF16SVE-SD: // %bb.0:
; CHECK-BF16SVE-SD-NEXT: shll v2.4s, v1.4h, #16
; CHECK-BF16SVE-SD-NEXT: shll v3.4s, v0.4h, #16
; CHECK-BF16SVE-SD-NEXT: shll2 v1.4s, v1.8h, #16
; CHECK-BF16SVE-SD-NEXT: shll2 v0.4s, v0.8h, #16
; CHECK-BF16SVE-SD-NEXT: fadd v2.4s, v3.4s, v2.4s
; CHECK-BF16SVE-SD-NEXT: fadd v1.4s, v0.4s, v1.4s
; CHECK-BF16SVE-SD-NEXT: bfcvtn v0.4h, v2.4s
; CHECK-BF16SVE-SD-NEXT: bfcvtn2 v0.8h, v1.4s
; CHECK-BF16SVE-SD-NEXT: ret
;
; CHECK-CVT-GI-LABEL: test_fadd_fast:
; CHECK-CVT-GI: // %bb.0:
; CHECK-CVT-GI-NEXT: shll v2.4s, v0.4h, #16
; CHECK-CVT-GI-NEXT: shll v3.4s, v1.4h, #16
; CHECK-CVT-GI-NEXT: shll2 v0.4s, v0.8h, #16
; CHECK-CVT-GI-NEXT: shll2 v1.4s, v1.8h, #16
; CHECK-CVT-GI-NEXT: movi v6.4s, #64, lsl #16
; CHECK-CVT-GI-NEXT: fadd v2.4s, v2.4s, v3.4s
; CHECK-CVT-GI-NEXT: movi v3.4s, #127, msl #8
; CHECK-CVT-GI-NEXT: fadd v0.4s, v0.4s, v1.4s
; CHECK-CVT-GI-NEXT: movi v1.4s, #1
; CHECK-CVT-GI-NEXT: ushr v4.4s, v2.4s, #16
; CHECK-CVT-GI-NEXT: fcmeq v7.4s, v2.4s, v2.4s
; CHECK-CVT-GI-NEXT: add v16.4s, v2.4s, v3.4s
; CHECK-CVT-GI-NEXT: ushr v5.4s, v0.4s, #16
; CHECK-CVT-GI-NEXT: fcmeq v17.4s, v0.4s, v0.4s
; CHECK-CVT-GI-NEXT: add v3.4s, v0.4s, v3.4s
; CHECK-CVT-GI-NEXT: orr v2.16b, v2.16b, v6.16b
; CHECK-CVT-GI-NEXT: orr v0.16b, v0.16b, v6.16b
; CHECK-CVT-GI-NEXT: and v4.16b, v4.16b, v1.16b
; CHECK-CVT-GI-NEXT: and v1.16b, v5.16b, v1.16b
; CHECK-CVT-GI-NEXT: mvn v5.16b, v7.16b
; CHECK-CVT-GI-NEXT: mvn v7.16b, v17.16b
; CHECK-CVT-GI-NEXT: add v4.4s, v16.4s, v4.4s
; CHECK-CVT-GI-NEXT: add v1.4s, v3.4s, v1.4s
; CHECK-CVT-GI-NEXT: bif v2.16b, v4.16b, v5.16b
; CHECK-CVT-GI-NEXT: bit v1.16b, v0.16b, v7.16b
; CHECK-CVT-GI-NEXT: shrn v0.4h, v2.4s, #16
; CHECK-CVT-GI-NEXT: shrn v1.4h, v1.4s, #16
; CHECK-CVT-GI-NEXT: mov v0.d[1], v1.d[0]
; CHECK-CVT-GI-NEXT: ret
;
; CHECK-BF16-GI-LABEL: test_fadd_fast:
; CHECK-BF16-GI: // %bb.0:
; CHECK-BF16-GI-NEXT: shll v2.4s, v0.4h, #16
; CHECK-BF16-GI-NEXT: shll v3.4s, v1.4h, #16
; CHECK-BF16-GI-NEXT: shll2 v0.4s, v0.8h, #16
; CHECK-BF16-GI-NEXT: shll2 v1.4s, v1.8h, #16
; CHECK-BF16-GI-NEXT: fadd v2.4s, v2.4s, v3.4s
; CHECK-BF16-GI-NEXT: fadd v1.4s, v0.4s, v1.4s
; CHECK-BF16-GI-NEXT: bfcvtn v0.4h, v2.4s
; CHECK-BF16-GI-NEXT: bfcvtn2 v0.8h, v1.4s
; CHECK-BF16-GI-NEXT: ret
%r = fadd fast <8 x bfloat> %a, %b
ret <8 x bfloat> %r
}
define <8 x bfloat> @test_fsub(<8 x bfloat> %a, <8 x bfloat> %b) {
; CHECK-CVT-SD-LABEL: test_fsub:
; CHECK-CVT-SD: // %bb.0:
; CHECK-CVT-SD-NEXT: shll v3.4s, v1.4h, #16
; CHECK-CVT-SD-NEXT: shll v4.4s, v0.4h, #16
; CHECK-CVT-SD-NEXT: shll2 v1.4s, v1.8h, #16
; CHECK-CVT-SD-NEXT: shll2 v0.4s, v0.8h, #16
; CHECK-CVT-SD-NEXT: movi v2.4s, #1
; CHECK-CVT-SD-NEXT: movi v5.4s, #127, msl #8
; CHECK-CVT-SD-NEXT: fsub v3.4s, v4.4s, v3.4s
; CHECK-CVT-SD-NEXT: fsub v1.4s, v0.4s, v1.4s
; CHECK-CVT-SD-NEXT: ushr v0.4s, v3.4s, #16
; CHECK-CVT-SD-NEXT: ushr v4.4s, v1.4s, #16
; CHECK-CVT-SD-NEXT: and v0.16b, v0.16b, v2.16b
; CHECK-CVT-SD-NEXT: and v2.16b, v4.16b, v2.16b
; CHECK-CVT-SD-NEXT: add v0.4s, v0.4s, v3.4s
; CHECK-CVT-SD-NEXT: add v1.4s, v2.4s, v1.4s
; CHECK-CVT-SD-NEXT: addhn v0.4h, v0.4s, v5.4s
; CHECK-CVT-SD-NEXT: addhn2 v0.8h, v1.4s, v5.4s
; CHECK-CVT-SD-NEXT: ret
;
; CHECK-BF16-SD-LABEL: test_fsub:
; CHECK-BF16-SD: // %bb.0:
; CHECK-BF16-SD-NEXT: shll v2.4s, v1.4h, #16
; CHECK-BF16-SD-NEXT: shll v3.4s, v0.4h, #16
; CHECK-BF16-SD-NEXT: shll2 v1.4s, v1.8h, #16
; CHECK-BF16-SD-NEXT: shll2 v0.4s, v0.8h, #16
; CHECK-BF16-SD-NEXT: fsub v2.4s, v3.4s, v2.4s
; CHECK-BF16-SD-NEXT: fsub v1.4s, v0.4s, v1.4s
; CHECK-BF16-SD-NEXT: bfcvtn v0.4h, v2.4s
; CHECK-BF16-SD-NEXT: bfcvtn2 v0.8h, v1.4s
; CHECK-BF16-SD-NEXT: ret
;
; CHECK-BF16SVE-SD-LABEL: test_fsub:
; CHECK-BF16SVE-SD: // %bb.0:
; CHECK-BF16SVE-SD-NEXT: shll v2.4s, v1.4h, #16
; CHECK-BF16SVE-SD-NEXT: shll v3.4s, v0.4h, #16
; CHECK-BF16SVE-SD-NEXT: shll2 v1.4s, v1.8h, #16
; CHECK-BF16SVE-SD-NEXT: shll2 v0.4s, v0.8h, #16
; CHECK-BF16SVE-SD-NEXT: fsub v2.4s, v3.4s, v2.4s
; CHECK-BF16SVE-SD-NEXT: fsub v1.4s, v0.4s, v1.4s
; CHECK-BF16SVE-SD-NEXT: bfcvtn v0.4h, v2.4s
; CHECK-BF16SVE-SD-NEXT: bfcvtn2 v0.8h, v1.4s
; CHECK-BF16SVE-SD-NEXT: ret
;
; CHECK-CVT-GI-LABEL: test_fsub:
; CHECK-CVT-GI: // %bb.0:
; CHECK-CVT-GI-NEXT: shll v2.4s, v0.4h, #16
; CHECK-CVT-GI-NEXT: shll v3.4s, v1.4h, #16
; CHECK-CVT-GI-NEXT: shll2 v0.4s, v0.8h, #16
; CHECK-CVT-GI-NEXT: shll2 v1.4s, v1.8h, #16
; CHECK-CVT-GI-NEXT: movi v6.4s, #64, lsl #16
; CHECK-CVT-GI-NEXT: fsub v2.4s, v2.4s, v3.4s
; CHECK-CVT-GI-NEXT: movi v3.4s, #127, msl #8
; CHECK-CVT-GI-NEXT: fsub v0.4s, v0.4s, v1.4s
; CHECK-CVT-GI-NEXT: movi v1.4s, #1
; CHECK-CVT-GI-NEXT: ushr v4.4s, v2.4s, #16
; CHECK-CVT-GI-NEXT: fcmeq v7.4s, v2.4s, v2.4s
; CHECK-CVT-GI-NEXT: add v16.4s, v2.4s, v3.4s
; CHECK-CVT-GI-NEXT: ushr v5.4s, v0.4s, #16
; CHECK-CVT-GI-NEXT: fcmeq v17.4s, v0.4s, v0.4s
; CHECK-CVT-GI-NEXT: add v3.4s, v0.4s, v3.4s
; CHECK-CVT-GI-NEXT: orr v2.16b, v2.16b, v6.16b
; CHECK-CVT-GI-NEXT: orr v0.16b, v0.16b, v6.16b
; CHECK-CVT-GI-NEXT: and v4.16b, v4.16b, v1.16b
; CHECK-CVT-GI-NEXT: and v1.16b, v5.16b, v1.16b
; CHECK-CVT-GI-NEXT: mvn v5.16b, v7.16b
; CHECK-CVT-GI-NEXT: mvn v7.16b, v17.16b
; CHECK-CVT-GI-NEXT: add v4.4s, v16.4s, v4.4s
; CHECK-CVT-GI-NEXT: add v1.4s, v3.4s, v1.4s
; CHECK-CVT-GI-NEXT: bif v2.16b, v4.16b, v5.16b
; CHECK-CVT-GI-NEXT: bit v1.16b, v0.16b, v7.16b
; CHECK-CVT-GI-NEXT: shrn v0.4h, v2.4s, #16
; CHECK-CVT-GI-NEXT: shrn v1.4h, v1.4s, #16
; CHECK-CVT-GI-NEXT: mov v0.d[1], v1.d[0]
; CHECK-CVT-GI-NEXT: ret
;
; CHECK-BF16-GI-LABEL: test_fsub:
; CHECK-BF16-GI: // %bb.0:
; CHECK-BF16-GI-NEXT: shll v2.4s, v0.4h, #16
; CHECK-BF16-GI-NEXT: shll v3.4s, v1.4h, #16
; CHECK-BF16-GI-NEXT: shll2 v0.4s, v0.8h, #16
; CHECK-BF16-GI-NEXT: shll2 v1.4s, v1.8h, #16
; CHECK-BF16-GI-NEXT: fsub v2.4s, v2.4s, v3.4s
; CHECK-BF16-GI-NEXT: fsub v1.4s, v0.4s, v1.4s
; CHECK-BF16-GI-NEXT: bfcvtn v0.4h, v2.4s
; CHECK-BF16-GI-NEXT: bfcvtn2 v0.8h, v1.4s
; CHECK-BF16-GI-NEXT: ret
%r = fsub <8 x bfloat> %a, %b
ret <8 x bfloat> %r
}
define <8 x bfloat> @test_fmul(<8 x bfloat> %a, <8 x bfloat> %b) {
; CHECK-CVT-SD-LABEL: test_fmul:
; CHECK-CVT-SD: // %bb.0:
; CHECK-CVT-SD-NEXT: shll v3.4s, v1.4h, #16
; CHECK-CVT-SD-NEXT: shll v4.4s, v0.4h, #16
; CHECK-CVT-SD-NEXT: shll2 v1.4s, v1.8h, #16
; CHECK-CVT-SD-NEXT: shll2 v0.4s, v0.8h, #16
; CHECK-CVT-SD-NEXT: movi v2.4s, #1
; CHECK-CVT-SD-NEXT: movi v5.4s, #127, msl #8
; CHECK-CVT-SD-NEXT: fmul v3.4s, v4.4s, v3.4s
; CHECK-CVT-SD-NEXT: fmul v1.4s, v0.4s, v1.4s
; CHECK-CVT-SD-NEXT: ushr v0.4s, v3.4s, #16
; CHECK-CVT-SD-NEXT: ushr v4.4s, v1.4s, #16
; CHECK-CVT-SD-NEXT: and v0.16b, v0.16b, v2.16b
; CHECK-CVT-SD-NEXT: and v2.16b, v4.16b, v2.16b
; CHECK-CVT-SD-NEXT: add v0.4s, v0.4s, v3.4s
; CHECK-CVT-SD-NEXT: add v1.4s, v2.4s, v1.4s
; CHECK-CVT-SD-NEXT: addhn v0.4h, v0.4s, v5.4s
; CHECK-CVT-SD-NEXT: addhn2 v0.8h, v1.4s, v5.4s
; CHECK-CVT-SD-NEXT: ret
;
; CHECK-BF16-SD-LABEL: test_fmul:
; CHECK-BF16-SD: // %bb.0:
; CHECK-BF16-SD-NEXT: shll v2.4s, v1.4h, #16
; CHECK-BF16-SD-NEXT: shll v3.4s, v0.4h, #16
; CHECK-BF16-SD-NEXT: shll2 v1.4s, v1.8h, #16
; CHECK-BF16-SD-NEXT: shll2 v0.4s, v0.8h, #16
; CHECK-BF16-SD-NEXT: fmul v2.4s, v3.4s, v2.4s
; CHECK-BF16-SD-NEXT: fmul v1.4s, v0.4s, v1.4s
; CHECK-BF16-SD-NEXT: bfcvtn v0.4h, v2.4s
; CHECK-BF16-SD-NEXT: bfcvtn2 v0.8h, v1.4s
; CHECK-BF16-SD-NEXT: ret
;
; CHECK-BF16SVE-SD-LABEL: test_fmul:
; CHECK-BF16SVE-SD: // %bb.0:
; CHECK-BF16SVE-SD-NEXT: movi v2.4s, #128, lsl #24
; CHECK-BF16SVE-SD-NEXT: movi v3.4s, #128, lsl #24
; CHECK-BF16SVE-SD-NEXT: ptrue p0.s, vl4
; CHECK-BF16SVE-SD-NEXT: bfmlalb v2.4s, v0.8h, v1.8h
; CHECK-BF16SVE-SD-NEXT: bfmlalt v3.4s, v0.8h, v1.8h
; CHECK-BF16SVE-SD-NEXT: bfcvt z2.h, p0/m, z2.s
; CHECK-BF16SVE-SD-NEXT: bfcvtnt z2.h, p0/m, z3.s
; CHECK-BF16SVE-SD-NEXT: mov v0.16b, v2.16b
; CHECK-BF16SVE-SD-NEXT: ret
;
; CHECK-CVT-GI-LABEL: test_fmul:
; CHECK-CVT-GI: // %bb.0:
; CHECK-CVT-GI-NEXT: shll v2.4s, v0.4h, #16
; CHECK-CVT-GI-NEXT: shll v3.4s, v1.4h, #16
; CHECK-CVT-GI-NEXT: shll2 v0.4s, v0.8h, #16
; CHECK-CVT-GI-NEXT: shll2 v1.4s, v1.8h, #16
; CHECK-CVT-GI-NEXT: movi v6.4s, #64, lsl #16
; CHECK-CVT-GI-NEXT: fmul v2.4s, v2.4s, v3.4s
; CHECK-CVT-GI-NEXT: movi v3.4s, #127, msl #8
; CHECK-CVT-GI-NEXT: fmul v0.4s, v0.4s, v1.4s
; CHECK-CVT-GI-NEXT: movi v1.4s, #1
; CHECK-CVT-GI-NEXT: ushr v4.4s, v2.4s, #16
; CHECK-CVT-GI-NEXT: fcmeq v7.4s, v2.4s, v2.4s
; CHECK-CVT-GI-NEXT: add v16.4s, v2.4s, v3.4s
; CHECK-CVT-GI-NEXT: ushr v5.4s, v0.4s, #16
; CHECK-CVT-GI-NEXT: fcmeq v17.4s, v0.4s, v0.4s
; CHECK-CVT-GI-NEXT: add v3.4s, v0.4s, v3.4s
; CHECK-CVT-GI-NEXT: orr v2.16b, v2.16b, v6.16b
; CHECK-CVT-GI-NEXT: orr v0.16b, v0.16b, v6.16b
; CHECK-CVT-GI-NEXT: and v4.16b, v4.16b, v1.16b
; CHECK-CVT-GI-NEXT: and v1.16b, v5.16b, v1.16b
; CHECK-CVT-GI-NEXT: mvn v5.16b, v7.16b
; CHECK-CVT-GI-NEXT: mvn v7.16b, v17.16b
; CHECK-CVT-GI-NEXT: add v4.4s, v16.4s, v4.4s
; CHECK-CVT-GI-NEXT: add v1.4s, v3.4s, v1.4s
; CHECK-CVT-GI-NEXT: bif v2.16b, v4.16b, v5.16b
; CHECK-CVT-GI-NEXT: bit v1.16b, v0.16b, v7.16b
; CHECK-CVT-GI-NEXT: shrn v0.4h, v2.4s, #16
; CHECK-CVT-GI-NEXT: shrn v1.4h, v1.4s, #16
; CHECK-CVT-GI-NEXT: mov v0.d[1], v1.d[0]
; CHECK-CVT-GI-NEXT: ret
;
; CHECK-BF16-GI-LABEL: test_fmul:
; CHECK-BF16-GI: // %bb.0:
; CHECK-BF16-GI-NEXT: shll v2.4s, v0.4h, #16
; CHECK-BF16-GI-NEXT: shll v3.4s, v1.4h, #16
; CHECK-BF16-GI-NEXT: shll2 v0.4s, v0.8h, #16
; CHECK-BF16-GI-NEXT: shll2 v1.4s, v1.8h, #16
; CHECK-BF16-GI-NEXT: fmul v2.4s, v2.4s, v3.4s
; CHECK-BF16-GI-NEXT: fmul v1.4s, v0.4s, v1.4s
; CHECK-BF16-GI-NEXT: bfcvtn v0.4h, v2.4s
; CHECK-BF16-GI-NEXT: bfcvtn2 v0.8h, v1.4s
; CHECK-BF16-GI-NEXT: ret
%r = fmul <8 x bfloat> %a, %b
ret <8 x bfloat> %r
}
define <8 x bfloat> @test_fmadd(<8 x bfloat> %a, <8 x bfloat> %b, <8 x bfloat> %c) #0 {
; CHECK-CVT-SD-LABEL: test_fmadd:
; CHECK-CVT-SD: // %bb.0:
; CHECK-CVT-SD-NEXT: shll v3.4s, v1.4h, #16
; CHECK-CVT-SD-NEXT: shll v4.4s, v0.4h, #16
; CHECK-CVT-SD-NEXT: shll2 v1.4s, v1.8h, #16
; CHECK-CVT-SD-NEXT: shll2 v0.4s, v0.8h, #16
; CHECK-CVT-SD-NEXT: movi v6.4s, #127, msl #8
; CHECK-CVT-SD-NEXT: fmul v3.4s, v4.4s, v3.4s
; CHECK-CVT-SD-NEXT: movi v4.4s, #1
; CHECK-CVT-SD-NEXT: fmul v0.4s, v0.4s, v1.4s
; CHECK-CVT-SD-NEXT: ushr v5.4s, v3.4s, #16
; CHECK-CVT-SD-NEXT: and v1.16b, v5.16b, v4.16b
; CHECK-CVT-SD-NEXT: ushr v5.4s, v0.4s, #16
; CHECK-CVT-SD-NEXT: add v1.4s, v1.4s, v3.4s
; CHECK-CVT-SD-NEXT: and v3.16b, v5.16b, v4.16b
; CHECK-CVT-SD-NEXT: addhn v1.4h, v1.4s, v6.4s
; CHECK-CVT-SD-NEXT: add v0.4s, v3.4s, v0.4s
; CHECK-CVT-SD-NEXT: shll v3.4s, v2.4h, #16
; CHECK-CVT-SD-NEXT: shll2 v2.4s, v2.8h, #16
; CHECK-CVT-SD-NEXT: addhn v0.4h, v0.4s, v6.4s
; CHECK-CVT-SD-NEXT: shll v1.4s, v1.4h, #16
; CHECK-CVT-SD-NEXT: fadd v1.4s, v1.4s, v3.4s
; CHECK-CVT-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-CVT-SD-NEXT: fadd v2.4s, v0.4s, v2.4s
; CHECK-CVT-SD-NEXT: ushr v0.4s, v1.4s, #16
; CHECK-CVT-SD-NEXT: and v0.16b, v0.16b, v4.16b
; CHECK-CVT-SD-NEXT: ushr v3.4s, v2.4s, #16
; CHECK-CVT-SD-NEXT: add v0.4s, v0.4s, v1.4s
; CHECK-CVT-SD-NEXT: and v1.16b, v3.16b, v4.16b
; CHECK-CVT-SD-NEXT: addhn v0.4h, v0.4s, v6.4s
; CHECK-CVT-SD-NEXT: add v1.4s, v1.4s, v2.4s
; CHECK-CVT-SD-NEXT: addhn2 v0.8h, v1.4s, v6.4s
; CHECK-CVT-SD-NEXT: ret
;
; CHECK-BF16-SD-LABEL: test_fmadd:
; CHECK-BF16-SD: // %bb.0:
; CHECK-BF16-SD-NEXT: shll v3.4s, v1.4h, #16
; CHECK-BF16-SD-NEXT: shll v4.4s, v0.4h, #16
; CHECK-BF16-SD-NEXT: shll2 v1.4s, v1.8h, #16
; CHECK-BF16-SD-NEXT: shll2 v0.4s, v0.8h, #16
; CHECK-BF16-SD-NEXT: fmul v3.4s, v4.4s, v3.4s
; CHECK-BF16-SD-NEXT: fmul v0.4s, v0.4s, v1.4s
; CHECK-BF16-SD-NEXT: bfcvtn v3.4h, v3.4s
; CHECK-BF16-SD-NEXT: bfcvtn v0.4h, v0.4s
; CHECK-BF16-SD-NEXT: shll v1.4s, v3.4h, #16
; CHECK-BF16-SD-NEXT: shll v3.4s, v2.4h, #16
; CHECK-BF16-SD-NEXT: shll2 v2.4s, v2.8h, #16
; CHECK-BF16-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16-SD-NEXT: fadd v1.4s, v1.4s, v3.4s
; CHECK-BF16-SD-NEXT: fadd v2.4s, v0.4s, v2.4s
; CHECK-BF16-SD-NEXT: bfcvtn v0.4h, v1.4s
; CHECK-BF16-SD-NEXT: bfcvtn2 v0.8h, v2.4s
; CHECK-BF16-SD-NEXT: ret
;
; CHECK-BF16SVE-SD-LABEL: test_fmadd:
; CHECK-BF16SVE-SD: // %bb.0:
; CHECK-BF16SVE-SD-NEXT: movi v3.2d, #0000000000000000
; CHECK-BF16SVE-SD-NEXT: movi v4.2d, #0000000000000000
; CHECK-BF16SVE-SD-NEXT: ptrue p0.s, vl4
; CHECK-BF16SVE-SD-NEXT: bfmlalb v3.4s, v0.8h, v1.8h
; CHECK-BF16SVE-SD-NEXT: bfmlalt v4.4s, v0.8h, v1.8h
; CHECK-BF16SVE-SD-NEXT: shll v1.4s, v2.4h, #16
; CHECK-BF16SVE-SD-NEXT: shll2 v2.4s, v2.8h, #16
; CHECK-BF16SVE-SD-NEXT: bfcvt z3.h, p0/m, z3.s
; CHECK-BF16SVE-SD-NEXT: bfcvtnt z3.h, p0/m, z4.s
; CHECK-BF16SVE-SD-NEXT: shll v0.4s, v3.4h, #16
; CHECK-BF16SVE-SD-NEXT: fadd v0.4s, v0.4s, v1.4s
; CHECK-BF16SVE-SD-NEXT: shll2 v1.4s, v3.8h, #16
; CHECK-BF16SVE-SD-NEXT: fadd v1.4s, v1.4s, v2.4s
; CHECK-BF16SVE-SD-NEXT: bfcvtn v0.4h, v0.4s
; CHECK-BF16SVE-SD-NEXT: bfcvtn2 v0.8h, v1.4s
; CHECK-BF16SVE-SD-NEXT: ret
;
; CHECK-CVT-GI-LABEL: test_fmadd:
; CHECK-CVT-GI: // %bb.0:
; CHECK-CVT-GI-NEXT: shll v3.4s, v0.4h, #16
; CHECK-CVT-GI-NEXT: shll v4.4s, v1.4h, #16
; CHECK-CVT-GI-NEXT: shll2 v0.4s, v0.8h, #16
; CHECK-CVT-GI-NEXT: shll2 v1.4s, v1.8h, #16
; CHECK-CVT-GI-NEXT: movi v7.4s, #64, lsl #16
; CHECK-CVT-GI-NEXT: fmul v3.4s, v3.4s, v4.4s
; CHECK-CVT-GI-NEXT: movi v4.4s, #127, msl #8
; CHECK-CVT-GI-NEXT: fmul v0.4s, v0.4s, v1.4s
; CHECK-CVT-GI-NEXT: movi v1.4s, #1
; CHECK-CVT-GI-NEXT: ushr v5.4s, v3.4s, #16
; CHECK-CVT-GI-NEXT: fcmeq v16.4s, v3.4s, v3.4s
; CHECK-CVT-GI-NEXT: add v17.4s, v3.4s, v4.4s
; CHECK-CVT-GI-NEXT: ushr v6.4s, v0.4s, #16
; CHECK-CVT-GI-NEXT: fcmeq v18.4s, v0.4s, v0.4s
; CHECK-CVT-GI-NEXT: add v19.4s, v0.4s, v4.4s
; CHECK-CVT-GI-NEXT: orr v3.16b, v3.16b, v7.16b
; CHECK-CVT-GI-NEXT: orr v0.16b, v0.16b, v7.16b
; CHECK-CVT-GI-NEXT: and v5.16b, v5.16b, v1.16b
; CHECK-CVT-GI-NEXT: and v6.16b, v6.16b, v1.16b
; CHECK-CVT-GI-NEXT: mvn v16.16b, v16.16b
; CHECK-CVT-GI-NEXT: add v5.4s, v17.4s, v5.4s
; CHECK-CVT-GI-NEXT: mvn v17.16b, v18.16b
; CHECK-CVT-GI-NEXT: add v6.4s, v19.4s, v6.4s
; CHECK-CVT-GI-NEXT: bif v3.16b, v5.16b, v16.16b
; CHECK-CVT-GI-NEXT: shll v5.4s, v2.4h, #16
; CHECK-CVT-GI-NEXT: shll2 v2.4s, v2.8h, #16
; CHECK-CVT-GI-NEXT: bif v0.16b, v6.16b, v17.16b
; CHECK-CVT-GI-NEXT: shrn v3.4h, v3.4s, #16
; CHECK-CVT-GI-NEXT: shrn v0.4h, v0.4s, #16
; CHECK-CVT-GI-NEXT: shll v3.4s, v3.4h, #16
; CHECK-CVT-GI-NEXT: shll v0.4s, v0.4h, #16
; CHECK-CVT-GI-NEXT: fadd v3.4s, v3.4s, v5.4s
; CHECK-CVT-GI-NEXT: fadd v0.4s, v0.4s, v2.4s
; CHECK-CVT-GI-NEXT: ushr v2.4s, v3.4s, #16
; CHECK-CVT-GI-NEXT: fcmeq v6.4s, v3.4s, v3.4s
; CHECK-CVT-GI-NEXT: add v16.4s, v3.4s, v4.4s
; CHECK-CVT-GI-NEXT: ushr v5.4s, v0.4s, #16
; CHECK-CVT-GI-NEXT: fcmeq v17.4s, v0.4s, v0.4s
; CHECK-CVT-GI-NEXT: add v4.4s, v0.4s, v4.4s
; CHECK-CVT-GI-NEXT: orr v3.16b, v3.16b, v7.16b
; CHECK-CVT-GI-NEXT: orr v0.16b, v0.16b, v7.16b
; CHECK-CVT-GI-NEXT: and v2.16b, v2.16b, v1.16b
; CHECK-CVT-GI-NEXT: and v1.16b, v5.16b, v1.16b
; CHECK-CVT-GI-NEXT: mvn v5.16b, v6.16b
; CHECK-CVT-GI-NEXT: mvn v6.16b, v17.16b
; CHECK-CVT-GI-NEXT: add v2.4s, v16.4s, v2.4s
; CHECK-CVT-GI-NEXT: add v1.4s, v4.4s, v1.4s
; CHECK-CVT-GI-NEXT: bit v2.16b, v3.16b, v5.16b
; CHECK-CVT-GI-NEXT: bit v1.16b, v0.16b, v6.16b
; CHECK-CVT-GI-NEXT: shrn v0.4h, v2.4s, #16
; CHECK-CVT-GI-NEXT: shrn v1.4h, v1.4s, #16
; CHECK-CVT-GI-NEXT: mov v0.d[1], v1.d[0]
; CHECK-CVT-GI-NEXT: ret
;
; CHECK-BF16-GI-LABEL: test_fmadd:
; CHECK-BF16-GI: // %bb.0:
; CHECK-BF16-GI-NEXT: shll v3.4s, v0.4h, #16
; CHECK-BF16-GI-NEXT: shll v4.4s, v1.4h, #16
; CHECK-BF16-GI-NEXT: shll2 v0.4s, v0.8h, #16
; CHECK-BF16-GI-NEXT: shll2 v1.4s, v1.8h, #16
; CHECK-BF16-GI-NEXT: fmul v3.4s, v3.4s, v4.4s
; CHECK-BF16-GI-NEXT: fmul v0.4s, v0.4s, v1.4s
; CHECK-BF16-GI-NEXT: bfcvtn v1.4h, v3.4s
; CHECK-BF16-GI-NEXT: shll v3.4s, v2.4h, #16
; CHECK-BF16-GI-NEXT: shll2 v2.4s, v2.8h, #16
; CHECK-BF16-GI-NEXT: bfcvtn v0.4h, v0.4s
; CHECK-BF16-GI-NEXT: shll v1.4s, v1.4h, #16
; CHECK-BF16-GI-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16-GI-NEXT: fadd v1.4s, v1.4s, v3.4s
; CHECK-BF16-GI-NEXT: fadd v2.4s, v0.4s, v2.4s
; CHECK-BF16-GI-NEXT: bfcvtn v0.4h, v1.4s
; CHECK-BF16-GI-NEXT: bfcvtn2 v0.8h, v2.4s
; CHECK-BF16-GI-NEXT: ret
%mul = fmul fast <8 x bfloat> %a, %b
%r = fadd fast <8 x bfloat> %mul, %c
ret <8 x bfloat> %r
}
define <8 x bfloat> @test_fdiv(<8 x bfloat> %a, <8 x bfloat> %b) {
; CHECK-CVT-SD-LABEL: test_fdiv:
; CHECK-CVT-SD: // %bb.0:
; CHECK-CVT-SD-NEXT: shll v2.4s, v1.4h, #16
; CHECK-CVT-SD-NEXT: shll v3.4s, v0.4h, #16
; CHECK-CVT-SD-NEXT: shll2 v1.4s, v1.8h, #16
; CHECK-CVT-SD-NEXT: shll2 v0.4s, v0.8h, #16
; CHECK-CVT-SD-NEXT: movi v5.4s, #127, msl #8
; CHECK-CVT-SD-NEXT: fdiv v2.4s, v3.4s, v2.4s
; CHECK-CVT-SD-NEXT: fdiv v1.4s, v0.4s, v1.4s
; CHECK-CVT-SD-NEXT: movi v0.4s, #1
; CHECK-CVT-SD-NEXT: ushr v3.4s, v2.4s, #16
; CHECK-CVT-SD-NEXT: and v3.16b, v3.16b, v0.16b
; CHECK-CVT-SD-NEXT: add v2.4s, v3.4s, v2.4s
; CHECK-CVT-SD-NEXT: ushr v4.4s, v1.4s, #16
; CHECK-CVT-SD-NEXT: and v3.16b, v4.16b, v0.16b
; CHECK-CVT-SD-NEXT: addhn v0.4h, v2.4s, v5.4s
; CHECK-CVT-SD-NEXT: add v1.4s, v3.4s, v1.4s
; CHECK-CVT-SD-NEXT: addhn2 v0.8h, v1.4s, v5.4s
; CHECK-CVT-SD-NEXT: ret
;
; CHECK-BF16-SD-LABEL: test_fdiv:
; CHECK-BF16-SD: // %bb.0:
; CHECK-BF16-SD-NEXT: shll v2.4s, v1.4h, #16
; CHECK-BF16-SD-NEXT: shll v3.4s, v0.4h, #16
; CHECK-BF16-SD-NEXT: shll2 v1.4s, v1.8h, #16
; CHECK-BF16-SD-NEXT: shll2 v0.4s, v0.8h, #16
; CHECK-BF16-SD-NEXT: fdiv v2.4s, v3.4s, v2.4s
; CHECK-BF16-SD-NEXT: fdiv v1.4s, v0.4s, v1.4s
; CHECK-BF16-SD-NEXT: bfcvtn v0.4h, v2.4s
; CHECK-BF16-SD-NEXT: bfcvtn2 v0.8h, v1.4s
; CHECK-BF16-SD-NEXT: ret
;
; CHECK-BF16SVE-SD-LABEL: test_fdiv:
; CHECK-BF16SVE-SD: // %bb.0:
; CHECK-BF16SVE-SD-NEXT: shll v2.4s, v1.4h, #16
; CHECK-BF16SVE-SD-NEXT: shll v3.4s, v0.4h, #16
; CHECK-BF16SVE-SD-NEXT: shll2 v1.4s, v1.8h, #16
; CHECK-BF16SVE-SD-NEXT: shll2 v0.4s, v0.8h, #16
; CHECK-BF16SVE-SD-NEXT: fdiv v2.4s, v3.4s, v2.4s
; CHECK-BF16SVE-SD-NEXT: fdiv v1.4s, v0.4s, v1.4s
; CHECK-BF16SVE-SD-NEXT: bfcvtn v0.4h, v2.4s
; CHECK-BF16SVE-SD-NEXT: bfcvtn2 v0.8h, v1.4s
; CHECK-BF16SVE-SD-NEXT: ret
;
; CHECK-CVT-GI-LABEL: test_fdiv:
; CHECK-CVT-GI: // %bb.0:
; CHECK-CVT-GI-NEXT: shll v2.4s, v0.4h, #16
; CHECK-CVT-GI-NEXT: shll v3.4s, v1.4h, #16
; CHECK-CVT-GI-NEXT: shll2 v0.4s, v0.8h, #16
; CHECK-CVT-GI-NEXT: shll2 v1.4s, v1.8h, #16
; CHECK-CVT-GI-NEXT: movi v6.4s, #64, lsl #16
; CHECK-CVT-GI-NEXT: fdiv v2.4s, v2.4s, v3.4s
; CHECK-CVT-GI-NEXT: movi v3.4s, #127, msl #8
; CHECK-CVT-GI-NEXT: fdiv v0.4s, v0.4s, v1.4s
; CHECK-CVT-GI-NEXT: movi v1.4s, #1
; CHECK-CVT-GI-NEXT: ushr v4.4s, v2.4s, #16
; CHECK-CVT-GI-NEXT: fcmeq v7.4s, v2.4s, v2.4s
; CHECK-CVT-GI-NEXT: add v16.4s, v2.4s, v3.4s
; CHECK-CVT-GI-NEXT: orr v2.16b, v2.16b, v6.16b
; CHECK-CVT-GI-NEXT: and v4.16b, v4.16b, v1.16b
; CHECK-CVT-GI-NEXT: add v4.4s, v16.4s, v4.4s
; CHECK-CVT-GI-NEXT: ushr v5.4s, v0.4s, #16
; CHECK-CVT-GI-NEXT: fcmeq v17.4s, v0.4s, v0.4s
; CHECK-CVT-GI-NEXT: add v3.4s, v0.4s, v3.4s
; CHECK-CVT-GI-NEXT: orr v0.16b, v0.16b, v6.16b
; CHECK-CVT-GI-NEXT: and v1.16b, v5.16b, v1.16b
; CHECK-CVT-GI-NEXT: mvn v5.16b, v7.16b
; CHECK-CVT-GI-NEXT: mvn v7.16b, v17.16b
; CHECK-CVT-GI-NEXT: add v1.4s, v3.4s, v1.4s
; CHECK-CVT-GI-NEXT: bif v2.16b, v4.16b, v5.16b
; CHECK-CVT-GI-NEXT: bit v1.16b, v0.16b, v7.16b
; CHECK-CVT-GI-NEXT: shrn v0.4h, v2.4s, #16
; CHECK-CVT-GI-NEXT: shrn v1.4h, v1.4s, #16
; CHECK-CVT-GI-NEXT: mov v0.d[1], v1.d[0]
; CHECK-CVT-GI-NEXT: ret
;
; CHECK-BF16-GI-LABEL: test_fdiv:
; CHECK-BF16-GI: // %bb.0:
; CHECK-BF16-GI-NEXT: shll v2.4s, v0.4h, #16
; CHECK-BF16-GI-NEXT: shll v3.4s, v1.4h, #16
; CHECK-BF16-GI-NEXT: shll2 v0.4s, v0.8h, #16
; CHECK-BF16-GI-NEXT: shll2 v1.4s, v1.8h, #16
; CHECK-BF16-GI-NEXT: fdiv v2.4s, v2.4s, v3.4s
; CHECK-BF16-GI-NEXT: fdiv v1.4s, v0.4s, v1.4s
; CHECK-BF16-GI-NEXT: bfcvtn v0.4h, v2.4s
; CHECK-BF16-GI-NEXT: bfcvtn2 v0.8h, v1.4s
; CHECK-BF16-GI-NEXT: ret
%r = fdiv <8 x bfloat> %a, %b
ret <8 x bfloat> %r
}
define <8 x bfloat> @test_frem(<8 x bfloat> %a, <8 x bfloat> %b) #0 {
; CHECK-CVT-SD-LABEL: test_frem:
; CHECK-CVT-SD: // %bb.0:
; CHECK-CVT-SD-NEXT: sub sp, sp, #64
; CHECK-CVT-SD-NEXT: mov h3, v0.h[1]
; CHECK-CVT-SD-NEXT: mov h2, v1.h[1]
; CHECK-CVT-SD-NEXT: stp q0, q1, [sp] // 32-byte Folded Spill
; CHECK-CVT-SD-NEXT: stp x30, x19, [sp, #48] // 16-byte Folded Spill
; CHECK-CVT-SD-NEXT: shll v0.4s, v3.4h, #16
; CHECK-CVT-SD-NEXT: shll v1.4s, v2.4h, #16
; CHECK-CVT-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-CVT-SD-NEXT: // kill: def $s1 killed $s1 killed $q1
; CHECK-CVT-SD-NEXT: bl fmodf
; CHECK-CVT-SD-NEXT: fmov w8, s0
; CHECK-CVT-SD-NEXT: mov w19, #32767 // =0x7fff
; CHECK-CVT-SD-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-SD-NEXT: add w8, w8, w19
; CHECK-CVT-SD-NEXT: add w8, w9, w8
; CHECK-CVT-SD-NEXT: lsr w8, w8, #16
; CHECK-CVT-SD-NEXT: fmov s0, w8
; CHECK-CVT-SD-NEXT: str q0, [sp, #32] // 16-byte Spill
; CHECK-CVT-SD-NEXT: ldp q0, q1, [sp] // 32-byte Folded Reload
; CHECK-CVT-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-CVT-SD-NEXT: shll v1.4s, v1.4h, #16
; CHECK-CVT-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-CVT-SD-NEXT: // kill: def $s1 killed $s1 killed $q1
; CHECK-CVT-SD-NEXT: bl fmodf
; CHECK-CVT-SD-NEXT: fmov w8, s0
; CHECK-CVT-SD-NEXT: ldp q1, q2, [sp, #16] // 32-byte Folded Reload
; CHECK-CVT-SD-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-SD-NEXT: add w8, w8, w19
; CHECK-CVT-SD-NEXT: mov h1, v1.h[2]
; CHECK-CVT-SD-NEXT: add w8, w9, w8
; CHECK-CVT-SD-NEXT: lsr w8, w8, #16
; CHECK-CVT-SD-NEXT: shll v1.4s, v1.4h, #16
; CHECK-CVT-SD-NEXT: fmov s0, w8
; CHECK-CVT-SD-NEXT: // kill: def $s1 killed $s1 killed $q1
; CHECK-CVT-SD-NEXT: mov v0.h[1], v2.h[0]
; CHECK-CVT-SD-NEXT: str q0, [sp, #32] // 16-byte Spill
; CHECK-CVT-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-CVT-SD-NEXT: mov h0, v0.h[2]
; CHECK-CVT-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-CVT-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-CVT-SD-NEXT: bl fmodf
; CHECK-CVT-SD-NEXT: fmov w8, s0
; CHECK-CVT-SD-NEXT: ldr q1, [sp, #32] // 16-byte Reload
; CHECK-CVT-SD-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-SD-NEXT: add w8, w8, w19
; CHECK-CVT-SD-NEXT: add w8, w9, w8
; CHECK-CVT-SD-NEXT: lsr w8, w8, #16
; CHECK-CVT-SD-NEXT: fmov s0, w8
; CHECK-CVT-SD-NEXT: mov v1.h[2], v0.h[0]
; CHECK-CVT-SD-NEXT: str q1, [sp, #32] // 16-byte Spill
; CHECK-CVT-SD-NEXT: ldp q0, q1, [sp] // 32-byte Folded Reload
; CHECK-CVT-SD-NEXT: mov h0, v0.h[3]
; CHECK-CVT-SD-NEXT: mov h1, v1.h[3]
; CHECK-CVT-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-CVT-SD-NEXT: shll v1.4s, v1.4h, #16
; CHECK-CVT-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-CVT-SD-NEXT: // kill: def $s1 killed $s1 killed $q1
; CHECK-CVT-SD-NEXT: bl fmodf
; CHECK-CVT-SD-NEXT: fmov w8, s0
; CHECK-CVT-SD-NEXT: ldr q1, [sp, #32] // 16-byte Reload
; CHECK-CVT-SD-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-SD-NEXT: add w8, w8, w19
; CHECK-CVT-SD-NEXT: add w8, w9, w8
; CHECK-CVT-SD-NEXT: lsr w8, w8, #16
; CHECK-CVT-SD-NEXT: fmov s0, w8
; CHECK-CVT-SD-NEXT: mov v1.h[3], v0.h[0]
; CHECK-CVT-SD-NEXT: str q1, [sp, #32] // 16-byte Spill
; CHECK-CVT-SD-NEXT: ldp q0, q1, [sp] // 32-byte Folded Reload
; CHECK-CVT-SD-NEXT: mov h0, v0.h[4]
; CHECK-CVT-SD-NEXT: mov h1, v1.h[4]
; CHECK-CVT-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-CVT-SD-NEXT: shll v1.4s, v1.4h, #16
; CHECK-CVT-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-CVT-SD-NEXT: // kill: def $s1 killed $s1 killed $q1
; CHECK-CVT-SD-NEXT: bl fmodf
; CHECK-CVT-SD-NEXT: fmov w8, s0
; CHECK-CVT-SD-NEXT: ldr q1, [sp, #32] // 16-byte Reload
; CHECK-CVT-SD-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-SD-NEXT: add w8, w8, w19
; CHECK-CVT-SD-NEXT: add w8, w9, w8
; CHECK-CVT-SD-NEXT: lsr w8, w8, #16
; CHECK-CVT-SD-NEXT: fmov s0, w8
; CHECK-CVT-SD-NEXT: mov v1.h[4], v0.h[0]
; CHECK-CVT-SD-NEXT: str q1, [sp, #32] // 16-byte Spill
; CHECK-CVT-SD-NEXT: ldp q0, q1, [sp] // 32-byte Folded Reload
; CHECK-CVT-SD-NEXT: mov h0, v0.h[5]
; CHECK-CVT-SD-NEXT: mov h1, v1.h[5]
; CHECK-CVT-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-CVT-SD-NEXT: shll v1.4s, v1.4h, #16
; CHECK-CVT-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-CVT-SD-NEXT: // kill: def $s1 killed $s1 killed $q1
; CHECK-CVT-SD-NEXT: bl fmodf
; CHECK-CVT-SD-NEXT: fmov w8, s0
; CHECK-CVT-SD-NEXT: ldr q1, [sp, #32] // 16-byte Reload
; CHECK-CVT-SD-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-SD-NEXT: add w8, w8, w19
; CHECK-CVT-SD-NEXT: add w8, w9, w8
; CHECK-CVT-SD-NEXT: lsr w8, w8, #16
; CHECK-CVT-SD-NEXT: fmov s0, w8
; CHECK-CVT-SD-NEXT: mov v1.h[5], v0.h[0]
; CHECK-CVT-SD-NEXT: str q1, [sp, #32] // 16-byte Spill
; CHECK-CVT-SD-NEXT: ldp q0, q1, [sp] // 32-byte Folded Reload
; CHECK-CVT-SD-NEXT: mov h0, v0.h[6]
; CHECK-CVT-SD-NEXT: mov h1, v1.h[6]
; CHECK-CVT-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-CVT-SD-NEXT: shll v1.4s, v1.4h, #16
; CHECK-CVT-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-CVT-SD-NEXT: // kill: def $s1 killed $s1 killed $q1
; CHECK-CVT-SD-NEXT: bl fmodf
; CHECK-CVT-SD-NEXT: fmov w8, s0
; CHECK-CVT-SD-NEXT: ldr q1, [sp, #32] // 16-byte Reload
; CHECK-CVT-SD-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-SD-NEXT: add w8, w8, w19
; CHECK-CVT-SD-NEXT: add w8, w9, w8
; CHECK-CVT-SD-NEXT: lsr w8, w8, #16
; CHECK-CVT-SD-NEXT: fmov s0, w8
; CHECK-CVT-SD-NEXT: mov v1.h[6], v0.h[0]
; CHECK-CVT-SD-NEXT: str q1, [sp, #32] // 16-byte Spill
; CHECK-CVT-SD-NEXT: ldp q0, q1, [sp] // 32-byte Folded Reload
; CHECK-CVT-SD-NEXT: mov h0, v0.h[7]
; CHECK-CVT-SD-NEXT: mov h1, v1.h[7]
; CHECK-CVT-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-CVT-SD-NEXT: shll v1.4s, v1.4h, #16
; CHECK-CVT-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-CVT-SD-NEXT: // kill: def $s1 killed $s1 killed $q1
; CHECK-CVT-SD-NEXT: bl fmodf
; CHECK-CVT-SD-NEXT: fmov w8, s0
; CHECK-CVT-SD-NEXT: ldr q0, [sp, #32] // 16-byte Reload
; CHECK-CVT-SD-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-SD-NEXT: add w8, w8, w19
; CHECK-CVT-SD-NEXT: ldp x30, x19, [sp, #48] // 16-byte Folded Reload
; CHECK-CVT-SD-NEXT: add w8, w9, w8
; CHECK-CVT-SD-NEXT: lsr w8, w8, #16
; CHECK-CVT-SD-NEXT: fmov s1, w8
; CHECK-CVT-SD-NEXT: mov v0.h[7], v1.h[0]
; CHECK-CVT-SD-NEXT: add sp, sp, #64
; CHECK-CVT-SD-NEXT: ret
;
; CHECK-BF16-SD-LABEL: test_frem:
; CHECK-BF16-SD: // %bb.0:
; CHECK-BF16-SD-NEXT: sub sp, sp, #64
; CHECK-BF16-SD-NEXT: mov h3, v0.h[1]
; CHECK-BF16-SD-NEXT: mov h2, v1.h[1]
; CHECK-BF16-SD-NEXT: stp q0, q1, [sp] // 32-byte Folded Spill
; CHECK-BF16-SD-NEXT: str x30, [sp, #48] // 8-byte Spill
; CHECK-BF16-SD-NEXT: shll v0.4s, v3.4h, #16
; CHECK-BF16-SD-NEXT: shll v1.4s, v2.4h, #16
; CHECK-BF16-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16-SD-NEXT: // kill: def $s1 killed $s1 killed $q1
; CHECK-BF16-SD-NEXT: bl fmodf
; CHECK-BF16-SD-NEXT: bfcvt h0, s0
; CHECK-BF16-SD-NEXT: str q0, [sp, #32] // 16-byte Spill
; CHECK-BF16-SD-NEXT: ldp q0, q1, [sp] // 32-byte Folded Reload
; CHECK-BF16-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16-SD-NEXT: shll v1.4s, v1.4h, #16
; CHECK-BF16-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16-SD-NEXT: // kill: def $s1 killed $s1 killed $q1
; CHECK-BF16-SD-NEXT: bl fmodf
; CHECK-BF16-SD-NEXT: bfcvt h0, s0
; CHECK-BF16-SD-NEXT: ldp q1, q2, [sp, #16] // 32-byte Folded Reload
; CHECK-BF16-SD-NEXT: mov h1, v1.h[2]
; CHECK-BF16-SD-NEXT: mov v0.h[1], v2.h[0]
; CHECK-BF16-SD-NEXT: shll v1.4s, v1.4h, #16
; CHECK-BF16-SD-NEXT: str q0, [sp, #32] // 16-byte Spill
; CHECK-BF16-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-BF16-SD-NEXT: // kill: def $s1 killed $s1 killed $q1
; CHECK-BF16-SD-NEXT: mov h0, v0.h[2]
; CHECK-BF16-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16-SD-NEXT: bl fmodf
; CHECK-BF16-SD-NEXT: bfcvt h0, s0
; CHECK-BF16-SD-NEXT: ldr q1, [sp, #32] // 16-byte Reload
; CHECK-BF16-SD-NEXT: mov v1.h[2], v0.h[0]
; CHECK-BF16-SD-NEXT: str q1, [sp, #32] // 16-byte Spill
; CHECK-BF16-SD-NEXT: ldp q0, q1, [sp] // 32-byte Folded Reload
; CHECK-BF16-SD-NEXT: mov h0, v0.h[3]
; CHECK-BF16-SD-NEXT: mov h1, v1.h[3]
; CHECK-BF16-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16-SD-NEXT: shll v1.4s, v1.4h, #16
; CHECK-BF16-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16-SD-NEXT: // kill: def $s1 killed $s1 killed $q1
; CHECK-BF16-SD-NEXT: bl fmodf
; CHECK-BF16-SD-NEXT: bfcvt h0, s0
; CHECK-BF16-SD-NEXT: ldr q1, [sp, #32] // 16-byte Reload
; CHECK-BF16-SD-NEXT: mov v1.h[3], v0.h[0]
; CHECK-BF16-SD-NEXT: str q1, [sp, #32] // 16-byte Spill
; CHECK-BF16-SD-NEXT: ldp q0, q1, [sp] // 32-byte Folded Reload
; CHECK-BF16-SD-NEXT: mov h0, v0.h[4]
; CHECK-BF16-SD-NEXT: mov h1, v1.h[4]
; CHECK-BF16-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16-SD-NEXT: shll v1.4s, v1.4h, #16
; CHECK-BF16-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16-SD-NEXT: // kill: def $s1 killed $s1 killed $q1
; CHECK-BF16-SD-NEXT: bl fmodf
; CHECK-BF16-SD-NEXT: bfcvt h0, s0
; CHECK-BF16-SD-NEXT: ldr q1, [sp, #32] // 16-byte Reload
; CHECK-BF16-SD-NEXT: mov v1.h[4], v0.h[0]
; CHECK-BF16-SD-NEXT: str q1, [sp, #32] // 16-byte Spill
; CHECK-BF16-SD-NEXT: ldp q0, q1, [sp] // 32-byte Folded Reload
; CHECK-BF16-SD-NEXT: mov h0, v0.h[5]
; CHECK-BF16-SD-NEXT: mov h1, v1.h[5]
; CHECK-BF16-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16-SD-NEXT: shll v1.4s, v1.4h, #16
; CHECK-BF16-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16-SD-NEXT: // kill: def $s1 killed $s1 killed $q1
; CHECK-BF16-SD-NEXT: bl fmodf
; CHECK-BF16-SD-NEXT: bfcvt h0, s0
; CHECK-BF16-SD-NEXT: ldr q1, [sp, #32] // 16-byte Reload
; CHECK-BF16-SD-NEXT: mov v1.h[5], v0.h[0]
; CHECK-BF16-SD-NEXT: str q1, [sp, #32] // 16-byte Spill
; CHECK-BF16-SD-NEXT: ldp q0, q1, [sp] // 32-byte Folded Reload
; CHECK-BF16-SD-NEXT: mov h0, v0.h[6]
; CHECK-BF16-SD-NEXT: mov h1, v1.h[6]
; CHECK-BF16-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16-SD-NEXT: shll v1.4s, v1.4h, #16
; CHECK-BF16-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16-SD-NEXT: // kill: def $s1 killed $s1 killed $q1
; CHECK-BF16-SD-NEXT: bl fmodf
; CHECK-BF16-SD-NEXT: bfcvt h0, s0
; CHECK-BF16-SD-NEXT: ldr q1, [sp, #32] // 16-byte Reload
; CHECK-BF16-SD-NEXT: mov v1.h[6], v0.h[0]
; CHECK-BF16-SD-NEXT: str q1, [sp, #32] // 16-byte Spill
; CHECK-BF16-SD-NEXT: ldp q0, q1, [sp] // 32-byte Folded Reload
; CHECK-BF16-SD-NEXT: mov h0, v0.h[7]
; CHECK-BF16-SD-NEXT: mov h1, v1.h[7]
; CHECK-BF16-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16-SD-NEXT: shll v1.4s, v1.4h, #16
; CHECK-BF16-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16-SD-NEXT: // kill: def $s1 killed $s1 killed $q1
; CHECK-BF16-SD-NEXT: bl fmodf
; CHECK-BF16-SD-NEXT: bfcvt h1, s0
; CHECK-BF16-SD-NEXT: ldr q0, [sp, #32] // 16-byte Reload
; CHECK-BF16-SD-NEXT: ldr x30, [sp, #48] // 8-byte Reload
; CHECK-BF16-SD-NEXT: mov v0.h[7], v1.h[0]
; CHECK-BF16-SD-NEXT: add sp, sp, #64
; CHECK-BF16-SD-NEXT: ret
;
; CHECK-BF16SVE-SD-LABEL: test_frem:
; CHECK-BF16SVE-SD: // %bb.0:
; CHECK-BF16SVE-SD-NEXT: sub sp, sp, #64
; CHECK-BF16SVE-SD-NEXT: mov h3, v0.h[1]
; CHECK-BF16SVE-SD-NEXT: mov h2, v1.h[1]
; CHECK-BF16SVE-SD-NEXT: stp q0, q1, [sp] // 32-byte Folded Spill
; CHECK-BF16SVE-SD-NEXT: str x30, [sp, #48] // 8-byte Spill
; CHECK-BF16SVE-SD-NEXT: shll v0.4s, v3.4h, #16
; CHECK-BF16SVE-SD-NEXT: shll v1.4s, v2.4h, #16
; CHECK-BF16SVE-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16SVE-SD-NEXT: // kill: def $s1 killed $s1 killed $q1
; CHECK-BF16SVE-SD-NEXT: bl fmodf
; CHECK-BF16SVE-SD-NEXT: bfcvt h0, s0
; CHECK-BF16SVE-SD-NEXT: str q0, [sp, #32] // 16-byte Spill
; CHECK-BF16SVE-SD-NEXT: ldp q0, q1, [sp] // 32-byte Folded Reload
; CHECK-BF16SVE-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16SVE-SD-NEXT: shll v1.4s, v1.4h, #16
; CHECK-BF16SVE-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16SVE-SD-NEXT: // kill: def $s1 killed $s1 killed $q1
; CHECK-BF16SVE-SD-NEXT: bl fmodf
; CHECK-BF16SVE-SD-NEXT: bfcvt h0, s0
; CHECK-BF16SVE-SD-NEXT: ldp q1, q2, [sp, #16] // 32-byte Folded Reload
; CHECK-BF16SVE-SD-NEXT: mov h1, v1.h[2]
; CHECK-BF16SVE-SD-NEXT: mov v0.h[1], v2.h[0]
; CHECK-BF16SVE-SD-NEXT: shll v1.4s, v1.4h, #16
; CHECK-BF16SVE-SD-NEXT: str q0, [sp, #32] // 16-byte Spill
; CHECK-BF16SVE-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-BF16SVE-SD-NEXT: // kill: def $s1 killed $s1 killed $q1
; CHECK-BF16SVE-SD-NEXT: mov h0, v0.h[2]
; CHECK-BF16SVE-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16SVE-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16SVE-SD-NEXT: bl fmodf
; CHECK-BF16SVE-SD-NEXT: bfcvt h0, s0
; CHECK-BF16SVE-SD-NEXT: ldr q1, [sp, #32] // 16-byte Reload
; CHECK-BF16SVE-SD-NEXT: mov v1.h[2], v0.h[0]
; CHECK-BF16SVE-SD-NEXT: str q1, [sp, #32] // 16-byte Spill
; CHECK-BF16SVE-SD-NEXT: ldp q0, q1, [sp] // 32-byte Folded Reload
; CHECK-BF16SVE-SD-NEXT: mov h0, v0.h[3]
; CHECK-BF16SVE-SD-NEXT: mov h1, v1.h[3]
; CHECK-BF16SVE-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16SVE-SD-NEXT: shll v1.4s, v1.4h, #16
; CHECK-BF16SVE-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16SVE-SD-NEXT: // kill: def $s1 killed $s1 killed $q1
; CHECK-BF16SVE-SD-NEXT: bl fmodf
; CHECK-BF16SVE-SD-NEXT: bfcvt h0, s0
; CHECK-BF16SVE-SD-NEXT: ldr q1, [sp, #32] // 16-byte Reload
; CHECK-BF16SVE-SD-NEXT: mov v1.h[3], v0.h[0]
; CHECK-BF16SVE-SD-NEXT: str q1, [sp, #32] // 16-byte Spill
; CHECK-BF16SVE-SD-NEXT: ldp q0, q1, [sp] // 32-byte Folded Reload
; CHECK-BF16SVE-SD-NEXT: mov h0, v0.h[4]
; CHECK-BF16SVE-SD-NEXT: mov h1, v1.h[4]
; CHECK-BF16SVE-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16SVE-SD-NEXT: shll v1.4s, v1.4h, #16
; CHECK-BF16SVE-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16SVE-SD-NEXT: // kill: def $s1 killed $s1 killed $q1
; CHECK-BF16SVE-SD-NEXT: bl fmodf
; CHECK-BF16SVE-SD-NEXT: bfcvt h0, s0
; CHECK-BF16SVE-SD-NEXT: ldr q1, [sp, #32] // 16-byte Reload
; CHECK-BF16SVE-SD-NEXT: mov v1.h[4], v0.h[0]
; CHECK-BF16SVE-SD-NEXT: str q1, [sp, #32] // 16-byte Spill
; CHECK-BF16SVE-SD-NEXT: ldp q0, q1, [sp] // 32-byte Folded Reload
; CHECK-BF16SVE-SD-NEXT: mov h0, v0.h[5]
; CHECK-BF16SVE-SD-NEXT: mov h1, v1.h[5]
; CHECK-BF16SVE-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16SVE-SD-NEXT: shll v1.4s, v1.4h, #16
; CHECK-BF16SVE-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16SVE-SD-NEXT: // kill: def $s1 killed $s1 killed $q1
; CHECK-BF16SVE-SD-NEXT: bl fmodf
; CHECK-BF16SVE-SD-NEXT: bfcvt h0, s0
; CHECK-BF16SVE-SD-NEXT: ldr q1, [sp, #32] // 16-byte Reload
; CHECK-BF16SVE-SD-NEXT: mov v1.h[5], v0.h[0]
; CHECK-BF16SVE-SD-NEXT: str q1, [sp, #32] // 16-byte Spill
; CHECK-BF16SVE-SD-NEXT: ldp q0, q1, [sp] // 32-byte Folded Reload
; CHECK-BF16SVE-SD-NEXT: mov h0, v0.h[6]
; CHECK-BF16SVE-SD-NEXT: mov h1, v1.h[6]
; CHECK-BF16SVE-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16SVE-SD-NEXT: shll v1.4s, v1.4h, #16
; CHECK-BF16SVE-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16SVE-SD-NEXT: // kill: def $s1 killed $s1 killed $q1
; CHECK-BF16SVE-SD-NEXT: bl fmodf
; CHECK-BF16SVE-SD-NEXT: bfcvt h0, s0
; CHECK-BF16SVE-SD-NEXT: ldr q1, [sp, #32] // 16-byte Reload
; CHECK-BF16SVE-SD-NEXT: mov v1.h[6], v0.h[0]
; CHECK-BF16SVE-SD-NEXT: str q1, [sp, #32] // 16-byte Spill
; CHECK-BF16SVE-SD-NEXT: ldp q0, q1, [sp] // 32-byte Folded Reload
; CHECK-BF16SVE-SD-NEXT: mov h0, v0.h[7]
; CHECK-BF16SVE-SD-NEXT: mov h1, v1.h[7]
; CHECK-BF16SVE-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16SVE-SD-NEXT: shll v1.4s, v1.4h, #16
; CHECK-BF16SVE-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16SVE-SD-NEXT: // kill: def $s1 killed $s1 killed $q1
; CHECK-BF16SVE-SD-NEXT: bl fmodf
; CHECK-BF16SVE-SD-NEXT: bfcvt h1, s0
; CHECK-BF16SVE-SD-NEXT: ldr q0, [sp, #32] // 16-byte Reload
; CHECK-BF16SVE-SD-NEXT: ldr x30, [sp, #48] // 8-byte Reload
; CHECK-BF16SVE-SD-NEXT: mov v0.h[7], v1.h[0]
; CHECK-BF16SVE-SD-NEXT: add sp, sp, #64
; CHECK-BF16SVE-SD-NEXT: ret
;
; CHECK-CVT-GI-LABEL: test_frem:
; CHECK-CVT-GI: // %bb.0:
; CHECK-CVT-GI-NEXT: sub sp, sp, #192
; CHECK-CVT-GI-NEXT: mov h2, v0.h[5]
; CHECK-CVT-GI-NEXT: stp d15, d14, [sp, #48] // 16-byte Folded Spill
; CHECK-CVT-GI-NEXT: mov h15, v0.h[4]
; CHECK-CVT-GI-NEXT: stp d13, d12, [sp, #64] // 16-byte Folded Spill
; CHECK-CVT-GI-NEXT: mov h12, v1.h[1]
; CHECK-CVT-GI-NEXT: mov h13, v1.h[2]
; CHECK-CVT-GI-NEXT: stp d11, d10, [sp, #80] // 16-byte Folded Spill
; CHECK-CVT-GI-NEXT: mov h10, v0.h[1]
; CHECK-CVT-GI-NEXT: mov h11, v0.h[2]
; CHECK-CVT-GI-NEXT: stp d9, d8, [sp, #96] // 16-byte Folded Spill
; CHECK-CVT-GI-NEXT: mov h9, v0.h[3]
; CHECK-CVT-GI-NEXT: mov h8, v1.h[3]
; CHECK-CVT-GI-NEXT: str d2, [sp, #8] // 8-byte Spill
; CHECK-CVT-GI-NEXT: mov h2, v0.h[6]
; CHECK-CVT-GI-NEXT: mov h14, v1.h[4]
; CHECK-CVT-GI-NEXT: str x30, [sp, #112] // 8-byte Spill
; CHECK-CVT-GI-NEXT: stp x26, x25, [sp, #128] // 16-byte Folded Spill
; CHECK-CVT-GI-NEXT: stp x24, x23, [sp, #144] // 16-byte Folded Spill
; CHECK-CVT-GI-NEXT: str d2, [sp, #24] // 8-byte Spill
; CHECK-CVT-GI-NEXT: mov h2, v0.h[7]
; CHECK-CVT-GI-NEXT: shll v0.4s, v0.4h, #16
; CHECK-CVT-GI-NEXT: stp x22, x21, [sp, #160] // 16-byte Folded Spill
; CHECK-CVT-GI-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-CVT-GI-NEXT: stp x20, x19, [sp, #176] // 16-byte Folded Spill
; CHECK-CVT-GI-NEXT: str d2, [sp, #40] // 8-byte Spill
; CHECK-CVT-GI-NEXT: mov h2, v1.h[5]
; CHECK-CVT-GI-NEXT: str d2, [sp, #16] // 8-byte Spill
; CHECK-CVT-GI-NEXT: mov h2, v1.h[6]
; CHECK-CVT-GI-NEXT: str d2, [sp, #32] // 8-byte Spill
; CHECK-CVT-GI-NEXT: mov h2, v1.h[7]
; CHECK-CVT-GI-NEXT: shll v1.4s, v1.4h, #16
; CHECK-CVT-GI-NEXT: // kill: def $s1 killed $s1 killed $q1
; CHECK-CVT-GI-NEXT: str d2, [sp, #120] // 8-byte Spill
; CHECK-CVT-GI-NEXT: bl fmodf
; CHECK-CVT-GI-NEXT: fmov w8, s0
; CHECK-CVT-GI-NEXT: mov w19, #32767 // =0x7fff
; CHECK-CVT-GI-NEXT: fcmp s0, #0.0
; CHECK-CVT-GI-NEXT: shll v0.4s, v10.4h, #16
; CHECK-CVT-GI-NEXT: shll v1.4s, v12.4h, #16
; CHECK-CVT-GI-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-CVT-GI-NEXT: // kill: def $s1 killed $s1 killed $q1
; CHECK-CVT-GI-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-GI-NEXT: add w10, w8, w19
; CHECK-CVT-GI-NEXT: orr w8, w8, #0x400000
; CHECK-CVT-GI-NEXT: add w9, w10, w9
; CHECK-CVT-GI-NEXT: csel w8, w8, w9, vs
; CHECK-CVT-GI-NEXT: lsr w20, w8, #16
; CHECK-CVT-GI-NEXT: bl fmodf
; CHECK-CVT-GI-NEXT: shll v2.4s, v11.4h, #16
; CHECK-CVT-GI-NEXT: fmov w8, s0
; CHECK-CVT-GI-NEXT: fcmp s0, #0.0
; CHECK-CVT-GI-NEXT: shll v1.4s, v13.4h, #16
; CHECK-CVT-GI-NEXT: // kill: def $s1 killed $s1 killed $q1
; CHECK-CVT-GI-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-GI-NEXT: fmov s0, s2
; CHECK-CVT-GI-NEXT: add w10, w8, w19
; CHECK-CVT-GI-NEXT: orr w8, w8, #0x400000
; CHECK-CVT-GI-NEXT: add w9, w10, w9
; CHECK-CVT-GI-NEXT: csel w8, w8, w9, vs
; CHECK-CVT-GI-NEXT: lsr w21, w8, #16
; CHECK-CVT-GI-NEXT: bl fmodf
; CHECK-CVT-GI-NEXT: shll v2.4s, v9.4h, #16
; CHECK-CVT-GI-NEXT: fmov w8, s0
; CHECK-CVT-GI-NEXT: fcmp s0, #0.0
; CHECK-CVT-GI-NEXT: shll v1.4s, v8.4h, #16
; CHECK-CVT-GI-NEXT: // kill: def $s1 killed $s1 killed $q1
; CHECK-CVT-GI-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-GI-NEXT: fmov s0, s2
; CHECK-CVT-GI-NEXT: add w10, w8, w19
; CHECK-CVT-GI-NEXT: orr w8, w8, #0x400000
; CHECK-CVT-GI-NEXT: add w9, w10, w9
; CHECK-CVT-GI-NEXT: csel w8, w8, w9, vs
; CHECK-CVT-GI-NEXT: lsr w22, w8, #16
; CHECK-CVT-GI-NEXT: bl fmodf
; CHECK-CVT-GI-NEXT: shll v2.4s, v15.4h, #16
; CHECK-CVT-GI-NEXT: fmov w8, s0
; CHECK-CVT-GI-NEXT: fcmp s0, #0.0
; CHECK-CVT-GI-NEXT: shll v1.4s, v14.4h, #16
; CHECK-CVT-GI-NEXT: // kill: def $s1 killed $s1 killed $q1
; CHECK-CVT-GI-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-GI-NEXT: fmov s0, s2
; CHECK-CVT-GI-NEXT: add w10, w8, w19
; CHECK-CVT-GI-NEXT: orr w8, w8, #0x400000
; CHECK-CVT-GI-NEXT: add w9, w10, w9
; CHECK-CVT-GI-NEXT: csel w8, w8, w9, vs
; CHECK-CVT-GI-NEXT: lsr w23, w8, #16
; CHECK-CVT-GI-NEXT: bl fmodf
; CHECK-CVT-GI-NEXT: ldr d1, [sp, #8] // 8-byte Reload
; CHECK-CVT-GI-NEXT: fmov w8, s0
; CHECK-CVT-GI-NEXT: fcmp s0, #0.0
; CHECK-CVT-GI-NEXT: ldr d0, [sp, #16] // 8-byte Reload
; CHECK-CVT-GI-NEXT: shll v2.4s, v1.4h, #16
; CHECK-CVT-GI-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-GI-NEXT: shll v1.4s, v0.4h, #16
; CHECK-CVT-GI-NEXT: add w10, w8, w19
; CHECK-CVT-GI-NEXT: orr w8, w8, #0x400000
; CHECK-CVT-GI-NEXT: // kill: def $s1 killed $s1 killed $q1
; CHECK-CVT-GI-NEXT: fmov s0, s2
; CHECK-CVT-GI-NEXT: add w9, w10, w9
; CHECK-CVT-GI-NEXT: csel w8, w8, w9, vs
; CHECK-CVT-GI-NEXT: lsr w24, w8, #16
; CHECK-CVT-GI-NEXT: bl fmodf
; CHECK-CVT-GI-NEXT: ldr d1, [sp, #24] // 8-byte Reload
; CHECK-CVT-GI-NEXT: fmov w8, s0
; CHECK-CVT-GI-NEXT: fcmp s0, #0.0
; CHECK-CVT-GI-NEXT: ldr d0, [sp, #32] // 8-byte Reload
; CHECK-CVT-GI-NEXT: shll v2.4s, v1.4h, #16
; CHECK-CVT-GI-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-GI-NEXT: shll v1.4s, v0.4h, #16
; CHECK-CVT-GI-NEXT: add w10, w8, w19
; CHECK-CVT-GI-NEXT: orr w8, w8, #0x400000
; CHECK-CVT-GI-NEXT: // kill: def $s1 killed $s1 killed $q1
; CHECK-CVT-GI-NEXT: fmov s0, s2
; CHECK-CVT-GI-NEXT: add w9, w10, w9
; CHECK-CVT-GI-NEXT: csel w8, w8, w9, vs
; CHECK-CVT-GI-NEXT: lsr w25, w8, #16
; CHECK-CVT-GI-NEXT: bl fmodf
; CHECK-CVT-GI-NEXT: ldr d1, [sp, #40] // 8-byte Reload
; CHECK-CVT-GI-NEXT: fmov w8, s0
; CHECK-CVT-GI-NEXT: fcmp s0, #0.0
; CHECK-CVT-GI-NEXT: ldr d0, [sp, #120] // 8-byte Reload
; CHECK-CVT-GI-NEXT: shll v2.4s, v1.4h, #16
; CHECK-CVT-GI-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-GI-NEXT: shll v1.4s, v0.4h, #16
; CHECK-CVT-GI-NEXT: add w10, w8, w19
; CHECK-CVT-GI-NEXT: orr w8, w8, #0x400000
; CHECK-CVT-GI-NEXT: // kill: def $s1 killed $s1 killed $q1
; CHECK-CVT-GI-NEXT: fmov s0, s2
; CHECK-CVT-GI-NEXT: add w9, w10, w9
; CHECK-CVT-GI-NEXT: csel w8, w8, w9, vs
; CHECK-CVT-GI-NEXT: lsr w26, w8, #16
; CHECK-CVT-GI-NEXT: bl fmodf
; CHECK-CVT-GI-NEXT: fmov s1, w20
; CHECK-CVT-GI-NEXT: fmov w8, s0
; CHECK-CVT-GI-NEXT: ldr x30, [sp, #112] // 8-byte Reload
; CHECK-CVT-GI-NEXT: fcmp s0, #0.0
; CHECK-CVT-GI-NEXT: ldp d9, d8, [sp, #96] // 16-byte Folded Reload
; CHECK-CVT-GI-NEXT: ldp d11, d10, [sp, #80] // 16-byte Folded Reload
; CHECK-CVT-GI-NEXT: mov v1.h[1], w21
; CHECK-CVT-GI-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-GI-NEXT: add w10, w8, w19
; CHECK-CVT-GI-NEXT: orr w8, w8, #0x400000
; CHECK-CVT-GI-NEXT: ldp x20, x19, [sp, #176] // 16-byte Folded Reload
; CHECK-CVT-GI-NEXT: add w9, w10, w9
; CHECK-CVT-GI-NEXT: ldp d13, d12, [sp, #64] // 16-byte Folded Reload
; CHECK-CVT-GI-NEXT: csel w8, w8, w9, vs
; CHECK-CVT-GI-NEXT: ldp d15, d14, [sp, #48] // 16-byte Folded Reload
; CHECK-CVT-GI-NEXT: mov v1.h[2], w22
; CHECK-CVT-GI-NEXT: lsr w8, w8, #16
; CHECK-CVT-GI-NEXT: ldp x22, x21, [sp, #160] // 16-byte Folded Reload
; CHECK-CVT-GI-NEXT: mov v1.h[3], w23
; CHECK-CVT-GI-NEXT: mov v1.h[4], w24
; CHECK-CVT-GI-NEXT: ldp x24, x23, [sp, #144] // 16-byte Folded Reload
; CHECK-CVT-GI-NEXT: mov v1.h[5], w25
; CHECK-CVT-GI-NEXT: mov v1.h[6], w26
; CHECK-CVT-GI-NEXT: ldp x26, x25, [sp, #128] // 16-byte Folded Reload
; CHECK-CVT-GI-NEXT: mov v1.h[7], w8
; CHECK-CVT-GI-NEXT: mov v0.16b, v1.16b
; CHECK-CVT-GI-NEXT: add sp, sp, #192
; CHECK-CVT-GI-NEXT: ret
;
; CHECK-BF16-GI-LABEL: test_frem:
; CHECK-BF16-GI: // %bb.0:
; CHECK-BF16-GI-NEXT: sub sp, sp, #240
; CHECK-BF16-GI-NEXT: mov h2, v0.h[5]
; CHECK-BF16-GI-NEXT: stp d15, d14, [sp, #160] // 16-byte Folded Spill
; CHECK-BF16-GI-NEXT: mov h15, v0.h[1]
; CHECK-BF16-GI-NEXT: stp d13, d12, [sp, #176] // 16-byte Folded Spill
; CHECK-BF16-GI-NEXT: mov h14, v0.h[4]
; CHECK-BF16-GI-NEXT: mov h12, v1.h[3]
; CHECK-BF16-GI-NEXT: stp d11, d10, [sp, #192] // 16-byte Folded Spill
; CHECK-BF16-GI-NEXT: mov h10, v1.h[1]
; CHECK-BF16-GI-NEXT: mov h11, v1.h[2]
; CHECK-BF16-GI-NEXT: stp d9, d8, [sp, #208] // 16-byte Folded Spill
; CHECK-BF16-GI-NEXT: mov h8, v0.h[2]
; CHECK-BF16-GI-NEXT: mov h9, v0.h[3]
; CHECK-BF16-GI-NEXT: str d2, [sp, #64] // 8-byte Spill
; CHECK-BF16-GI-NEXT: mov h2, v0.h[6]
; CHECK-BF16-GI-NEXT: mov h13, v1.h[4]
; CHECK-BF16-GI-NEXT: str x30, [sp, #224] // 8-byte Spill
; CHECK-BF16-GI-NEXT: str d2, [sp, #112] // 8-byte Spill
; CHECK-BF16-GI-NEXT: mov h2, v0.h[7]
; CHECK-BF16-GI-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16-GI-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16-GI-NEXT: str d2, [sp, #232] // 8-byte Spill
; CHECK-BF16-GI-NEXT: mov h2, v1.h[5]
; CHECK-BF16-GI-NEXT: str d2, [sp, #40] // 8-byte Spill
; CHECK-BF16-GI-NEXT: mov h2, v1.h[6]
; CHECK-BF16-GI-NEXT: str d2, [sp, #104] // 8-byte Spill
; CHECK-BF16-GI-NEXT: mov h2, v1.h[7]
; CHECK-BF16-GI-NEXT: shll v1.4s, v1.4h, #16
; CHECK-BF16-GI-NEXT: // kill: def $s1 killed $s1 killed $q1
; CHECK-BF16-GI-NEXT: str d2, [sp, #152] // 8-byte Spill
; CHECK-BF16-GI-NEXT: bl fmodf
; CHECK-BF16-GI-NEXT: bfcvt h0, s0
; CHECK-BF16-GI-NEXT: shll v1.4s, v10.4h, #16
; CHECK-BF16-GI-NEXT: // kill: def $s1 killed $s1 killed $q1
; CHECK-BF16-GI-NEXT: str q0, [sp, #128] // 16-byte Spill
; CHECK-BF16-GI-NEXT: shll v0.4s, v15.4h, #16
; CHECK-BF16-GI-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16-GI-NEXT: bl fmodf
; CHECK-BF16-GI-NEXT: bfcvt h0, s0
; CHECK-BF16-GI-NEXT: shll v1.4s, v11.4h, #16
; CHECK-BF16-GI-NEXT: // kill: def $s1 killed $s1 killed $q1
; CHECK-BF16-GI-NEXT: str q0, [sp, #80] // 16-byte Spill
; CHECK-BF16-GI-NEXT: shll v0.4s, v8.4h, #16
; CHECK-BF16-GI-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16-GI-NEXT: bl fmodf
; CHECK-BF16-GI-NEXT: bfcvt h0, s0
; CHECK-BF16-GI-NEXT: shll v1.4s, v12.4h, #16
; CHECK-BF16-GI-NEXT: // kill: def $s1 killed $s1 killed $q1
; CHECK-BF16-GI-NEXT: str q0, [sp, #48] // 16-byte Spill
; CHECK-BF16-GI-NEXT: shll v0.4s, v9.4h, #16
; CHECK-BF16-GI-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16-GI-NEXT: bl fmodf
; CHECK-BF16-GI-NEXT: bfcvt h0, s0
; CHECK-BF16-GI-NEXT: shll v1.4s, v13.4h, #16
; CHECK-BF16-GI-NEXT: // kill: def $s1 killed $s1 killed $q1
; CHECK-BF16-GI-NEXT: str q0, [sp, #16] // 16-byte Spill
; CHECK-BF16-GI-NEXT: shll v0.4s, v14.4h, #16
; CHECK-BF16-GI-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16-GI-NEXT: bl fmodf
; CHECK-BF16-GI-NEXT: bfcvt h0, s0
; CHECK-BF16-GI-NEXT: ldr d1, [sp, #40] // 8-byte Reload
; CHECK-BF16-GI-NEXT: shll v1.4s, v1.4h, #16
; CHECK-BF16-GI-NEXT: // kill: def $s1 killed $s1 killed $q1
; CHECK-BF16-GI-NEXT: str q0, [sp] // 16-byte Spill
; CHECK-BF16-GI-NEXT: ldr d0, [sp, #64] // 8-byte Reload
; CHECK-BF16-GI-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16-GI-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16-GI-NEXT: bl fmodf
; CHECK-BF16-GI-NEXT: bfcvt h0, s0
; CHECK-BF16-GI-NEXT: str q0, [sp, #64] // 16-byte Spill
; CHECK-BF16-GI-NEXT: ldp d1, d0, [sp, #104] // 16-byte Folded Reload
; CHECK-BF16-GI-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16-GI-NEXT: shll v1.4s, v1.4h, #16
; CHECK-BF16-GI-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16-GI-NEXT: // kill: def $s1 killed $s1 killed $q1
; CHECK-BF16-GI-NEXT: bl fmodf
; CHECK-BF16-GI-NEXT: bfcvt h0, s0
; CHECK-BF16-GI-NEXT: ldr d1, [sp, #152] // 8-byte Reload
; CHECK-BF16-GI-NEXT: shll v1.4s, v1.4h, #16
; CHECK-BF16-GI-NEXT: // kill: def $s1 killed $s1 killed $q1
; CHECK-BF16-GI-NEXT: str q0, [sp, #112] // 16-byte Spill
; CHECK-BF16-GI-NEXT: ldr d0, [sp, #232] // 8-byte Reload
; CHECK-BF16-GI-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16-GI-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16-GI-NEXT: bl fmodf
; CHECK-BF16-GI-NEXT: ldr q1, [sp, #128] // 16-byte Reload
; CHECK-BF16-GI-NEXT: ldr q2, [sp, #80] // 16-byte Reload
; CHECK-BF16-GI-NEXT: bfcvt h0, s0
; CHECK-BF16-GI-NEXT: ldp d9, d8, [sp, #208] // 16-byte Folded Reload
; CHECK-BF16-GI-NEXT: ldr x30, [sp, #224] // 8-byte Reload
; CHECK-BF16-GI-NEXT: mov v1.h[1], v2.h[0]
; CHECK-BF16-GI-NEXT: ldr q2, [sp, #48] // 16-byte Reload
; CHECK-BF16-GI-NEXT: ldp d11, d10, [sp, #192] // 16-byte Folded Reload
; CHECK-BF16-GI-NEXT: ldp d13, d12, [sp, #176] // 16-byte Folded Reload
; CHECK-BF16-GI-NEXT: ldp d15, d14, [sp, #160] // 16-byte Folded Reload
; CHECK-BF16-GI-NEXT: mov v1.h[2], v2.h[0]
; CHECK-BF16-GI-NEXT: ldp q2, q3, [sp] // 32-byte Folded Reload
; CHECK-BF16-GI-NEXT: mov v1.h[3], v3.h[0]
; CHECK-BF16-GI-NEXT: mov v1.h[4], v2.h[0]
; CHECK-BF16-GI-NEXT: ldr q2, [sp, #64] // 16-byte Reload
; CHECK-BF16-GI-NEXT: mov v1.h[5], v2.h[0]
; CHECK-BF16-GI-NEXT: ldr q2, [sp, #112] // 16-byte Reload
; CHECK-BF16-GI-NEXT: mov v1.h[6], v2.h[0]
; CHECK-BF16-GI-NEXT: mov v1.h[7], v0.h[0]
; CHECK-BF16-GI-NEXT: mov v0.16b, v1.16b
; CHECK-BF16-GI-NEXT: add sp, sp, #240
; CHECK-BF16-GI-NEXT: ret
%r = frem <8 x bfloat> %a, %b
ret <8 x bfloat> %r
}
define <8 x bfloat> @test_load(ptr %a) {
; CHECK-LABEL: test_load:
; CHECK: // %bb.0:
; CHECK-NEXT: ldr q0, [x0]
; CHECK-NEXT: ret
%r = load <8 x bfloat>, ptr %a, align 4
ret <8 x bfloat> %r
}
define void @test_store(ptr %a, <8 x bfloat> %b) {
; CHECK-LABEL: test_store:
; CHECK: // %bb.0:
; CHECK-NEXT: str q0, [x0]
; CHECK-NEXT: ret
store <8 x bfloat> %b, ptr %a, align 4
ret void
}
define void @test_insert_at_zero(bfloat %a, ptr %b) #0 {
; CHECK-LABEL: test_insert_at_zero:
; CHECK: // %bb.0:
; CHECK-NEXT: // kill: def $h0 killed $h0 def $q0
; CHECK-NEXT: str q0, [x0]
; CHECK-NEXT: ret
%1 = insertelement <8 x bfloat> undef, bfloat %a, i64 0
store <8 x bfloat> %1, ptr %b, align 4
ret void
}
define <8 x i1> @test_fcmp_une(<8 x bfloat> %a, <8 x bfloat> %b) #0 {
; CHECK-CVT-SD-LABEL: test_fcmp_une:
; CHECK-CVT-SD: // %bb.0:
; CHECK-CVT-SD-NEXT: shll2 v2.4s, v1.8h, #16
; CHECK-CVT-SD-NEXT: shll2 v3.4s, v0.8h, #16
; CHECK-CVT-SD-NEXT: shll v1.4s, v1.4h, #16
; CHECK-CVT-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-CVT-SD-NEXT: fcmeq v2.4s, v3.4s, v2.4s
; CHECK-CVT-SD-NEXT: fcmeq v0.4s, v0.4s, v1.4s
; CHECK-CVT-SD-NEXT: uzp1 v0.8h, v0.8h, v2.8h
; CHECK-CVT-SD-NEXT: mvn v0.16b, v0.16b
; CHECK-CVT-SD-NEXT: xtn v0.8b, v0.8h
; CHECK-CVT-SD-NEXT: ret
;
; CHECK-BF16-SD-LABEL: test_fcmp_une:
; CHECK-BF16-SD: // %bb.0:
; CHECK-BF16-SD-NEXT: shll2 v2.4s, v1.8h, #16
; CHECK-BF16-SD-NEXT: shll2 v3.4s, v0.8h, #16
; CHECK-BF16-SD-NEXT: shll v1.4s, v1.4h, #16
; CHECK-BF16-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16-SD-NEXT: fcmeq v2.4s, v3.4s, v2.4s
; CHECK-BF16-SD-NEXT: fcmeq v0.4s, v0.4s, v1.4s
; CHECK-BF16-SD-NEXT: uzp1 v0.8h, v0.8h, v2.8h
; CHECK-BF16-SD-NEXT: mvn v0.16b, v0.16b
; CHECK-BF16-SD-NEXT: xtn v0.8b, v0.8h
; CHECK-BF16-SD-NEXT: ret
;
; CHECK-BF16SVE-SD-LABEL: test_fcmp_une:
; CHECK-BF16SVE-SD: // %bb.0:
; CHECK-BF16SVE-SD-NEXT: shll2 v2.4s, v1.8h, #16
; CHECK-BF16SVE-SD-NEXT: shll2 v3.4s, v0.8h, #16
; CHECK-BF16SVE-SD-NEXT: shll v1.4s, v1.4h, #16
; CHECK-BF16SVE-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16SVE-SD-NEXT: fcmeq v2.4s, v3.4s, v2.4s
; CHECK-BF16SVE-SD-NEXT: fcmeq v0.4s, v0.4s, v1.4s
; CHECK-BF16SVE-SD-NEXT: uzp1 v0.8h, v0.8h, v2.8h
; CHECK-BF16SVE-SD-NEXT: mvn v0.16b, v0.16b
; CHECK-BF16SVE-SD-NEXT: xtn v0.8b, v0.8h
; CHECK-BF16SVE-SD-NEXT: ret
;
; CHECK-CVT-GI-LABEL: test_fcmp_une:
; CHECK-CVT-GI: // %bb.0:
; CHECK-CVT-GI-NEXT: shll v2.4s, v0.4h, #16
; CHECK-CVT-GI-NEXT: shll2 v0.4s, v0.8h, #16
; CHECK-CVT-GI-NEXT: shll v3.4s, v1.4h, #16
; CHECK-CVT-GI-NEXT: shll2 v1.4s, v1.8h, #16
; CHECK-CVT-GI-NEXT: fcmeq v2.4s, v2.4s, v3.4s
; CHECK-CVT-GI-NEXT: fcmeq v0.4s, v0.4s, v1.4s
; CHECK-CVT-GI-NEXT: mvn v1.16b, v2.16b
; CHECK-CVT-GI-NEXT: mvn v0.16b, v0.16b
; CHECK-CVT-GI-NEXT: uzp1 v0.8h, v1.8h, v0.8h
; CHECK-CVT-GI-NEXT: xtn v0.8b, v0.8h
; CHECK-CVT-GI-NEXT: ret
;
; CHECK-BF16-GI-LABEL: test_fcmp_une:
; CHECK-BF16-GI: // %bb.0:
; CHECK-BF16-GI-NEXT: shll v2.4s, v0.4h, #16
; CHECK-BF16-GI-NEXT: shll2 v0.4s, v0.8h, #16
; CHECK-BF16-GI-NEXT: shll v3.4s, v1.4h, #16
; CHECK-BF16-GI-NEXT: shll2 v1.4s, v1.8h, #16
; CHECK-BF16-GI-NEXT: fcmeq v2.4s, v2.4s, v3.4s
; CHECK-BF16-GI-NEXT: fcmeq v0.4s, v0.4s, v1.4s
; CHECK-BF16-GI-NEXT: mvn v1.16b, v2.16b
; CHECK-BF16-GI-NEXT: mvn v0.16b, v0.16b
; CHECK-BF16-GI-NEXT: uzp1 v0.8h, v1.8h, v0.8h
; CHECK-BF16-GI-NEXT: xtn v0.8b, v0.8h
; CHECK-BF16-GI-NEXT: ret
%1 = fcmp une <8 x bfloat> %a, %b
ret <8 x i1> %1
}
define <8 x i1> @test_fcmp_ueq(<8 x bfloat> %a, <8 x bfloat> %b) #0 {
; CHECK-CVT-SD-LABEL: test_fcmp_ueq:
; CHECK-CVT-SD: // %bb.0:
; CHECK-CVT-SD-NEXT: shll2 v2.4s, v1.8h, #16
; CHECK-CVT-SD-NEXT: shll2 v3.4s, v0.8h, #16
; CHECK-CVT-SD-NEXT: shll v1.4s, v1.4h, #16
; CHECK-CVT-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-CVT-SD-NEXT: fcmgt v4.4s, v3.4s, v2.4s
; CHECK-CVT-SD-NEXT: fcmgt v2.4s, v2.4s, v3.4s
; CHECK-CVT-SD-NEXT: fcmgt v3.4s, v0.4s, v1.4s
; CHECK-CVT-SD-NEXT: fcmgt v0.4s, v1.4s, v0.4s
; CHECK-CVT-SD-NEXT: orr v1.16b, v2.16b, v4.16b
; CHECK-CVT-SD-NEXT: orr v0.16b, v0.16b, v3.16b
; CHECK-CVT-SD-NEXT: uzp1 v0.8h, v0.8h, v1.8h
; CHECK-CVT-SD-NEXT: mvn v0.16b, v0.16b
; CHECK-CVT-SD-NEXT: xtn v0.8b, v0.8h
; CHECK-CVT-SD-NEXT: ret
;
; CHECK-BF16-SD-LABEL: test_fcmp_ueq:
; CHECK-BF16-SD: // %bb.0:
; CHECK-BF16-SD-NEXT: shll2 v2.4s, v1.8h, #16
; CHECK-BF16-SD-NEXT: shll2 v3.4s, v0.8h, #16
; CHECK-BF16-SD-NEXT: shll v1.4s, v1.4h, #16
; CHECK-BF16-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16-SD-NEXT: fcmgt v4.4s, v3.4s, v2.4s
; CHECK-BF16-SD-NEXT: fcmgt v2.4s, v2.4s, v3.4s
; CHECK-BF16-SD-NEXT: fcmgt v3.4s, v0.4s, v1.4s
; CHECK-BF16-SD-NEXT: fcmgt v0.4s, v1.4s, v0.4s
; CHECK-BF16-SD-NEXT: orr v1.16b, v2.16b, v4.16b
; CHECK-BF16-SD-NEXT: orr v0.16b, v0.16b, v3.16b
; CHECK-BF16-SD-NEXT: uzp1 v0.8h, v0.8h, v1.8h
; CHECK-BF16-SD-NEXT: mvn v0.16b, v0.16b
; CHECK-BF16-SD-NEXT: xtn v0.8b, v0.8h
; CHECK-BF16-SD-NEXT: ret
;
; CHECK-BF16SVE-SD-LABEL: test_fcmp_ueq:
; CHECK-BF16SVE-SD: // %bb.0:
; CHECK-BF16SVE-SD-NEXT: shll2 v2.4s, v1.8h, #16
; CHECK-BF16SVE-SD-NEXT: shll2 v3.4s, v0.8h, #16
; CHECK-BF16SVE-SD-NEXT: shll v1.4s, v1.4h, #16
; CHECK-BF16SVE-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16SVE-SD-NEXT: fcmgt v4.4s, v3.4s, v2.4s
; CHECK-BF16SVE-SD-NEXT: fcmgt v2.4s, v2.4s, v3.4s
; CHECK-BF16SVE-SD-NEXT: fcmgt v3.4s, v0.4s, v1.4s
; CHECK-BF16SVE-SD-NEXT: fcmgt v0.4s, v1.4s, v0.4s
; CHECK-BF16SVE-SD-NEXT: orr v1.16b, v2.16b, v4.16b
; CHECK-BF16SVE-SD-NEXT: orr v0.16b, v0.16b, v3.16b
; CHECK-BF16SVE-SD-NEXT: uzp1 v0.8h, v0.8h, v1.8h
; CHECK-BF16SVE-SD-NEXT: mvn v0.16b, v0.16b
; CHECK-BF16SVE-SD-NEXT: xtn v0.8b, v0.8h
; CHECK-BF16SVE-SD-NEXT: ret
;
; CHECK-CVT-GI-LABEL: test_fcmp_ueq:
; CHECK-CVT-GI: // %bb.0:
; CHECK-CVT-GI-NEXT: shll v2.4s, v0.4h, #16
; CHECK-CVT-GI-NEXT: shll v3.4s, v1.4h, #16
; CHECK-CVT-GI-NEXT: shll2 v0.4s, v0.8h, #16
; CHECK-CVT-GI-NEXT: shll2 v1.4s, v1.8h, #16
; CHECK-CVT-GI-NEXT: fcmgt v4.4s, v2.4s, v3.4s
; CHECK-CVT-GI-NEXT: fcmgt v2.4s, v3.4s, v2.4s
; CHECK-CVT-GI-NEXT: fcmgt v3.4s, v0.4s, v1.4s
; CHECK-CVT-GI-NEXT: fcmgt v0.4s, v1.4s, v0.4s
; CHECK-CVT-GI-NEXT: orr v1.16b, v2.16b, v4.16b
; CHECK-CVT-GI-NEXT: orr v0.16b, v0.16b, v3.16b
; CHECK-CVT-GI-NEXT: mvn v1.16b, v1.16b
; CHECK-CVT-GI-NEXT: mvn v0.16b, v0.16b
; CHECK-CVT-GI-NEXT: uzp1 v0.8h, v1.8h, v0.8h
; CHECK-CVT-GI-NEXT: xtn v0.8b, v0.8h
; CHECK-CVT-GI-NEXT: ret
;
; CHECK-BF16-GI-LABEL: test_fcmp_ueq:
; CHECK-BF16-GI: // %bb.0:
; CHECK-BF16-GI-NEXT: shll v2.4s, v0.4h, #16
; CHECK-BF16-GI-NEXT: shll v3.4s, v1.4h, #16
; CHECK-BF16-GI-NEXT: shll2 v0.4s, v0.8h, #16
; CHECK-BF16-GI-NEXT: shll2 v1.4s, v1.8h, #16
; CHECK-BF16-GI-NEXT: fcmgt v4.4s, v2.4s, v3.4s
; CHECK-BF16-GI-NEXT: fcmgt v2.4s, v3.4s, v2.4s
; CHECK-BF16-GI-NEXT: fcmgt v3.4s, v0.4s, v1.4s
; CHECK-BF16-GI-NEXT: fcmgt v0.4s, v1.4s, v0.4s
; CHECK-BF16-GI-NEXT: orr v1.16b, v2.16b, v4.16b
; CHECK-BF16-GI-NEXT: orr v0.16b, v0.16b, v3.16b
; CHECK-BF16-GI-NEXT: mvn v1.16b, v1.16b
; CHECK-BF16-GI-NEXT: mvn v0.16b, v0.16b
; CHECK-BF16-GI-NEXT: uzp1 v0.8h, v1.8h, v0.8h
; CHECK-BF16-GI-NEXT: xtn v0.8b, v0.8h
; CHECK-BF16-GI-NEXT: ret
%1 = fcmp ueq <8 x bfloat> %a, %b
ret <8 x i1> %1
}
define <8 x i1> @test_fcmp_ugt(<8 x bfloat> %a, <8 x bfloat> %b) #0 {
; CHECK-CVT-SD-LABEL: test_fcmp_ugt:
; CHECK-CVT-SD: // %bb.0:
; CHECK-CVT-SD-NEXT: shll2 v2.4s, v0.8h, #16
; CHECK-CVT-SD-NEXT: shll2 v3.4s, v1.8h, #16
; CHECK-CVT-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-CVT-SD-NEXT: shll v1.4s, v1.4h, #16
; CHECK-CVT-SD-NEXT: fcmge v2.4s, v3.4s, v2.4s
; CHECK-CVT-SD-NEXT: fcmge v0.4s, v1.4s, v0.4s
; CHECK-CVT-SD-NEXT: uzp1 v0.8h, v0.8h, v2.8h
; CHECK-CVT-SD-NEXT: mvn v0.16b, v0.16b
; CHECK-CVT-SD-NEXT: xtn v0.8b, v0.8h
; CHECK-CVT-SD-NEXT: ret
;
; CHECK-BF16-SD-LABEL: test_fcmp_ugt:
; CHECK-BF16-SD: // %bb.0:
; CHECK-BF16-SD-NEXT: shll2 v2.4s, v0.8h, #16
; CHECK-BF16-SD-NEXT: shll2 v3.4s, v1.8h, #16
; CHECK-BF16-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16-SD-NEXT: shll v1.4s, v1.4h, #16
; CHECK-BF16-SD-NEXT: fcmge v2.4s, v3.4s, v2.4s
; CHECK-BF16-SD-NEXT: fcmge v0.4s, v1.4s, v0.4s
; CHECK-BF16-SD-NEXT: uzp1 v0.8h, v0.8h, v2.8h
; CHECK-BF16-SD-NEXT: mvn v0.16b, v0.16b
; CHECK-BF16-SD-NEXT: xtn v0.8b, v0.8h
; CHECK-BF16-SD-NEXT: ret
;
; CHECK-BF16SVE-SD-LABEL: test_fcmp_ugt:
; CHECK-BF16SVE-SD: // %bb.0:
; CHECK-BF16SVE-SD-NEXT: shll2 v2.4s, v0.8h, #16
; CHECK-BF16SVE-SD-NEXT: shll2 v3.4s, v1.8h, #16
; CHECK-BF16SVE-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16SVE-SD-NEXT: shll v1.4s, v1.4h, #16
; CHECK-BF16SVE-SD-NEXT: fcmge v2.4s, v3.4s, v2.4s
; CHECK-BF16SVE-SD-NEXT: fcmge v0.4s, v1.4s, v0.4s
; CHECK-BF16SVE-SD-NEXT: uzp1 v0.8h, v0.8h, v2.8h
; CHECK-BF16SVE-SD-NEXT: mvn v0.16b, v0.16b
; CHECK-BF16SVE-SD-NEXT: xtn v0.8b, v0.8h
; CHECK-BF16SVE-SD-NEXT: ret
;
; CHECK-CVT-GI-LABEL: test_fcmp_ugt:
; CHECK-CVT-GI: // %bb.0:
; CHECK-CVT-GI-NEXT: shll v2.4s, v0.4h, #16
; CHECK-CVT-GI-NEXT: shll2 v0.4s, v0.8h, #16
; CHECK-CVT-GI-NEXT: shll v3.4s, v1.4h, #16
; CHECK-CVT-GI-NEXT: shll2 v1.4s, v1.8h, #16
; CHECK-CVT-GI-NEXT: fcmge v2.4s, v3.4s, v2.4s
; CHECK-CVT-GI-NEXT: fcmge v0.4s, v1.4s, v0.4s
; CHECK-CVT-GI-NEXT: mvn v1.16b, v2.16b
; CHECK-CVT-GI-NEXT: mvn v0.16b, v0.16b
; CHECK-CVT-GI-NEXT: uzp1 v0.8h, v1.8h, v0.8h
; CHECK-CVT-GI-NEXT: xtn v0.8b, v0.8h
; CHECK-CVT-GI-NEXT: ret
;
; CHECK-BF16-GI-LABEL: test_fcmp_ugt:
; CHECK-BF16-GI: // %bb.0:
; CHECK-BF16-GI-NEXT: shll v2.4s, v0.4h, #16
; CHECK-BF16-GI-NEXT: shll2 v0.4s, v0.8h, #16
; CHECK-BF16-GI-NEXT: shll v3.4s, v1.4h, #16
; CHECK-BF16-GI-NEXT: shll2 v1.4s, v1.8h, #16
; CHECK-BF16-GI-NEXT: fcmge v2.4s, v3.4s, v2.4s
; CHECK-BF16-GI-NEXT: fcmge v0.4s, v1.4s, v0.4s
; CHECK-BF16-GI-NEXT: mvn v1.16b, v2.16b
; CHECK-BF16-GI-NEXT: mvn v0.16b, v0.16b
; CHECK-BF16-GI-NEXT: uzp1 v0.8h, v1.8h, v0.8h
; CHECK-BF16-GI-NEXT: xtn v0.8b, v0.8h
; CHECK-BF16-GI-NEXT: ret
%1 = fcmp ugt <8 x bfloat> %a, %b
ret <8 x i1> %1
}
define <8 x i1> @test_fcmp_uge(<8 x bfloat> %a, <8 x bfloat> %b) #0 {
; CHECK-CVT-SD-LABEL: test_fcmp_uge:
; CHECK-CVT-SD: // %bb.0:
; CHECK-CVT-SD-NEXT: shll2 v2.4s, v0.8h, #16
; CHECK-CVT-SD-NEXT: shll2 v3.4s, v1.8h, #16
; CHECK-CVT-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-CVT-SD-NEXT: shll v1.4s, v1.4h, #16
; CHECK-CVT-SD-NEXT: fcmgt v2.4s, v3.4s, v2.4s
; CHECK-CVT-SD-NEXT: fcmgt v0.4s, v1.4s, v0.4s
; CHECK-CVT-SD-NEXT: uzp1 v0.8h, v0.8h, v2.8h
; CHECK-CVT-SD-NEXT: mvn v0.16b, v0.16b
; CHECK-CVT-SD-NEXT: xtn v0.8b, v0.8h
; CHECK-CVT-SD-NEXT: ret
;
; CHECK-BF16-SD-LABEL: test_fcmp_uge:
; CHECK-BF16-SD: // %bb.0:
; CHECK-BF16-SD-NEXT: shll2 v2.4s, v0.8h, #16
; CHECK-BF16-SD-NEXT: shll2 v3.4s, v1.8h, #16
; CHECK-BF16-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16-SD-NEXT: shll v1.4s, v1.4h, #16
; CHECK-BF16-SD-NEXT: fcmgt v2.4s, v3.4s, v2.4s
; CHECK-BF16-SD-NEXT: fcmgt v0.4s, v1.4s, v0.4s
; CHECK-BF16-SD-NEXT: uzp1 v0.8h, v0.8h, v2.8h
; CHECK-BF16-SD-NEXT: mvn v0.16b, v0.16b
; CHECK-BF16-SD-NEXT: xtn v0.8b, v0.8h
; CHECK-BF16-SD-NEXT: ret
;
; CHECK-BF16SVE-SD-LABEL: test_fcmp_uge:
; CHECK-BF16SVE-SD: // %bb.0:
; CHECK-BF16SVE-SD-NEXT: shll2 v2.4s, v0.8h, #16
; CHECK-BF16SVE-SD-NEXT: shll2 v3.4s, v1.8h, #16
; CHECK-BF16SVE-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16SVE-SD-NEXT: shll v1.4s, v1.4h, #16
; CHECK-BF16SVE-SD-NEXT: fcmgt v2.4s, v3.4s, v2.4s
; CHECK-BF16SVE-SD-NEXT: fcmgt v0.4s, v1.4s, v0.4s
; CHECK-BF16SVE-SD-NEXT: uzp1 v0.8h, v0.8h, v2.8h
; CHECK-BF16SVE-SD-NEXT: mvn v0.16b, v0.16b
; CHECK-BF16SVE-SD-NEXT: xtn v0.8b, v0.8h
; CHECK-BF16SVE-SD-NEXT: ret
;
; CHECK-CVT-GI-LABEL: test_fcmp_uge:
; CHECK-CVT-GI: // %bb.0:
; CHECK-CVT-GI-NEXT: shll v2.4s, v0.4h, #16
; CHECK-CVT-GI-NEXT: shll2 v0.4s, v0.8h, #16
; CHECK-CVT-GI-NEXT: shll v3.4s, v1.4h, #16
; CHECK-CVT-GI-NEXT: shll2 v1.4s, v1.8h, #16
; CHECK-CVT-GI-NEXT: fcmgt v2.4s, v3.4s, v2.4s
; CHECK-CVT-GI-NEXT: fcmgt v0.4s, v1.4s, v0.4s
; CHECK-CVT-GI-NEXT: mvn v1.16b, v2.16b
; CHECK-CVT-GI-NEXT: mvn v0.16b, v0.16b
; CHECK-CVT-GI-NEXT: uzp1 v0.8h, v1.8h, v0.8h
; CHECK-CVT-GI-NEXT: xtn v0.8b, v0.8h
; CHECK-CVT-GI-NEXT: ret
;
; CHECK-BF16-GI-LABEL: test_fcmp_uge:
; CHECK-BF16-GI: // %bb.0:
; CHECK-BF16-GI-NEXT: shll v2.4s, v0.4h, #16
; CHECK-BF16-GI-NEXT: shll2 v0.4s, v0.8h, #16
; CHECK-BF16-GI-NEXT: shll v3.4s, v1.4h, #16
; CHECK-BF16-GI-NEXT: shll2 v1.4s, v1.8h, #16
; CHECK-BF16-GI-NEXT: fcmgt v2.4s, v3.4s, v2.4s
; CHECK-BF16-GI-NEXT: fcmgt v0.4s, v1.4s, v0.4s
; CHECK-BF16-GI-NEXT: mvn v1.16b, v2.16b
; CHECK-BF16-GI-NEXT: mvn v0.16b, v0.16b
; CHECK-BF16-GI-NEXT: uzp1 v0.8h, v1.8h, v0.8h
; CHECK-BF16-GI-NEXT: xtn v0.8b, v0.8h
; CHECK-BF16-GI-NEXT: ret
%1 = fcmp uge <8 x bfloat> %a, %b
ret <8 x i1> %1
}
define <8 x i1> @test_fcmp_ult(<8 x bfloat> %a, <8 x bfloat> %b) #0 {
; CHECK-CVT-SD-LABEL: test_fcmp_ult:
; CHECK-CVT-SD: // %bb.0:
; CHECK-CVT-SD-NEXT: shll2 v2.4s, v1.8h, #16
; CHECK-CVT-SD-NEXT: shll2 v3.4s, v0.8h, #16
; CHECK-CVT-SD-NEXT: shll v1.4s, v1.4h, #16
; CHECK-CVT-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-CVT-SD-NEXT: fcmge v2.4s, v3.4s, v2.4s
; CHECK-CVT-SD-NEXT: fcmge v0.4s, v0.4s, v1.4s
; CHECK-CVT-SD-NEXT: uzp1 v0.8h, v0.8h, v2.8h
; CHECK-CVT-SD-NEXT: mvn v0.16b, v0.16b
; CHECK-CVT-SD-NEXT: xtn v0.8b, v0.8h
; CHECK-CVT-SD-NEXT: ret
;
; CHECK-BF16-SD-LABEL: test_fcmp_ult:
; CHECK-BF16-SD: // %bb.0:
; CHECK-BF16-SD-NEXT: shll2 v2.4s, v1.8h, #16
; CHECK-BF16-SD-NEXT: shll2 v3.4s, v0.8h, #16
; CHECK-BF16-SD-NEXT: shll v1.4s, v1.4h, #16
; CHECK-BF16-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16-SD-NEXT: fcmge v2.4s, v3.4s, v2.4s
; CHECK-BF16-SD-NEXT: fcmge v0.4s, v0.4s, v1.4s
; CHECK-BF16-SD-NEXT: uzp1 v0.8h, v0.8h, v2.8h
; CHECK-BF16-SD-NEXT: mvn v0.16b, v0.16b
; CHECK-BF16-SD-NEXT: xtn v0.8b, v0.8h
; CHECK-BF16-SD-NEXT: ret
;
; CHECK-BF16SVE-SD-LABEL: test_fcmp_ult:
; CHECK-BF16SVE-SD: // %bb.0:
; CHECK-BF16SVE-SD-NEXT: shll2 v2.4s, v1.8h, #16
; CHECK-BF16SVE-SD-NEXT: shll2 v3.4s, v0.8h, #16
; CHECK-BF16SVE-SD-NEXT: shll v1.4s, v1.4h, #16
; CHECK-BF16SVE-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16SVE-SD-NEXT: fcmge v2.4s, v3.4s, v2.4s
; CHECK-BF16SVE-SD-NEXT: fcmge v0.4s, v0.4s, v1.4s
; CHECK-BF16SVE-SD-NEXT: uzp1 v0.8h, v0.8h, v2.8h
; CHECK-BF16SVE-SD-NEXT: mvn v0.16b, v0.16b
; CHECK-BF16SVE-SD-NEXT: xtn v0.8b, v0.8h
; CHECK-BF16SVE-SD-NEXT: ret
;
; CHECK-CVT-GI-LABEL: test_fcmp_ult:
; CHECK-CVT-GI: // %bb.0:
; CHECK-CVT-GI-NEXT: shll v2.4s, v0.4h, #16
; CHECK-CVT-GI-NEXT: shll2 v0.4s, v0.8h, #16
; CHECK-CVT-GI-NEXT: shll v3.4s, v1.4h, #16
; CHECK-CVT-GI-NEXT: shll2 v1.4s, v1.8h, #16
; CHECK-CVT-GI-NEXT: fcmge v2.4s, v2.4s, v3.4s
; CHECK-CVT-GI-NEXT: fcmge v0.4s, v0.4s, v1.4s
; CHECK-CVT-GI-NEXT: mvn v1.16b, v2.16b
; CHECK-CVT-GI-NEXT: mvn v0.16b, v0.16b
; CHECK-CVT-GI-NEXT: uzp1 v0.8h, v1.8h, v0.8h
; CHECK-CVT-GI-NEXT: xtn v0.8b, v0.8h
; CHECK-CVT-GI-NEXT: ret
;
; CHECK-BF16-GI-LABEL: test_fcmp_ult:
; CHECK-BF16-GI: // %bb.0:
; CHECK-BF16-GI-NEXT: shll v2.4s, v0.4h, #16
; CHECK-BF16-GI-NEXT: shll2 v0.4s, v0.8h, #16
; CHECK-BF16-GI-NEXT: shll v3.4s, v1.4h, #16
; CHECK-BF16-GI-NEXT: shll2 v1.4s, v1.8h, #16
; CHECK-BF16-GI-NEXT: fcmge v2.4s, v2.4s, v3.4s
; CHECK-BF16-GI-NEXT: fcmge v0.4s, v0.4s, v1.4s
; CHECK-BF16-GI-NEXT: mvn v1.16b, v2.16b
; CHECK-BF16-GI-NEXT: mvn v0.16b, v0.16b
; CHECK-BF16-GI-NEXT: uzp1 v0.8h, v1.8h, v0.8h
; CHECK-BF16-GI-NEXT: xtn v0.8b, v0.8h
; CHECK-BF16-GI-NEXT: ret
%1 = fcmp ult <8 x bfloat> %a, %b
ret <8 x i1> %1
}
define <8 x i1> @test_fcmp_ule(<8 x bfloat> %a, <8 x bfloat> %b) #0 {
; CHECK-CVT-SD-LABEL: test_fcmp_ule:
; CHECK-CVT-SD: // %bb.0:
; CHECK-CVT-SD-NEXT: shll2 v2.4s, v1.8h, #16
; CHECK-CVT-SD-NEXT: shll2 v3.4s, v0.8h, #16
; CHECK-CVT-SD-NEXT: shll v1.4s, v1.4h, #16
; CHECK-CVT-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-CVT-SD-NEXT: fcmgt v2.4s, v3.4s, v2.4s
; CHECK-CVT-SD-NEXT: fcmgt v0.4s, v0.4s, v1.4s
; CHECK-CVT-SD-NEXT: uzp1 v0.8h, v0.8h, v2.8h
; CHECK-CVT-SD-NEXT: mvn v0.16b, v0.16b
; CHECK-CVT-SD-NEXT: xtn v0.8b, v0.8h
; CHECK-CVT-SD-NEXT: ret
;
; CHECK-BF16-SD-LABEL: test_fcmp_ule:
; CHECK-BF16-SD: // %bb.0:
; CHECK-BF16-SD-NEXT: shll2 v2.4s, v1.8h, #16
; CHECK-BF16-SD-NEXT: shll2 v3.4s, v0.8h, #16
; CHECK-BF16-SD-NEXT: shll v1.4s, v1.4h, #16
; CHECK-BF16-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16-SD-NEXT: fcmgt v2.4s, v3.4s, v2.4s
; CHECK-BF16-SD-NEXT: fcmgt v0.4s, v0.4s, v1.4s
; CHECK-BF16-SD-NEXT: uzp1 v0.8h, v0.8h, v2.8h
; CHECK-BF16-SD-NEXT: mvn v0.16b, v0.16b
; CHECK-BF16-SD-NEXT: xtn v0.8b, v0.8h
; CHECK-BF16-SD-NEXT: ret
;
; CHECK-BF16SVE-SD-LABEL: test_fcmp_ule:
; CHECK-BF16SVE-SD: // %bb.0:
; CHECK-BF16SVE-SD-NEXT: shll2 v2.4s, v1.8h, #16
; CHECK-BF16SVE-SD-NEXT: shll2 v3.4s, v0.8h, #16
; CHECK-BF16SVE-SD-NEXT: shll v1.4s, v1.4h, #16
; CHECK-BF16SVE-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16SVE-SD-NEXT: fcmgt v2.4s, v3.4s, v2.4s
; CHECK-BF16SVE-SD-NEXT: fcmgt v0.4s, v0.4s, v1.4s
; CHECK-BF16SVE-SD-NEXT: uzp1 v0.8h, v0.8h, v2.8h
; CHECK-BF16SVE-SD-NEXT: mvn v0.16b, v0.16b
; CHECK-BF16SVE-SD-NEXT: xtn v0.8b, v0.8h
; CHECK-BF16SVE-SD-NEXT: ret
;
; CHECK-CVT-GI-LABEL: test_fcmp_ule:
; CHECK-CVT-GI: // %bb.0:
; CHECK-CVT-GI-NEXT: shll v2.4s, v0.4h, #16
; CHECK-CVT-GI-NEXT: shll2 v0.4s, v0.8h, #16
; CHECK-CVT-GI-NEXT: shll v3.4s, v1.4h, #16
; CHECK-CVT-GI-NEXT: shll2 v1.4s, v1.8h, #16
; CHECK-CVT-GI-NEXT: fcmgt v2.4s, v2.4s, v3.4s
; CHECK-CVT-GI-NEXT: fcmgt v0.4s, v0.4s, v1.4s
; CHECK-CVT-GI-NEXT: mvn v1.16b, v2.16b
; CHECK-CVT-GI-NEXT: mvn v0.16b, v0.16b
; CHECK-CVT-GI-NEXT: uzp1 v0.8h, v1.8h, v0.8h
; CHECK-CVT-GI-NEXT: xtn v0.8b, v0.8h
; CHECK-CVT-GI-NEXT: ret
;
; CHECK-BF16-GI-LABEL: test_fcmp_ule:
; CHECK-BF16-GI: // %bb.0:
; CHECK-BF16-GI-NEXT: shll v2.4s, v0.4h, #16
; CHECK-BF16-GI-NEXT: shll2 v0.4s, v0.8h, #16
; CHECK-BF16-GI-NEXT: shll v3.4s, v1.4h, #16
; CHECK-BF16-GI-NEXT: shll2 v1.4s, v1.8h, #16
; CHECK-BF16-GI-NEXT: fcmgt v2.4s, v2.4s, v3.4s
; CHECK-BF16-GI-NEXT: fcmgt v0.4s, v0.4s, v1.4s
; CHECK-BF16-GI-NEXT: mvn v1.16b, v2.16b
; CHECK-BF16-GI-NEXT: mvn v0.16b, v0.16b
; CHECK-BF16-GI-NEXT: uzp1 v0.8h, v1.8h, v0.8h
; CHECK-BF16-GI-NEXT: xtn v0.8b, v0.8h
; CHECK-BF16-GI-NEXT: ret
%1 = fcmp ule <8 x bfloat> %a, %b
ret <8 x i1> %1
}
define <8 x i1> @test_fcmp_uno(<8 x bfloat> %a, <8 x bfloat> %b) #0 {
; CHECK-CVT-SD-LABEL: test_fcmp_uno:
; CHECK-CVT-SD: // %bb.0:
; CHECK-CVT-SD-NEXT: shll2 v2.4s, v1.8h, #16
; CHECK-CVT-SD-NEXT: shll2 v3.4s, v0.8h, #16
; CHECK-CVT-SD-NEXT: shll v1.4s, v1.4h, #16
; CHECK-CVT-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-CVT-SD-NEXT: fcmge v4.4s, v3.4s, v2.4s
; CHECK-CVT-SD-NEXT: fcmgt v2.4s, v2.4s, v3.4s
; CHECK-CVT-SD-NEXT: fcmge v3.4s, v0.4s, v1.4s
; CHECK-CVT-SD-NEXT: fcmgt v0.4s, v1.4s, v0.4s
; CHECK-CVT-SD-NEXT: orr v1.16b, v2.16b, v4.16b
; CHECK-CVT-SD-NEXT: orr v0.16b, v0.16b, v3.16b
; CHECK-CVT-SD-NEXT: uzp1 v0.8h, v0.8h, v1.8h
; CHECK-CVT-SD-NEXT: mvn v0.16b, v0.16b
; CHECK-CVT-SD-NEXT: xtn v0.8b, v0.8h
; CHECK-CVT-SD-NEXT: ret
;
; CHECK-BF16-SD-LABEL: test_fcmp_uno:
; CHECK-BF16-SD: // %bb.0:
; CHECK-BF16-SD-NEXT: shll2 v2.4s, v1.8h, #16
; CHECK-BF16-SD-NEXT: shll2 v3.4s, v0.8h, #16
; CHECK-BF16-SD-NEXT: shll v1.4s, v1.4h, #16
; CHECK-BF16-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16-SD-NEXT: fcmge v4.4s, v3.4s, v2.4s
; CHECK-BF16-SD-NEXT: fcmgt v2.4s, v2.4s, v3.4s
; CHECK-BF16-SD-NEXT: fcmge v3.4s, v0.4s, v1.4s
; CHECK-BF16-SD-NEXT: fcmgt v0.4s, v1.4s, v0.4s
; CHECK-BF16-SD-NEXT: orr v1.16b, v2.16b, v4.16b
; CHECK-BF16-SD-NEXT: orr v0.16b, v0.16b, v3.16b
; CHECK-BF16-SD-NEXT: uzp1 v0.8h, v0.8h, v1.8h
; CHECK-BF16-SD-NEXT: mvn v0.16b, v0.16b
; CHECK-BF16-SD-NEXT: xtn v0.8b, v0.8h
; CHECK-BF16-SD-NEXT: ret
;
; CHECK-BF16SVE-SD-LABEL: test_fcmp_uno:
; CHECK-BF16SVE-SD: // %bb.0:
; CHECK-BF16SVE-SD-NEXT: shll2 v2.4s, v1.8h, #16
; CHECK-BF16SVE-SD-NEXT: shll2 v3.4s, v0.8h, #16
; CHECK-BF16SVE-SD-NEXT: shll v1.4s, v1.4h, #16
; CHECK-BF16SVE-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16SVE-SD-NEXT: fcmge v4.4s, v3.4s, v2.4s
; CHECK-BF16SVE-SD-NEXT: fcmgt v2.4s, v2.4s, v3.4s
; CHECK-BF16SVE-SD-NEXT: fcmge v3.4s, v0.4s, v1.4s
; CHECK-BF16SVE-SD-NEXT: fcmgt v0.4s, v1.4s, v0.4s
; CHECK-BF16SVE-SD-NEXT: orr v1.16b, v2.16b, v4.16b
; CHECK-BF16SVE-SD-NEXT: orr v0.16b, v0.16b, v3.16b
; CHECK-BF16SVE-SD-NEXT: uzp1 v0.8h, v0.8h, v1.8h
; CHECK-BF16SVE-SD-NEXT: mvn v0.16b, v0.16b
; CHECK-BF16SVE-SD-NEXT: xtn v0.8b, v0.8h
; CHECK-BF16SVE-SD-NEXT: ret
;
; CHECK-CVT-GI-LABEL: test_fcmp_uno:
; CHECK-CVT-GI: // %bb.0:
; CHECK-CVT-GI-NEXT: shll v2.4s, v0.4h, #16
; CHECK-CVT-GI-NEXT: shll v3.4s, v1.4h, #16
; CHECK-CVT-GI-NEXT: shll2 v0.4s, v0.8h, #16
; CHECK-CVT-GI-NEXT: shll2 v1.4s, v1.8h, #16
; CHECK-CVT-GI-NEXT: fcmge v4.4s, v2.4s, v3.4s
; CHECK-CVT-GI-NEXT: fcmgt v2.4s, v3.4s, v2.4s
; CHECK-CVT-GI-NEXT: fcmge v3.4s, v0.4s, v1.4s
; CHECK-CVT-GI-NEXT: fcmgt v0.4s, v1.4s, v0.4s
; CHECK-CVT-GI-NEXT: orr v1.16b, v2.16b, v4.16b
; CHECK-CVT-GI-NEXT: orr v0.16b, v0.16b, v3.16b
; CHECK-CVT-GI-NEXT: mvn v1.16b, v1.16b
; CHECK-CVT-GI-NEXT: mvn v0.16b, v0.16b
; CHECK-CVT-GI-NEXT: uzp1 v0.8h, v1.8h, v0.8h
; CHECK-CVT-GI-NEXT: xtn v0.8b, v0.8h
; CHECK-CVT-GI-NEXT: ret
;
; CHECK-BF16-GI-LABEL: test_fcmp_uno:
; CHECK-BF16-GI: // %bb.0:
; CHECK-BF16-GI-NEXT: shll v2.4s, v0.4h, #16
; CHECK-BF16-GI-NEXT: shll v3.4s, v1.4h, #16
; CHECK-BF16-GI-NEXT: shll2 v0.4s, v0.8h, #16
; CHECK-BF16-GI-NEXT: shll2 v1.4s, v1.8h, #16
; CHECK-BF16-GI-NEXT: fcmge v4.4s, v2.4s, v3.4s
; CHECK-BF16-GI-NEXT: fcmgt v2.4s, v3.4s, v2.4s
; CHECK-BF16-GI-NEXT: fcmge v3.4s, v0.4s, v1.4s
; CHECK-BF16-GI-NEXT: fcmgt v0.4s, v1.4s, v0.4s
; CHECK-BF16-GI-NEXT: orr v1.16b, v2.16b, v4.16b
; CHECK-BF16-GI-NEXT: orr v0.16b, v0.16b, v3.16b
; CHECK-BF16-GI-NEXT: mvn v1.16b, v1.16b
; CHECK-BF16-GI-NEXT: mvn v0.16b, v0.16b
; CHECK-BF16-GI-NEXT: uzp1 v0.8h, v1.8h, v0.8h
; CHECK-BF16-GI-NEXT: xtn v0.8b, v0.8h
; CHECK-BF16-GI-NEXT: ret
%1 = fcmp uno <8 x bfloat> %a, %b
ret <8 x i1> %1
}
define <8 x i1> @test_fcmp_one(<8 x bfloat> %a, <8 x bfloat> %b) #0 {
; CHECK-CVT-SD-LABEL: test_fcmp_one:
; CHECK-CVT-SD: // %bb.0:
; CHECK-CVT-SD-NEXT: shll2 v2.4s, v1.8h, #16
; CHECK-CVT-SD-NEXT: shll2 v3.4s, v0.8h, #16
; CHECK-CVT-SD-NEXT: shll v1.4s, v1.4h, #16
; CHECK-CVT-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-CVT-SD-NEXT: fcmgt v4.4s, v3.4s, v2.4s
; CHECK-CVT-SD-NEXT: fcmgt v2.4s, v2.4s, v3.4s
; CHECK-CVT-SD-NEXT: fcmgt v3.4s, v0.4s, v1.4s
; CHECK-CVT-SD-NEXT: fcmgt v0.4s, v1.4s, v0.4s
; CHECK-CVT-SD-NEXT: orr v1.16b, v2.16b, v4.16b
; CHECK-CVT-SD-NEXT: orr v0.16b, v0.16b, v3.16b
; CHECK-CVT-SD-NEXT: uzp1 v0.8h, v0.8h, v1.8h
; CHECK-CVT-SD-NEXT: xtn v0.8b, v0.8h
; CHECK-CVT-SD-NEXT: ret
;
; CHECK-BF16-SD-LABEL: test_fcmp_one:
; CHECK-BF16-SD: // %bb.0:
; CHECK-BF16-SD-NEXT: shll2 v2.4s, v1.8h, #16
; CHECK-BF16-SD-NEXT: shll2 v3.4s, v0.8h, #16
; CHECK-BF16-SD-NEXT: shll v1.4s, v1.4h, #16
; CHECK-BF16-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16-SD-NEXT: fcmgt v4.4s, v3.4s, v2.4s
; CHECK-BF16-SD-NEXT: fcmgt v2.4s, v2.4s, v3.4s
; CHECK-BF16-SD-NEXT: fcmgt v3.4s, v0.4s, v1.4s
; CHECK-BF16-SD-NEXT: fcmgt v0.4s, v1.4s, v0.4s
; CHECK-BF16-SD-NEXT: orr v1.16b, v2.16b, v4.16b
; CHECK-BF16-SD-NEXT: orr v0.16b, v0.16b, v3.16b
; CHECK-BF16-SD-NEXT: uzp1 v0.8h, v0.8h, v1.8h
; CHECK-BF16-SD-NEXT: xtn v0.8b, v0.8h
; CHECK-BF16-SD-NEXT: ret
;
; CHECK-BF16SVE-SD-LABEL: test_fcmp_one:
; CHECK-BF16SVE-SD: // %bb.0:
; CHECK-BF16SVE-SD-NEXT: shll2 v2.4s, v1.8h, #16
; CHECK-BF16SVE-SD-NEXT: shll2 v3.4s, v0.8h, #16
; CHECK-BF16SVE-SD-NEXT: shll v1.4s, v1.4h, #16
; CHECK-BF16SVE-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16SVE-SD-NEXT: fcmgt v4.4s, v3.4s, v2.4s
; CHECK-BF16SVE-SD-NEXT: fcmgt v2.4s, v2.4s, v3.4s
; CHECK-BF16SVE-SD-NEXT: fcmgt v3.4s, v0.4s, v1.4s
; CHECK-BF16SVE-SD-NEXT: fcmgt v0.4s, v1.4s, v0.4s
; CHECK-BF16SVE-SD-NEXT: orr v1.16b, v2.16b, v4.16b
; CHECK-BF16SVE-SD-NEXT: orr v0.16b, v0.16b, v3.16b
; CHECK-BF16SVE-SD-NEXT: uzp1 v0.8h, v0.8h, v1.8h
; CHECK-BF16SVE-SD-NEXT: xtn v0.8b, v0.8h
; CHECK-BF16SVE-SD-NEXT: ret
;
; CHECK-CVT-GI-LABEL: test_fcmp_one:
; CHECK-CVT-GI: // %bb.0:
; CHECK-CVT-GI-NEXT: shll v2.4s, v0.4h, #16
; CHECK-CVT-GI-NEXT: shll v3.4s, v1.4h, #16
; CHECK-CVT-GI-NEXT: shll2 v0.4s, v0.8h, #16
; CHECK-CVT-GI-NEXT: shll2 v1.4s, v1.8h, #16
; CHECK-CVT-GI-NEXT: fcmgt v4.4s, v2.4s, v3.4s
; CHECK-CVT-GI-NEXT: fcmgt v2.4s, v3.4s, v2.4s
; CHECK-CVT-GI-NEXT: fcmgt v3.4s, v0.4s, v1.4s
; CHECK-CVT-GI-NEXT: fcmgt v0.4s, v1.4s, v0.4s
; CHECK-CVT-GI-NEXT: orr v1.16b, v2.16b, v4.16b
; CHECK-CVT-GI-NEXT: orr v0.16b, v0.16b, v3.16b
; CHECK-CVT-GI-NEXT: uzp1 v0.8h, v1.8h, v0.8h
; CHECK-CVT-GI-NEXT: xtn v0.8b, v0.8h
; CHECK-CVT-GI-NEXT: ret
;
; CHECK-BF16-GI-LABEL: test_fcmp_one:
; CHECK-BF16-GI: // %bb.0:
; CHECK-BF16-GI-NEXT: shll v2.4s, v0.4h, #16
; CHECK-BF16-GI-NEXT: shll v3.4s, v1.4h, #16
; CHECK-BF16-GI-NEXT: shll2 v0.4s, v0.8h, #16
; CHECK-BF16-GI-NEXT: shll2 v1.4s, v1.8h, #16
; CHECK-BF16-GI-NEXT: fcmgt v4.4s, v2.4s, v3.4s
; CHECK-BF16-GI-NEXT: fcmgt v2.4s, v3.4s, v2.4s
; CHECK-BF16-GI-NEXT: fcmgt v3.4s, v0.4s, v1.4s
; CHECK-BF16-GI-NEXT: fcmgt v0.4s, v1.4s, v0.4s
; CHECK-BF16-GI-NEXT: orr v1.16b, v2.16b, v4.16b
; CHECK-BF16-GI-NEXT: orr v0.16b, v0.16b, v3.16b
; CHECK-BF16-GI-NEXT: uzp1 v0.8h, v1.8h, v0.8h
; CHECK-BF16-GI-NEXT: xtn v0.8b, v0.8h
; CHECK-BF16-GI-NEXT: ret
%1 = fcmp one <8 x bfloat> %a, %b
ret <8 x i1> %1
}
define <8 x i1> @test_fcmp_oeq(<8 x bfloat> %a, <8 x bfloat> %b) #0 {
; CHECK-CVT-SD-LABEL: test_fcmp_oeq:
; CHECK-CVT-SD: // %bb.0:
; CHECK-CVT-SD-NEXT: shll2 v2.4s, v1.8h, #16
; CHECK-CVT-SD-NEXT: shll2 v3.4s, v0.8h, #16
; CHECK-CVT-SD-NEXT: shll v1.4s, v1.4h, #16
; CHECK-CVT-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-CVT-SD-NEXT: fcmeq v2.4s, v3.4s, v2.4s
; CHECK-CVT-SD-NEXT: fcmeq v0.4s, v0.4s, v1.4s
; CHECK-CVT-SD-NEXT: uzp1 v0.8h, v0.8h, v2.8h
; CHECK-CVT-SD-NEXT: xtn v0.8b, v0.8h
; CHECK-CVT-SD-NEXT: ret
;
; CHECK-BF16-SD-LABEL: test_fcmp_oeq:
; CHECK-BF16-SD: // %bb.0:
; CHECK-BF16-SD-NEXT: shll2 v2.4s, v1.8h, #16
; CHECK-BF16-SD-NEXT: shll2 v3.4s, v0.8h, #16
; CHECK-BF16-SD-NEXT: shll v1.4s, v1.4h, #16
; CHECK-BF16-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16-SD-NEXT: fcmeq v2.4s, v3.4s, v2.4s
; CHECK-BF16-SD-NEXT: fcmeq v0.4s, v0.4s, v1.4s
; CHECK-BF16-SD-NEXT: uzp1 v0.8h, v0.8h, v2.8h
; CHECK-BF16-SD-NEXT: xtn v0.8b, v0.8h
; CHECK-BF16-SD-NEXT: ret
;
; CHECK-BF16SVE-SD-LABEL: test_fcmp_oeq:
; CHECK-BF16SVE-SD: // %bb.0:
; CHECK-BF16SVE-SD-NEXT: shll2 v2.4s, v1.8h, #16
; CHECK-BF16SVE-SD-NEXT: shll2 v3.4s, v0.8h, #16
; CHECK-BF16SVE-SD-NEXT: shll v1.4s, v1.4h, #16
; CHECK-BF16SVE-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16SVE-SD-NEXT: fcmeq v2.4s, v3.4s, v2.4s
; CHECK-BF16SVE-SD-NEXT: fcmeq v0.4s, v0.4s, v1.4s
; CHECK-BF16SVE-SD-NEXT: uzp1 v0.8h, v0.8h, v2.8h
; CHECK-BF16SVE-SD-NEXT: xtn v0.8b, v0.8h
; CHECK-BF16SVE-SD-NEXT: ret
;
; CHECK-CVT-GI-LABEL: test_fcmp_oeq:
; CHECK-CVT-GI: // %bb.0:
; CHECK-CVT-GI-NEXT: shll v2.4s, v0.4h, #16
; CHECK-CVT-GI-NEXT: shll2 v0.4s, v0.8h, #16
; CHECK-CVT-GI-NEXT: shll v3.4s, v1.4h, #16
; CHECK-CVT-GI-NEXT: shll2 v1.4s, v1.8h, #16
; CHECK-CVT-GI-NEXT: fcmeq v2.4s, v2.4s, v3.4s
; CHECK-CVT-GI-NEXT: fcmeq v0.4s, v0.4s, v1.4s
; CHECK-CVT-GI-NEXT: uzp1 v0.8h, v2.8h, v0.8h
; CHECK-CVT-GI-NEXT: xtn v0.8b, v0.8h
; CHECK-CVT-GI-NEXT: ret
;
; CHECK-BF16-GI-LABEL: test_fcmp_oeq:
; CHECK-BF16-GI: // %bb.0:
; CHECK-BF16-GI-NEXT: shll v2.4s, v0.4h, #16
; CHECK-BF16-GI-NEXT: shll2 v0.4s, v0.8h, #16
; CHECK-BF16-GI-NEXT: shll v3.4s, v1.4h, #16
; CHECK-BF16-GI-NEXT: shll2 v1.4s, v1.8h, #16
; CHECK-BF16-GI-NEXT: fcmeq v2.4s, v2.4s, v3.4s
; CHECK-BF16-GI-NEXT: fcmeq v0.4s, v0.4s, v1.4s
; CHECK-BF16-GI-NEXT: uzp1 v0.8h, v2.8h, v0.8h
; CHECK-BF16-GI-NEXT: xtn v0.8b, v0.8h
; CHECK-BF16-GI-NEXT: ret
%1 = fcmp oeq <8 x bfloat> %a, %b
ret <8 x i1> %1
}
define <8 x i1> @test_fcmp_ogt(<8 x bfloat> %a, <8 x bfloat> %b) #0 {
; CHECK-CVT-SD-LABEL: test_fcmp_ogt:
; CHECK-CVT-SD: // %bb.0:
; CHECK-CVT-SD-NEXT: shll2 v2.4s, v1.8h, #16
; CHECK-CVT-SD-NEXT: shll2 v3.4s, v0.8h, #16
; CHECK-CVT-SD-NEXT: shll v1.4s, v1.4h, #16
; CHECK-CVT-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-CVT-SD-NEXT: fcmgt v2.4s, v3.4s, v2.4s
; CHECK-CVT-SD-NEXT: fcmgt v0.4s, v0.4s, v1.4s
; CHECK-CVT-SD-NEXT: uzp1 v0.8h, v0.8h, v2.8h
; CHECK-CVT-SD-NEXT: xtn v0.8b, v0.8h
; CHECK-CVT-SD-NEXT: ret
;
; CHECK-BF16-SD-LABEL: test_fcmp_ogt:
; CHECK-BF16-SD: // %bb.0:
; CHECK-BF16-SD-NEXT: shll2 v2.4s, v1.8h, #16
; CHECK-BF16-SD-NEXT: shll2 v3.4s, v0.8h, #16
; CHECK-BF16-SD-NEXT: shll v1.4s, v1.4h, #16
; CHECK-BF16-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16-SD-NEXT: fcmgt v2.4s, v3.4s, v2.4s
; CHECK-BF16-SD-NEXT: fcmgt v0.4s, v0.4s, v1.4s
; CHECK-BF16-SD-NEXT: uzp1 v0.8h, v0.8h, v2.8h
; CHECK-BF16-SD-NEXT: xtn v0.8b, v0.8h
; CHECK-BF16-SD-NEXT: ret
;
; CHECK-BF16SVE-SD-LABEL: test_fcmp_ogt:
; CHECK-BF16SVE-SD: // %bb.0:
; CHECK-BF16SVE-SD-NEXT: shll2 v2.4s, v1.8h, #16
; CHECK-BF16SVE-SD-NEXT: shll2 v3.4s, v0.8h, #16
; CHECK-BF16SVE-SD-NEXT: shll v1.4s, v1.4h, #16
; CHECK-BF16SVE-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16SVE-SD-NEXT: fcmgt v2.4s, v3.4s, v2.4s
; CHECK-BF16SVE-SD-NEXT: fcmgt v0.4s, v0.4s, v1.4s
; CHECK-BF16SVE-SD-NEXT: uzp1 v0.8h, v0.8h, v2.8h
; CHECK-BF16SVE-SD-NEXT: xtn v0.8b, v0.8h
; CHECK-BF16SVE-SD-NEXT: ret
;
; CHECK-CVT-GI-LABEL: test_fcmp_ogt:
; CHECK-CVT-GI: // %bb.0:
; CHECK-CVT-GI-NEXT: shll v2.4s, v0.4h, #16
; CHECK-CVT-GI-NEXT: shll2 v0.4s, v0.8h, #16
; CHECK-CVT-GI-NEXT: shll v3.4s, v1.4h, #16
; CHECK-CVT-GI-NEXT: shll2 v1.4s, v1.8h, #16
; CHECK-CVT-GI-NEXT: fcmgt v2.4s, v2.4s, v3.4s
; CHECK-CVT-GI-NEXT: fcmgt v0.4s, v0.4s, v1.4s
; CHECK-CVT-GI-NEXT: uzp1 v0.8h, v2.8h, v0.8h
; CHECK-CVT-GI-NEXT: xtn v0.8b, v0.8h
; CHECK-CVT-GI-NEXT: ret
;
; CHECK-BF16-GI-LABEL: test_fcmp_ogt:
; CHECK-BF16-GI: // %bb.0:
; CHECK-BF16-GI-NEXT: shll v2.4s, v0.4h, #16
; CHECK-BF16-GI-NEXT: shll2 v0.4s, v0.8h, #16
; CHECK-BF16-GI-NEXT: shll v3.4s, v1.4h, #16
; CHECK-BF16-GI-NEXT: shll2 v1.4s, v1.8h, #16
; CHECK-BF16-GI-NEXT: fcmgt v2.4s, v2.4s, v3.4s
; CHECK-BF16-GI-NEXT: fcmgt v0.4s, v0.4s, v1.4s
; CHECK-BF16-GI-NEXT: uzp1 v0.8h, v2.8h, v0.8h
; CHECK-BF16-GI-NEXT: xtn v0.8b, v0.8h
; CHECK-BF16-GI-NEXT: ret
%1 = fcmp ogt <8 x bfloat> %a, %b
ret <8 x i1> %1
}
define <8 x i1> @test_fcmp_oge(<8 x bfloat> %a, <8 x bfloat> %b) #0 {
; CHECK-CVT-SD-LABEL: test_fcmp_oge:
; CHECK-CVT-SD: // %bb.0:
; CHECK-CVT-SD-NEXT: shll2 v2.4s, v1.8h, #16
; CHECK-CVT-SD-NEXT: shll2 v3.4s, v0.8h, #16
; CHECK-CVT-SD-NEXT: shll v1.4s, v1.4h, #16
; CHECK-CVT-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-CVT-SD-NEXT: fcmge v2.4s, v3.4s, v2.4s
; CHECK-CVT-SD-NEXT: fcmge v0.4s, v0.4s, v1.4s
; CHECK-CVT-SD-NEXT: uzp1 v0.8h, v0.8h, v2.8h
; CHECK-CVT-SD-NEXT: xtn v0.8b, v0.8h
; CHECK-CVT-SD-NEXT: ret
;
; CHECK-BF16-SD-LABEL: test_fcmp_oge:
; CHECK-BF16-SD: // %bb.0:
; CHECK-BF16-SD-NEXT: shll2 v2.4s, v1.8h, #16
; CHECK-BF16-SD-NEXT: shll2 v3.4s, v0.8h, #16
; CHECK-BF16-SD-NEXT: shll v1.4s, v1.4h, #16
; CHECK-BF16-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16-SD-NEXT: fcmge v2.4s, v3.4s, v2.4s
; CHECK-BF16-SD-NEXT: fcmge v0.4s, v0.4s, v1.4s
; CHECK-BF16-SD-NEXT: uzp1 v0.8h, v0.8h, v2.8h
; CHECK-BF16-SD-NEXT: xtn v0.8b, v0.8h
; CHECK-BF16-SD-NEXT: ret
;
; CHECK-BF16SVE-SD-LABEL: test_fcmp_oge:
; CHECK-BF16SVE-SD: // %bb.0:
; CHECK-BF16SVE-SD-NEXT: shll2 v2.4s, v1.8h, #16
; CHECK-BF16SVE-SD-NEXT: shll2 v3.4s, v0.8h, #16
; CHECK-BF16SVE-SD-NEXT: shll v1.4s, v1.4h, #16
; CHECK-BF16SVE-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16SVE-SD-NEXT: fcmge v2.4s, v3.4s, v2.4s
; CHECK-BF16SVE-SD-NEXT: fcmge v0.4s, v0.4s, v1.4s
; CHECK-BF16SVE-SD-NEXT: uzp1 v0.8h, v0.8h, v2.8h
; CHECK-BF16SVE-SD-NEXT: xtn v0.8b, v0.8h
; CHECK-BF16SVE-SD-NEXT: ret
;
; CHECK-CVT-GI-LABEL: test_fcmp_oge:
; CHECK-CVT-GI: // %bb.0:
; CHECK-CVT-GI-NEXT: shll v2.4s, v0.4h, #16
; CHECK-CVT-GI-NEXT: shll2 v0.4s, v0.8h, #16
; CHECK-CVT-GI-NEXT: shll v3.4s, v1.4h, #16
; CHECK-CVT-GI-NEXT: shll2 v1.4s, v1.8h, #16
; CHECK-CVT-GI-NEXT: fcmge v2.4s, v2.4s, v3.4s
; CHECK-CVT-GI-NEXT: fcmge v0.4s, v0.4s, v1.4s
; CHECK-CVT-GI-NEXT: uzp1 v0.8h, v2.8h, v0.8h
; CHECK-CVT-GI-NEXT: xtn v0.8b, v0.8h
; CHECK-CVT-GI-NEXT: ret
;
; CHECK-BF16-GI-LABEL: test_fcmp_oge:
; CHECK-BF16-GI: // %bb.0:
; CHECK-BF16-GI-NEXT: shll v2.4s, v0.4h, #16
; CHECK-BF16-GI-NEXT: shll2 v0.4s, v0.8h, #16
; CHECK-BF16-GI-NEXT: shll v3.4s, v1.4h, #16
; CHECK-BF16-GI-NEXT: shll2 v1.4s, v1.8h, #16
; CHECK-BF16-GI-NEXT: fcmge v2.4s, v2.4s, v3.4s
; CHECK-BF16-GI-NEXT: fcmge v0.4s, v0.4s, v1.4s
; CHECK-BF16-GI-NEXT: uzp1 v0.8h, v2.8h, v0.8h
; CHECK-BF16-GI-NEXT: xtn v0.8b, v0.8h
; CHECK-BF16-GI-NEXT: ret
%1 = fcmp oge <8 x bfloat> %a, %b
ret <8 x i1> %1
}
define <8 x i1> @test_fcmp_olt(<8 x bfloat> %a, <8 x bfloat> %b) #0 {
; CHECK-CVT-SD-LABEL: test_fcmp_olt:
; CHECK-CVT-SD: // %bb.0:
; CHECK-CVT-SD-NEXT: shll2 v2.4s, v0.8h, #16
; CHECK-CVT-SD-NEXT: shll2 v3.4s, v1.8h, #16
; CHECK-CVT-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-CVT-SD-NEXT: shll v1.4s, v1.4h, #16
; CHECK-CVT-SD-NEXT: fcmgt v2.4s, v3.4s, v2.4s
; CHECK-CVT-SD-NEXT: fcmgt v0.4s, v1.4s, v0.4s
; CHECK-CVT-SD-NEXT: uzp1 v0.8h, v0.8h, v2.8h
; CHECK-CVT-SD-NEXT: xtn v0.8b, v0.8h
; CHECK-CVT-SD-NEXT: ret
;
; CHECK-BF16-SD-LABEL: test_fcmp_olt:
; CHECK-BF16-SD: // %bb.0:
; CHECK-BF16-SD-NEXT: shll2 v2.4s, v0.8h, #16
; CHECK-BF16-SD-NEXT: shll2 v3.4s, v1.8h, #16
; CHECK-BF16-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16-SD-NEXT: shll v1.4s, v1.4h, #16
; CHECK-BF16-SD-NEXT: fcmgt v2.4s, v3.4s, v2.4s
; CHECK-BF16-SD-NEXT: fcmgt v0.4s, v1.4s, v0.4s
; CHECK-BF16-SD-NEXT: uzp1 v0.8h, v0.8h, v2.8h
; CHECK-BF16-SD-NEXT: xtn v0.8b, v0.8h
; CHECK-BF16-SD-NEXT: ret
;
; CHECK-BF16SVE-SD-LABEL: test_fcmp_olt:
; CHECK-BF16SVE-SD: // %bb.0:
; CHECK-BF16SVE-SD-NEXT: shll2 v2.4s, v0.8h, #16
; CHECK-BF16SVE-SD-NEXT: shll2 v3.4s, v1.8h, #16
; CHECK-BF16SVE-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16SVE-SD-NEXT: shll v1.4s, v1.4h, #16
; CHECK-BF16SVE-SD-NEXT: fcmgt v2.4s, v3.4s, v2.4s
; CHECK-BF16SVE-SD-NEXT: fcmgt v0.4s, v1.4s, v0.4s
; CHECK-BF16SVE-SD-NEXT: uzp1 v0.8h, v0.8h, v2.8h
; CHECK-BF16SVE-SD-NEXT: xtn v0.8b, v0.8h
; CHECK-BF16SVE-SD-NEXT: ret
;
; CHECK-CVT-GI-LABEL: test_fcmp_olt:
; CHECK-CVT-GI: // %bb.0:
; CHECK-CVT-GI-NEXT: shll v2.4s, v0.4h, #16
; CHECK-CVT-GI-NEXT: shll2 v0.4s, v0.8h, #16
; CHECK-CVT-GI-NEXT: shll v3.4s, v1.4h, #16
; CHECK-CVT-GI-NEXT: shll2 v1.4s, v1.8h, #16
; CHECK-CVT-GI-NEXT: fcmgt v2.4s, v3.4s, v2.4s
; CHECK-CVT-GI-NEXT: fcmgt v0.4s, v1.4s, v0.4s
; CHECK-CVT-GI-NEXT: uzp1 v0.8h, v2.8h, v0.8h
; CHECK-CVT-GI-NEXT: xtn v0.8b, v0.8h
; CHECK-CVT-GI-NEXT: ret
;
; CHECK-BF16-GI-LABEL: test_fcmp_olt:
; CHECK-BF16-GI: // %bb.0:
; CHECK-BF16-GI-NEXT: shll v2.4s, v0.4h, #16
; CHECK-BF16-GI-NEXT: shll2 v0.4s, v0.8h, #16
; CHECK-BF16-GI-NEXT: shll v3.4s, v1.4h, #16
; CHECK-BF16-GI-NEXT: shll2 v1.4s, v1.8h, #16
; CHECK-BF16-GI-NEXT: fcmgt v2.4s, v3.4s, v2.4s
; CHECK-BF16-GI-NEXT: fcmgt v0.4s, v1.4s, v0.4s
; CHECK-BF16-GI-NEXT: uzp1 v0.8h, v2.8h, v0.8h
; CHECK-BF16-GI-NEXT: xtn v0.8b, v0.8h
; CHECK-BF16-GI-NEXT: ret
%1 = fcmp olt <8 x bfloat> %a, %b
ret <8 x i1> %1
}
define <8 x i1> @test_fcmp_ole(<8 x bfloat> %a, <8 x bfloat> %b) #0 {
; CHECK-CVT-SD-LABEL: test_fcmp_ole:
; CHECK-CVT-SD: // %bb.0:
; CHECK-CVT-SD-NEXT: shll2 v2.4s, v0.8h, #16
; CHECK-CVT-SD-NEXT: shll2 v3.4s, v1.8h, #16
; CHECK-CVT-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-CVT-SD-NEXT: shll v1.4s, v1.4h, #16
; CHECK-CVT-SD-NEXT: fcmge v2.4s, v3.4s, v2.4s
; CHECK-CVT-SD-NEXT: fcmge v0.4s, v1.4s, v0.4s
; CHECK-CVT-SD-NEXT: uzp1 v0.8h, v0.8h, v2.8h
; CHECK-CVT-SD-NEXT: xtn v0.8b, v0.8h
; CHECK-CVT-SD-NEXT: ret
;
; CHECK-BF16-SD-LABEL: test_fcmp_ole:
; CHECK-BF16-SD: // %bb.0:
; CHECK-BF16-SD-NEXT: shll2 v2.4s, v0.8h, #16
; CHECK-BF16-SD-NEXT: shll2 v3.4s, v1.8h, #16
; CHECK-BF16-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16-SD-NEXT: shll v1.4s, v1.4h, #16
; CHECK-BF16-SD-NEXT: fcmge v2.4s, v3.4s, v2.4s
; CHECK-BF16-SD-NEXT: fcmge v0.4s, v1.4s, v0.4s
; CHECK-BF16-SD-NEXT: uzp1 v0.8h, v0.8h, v2.8h
; CHECK-BF16-SD-NEXT: xtn v0.8b, v0.8h
; CHECK-BF16-SD-NEXT: ret
;
; CHECK-BF16SVE-SD-LABEL: test_fcmp_ole:
; CHECK-BF16SVE-SD: // %bb.0:
; CHECK-BF16SVE-SD-NEXT: shll2 v2.4s, v0.8h, #16
; CHECK-BF16SVE-SD-NEXT: shll2 v3.4s, v1.8h, #16
; CHECK-BF16SVE-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16SVE-SD-NEXT: shll v1.4s, v1.4h, #16
; CHECK-BF16SVE-SD-NEXT: fcmge v2.4s, v3.4s, v2.4s
; CHECK-BF16SVE-SD-NEXT: fcmge v0.4s, v1.4s, v0.4s
; CHECK-BF16SVE-SD-NEXT: uzp1 v0.8h, v0.8h, v2.8h
; CHECK-BF16SVE-SD-NEXT: xtn v0.8b, v0.8h
; CHECK-BF16SVE-SD-NEXT: ret
;
; CHECK-CVT-GI-LABEL: test_fcmp_ole:
; CHECK-CVT-GI: // %bb.0:
; CHECK-CVT-GI-NEXT: shll v2.4s, v0.4h, #16
; CHECK-CVT-GI-NEXT: shll2 v0.4s, v0.8h, #16
; CHECK-CVT-GI-NEXT: shll v3.4s, v1.4h, #16
; CHECK-CVT-GI-NEXT: shll2 v1.4s, v1.8h, #16
; CHECK-CVT-GI-NEXT: fcmge v2.4s, v3.4s, v2.4s
; CHECK-CVT-GI-NEXT: fcmge v0.4s, v1.4s, v0.4s
; CHECK-CVT-GI-NEXT: uzp1 v0.8h, v2.8h, v0.8h
; CHECK-CVT-GI-NEXT: xtn v0.8b, v0.8h
; CHECK-CVT-GI-NEXT: ret
;
; CHECK-BF16-GI-LABEL: test_fcmp_ole:
; CHECK-BF16-GI: // %bb.0:
; CHECK-BF16-GI-NEXT: shll v2.4s, v0.4h, #16
; CHECK-BF16-GI-NEXT: shll2 v0.4s, v0.8h, #16
; CHECK-BF16-GI-NEXT: shll v3.4s, v1.4h, #16
; CHECK-BF16-GI-NEXT: shll2 v1.4s, v1.8h, #16
; CHECK-BF16-GI-NEXT: fcmge v2.4s, v3.4s, v2.4s
; CHECK-BF16-GI-NEXT: fcmge v0.4s, v1.4s, v0.4s
; CHECK-BF16-GI-NEXT: uzp1 v0.8h, v2.8h, v0.8h
; CHECK-BF16-GI-NEXT: xtn v0.8b, v0.8h
; CHECK-BF16-GI-NEXT: ret
%1 = fcmp ole <8 x bfloat> %a, %b
ret <8 x i1> %1
}
define <8 x i1> @test_fcmp_ord(<8 x bfloat> %a, <8 x bfloat> %b) #0 {
; CHECK-CVT-SD-LABEL: test_fcmp_ord:
; CHECK-CVT-SD: // %bb.0:
; CHECK-CVT-SD-NEXT: shll2 v2.4s, v1.8h, #16
; CHECK-CVT-SD-NEXT: shll2 v3.4s, v0.8h, #16
; CHECK-CVT-SD-NEXT: shll v1.4s, v1.4h, #16
; CHECK-CVT-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-CVT-SD-NEXT: fcmge v4.4s, v3.4s, v2.4s
; CHECK-CVT-SD-NEXT: fcmgt v2.4s, v2.4s, v3.4s
; CHECK-CVT-SD-NEXT: fcmge v3.4s, v0.4s, v1.4s
; CHECK-CVT-SD-NEXT: fcmgt v0.4s, v1.4s, v0.4s
; CHECK-CVT-SD-NEXT: orr v1.16b, v2.16b, v4.16b
; CHECK-CVT-SD-NEXT: orr v0.16b, v0.16b, v3.16b
; CHECK-CVT-SD-NEXT: uzp1 v0.8h, v0.8h, v1.8h
; CHECK-CVT-SD-NEXT: xtn v0.8b, v0.8h
; CHECK-CVT-SD-NEXT: ret
;
; CHECK-BF16-SD-LABEL: test_fcmp_ord:
; CHECK-BF16-SD: // %bb.0:
; CHECK-BF16-SD-NEXT: shll2 v2.4s, v1.8h, #16
; CHECK-BF16-SD-NEXT: shll2 v3.4s, v0.8h, #16
; CHECK-BF16-SD-NEXT: shll v1.4s, v1.4h, #16
; CHECK-BF16-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16-SD-NEXT: fcmge v4.4s, v3.4s, v2.4s
; CHECK-BF16-SD-NEXT: fcmgt v2.4s, v2.4s, v3.4s
; CHECK-BF16-SD-NEXT: fcmge v3.4s, v0.4s, v1.4s
; CHECK-BF16-SD-NEXT: fcmgt v0.4s, v1.4s, v0.4s
; CHECK-BF16-SD-NEXT: orr v1.16b, v2.16b, v4.16b
; CHECK-BF16-SD-NEXT: orr v0.16b, v0.16b, v3.16b
; CHECK-BF16-SD-NEXT: uzp1 v0.8h, v0.8h, v1.8h
; CHECK-BF16-SD-NEXT: xtn v0.8b, v0.8h
; CHECK-BF16-SD-NEXT: ret
;
; CHECK-BF16SVE-SD-LABEL: test_fcmp_ord:
; CHECK-BF16SVE-SD: // %bb.0:
; CHECK-BF16SVE-SD-NEXT: shll2 v2.4s, v1.8h, #16
; CHECK-BF16SVE-SD-NEXT: shll2 v3.4s, v0.8h, #16
; CHECK-BF16SVE-SD-NEXT: shll v1.4s, v1.4h, #16
; CHECK-BF16SVE-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16SVE-SD-NEXT: fcmge v4.4s, v3.4s, v2.4s
; CHECK-BF16SVE-SD-NEXT: fcmgt v2.4s, v2.4s, v3.4s
; CHECK-BF16SVE-SD-NEXT: fcmge v3.4s, v0.4s, v1.4s
; CHECK-BF16SVE-SD-NEXT: fcmgt v0.4s, v1.4s, v0.4s
; CHECK-BF16SVE-SD-NEXT: orr v1.16b, v2.16b, v4.16b
; CHECK-BF16SVE-SD-NEXT: orr v0.16b, v0.16b, v3.16b
; CHECK-BF16SVE-SD-NEXT: uzp1 v0.8h, v0.8h, v1.8h
; CHECK-BF16SVE-SD-NEXT: xtn v0.8b, v0.8h
; CHECK-BF16SVE-SD-NEXT: ret
;
; CHECK-CVT-GI-LABEL: test_fcmp_ord:
; CHECK-CVT-GI: // %bb.0:
; CHECK-CVT-GI-NEXT: shll v2.4s, v0.4h, #16
; CHECK-CVT-GI-NEXT: shll v3.4s, v1.4h, #16
; CHECK-CVT-GI-NEXT: shll2 v0.4s, v0.8h, #16
; CHECK-CVT-GI-NEXT: shll2 v1.4s, v1.8h, #16
; CHECK-CVT-GI-NEXT: fcmge v4.4s, v2.4s, v3.4s
; CHECK-CVT-GI-NEXT: fcmgt v2.4s, v3.4s, v2.4s
; CHECK-CVT-GI-NEXT: fcmge v3.4s, v0.4s, v1.4s
; CHECK-CVT-GI-NEXT: fcmgt v0.4s, v1.4s, v0.4s
; CHECK-CVT-GI-NEXT: orr v1.16b, v2.16b, v4.16b
; CHECK-CVT-GI-NEXT: orr v0.16b, v0.16b, v3.16b
; CHECK-CVT-GI-NEXT: uzp1 v0.8h, v1.8h, v0.8h
; CHECK-CVT-GI-NEXT: xtn v0.8b, v0.8h
; CHECK-CVT-GI-NEXT: ret
;
; CHECK-BF16-GI-LABEL: test_fcmp_ord:
; CHECK-BF16-GI: // %bb.0:
; CHECK-BF16-GI-NEXT: shll v2.4s, v0.4h, #16
; CHECK-BF16-GI-NEXT: shll v3.4s, v1.4h, #16
; CHECK-BF16-GI-NEXT: shll2 v0.4s, v0.8h, #16
; CHECK-BF16-GI-NEXT: shll2 v1.4s, v1.8h, #16
; CHECK-BF16-GI-NEXT: fcmge v4.4s, v2.4s, v3.4s
; CHECK-BF16-GI-NEXT: fcmgt v2.4s, v3.4s, v2.4s
; CHECK-BF16-GI-NEXT: fcmge v3.4s, v0.4s, v1.4s
; CHECK-BF16-GI-NEXT: fcmgt v0.4s, v1.4s, v0.4s
; CHECK-BF16-GI-NEXT: orr v1.16b, v2.16b, v4.16b
; CHECK-BF16-GI-NEXT: orr v0.16b, v0.16b, v3.16b
; CHECK-BF16-GI-NEXT: uzp1 v0.8h, v1.8h, v0.8h
; CHECK-BF16-GI-NEXT: xtn v0.8b, v0.8h
; CHECK-BF16-GI-NEXT: ret
%1 = fcmp ord <8 x bfloat> %a, %b
ret <8 x i1> %1
}
define <8 x i8> @test_fptosi_i8(<8 x bfloat> %a) #0 {
; CHECK-LABEL: test_fptosi_i8:
; CHECK: // %bb.0:
; CHECK-NEXT: shll2 v1.4s, v0.8h, #16
; CHECK-NEXT: shll v0.4s, v0.4h, #16
; CHECK-NEXT: fcvtzs v1.4s, v1.4s
; CHECK-NEXT: fcvtzs v0.4s, v0.4s
; CHECK-NEXT: uzp1 v0.8h, v0.8h, v1.8h
; CHECK-NEXT: xtn v0.8b, v0.8h
; CHECK-NEXT: ret
%1 = fptosi <8 x bfloat> %a to <8 x i8>
ret <8 x i8> %1
}
define <16 x i8> @test_fptosi_v16i8(<16 x bfloat> %a) #0 {
; CHECK-LABEL: test_fptosi_v16i8:
; CHECK: // %bb.0:
; CHECK-NEXT: shll2 v2.4s, v1.8h, #16
; CHECK-NEXT: shll v1.4s, v1.4h, #16
; CHECK-NEXT: shll2 v3.4s, v0.8h, #16
; CHECK-NEXT: shll v0.4s, v0.4h, #16
; CHECK-NEXT: fcvtzs v2.4s, v2.4s
; CHECK-NEXT: fcvtzs v1.4s, v1.4s
; CHECK-NEXT: fcvtzs v3.4s, v3.4s
; CHECK-NEXT: fcvtzs v0.4s, v0.4s
; CHECK-NEXT: uzp1 v1.8h, v1.8h, v2.8h
; CHECK-NEXT: uzp1 v0.8h, v0.8h, v3.8h
; CHECK-NEXT: uzp1 v0.16b, v0.16b, v1.16b
; CHECK-NEXT: ret
%1 = fptosi <16 x bfloat> %a to <16 x i8>
ret <16 x i8> %1
}
define <8 x i16> @test_fptosi_i16(<8 x bfloat> %a) #0 {
; CHECK-LABEL: test_fptosi_i16:
; CHECK: // %bb.0:
; CHECK-NEXT: shll2 v1.4s, v0.8h, #16
; CHECK-NEXT: shll v0.4s, v0.4h, #16
; CHECK-NEXT: fcvtzs v1.4s, v1.4s
; CHECK-NEXT: fcvtzs v0.4s, v0.4s
; CHECK-NEXT: uzp1 v0.8h, v0.8h, v1.8h
; CHECK-NEXT: ret
%1 = fptosi <8 x bfloat> %a to <8 x i16>
ret <8 x i16> %1
}
define <8 x i32> @test_fptosi_i32(<8 x bfloat> %a) #0 {
; CHECK-LABEL: test_fptosi_i32:
; CHECK: // %bb.0:
; CHECK-NEXT: shll2 v1.4s, v0.8h, #16
; CHECK-NEXT: shll v0.4s, v0.4h, #16
; CHECK-NEXT: fcvtzs v1.4s, v1.4s
; CHECK-NEXT: fcvtzs v0.4s, v0.4s
; CHECK-NEXT: ret
%1 = fptosi <8 x bfloat> %a to <8 x i32>
ret <8 x i32> %1
}
define <8 x i64> @test_fptosi_i64(<8 x bfloat> %a) #0 {
; CHECK-LABEL: test_fptosi_i64:
; CHECK: // %bb.0:
; CHECK-NEXT: mov d1, v0.d[1]
; CHECK-NEXT: mov h4, v0.h[2]
; CHECK-NEXT: mov h3, v0.h[1]
; CHECK-NEXT: mov h7, v0.h[3]
; CHECK-NEXT: shll v0.4s, v0.4h, #16
; CHECK-NEXT: mov h2, v1.h[2]
; CHECK-NEXT: mov h5, v1.h[1]
; CHECK-NEXT: mov h6, v1.h[3]
; CHECK-NEXT: shll v1.4s, v1.4h, #16
; CHECK-NEXT: shll v4.4s, v4.4h, #16
; CHECK-NEXT: shll v3.4s, v3.4h, #16
; CHECK-NEXT: shll v7.4s, v7.4h, #16
; CHECK-NEXT: fcvtzs x9, s0
; CHECK-NEXT: shll v2.4s, v2.4h, #16
; CHECK-NEXT: shll v5.4s, v5.4h, #16
; CHECK-NEXT: shll v6.4s, v6.4h, #16
; CHECK-NEXT: fcvtzs x8, s1
; CHECK-NEXT: fcvtzs x12, s4
; CHECK-NEXT: fcvtzs x11, s3
; CHECK-NEXT: fcvtzs x15, s7
; CHECK-NEXT: fmov d0, x9
; CHECK-NEXT: fcvtzs x10, s2
; CHECK-NEXT: fcvtzs x13, s5
; CHECK-NEXT: fcvtzs x14, s6
; CHECK-NEXT: fmov d2, x8
; CHECK-NEXT: fmov d1, x12
; CHECK-NEXT: mov v0.d[1], x11
; CHECK-NEXT: fmov d3, x10
; CHECK-NEXT: mov v2.d[1], x13
; CHECK-NEXT: mov v1.d[1], x15
; CHECK-NEXT: mov v3.d[1], x14
; CHECK-NEXT: ret
%1 = fptosi <8 x bfloat> %a to <8 x i64>
ret <8 x i64> %1
}
; NOTE: fcvtzs selected here because the xtn shaves the sign bit
define <8 x i8> @test_fptoui_i8(<8 x bfloat> %a) #0 {
; CHECK-LABEL: test_fptoui_i8:
; CHECK: // %bb.0:
; CHECK-NEXT: shll2 v1.4s, v0.8h, #16
; CHECK-NEXT: shll v0.4s, v0.4h, #16
; CHECK-NEXT: fcvtzu v1.4s, v1.4s
; CHECK-NEXT: fcvtzu v0.4s, v0.4s
; CHECK-NEXT: uzp1 v0.8h, v0.8h, v1.8h
; CHECK-NEXT: xtn v0.8b, v0.8h
; CHECK-NEXT: ret
%1 = fptoui <8 x bfloat> %a to <8 x i8>
ret <8 x i8> %1
}
define <16 x i8> @test_fptoui_v16i8(<16 x bfloat> %a) #0 {
; CHECK-LABEL: test_fptoui_v16i8:
; CHECK: // %bb.0:
; CHECK-NEXT: shll2 v2.4s, v1.8h, #16
; CHECK-NEXT: shll v1.4s, v1.4h, #16
; CHECK-NEXT: shll2 v3.4s, v0.8h, #16
; CHECK-NEXT: shll v0.4s, v0.4h, #16
; CHECK-NEXT: fcvtzu v2.4s, v2.4s
; CHECK-NEXT: fcvtzu v1.4s, v1.4s
; CHECK-NEXT: fcvtzu v3.4s, v3.4s
; CHECK-NEXT: fcvtzu v0.4s, v0.4s
; CHECK-NEXT: uzp1 v1.8h, v1.8h, v2.8h
; CHECK-NEXT: uzp1 v0.8h, v0.8h, v3.8h
; CHECK-NEXT: uzp1 v0.16b, v0.16b, v1.16b
; CHECK-NEXT: ret
%1 = fptoui <16 x bfloat> %a to <16 x i8>
ret <16 x i8> %1
}
define <8 x i16> @test_fptoui_i16(<8 x bfloat> %a) #0 {
; CHECK-LABEL: test_fptoui_i16:
; CHECK: // %bb.0:
; CHECK-NEXT: shll2 v1.4s, v0.8h, #16
; CHECK-NEXT: shll v0.4s, v0.4h, #16
; CHECK-NEXT: fcvtzu v1.4s, v1.4s
; CHECK-NEXT: fcvtzu v0.4s, v0.4s
; CHECK-NEXT: uzp1 v0.8h, v0.8h, v1.8h
; CHECK-NEXT: ret
%1 = fptoui <8 x bfloat> %a to <8 x i16>
ret <8 x i16> %1
}
define <8 x i32> @test_fptoui_i32(<8 x bfloat> %a) #0 {
; CHECK-LABEL: test_fptoui_i32:
; CHECK: // %bb.0:
; CHECK-NEXT: shll2 v1.4s, v0.8h, #16
; CHECK-NEXT: shll v0.4s, v0.4h, #16
; CHECK-NEXT: fcvtzu v1.4s, v1.4s
; CHECK-NEXT: fcvtzu v0.4s, v0.4s
; CHECK-NEXT: ret
%1 = fptoui <8 x bfloat> %a to <8 x i32>
ret <8 x i32> %1
}
define <8 x i64> @test_fptoui_i64(<8 x bfloat> %a) #0 {
; CHECK-LABEL: test_fptoui_i64:
; CHECK: // %bb.0:
; CHECK-NEXT: mov d1, v0.d[1]
; CHECK-NEXT: mov h4, v0.h[2]
; CHECK-NEXT: mov h3, v0.h[1]
; CHECK-NEXT: mov h7, v0.h[3]
; CHECK-NEXT: shll v0.4s, v0.4h, #16
; CHECK-NEXT: mov h2, v1.h[2]
; CHECK-NEXT: mov h5, v1.h[1]
; CHECK-NEXT: mov h6, v1.h[3]
; CHECK-NEXT: shll v1.4s, v1.4h, #16
; CHECK-NEXT: shll v4.4s, v4.4h, #16
; CHECK-NEXT: shll v3.4s, v3.4h, #16
; CHECK-NEXT: shll v7.4s, v7.4h, #16
; CHECK-NEXT: fcvtzu x9, s0
; CHECK-NEXT: shll v2.4s, v2.4h, #16
; CHECK-NEXT: shll v5.4s, v5.4h, #16
; CHECK-NEXT: shll v6.4s, v6.4h, #16
; CHECK-NEXT: fcvtzu x8, s1
; CHECK-NEXT: fcvtzu x12, s4
; CHECK-NEXT: fcvtzu x11, s3
; CHECK-NEXT: fcvtzu x15, s7
; CHECK-NEXT: fmov d0, x9
; CHECK-NEXT: fcvtzu x10, s2
; CHECK-NEXT: fcvtzu x13, s5
; CHECK-NEXT: fcvtzu x14, s6
; CHECK-NEXT: fmov d2, x8
; CHECK-NEXT: fmov d1, x12
; CHECK-NEXT: mov v0.d[1], x11
; CHECK-NEXT: fmov d3, x10
; CHECK-NEXT: mov v2.d[1], x13
; CHECK-NEXT: mov v1.d[1], x15
; CHECK-NEXT: mov v3.d[1], x14
; CHECK-NEXT: ret
%1 = fptoui <8 x bfloat> %a to <8 x i64>
ret <8 x i64> %1
}
define <8 x bfloat> @test_sitofp_i8(<8 x i8> %a) #0 {
; CHECK-CVT-LABEL: test_sitofp_i8:
; CHECK-CVT: // %bb.0:
; CHECK-CVT-NEXT: sshll v0.8h, v0.8b, #0
; CHECK-CVT-NEXT: movi v1.4s, #1
; CHECK-CVT-NEXT: movi v4.4s, #127, msl #8
; CHECK-CVT-NEXT: sshll v2.4s, v0.4h, #0
; CHECK-CVT-NEXT: sshll2 v0.4s, v0.8h, #0
; CHECK-CVT-NEXT: scvtf v2.4s, v2.4s
; CHECK-CVT-NEXT: scvtf v3.4s, v0.4s
; CHECK-CVT-NEXT: ushr v0.4s, v2.4s, #16
; CHECK-CVT-NEXT: ushr v5.4s, v3.4s, #16
; CHECK-CVT-NEXT: and v0.16b, v0.16b, v1.16b
; CHECK-CVT-NEXT: and v1.16b, v5.16b, v1.16b
; CHECK-CVT-NEXT: add v0.4s, v0.4s, v4.4s
; CHECK-CVT-NEXT: add v1.4s, v1.4s, v4.4s
; CHECK-CVT-NEXT: addhn v0.4h, v2.4s, v0.4s
; CHECK-CVT-NEXT: addhn2 v0.8h, v3.4s, v1.4s
; CHECK-CVT-NEXT: ret
;
; CHECK-BF16-LABEL: test_sitofp_i8:
; CHECK-BF16: // %bb.0:
; CHECK-BF16-NEXT: sshll v0.8h, v0.8b, #0
; CHECK-BF16-NEXT: sshll v1.4s, v0.4h, #0
; CHECK-BF16-NEXT: sshll2 v2.4s, v0.8h, #0
; CHECK-BF16-NEXT: scvtf v1.4s, v1.4s
; CHECK-BF16-NEXT: bfcvtn v0.4h, v1.4s
; CHECK-BF16-NEXT: scvtf v1.4s, v2.4s
; CHECK-BF16-NEXT: bfcvtn2 v0.8h, v1.4s
; CHECK-BF16-NEXT: ret
%1 = sitofp <8 x i8> %a to <8 x bfloat>
ret <8 x bfloat> %1
}
define <16 x bfloat> @test_sitofp_v16i8(<16 x i8> %a) #0 {
; CHECK-CVT-LABEL: test_sitofp_v16i8:
; CHECK-CVT: // %bb.0:
; CHECK-CVT-NEXT: sshll2 v2.8h, v0.16b, #0
; CHECK-CVT-NEXT: sshll v0.8h, v0.8b, #0
; CHECK-CVT-NEXT: movi v1.4s, #1
; CHECK-CVT-NEXT: movi v7.4s, #127, msl #8
; CHECK-CVT-NEXT: sshll v3.4s, v2.4h, #0
; CHECK-CVT-NEXT: sshll v4.4s, v0.4h, #0
; CHECK-CVT-NEXT: sshll2 v2.4s, v2.8h, #0
; CHECK-CVT-NEXT: sshll2 v0.4s, v0.8h, #0
; CHECK-CVT-NEXT: scvtf v3.4s, v3.4s
; CHECK-CVT-NEXT: scvtf v4.4s, v4.4s
; CHECK-CVT-NEXT: scvtf v2.4s, v2.4s
; CHECK-CVT-NEXT: scvtf v6.4s, v0.4s
; CHECK-CVT-NEXT: ushr v5.4s, v3.4s, #16
; CHECK-CVT-NEXT: ushr v0.4s, v4.4s, #16
; CHECK-CVT-NEXT: ushr v16.4s, v2.4s, #16
; CHECK-CVT-NEXT: ushr v17.4s, v6.4s, #16
; CHECK-CVT-NEXT: and v5.16b, v5.16b, v1.16b
; CHECK-CVT-NEXT: and v0.16b, v0.16b, v1.16b
; CHECK-CVT-NEXT: and v16.16b, v16.16b, v1.16b
; CHECK-CVT-NEXT: and v17.16b, v17.16b, v1.16b
; CHECK-CVT-NEXT: add v5.4s, v5.4s, v7.4s
; CHECK-CVT-NEXT: add v0.4s, v0.4s, v7.4s
; CHECK-CVT-NEXT: addhn v1.4h, v3.4s, v5.4s
; CHECK-CVT-NEXT: addhn v0.4h, v4.4s, v0.4s
; CHECK-CVT-NEXT: add v3.4s, v16.4s, v7.4s
; CHECK-CVT-NEXT: add v4.4s, v17.4s, v7.4s
; CHECK-CVT-NEXT: addhn2 v1.8h, v2.4s, v3.4s
; CHECK-CVT-NEXT: addhn2 v0.8h, v6.4s, v4.4s
; CHECK-CVT-NEXT: ret
;
; CHECK-BF16-LABEL: test_sitofp_v16i8:
; CHECK-BF16: // %bb.0:
; CHECK-BF16-NEXT: sshll2 v1.8h, v0.16b, #0
; CHECK-BF16-NEXT: sshll v0.8h, v0.8b, #0
; CHECK-BF16-NEXT: sshll v2.4s, v1.4h, #0
; CHECK-BF16-NEXT: sshll v3.4s, v0.4h, #0
; CHECK-BF16-NEXT: sshll2 v4.4s, v1.8h, #0
; CHECK-BF16-NEXT: sshll2 v5.4s, v0.8h, #0
; CHECK-BF16-NEXT: scvtf v2.4s, v2.4s
; CHECK-BF16-NEXT: scvtf v3.4s, v3.4s
; CHECK-BF16-NEXT: bfcvtn v1.4h, v2.4s
; CHECK-BF16-NEXT: scvtf v2.4s, v4.4s
; CHECK-BF16-NEXT: bfcvtn v0.4h, v3.4s
; CHECK-BF16-NEXT: scvtf v3.4s, v5.4s
; CHECK-BF16-NEXT: bfcvtn2 v1.8h, v2.4s
; CHECK-BF16-NEXT: bfcvtn2 v0.8h, v3.4s
; CHECK-BF16-NEXT: ret
%1 = sitofp <16 x i8> %a to <16 x bfloat>
ret <16 x bfloat> %1
}
define <8 x bfloat> @test_sitofp_i16(<8 x i16> %a) #0 {
; CHECK-CVT-LABEL: test_sitofp_i16:
; CHECK-CVT: // %bb.0:
; CHECK-CVT-NEXT: sshll v2.4s, v0.4h, #0
; CHECK-CVT-NEXT: sshll2 v0.4s, v0.8h, #0
; CHECK-CVT-NEXT: movi v1.4s, #1
; CHECK-CVT-NEXT: movi v4.4s, #127, msl #8
; CHECK-CVT-NEXT: scvtf v2.4s, v2.4s
; CHECK-CVT-NEXT: scvtf v3.4s, v0.4s
; CHECK-CVT-NEXT: ushr v0.4s, v2.4s, #16
; CHECK-CVT-NEXT: ushr v5.4s, v3.4s, #16
; CHECK-CVT-NEXT: and v0.16b, v0.16b, v1.16b
; CHECK-CVT-NEXT: and v1.16b, v5.16b, v1.16b
; CHECK-CVT-NEXT: add v0.4s, v0.4s, v4.4s
; CHECK-CVT-NEXT: add v1.4s, v1.4s, v4.4s
; CHECK-CVT-NEXT: addhn v0.4h, v2.4s, v0.4s
; CHECK-CVT-NEXT: addhn2 v0.8h, v3.4s, v1.4s
; CHECK-CVT-NEXT: ret
;
; CHECK-BF16-LABEL: test_sitofp_i16:
; CHECK-BF16: // %bb.0:
; CHECK-BF16-NEXT: sshll v1.4s, v0.4h, #0
; CHECK-BF16-NEXT: sshll2 v2.4s, v0.8h, #0
; CHECK-BF16-NEXT: scvtf v1.4s, v1.4s
; CHECK-BF16-NEXT: bfcvtn v0.4h, v1.4s
; CHECK-BF16-NEXT: scvtf v1.4s, v2.4s
; CHECK-BF16-NEXT: bfcvtn2 v0.8h, v1.4s
; CHECK-BF16-NEXT: ret
%1 = sitofp <8 x i16> %a to <8 x bfloat>
ret <8 x bfloat> %1
}
define <8 x bfloat> @test_sitofp_i32(<8 x i32> %a) #0 {
; CHECK-CVT-LABEL: test_sitofp_i32:
; CHECK-CVT: // %bb.0:
; CHECK-CVT-NEXT: scvtf v0.4s, v0.4s
; CHECK-CVT-NEXT: movi v2.4s, #1
; CHECK-CVT-NEXT: scvtf v1.4s, v1.4s
; CHECK-CVT-NEXT: movi v5.4s, #127, msl #8
; CHECK-CVT-NEXT: ushr v3.4s, v0.4s, #16
; CHECK-CVT-NEXT: ushr v4.4s, v1.4s, #16
; CHECK-CVT-NEXT: and v3.16b, v3.16b, v2.16b
; CHECK-CVT-NEXT: and v2.16b, v4.16b, v2.16b
; CHECK-CVT-NEXT: add v0.4s, v3.4s, v0.4s
; CHECK-CVT-NEXT: add v1.4s, v2.4s, v1.4s
; CHECK-CVT-NEXT: addhn v0.4h, v0.4s, v5.4s
; CHECK-CVT-NEXT: addhn2 v0.8h, v1.4s, v5.4s
; CHECK-CVT-NEXT: ret
;
; CHECK-BF16-LABEL: test_sitofp_i32:
; CHECK-BF16: // %bb.0:
; CHECK-BF16-NEXT: scvtf v0.4s, v0.4s
; CHECK-BF16-NEXT: scvtf v1.4s, v1.4s
; CHECK-BF16-NEXT: bfcvtn v0.4h, v0.4s
; CHECK-BF16-NEXT: bfcvtn2 v0.8h, v1.4s
; CHECK-BF16-NEXT: ret
%1 = sitofp <8 x i32> %a to <8 x bfloat>
ret <8 x bfloat> %1
}
define <8 x bfloat> @test_sitofp_i64(<8 x i64> %a) #0 {
; CHECK-CVT-LABEL: test_sitofp_i64:
; CHECK-CVT: // %bb.0:
; CHECK-CVT-NEXT: fmov x10, d2
; CHECK-CVT-NEXT: mov x8, v2.d[1]
; CHECK-CVT-NEXT: mov x9, v0.d[1]
; CHECK-CVT-NEXT: scvtf s2, x10
; CHECK-CVT-NEXT: fmov x10, d0
; CHECK-CVT-NEXT: scvtf s0, x8
; CHECK-CVT-NEXT: scvtf s5, x9
; CHECK-CVT-NEXT: fmov x9, d3
; CHECK-CVT-NEXT: mov x8, v3.d[1]
; CHECK-CVT-NEXT: scvtf s4, x10
; CHECK-CVT-NEXT: fmov x10, d1
; CHECK-CVT-NEXT: scvtf s3, x9
; CHECK-CVT-NEXT: mov x9, v1.d[1]
; CHECK-CVT-NEXT: mov v2.s[1], v0.s[0]
; CHECK-CVT-NEXT: scvtf s0, x10
; CHECK-CVT-NEXT: scvtf s1, x8
; CHECK-CVT-NEXT: mov v4.s[1], v5.s[0]
; CHECK-CVT-NEXT: mov v2.s[2], v3.s[0]
; CHECK-CVT-NEXT: scvtf s3, x9
; CHECK-CVT-NEXT: mov v4.s[2], v0.s[0]
; CHECK-CVT-NEXT: movi v0.4s, #1
; CHECK-CVT-NEXT: mov v2.s[3], v1.s[0]
; CHECK-CVT-NEXT: movi v1.4s, #127, msl #8
; CHECK-CVT-NEXT: mov v4.s[3], v3.s[0]
; CHECK-CVT-NEXT: ushr v3.4s, v2.4s, #16
; CHECK-CVT-NEXT: add v6.4s, v2.4s, v1.4s
; CHECK-CVT-NEXT: ushr v5.4s, v4.4s, #16
; CHECK-CVT-NEXT: add v1.4s, v4.4s, v1.4s
; CHECK-CVT-NEXT: and v3.16b, v3.16b, v0.16b
; CHECK-CVT-NEXT: and v0.16b, v5.16b, v0.16b
; CHECK-CVT-NEXT: fcmeq v5.4s, v2.4s, v2.4s
; CHECK-CVT-NEXT: orr v2.4s, #64, lsl #16
; CHECK-CVT-NEXT: add v3.4s, v3.4s, v6.4s
; CHECK-CVT-NEXT: fcmeq v6.4s, v4.4s, v4.4s
; CHECK-CVT-NEXT: orr v4.4s, #64, lsl #16
; CHECK-CVT-NEXT: add v0.4s, v0.4s, v1.4s
; CHECK-CVT-NEXT: mov v1.16b, v5.16b
; CHECK-CVT-NEXT: bif v0.16b, v4.16b, v6.16b
; CHECK-CVT-NEXT: bsl v1.16b, v3.16b, v2.16b
; CHECK-CVT-NEXT: uzp2 v0.8h, v0.8h, v1.8h
; CHECK-CVT-NEXT: ret
;
; CHECK-BF16-LABEL: test_sitofp_i64:
; CHECK-BF16: // %bb.0:
; CHECK-BF16-NEXT: mov x9, v0.d[1]
; CHECK-BF16-NEXT: fmov x10, d0
; CHECK-BF16-NEXT: mov x8, v2.d[1]
; CHECK-BF16-NEXT: scvtf s4, x10
; CHECK-BF16-NEXT: fmov x10, d1
; CHECK-BF16-NEXT: scvtf s0, x9
; CHECK-BF16-NEXT: fmov x9, d2
; CHECK-BF16-NEXT: scvtf s2, x8
; CHECK-BF16-NEXT: mov x8, v1.d[1]
; CHECK-BF16-NEXT: scvtf s1, x9
; CHECK-BF16-NEXT: fmov x9, d3
; CHECK-BF16-NEXT: mov v4.s[1], v0.s[0]
; CHECK-BF16-NEXT: scvtf s0, x10
; CHECK-BF16-NEXT: mov x10, v3.d[1]
; CHECK-BF16-NEXT: scvtf s3, x9
; CHECK-BF16-NEXT: mov v1.s[1], v2.s[0]
; CHECK-BF16-NEXT: scvtf s2, x8
; CHECK-BF16-NEXT: mov v4.s[2], v0.s[0]
; CHECK-BF16-NEXT: scvtf s0, x10
; CHECK-BF16-NEXT: mov v1.s[2], v3.s[0]
; CHECK-BF16-NEXT: mov v4.s[3], v2.s[0]
; CHECK-BF16-NEXT: mov v1.s[3], v0.s[0]
; CHECK-BF16-NEXT: bfcvtn v0.4h, v4.4s
; CHECK-BF16-NEXT: bfcvtn2 v0.8h, v1.4s
; CHECK-BF16-NEXT: ret
%1 = sitofp <8 x i64> %a to <8 x bfloat>
ret <8 x bfloat> %1
}
define <8 x bfloat> @test_uitofp_i8(<8 x i8> %a) #0 {
; CHECK-CVT-LABEL: test_uitofp_i8:
; CHECK-CVT: // %bb.0:
; CHECK-CVT-NEXT: ushll v0.8h, v0.8b, #0
; CHECK-CVT-NEXT: movi v1.4s, #1
; CHECK-CVT-NEXT: movi v4.4s, #127, msl #8
; CHECK-CVT-NEXT: ushll v2.4s, v0.4h, #0
; CHECK-CVT-NEXT: ushll2 v0.4s, v0.8h, #0
; CHECK-CVT-NEXT: ucvtf v2.4s, v2.4s
; CHECK-CVT-NEXT: ucvtf v3.4s, v0.4s
; CHECK-CVT-NEXT: ushr v0.4s, v2.4s, #16
; CHECK-CVT-NEXT: ushr v5.4s, v3.4s, #16
; CHECK-CVT-NEXT: and v0.16b, v0.16b, v1.16b
; CHECK-CVT-NEXT: and v1.16b, v5.16b, v1.16b
; CHECK-CVT-NEXT: add v0.4s, v0.4s, v4.4s
; CHECK-CVT-NEXT: add v1.4s, v1.4s, v4.4s
; CHECK-CVT-NEXT: addhn v0.4h, v2.4s, v0.4s
; CHECK-CVT-NEXT: addhn2 v0.8h, v3.4s, v1.4s
; CHECK-CVT-NEXT: ret
;
; CHECK-BF16-LABEL: test_uitofp_i8:
; CHECK-BF16: // %bb.0:
; CHECK-BF16-NEXT: ushll v0.8h, v0.8b, #0
; CHECK-BF16-NEXT: ushll v1.4s, v0.4h, #0
; CHECK-BF16-NEXT: ushll2 v2.4s, v0.8h, #0
; CHECK-BF16-NEXT: ucvtf v1.4s, v1.4s
; CHECK-BF16-NEXT: bfcvtn v0.4h, v1.4s
; CHECK-BF16-NEXT: ucvtf v1.4s, v2.4s
; CHECK-BF16-NEXT: bfcvtn2 v0.8h, v1.4s
; CHECK-BF16-NEXT: ret
%1 = uitofp <8 x i8> %a to <8 x bfloat>
ret <8 x bfloat> %1
}
define <16 x bfloat> @test_uitofp_v16i8(<16 x i8> %a) #0 {
; CHECK-CVT-LABEL: test_uitofp_v16i8:
; CHECK-CVT: // %bb.0:
; CHECK-CVT-NEXT: ushll2 v2.8h, v0.16b, #0
; CHECK-CVT-NEXT: ushll v0.8h, v0.8b, #0
; CHECK-CVT-NEXT: movi v1.4s, #1
; CHECK-CVT-NEXT: movi v7.4s, #127, msl #8
; CHECK-CVT-NEXT: ushll v3.4s, v2.4h, #0
; CHECK-CVT-NEXT: ushll v4.4s, v0.4h, #0
; CHECK-CVT-NEXT: ushll2 v2.4s, v2.8h, #0
; CHECK-CVT-NEXT: ushll2 v0.4s, v0.8h, #0
; CHECK-CVT-NEXT: ucvtf v3.4s, v3.4s
; CHECK-CVT-NEXT: ucvtf v4.4s, v4.4s
; CHECK-CVT-NEXT: ucvtf v2.4s, v2.4s
; CHECK-CVT-NEXT: ucvtf v6.4s, v0.4s
; CHECK-CVT-NEXT: ushr v5.4s, v3.4s, #16
; CHECK-CVT-NEXT: ushr v0.4s, v4.4s, #16
; CHECK-CVT-NEXT: ushr v16.4s, v2.4s, #16
; CHECK-CVT-NEXT: ushr v17.4s, v6.4s, #16
; CHECK-CVT-NEXT: and v5.16b, v5.16b, v1.16b
; CHECK-CVT-NEXT: and v0.16b, v0.16b, v1.16b
; CHECK-CVT-NEXT: and v16.16b, v16.16b, v1.16b
; CHECK-CVT-NEXT: and v17.16b, v17.16b, v1.16b
; CHECK-CVT-NEXT: add v5.4s, v5.4s, v7.4s
; CHECK-CVT-NEXT: add v0.4s, v0.4s, v7.4s
; CHECK-CVT-NEXT: addhn v1.4h, v3.4s, v5.4s
; CHECK-CVT-NEXT: addhn v0.4h, v4.4s, v0.4s
; CHECK-CVT-NEXT: add v3.4s, v16.4s, v7.4s
; CHECK-CVT-NEXT: add v4.4s, v17.4s, v7.4s
; CHECK-CVT-NEXT: addhn2 v1.8h, v2.4s, v3.4s
; CHECK-CVT-NEXT: addhn2 v0.8h, v6.4s, v4.4s
; CHECK-CVT-NEXT: ret
;
; CHECK-BF16-LABEL: test_uitofp_v16i8:
; CHECK-BF16: // %bb.0:
; CHECK-BF16-NEXT: ushll2 v1.8h, v0.16b, #0
; CHECK-BF16-NEXT: ushll v0.8h, v0.8b, #0
; CHECK-BF16-NEXT: ushll v2.4s, v1.4h, #0
; CHECK-BF16-NEXT: ushll v3.4s, v0.4h, #0
; CHECK-BF16-NEXT: ushll2 v4.4s, v1.8h, #0
; CHECK-BF16-NEXT: ushll2 v5.4s, v0.8h, #0
; CHECK-BF16-NEXT: ucvtf v2.4s, v2.4s
; CHECK-BF16-NEXT: ucvtf v3.4s, v3.4s
; CHECK-BF16-NEXT: bfcvtn v1.4h, v2.4s
; CHECK-BF16-NEXT: ucvtf v2.4s, v4.4s
; CHECK-BF16-NEXT: bfcvtn v0.4h, v3.4s
; CHECK-BF16-NEXT: ucvtf v3.4s, v5.4s
; CHECK-BF16-NEXT: bfcvtn2 v1.8h, v2.4s
; CHECK-BF16-NEXT: bfcvtn2 v0.8h, v3.4s
; CHECK-BF16-NEXT: ret
%1 = uitofp <16 x i8> %a to <16 x bfloat>
ret <16 x bfloat> %1
}
define <8 x bfloat> @test_uitofp_i16(<8 x i16> %a) #0 {
; CHECK-CVT-LABEL: test_uitofp_i16:
; CHECK-CVT: // %bb.0:
; CHECK-CVT-NEXT: ushll v2.4s, v0.4h, #0
; CHECK-CVT-NEXT: ushll2 v0.4s, v0.8h, #0
; CHECK-CVT-NEXT: movi v1.4s, #1
; CHECK-CVT-NEXT: movi v4.4s, #127, msl #8
; CHECK-CVT-NEXT: ucvtf v2.4s, v2.4s
; CHECK-CVT-NEXT: ucvtf v3.4s, v0.4s
; CHECK-CVT-NEXT: ushr v0.4s, v2.4s, #16
; CHECK-CVT-NEXT: ushr v5.4s, v3.4s, #16
; CHECK-CVT-NEXT: and v0.16b, v0.16b, v1.16b
; CHECK-CVT-NEXT: and v1.16b, v5.16b, v1.16b
; CHECK-CVT-NEXT: add v0.4s, v0.4s, v4.4s
; CHECK-CVT-NEXT: add v1.4s, v1.4s, v4.4s
; CHECK-CVT-NEXT: addhn v0.4h, v2.4s, v0.4s
; CHECK-CVT-NEXT: addhn2 v0.8h, v3.4s, v1.4s
; CHECK-CVT-NEXT: ret
;
; CHECK-BF16-LABEL: test_uitofp_i16:
; CHECK-BF16: // %bb.0:
; CHECK-BF16-NEXT: ushll v1.4s, v0.4h, #0
; CHECK-BF16-NEXT: ushll2 v2.4s, v0.8h, #0
; CHECK-BF16-NEXT: ucvtf v1.4s, v1.4s
; CHECK-BF16-NEXT: bfcvtn v0.4h, v1.4s
; CHECK-BF16-NEXT: ucvtf v1.4s, v2.4s
; CHECK-BF16-NEXT: bfcvtn2 v0.8h, v1.4s
; CHECK-BF16-NEXT: ret
%1 = uitofp <8 x i16> %a to <8 x bfloat>
ret <8 x bfloat> %1
}
define <8 x bfloat> @test_uitofp_i32(<8 x i32> %a) #0 {
; CHECK-CVT-LABEL: test_uitofp_i32:
; CHECK-CVT: // %bb.0:
; CHECK-CVT-NEXT: ucvtf v0.4s, v0.4s
; CHECK-CVT-NEXT: movi v2.4s, #1
; CHECK-CVT-NEXT: ucvtf v1.4s, v1.4s
; CHECK-CVT-NEXT: movi v5.4s, #127, msl #8
; CHECK-CVT-NEXT: ushr v3.4s, v0.4s, #16
; CHECK-CVT-NEXT: ushr v4.4s, v1.4s, #16
; CHECK-CVT-NEXT: and v3.16b, v3.16b, v2.16b
; CHECK-CVT-NEXT: and v2.16b, v4.16b, v2.16b
; CHECK-CVT-NEXT: add v0.4s, v3.4s, v0.4s
; CHECK-CVT-NEXT: add v1.4s, v2.4s, v1.4s
; CHECK-CVT-NEXT: addhn v0.4h, v0.4s, v5.4s
; CHECK-CVT-NEXT: addhn2 v0.8h, v1.4s, v5.4s
; CHECK-CVT-NEXT: ret
;
; CHECK-BF16-LABEL: test_uitofp_i32:
; CHECK-BF16: // %bb.0:
; CHECK-BF16-NEXT: ucvtf v0.4s, v0.4s
; CHECK-BF16-NEXT: ucvtf v1.4s, v1.4s
; CHECK-BF16-NEXT: bfcvtn v0.4h, v0.4s
; CHECK-BF16-NEXT: bfcvtn2 v0.8h, v1.4s
; CHECK-BF16-NEXT: ret
%1 = uitofp <8 x i32> %a to <8 x bfloat>
ret <8 x bfloat> %1
}
define <8 x bfloat> @test_uitofp_i64(<8 x i64> %a) #0 {
; CHECK-CVT-LABEL: test_uitofp_i64:
; CHECK-CVT: // %bb.0:
; CHECK-CVT-NEXT: fmov x10, d2
; CHECK-CVT-NEXT: mov x8, v2.d[1]
; CHECK-CVT-NEXT: mov x9, v0.d[1]
; CHECK-CVT-NEXT: ucvtf s2, x10
; CHECK-CVT-NEXT: fmov x10, d0
; CHECK-CVT-NEXT: ucvtf s0, x8
; CHECK-CVT-NEXT: ucvtf s5, x9
; CHECK-CVT-NEXT: fmov x9, d3
; CHECK-CVT-NEXT: mov x8, v3.d[1]
; CHECK-CVT-NEXT: ucvtf s4, x10
; CHECK-CVT-NEXT: fmov x10, d1
; CHECK-CVT-NEXT: ucvtf s3, x9
; CHECK-CVT-NEXT: mov x9, v1.d[1]
; CHECK-CVT-NEXT: mov v2.s[1], v0.s[0]
; CHECK-CVT-NEXT: ucvtf s0, x10
; CHECK-CVT-NEXT: ucvtf s1, x8
; CHECK-CVT-NEXT: mov v4.s[1], v5.s[0]
; CHECK-CVT-NEXT: mov v2.s[2], v3.s[0]
; CHECK-CVT-NEXT: ucvtf s3, x9
; CHECK-CVT-NEXT: mov v4.s[2], v0.s[0]
; CHECK-CVT-NEXT: movi v0.4s, #1
; CHECK-CVT-NEXT: mov v2.s[3], v1.s[0]
; CHECK-CVT-NEXT: movi v1.4s, #127, msl #8
; CHECK-CVT-NEXT: mov v4.s[3], v3.s[0]
; CHECK-CVT-NEXT: ushr v3.4s, v2.4s, #16
; CHECK-CVT-NEXT: add v6.4s, v2.4s, v1.4s
; CHECK-CVT-NEXT: ushr v5.4s, v4.4s, #16
; CHECK-CVT-NEXT: add v1.4s, v4.4s, v1.4s
; CHECK-CVT-NEXT: and v3.16b, v3.16b, v0.16b
; CHECK-CVT-NEXT: and v0.16b, v5.16b, v0.16b
; CHECK-CVT-NEXT: fcmeq v5.4s, v2.4s, v2.4s
; CHECK-CVT-NEXT: orr v2.4s, #64, lsl #16
; CHECK-CVT-NEXT: add v3.4s, v3.4s, v6.4s
; CHECK-CVT-NEXT: fcmeq v6.4s, v4.4s, v4.4s
; CHECK-CVT-NEXT: orr v4.4s, #64, lsl #16
; CHECK-CVT-NEXT: add v0.4s, v0.4s, v1.4s
; CHECK-CVT-NEXT: mov v1.16b, v5.16b
; CHECK-CVT-NEXT: bif v0.16b, v4.16b, v6.16b
; CHECK-CVT-NEXT: bsl v1.16b, v3.16b, v2.16b
; CHECK-CVT-NEXT: uzp2 v0.8h, v0.8h, v1.8h
; CHECK-CVT-NEXT: ret
;
; CHECK-BF16-LABEL: test_uitofp_i64:
; CHECK-BF16: // %bb.0:
; CHECK-BF16-NEXT: mov x9, v0.d[1]
; CHECK-BF16-NEXT: fmov x10, d0
; CHECK-BF16-NEXT: mov x8, v2.d[1]
; CHECK-BF16-NEXT: ucvtf s4, x10
; CHECK-BF16-NEXT: fmov x10, d1
; CHECK-BF16-NEXT: ucvtf s0, x9
; CHECK-BF16-NEXT: fmov x9, d2
; CHECK-BF16-NEXT: ucvtf s2, x8
; CHECK-BF16-NEXT: mov x8, v1.d[1]
; CHECK-BF16-NEXT: ucvtf s1, x9
; CHECK-BF16-NEXT: fmov x9, d3
; CHECK-BF16-NEXT: mov v4.s[1], v0.s[0]
; CHECK-BF16-NEXT: ucvtf s0, x10
; CHECK-BF16-NEXT: mov x10, v3.d[1]
; CHECK-BF16-NEXT: ucvtf s3, x9
; CHECK-BF16-NEXT: mov v1.s[1], v2.s[0]
; CHECK-BF16-NEXT: ucvtf s2, x8
; CHECK-BF16-NEXT: mov v4.s[2], v0.s[0]
; CHECK-BF16-NEXT: ucvtf s0, x10
; CHECK-BF16-NEXT: mov v1.s[2], v3.s[0]
; CHECK-BF16-NEXT: mov v4.s[3], v2.s[0]
; CHECK-BF16-NEXT: mov v1.s[3], v0.s[0]
; CHECK-BF16-NEXT: bfcvtn v0.4h, v4.4s
; CHECK-BF16-NEXT: bfcvtn2 v0.8h, v1.4s
; CHECK-BF16-NEXT: ret
%1 = uitofp <8 x i64> %a to <8 x bfloat>
ret <8 x bfloat> %1
}
define <8 x bfloat> @test_fptrunc_float(<8 x float> %a) {
; CHECK-CVT-SD-LABEL: test_fptrunc_float:
; CHECK-CVT-SD: // %bb.0:
; CHECK-CVT-SD-NEXT: movi v2.4s, #1
; CHECK-CVT-SD-NEXT: movi v3.4s, #127, msl #8
; CHECK-CVT-SD-NEXT: ushr v4.4s, v1.4s, #16
; CHECK-CVT-SD-NEXT: ushr v5.4s, v0.4s, #16
; CHECK-CVT-SD-NEXT: and v4.16b, v4.16b, v2.16b
; CHECK-CVT-SD-NEXT: add v6.4s, v1.4s, v3.4s
; CHECK-CVT-SD-NEXT: and v2.16b, v5.16b, v2.16b
; CHECK-CVT-SD-NEXT: add v3.4s, v0.4s, v3.4s
; CHECK-CVT-SD-NEXT: fcmeq v5.4s, v1.4s, v1.4s
; CHECK-CVT-SD-NEXT: orr v1.4s, #64, lsl #16
; CHECK-CVT-SD-NEXT: add v4.4s, v4.4s, v6.4s
; CHECK-CVT-SD-NEXT: fcmeq v6.4s, v0.4s, v0.4s
; CHECK-CVT-SD-NEXT: orr v0.4s, #64, lsl #16
; CHECK-CVT-SD-NEXT: add v2.4s, v2.4s, v3.4s
; CHECK-CVT-SD-NEXT: bit v1.16b, v4.16b, v5.16b
; CHECK-CVT-SD-NEXT: bit v0.16b, v2.16b, v6.16b
; CHECK-CVT-SD-NEXT: uzp2 v0.8h, v0.8h, v1.8h
; CHECK-CVT-SD-NEXT: ret
;
; CHECK-BF16-LABEL: test_fptrunc_float:
; CHECK-BF16: // %bb.0:
; CHECK-BF16-NEXT: bfcvtn v0.4h, v0.4s
; CHECK-BF16-NEXT: bfcvtn2 v0.8h, v1.4s
; CHECK-BF16-NEXT: ret
;
; CHECK-CVT-GI-LABEL: test_fptrunc_float:
; CHECK-CVT-GI: // %bb.0:
; CHECK-CVT-GI-NEXT: movi v2.4s, #1
; CHECK-CVT-GI-NEXT: movi v3.4s, #127, msl #8
; CHECK-CVT-GI-NEXT: ushr v4.4s, v0.4s, #16
; CHECK-CVT-GI-NEXT: ushr v5.4s, v1.4s, #16
; CHECK-CVT-GI-NEXT: movi v6.4s, #64, lsl #16
; CHECK-CVT-GI-NEXT: fcmeq v7.4s, v0.4s, v0.4s
; CHECK-CVT-GI-NEXT: fcmeq v16.4s, v1.4s, v1.4s
; CHECK-CVT-GI-NEXT: and v4.16b, v4.16b, v2.16b
; CHECK-CVT-GI-NEXT: add v17.4s, v0.4s, v3.4s
; CHECK-CVT-GI-NEXT: and v2.16b, v5.16b, v2.16b
; CHECK-CVT-GI-NEXT: add v3.4s, v1.4s, v3.4s
; CHECK-CVT-GI-NEXT: orr v0.16b, v0.16b, v6.16b
; CHECK-CVT-GI-NEXT: mvn v5.16b, v7.16b
; CHECK-CVT-GI-NEXT: mvn v7.16b, v16.16b
; CHECK-CVT-GI-NEXT: orr v1.16b, v1.16b, v6.16b
; CHECK-CVT-GI-NEXT: add v4.4s, v17.4s, v4.4s
; CHECK-CVT-GI-NEXT: add v2.4s, v3.4s, v2.4s
; CHECK-CVT-GI-NEXT: bif v0.16b, v4.16b, v5.16b
; CHECK-CVT-GI-NEXT: bif v1.16b, v2.16b, v7.16b
; CHECK-CVT-GI-NEXT: shrn v0.4h, v0.4s, #16
; CHECK-CVT-GI-NEXT: shrn v1.4h, v1.4s, #16
; CHECK-CVT-GI-NEXT: mov v0.d[1], v1.d[0]
; CHECK-CVT-GI-NEXT: ret
%1 = fptrunc <8 x float> %a to <8 x bfloat>
ret <8 x bfloat> %1
}
define <8 x bfloat> @test_fptrunc_double(<8 x double> %a) {
; CHECK-CVT-SD-LABEL: test_fptrunc_double:
; CHECK-CVT-SD: // %bb.0:
; CHECK-CVT-SD-NEXT: fcvtxn v2.2s, v2.2d
; CHECK-CVT-SD-NEXT: fcvtxn v0.2s, v0.2d
; CHECK-CVT-SD-NEXT: fcvtxn2 v2.4s, v3.2d
; CHECK-CVT-SD-NEXT: fcvtxn2 v0.4s, v1.2d
; CHECK-CVT-SD-NEXT: movi v1.4s, #1
; CHECK-CVT-SD-NEXT: movi v3.4s, #127, msl #8
; CHECK-CVT-SD-NEXT: ushr v4.4s, v2.4s, #16
; CHECK-CVT-SD-NEXT: ushr v5.4s, v0.4s, #16
; CHECK-CVT-SD-NEXT: add v6.4s, v2.4s, v3.4s
; CHECK-CVT-SD-NEXT: add v3.4s, v0.4s, v3.4s
; CHECK-CVT-SD-NEXT: and v4.16b, v4.16b, v1.16b
; CHECK-CVT-SD-NEXT: and v1.16b, v5.16b, v1.16b
; CHECK-CVT-SD-NEXT: fcmeq v5.4s, v2.4s, v2.4s
; CHECK-CVT-SD-NEXT: orr v2.4s, #64, lsl #16
; CHECK-CVT-SD-NEXT: add v4.4s, v4.4s, v6.4s
; CHECK-CVT-SD-NEXT: fcmeq v6.4s, v0.4s, v0.4s
; CHECK-CVT-SD-NEXT: add v1.4s, v1.4s, v3.4s
; CHECK-CVT-SD-NEXT: orr v0.4s, #64, lsl #16
; CHECK-CVT-SD-NEXT: bit v2.16b, v4.16b, v5.16b
; CHECK-CVT-SD-NEXT: bit v0.16b, v1.16b, v6.16b
; CHECK-CVT-SD-NEXT: uzp2 v0.8h, v0.8h, v2.8h
; CHECK-CVT-SD-NEXT: ret
;
; CHECK-BF16-LABEL: test_fptrunc_double:
; CHECK-BF16: // %bb.0:
; CHECK-BF16-NEXT: fcvtxn v0.2s, v0.2d
; CHECK-BF16-NEXT: fcvtxn v2.2s, v2.2d
; CHECK-BF16-NEXT: fcvtxn2 v0.4s, v1.2d
; CHECK-BF16-NEXT: fcvtxn2 v2.4s, v3.2d
; CHECK-BF16-NEXT: bfcvtn v0.4h, v0.4s
; CHECK-BF16-NEXT: bfcvtn2 v0.8h, v2.4s
; CHECK-BF16-NEXT: ret
;
; CHECK-CVT-GI-LABEL: test_fptrunc_double:
; CHECK-CVT-GI: // %bb.0:
; CHECK-CVT-GI-NEXT: fcvtxn v0.2s, v0.2d
; CHECK-CVT-GI-NEXT: fcvtxn v2.2s, v2.2d
; CHECK-CVT-GI-NEXT: movi v6.4s, #64, lsl #16
; CHECK-CVT-GI-NEXT: fcvtxn2 v0.4s, v1.2d
; CHECK-CVT-GI-NEXT: fcvtxn2 v2.4s, v3.2d
; CHECK-CVT-GI-NEXT: movi v1.4s, #1
; CHECK-CVT-GI-NEXT: movi v3.4s, #127, msl #8
; CHECK-CVT-GI-NEXT: ushr v4.4s, v0.4s, #16
; CHECK-CVT-GI-NEXT: ushr v5.4s, v2.4s, #16
; CHECK-CVT-GI-NEXT: fcmeq v7.4s, v0.4s, v0.4s
; CHECK-CVT-GI-NEXT: fcmeq v17.4s, v2.4s, v2.4s
; CHECK-CVT-GI-NEXT: add v16.4s, v0.4s, v3.4s
; CHECK-CVT-GI-NEXT: add v3.4s, v2.4s, v3.4s
; CHECK-CVT-GI-NEXT: orr v0.16b, v0.16b, v6.16b
; CHECK-CVT-GI-NEXT: orr v2.16b, v2.16b, v6.16b
; CHECK-CVT-GI-NEXT: and v4.16b, v4.16b, v1.16b
; CHECK-CVT-GI-NEXT: and v1.16b, v5.16b, v1.16b
; CHECK-CVT-GI-NEXT: mvn v5.16b, v7.16b
; CHECK-CVT-GI-NEXT: mvn v7.16b, v17.16b
; CHECK-CVT-GI-NEXT: add v4.4s, v16.4s, v4.4s
; CHECK-CVT-GI-NEXT: add v1.4s, v3.4s, v1.4s
; CHECK-CVT-GI-NEXT: bif v0.16b, v4.16b, v5.16b
; CHECK-CVT-GI-NEXT: bit v1.16b, v2.16b, v7.16b
; CHECK-CVT-GI-NEXT: shrn v0.4h, v0.4s, #16
; CHECK-CVT-GI-NEXT: shrn v1.4h, v1.4s, #16
; CHECK-CVT-GI-NEXT: mov v0.d[1], v1.d[0]
; CHECK-CVT-GI-NEXT: ret
%1 = fptrunc <8 x double> %a to <8 x bfloat>
ret <8 x bfloat> %1
}
define <8 x bfloat> @test_fptrunc_float_fast(<8 x float> %a) {
; CHECK-CVT-SD-LABEL: test_fptrunc_float_fast:
; CHECK-CVT-SD: // %bb.0:
; CHECK-CVT-SD-NEXT: movi v2.4s, #1
; CHECK-CVT-SD-NEXT: movi v3.4s, #127, msl #8
; CHECK-CVT-SD-NEXT: ushr v4.4s, v1.4s, #16
; CHECK-CVT-SD-NEXT: ushr v5.4s, v0.4s, #16
; CHECK-CVT-SD-NEXT: and v4.16b, v4.16b, v2.16b
; CHECK-CVT-SD-NEXT: add v6.4s, v1.4s, v3.4s
; CHECK-CVT-SD-NEXT: and v2.16b, v5.16b, v2.16b
; CHECK-CVT-SD-NEXT: add v3.4s, v0.4s, v3.4s
; CHECK-CVT-SD-NEXT: fcmeq v5.4s, v1.4s, v1.4s
; CHECK-CVT-SD-NEXT: orr v1.4s, #64, lsl #16
; CHECK-CVT-SD-NEXT: add v4.4s, v4.4s, v6.4s
; CHECK-CVT-SD-NEXT: fcmeq v6.4s, v0.4s, v0.4s
; CHECK-CVT-SD-NEXT: orr v0.4s, #64, lsl #16
; CHECK-CVT-SD-NEXT: add v2.4s, v2.4s, v3.4s
; CHECK-CVT-SD-NEXT: bit v1.16b, v4.16b, v5.16b
; CHECK-CVT-SD-NEXT: bit v0.16b, v2.16b, v6.16b
; CHECK-CVT-SD-NEXT: uzp2 v0.8h, v0.8h, v1.8h
; CHECK-CVT-SD-NEXT: ret
;
; CHECK-BF16-LABEL: test_fptrunc_float_fast:
; CHECK-BF16: // %bb.0:
; CHECK-BF16-NEXT: bfcvtn v0.4h, v0.4s
; CHECK-BF16-NEXT: bfcvtn2 v0.8h, v1.4s
; CHECK-BF16-NEXT: ret
;
; CHECK-CVT-GI-LABEL: test_fptrunc_float_fast:
; CHECK-CVT-GI: // %bb.0:
; CHECK-CVT-GI-NEXT: movi v2.4s, #1
; CHECK-CVT-GI-NEXT: movi v3.4s, #127, msl #8
; CHECK-CVT-GI-NEXT: ushr v4.4s, v0.4s, #16
; CHECK-CVT-GI-NEXT: ushr v5.4s, v1.4s, #16
; CHECK-CVT-GI-NEXT: movi v6.4s, #64, lsl #16
; CHECK-CVT-GI-NEXT: fcmeq v7.4s, v0.4s, v0.4s
; CHECK-CVT-GI-NEXT: fcmeq v16.4s, v1.4s, v1.4s
; CHECK-CVT-GI-NEXT: and v4.16b, v4.16b, v2.16b
; CHECK-CVT-GI-NEXT: add v17.4s, v0.4s, v3.4s
; CHECK-CVT-GI-NEXT: and v2.16b, v5.16b, v2.16b
; CHECK-CVT-GI-NEXT: add v3.4s, v1.4s, v3.4s
; CHECK-CVT-GI-NEXT: orr v0.16b, v0.16b, v6.16b
; CHECK-CVT-GI-NEXT: mvn v5.16b, v7.16b
; CHECK-CVT-GI-NEXT: mvn v7.16b, v16.16b
; CHECK-CVT-GI-NEXT: orr v1.16b, v1.16b, v6.16b
; CHECK-CVT-GI-NEXT: add v4.4s, v17.4s, v4.4s
; CHECK-CVT-GI-NEXT: add v2.4s, v3.4s, v2.4s
; CHECK-CVT-GI-NEXT: bif v0.16b, v4.16b, v5.16b
; CHECK-CVT-GI-NEXT: bif v1.16b, v2.16b, v7.16b
; CHECK-CVT-GI-NEXT: shrn v0.4h, v0.4s, #16
; CHECK-CVT-GI-NEXT: shrn v1.4h, v1.4s, #16
; CHECK-CVT-GI-NEXT: mov v0.d[1], v1.d[0]
; CHECK-CVT-GI-NEXT: ret
%1 = fptrunc fast <8 x float> %a to <8 x bfloat>
ret <8 x bfloat> %1
}
define <8 x bfloat> @test_fptrunc_double_fast(<8 x double> %a) {
; CHECK-CVT-SD-LABEL: test_fptrunc_double_fast:
; CHECK-CVT-SD: // %bb.0:
; CHECK-CVT-SD-NEXT: fcvtxn v2.2s, v2.2d
; CHECK-CVT-SD-NEXT: fcvtxn v0.2s, v0.2d
; CHECK-CVT-SD-NEXT: fcvtxn2 v2.4s, v3.2d
; CHECK-CVT-SD-NEXT: fcvtxn2 v0.4s, v1.2d
; CHECK-CVT-SD-NEXT: movi v1.4s, #1
; CHECK-CVT-SD-NEXT: movi v3.4s, #127, msl #8
; CHECK-CVT-SD-NEXT: ushr v4.4s, v2.4s, #16
; CHECK-CVT-SD-NEXT: ushr v5.4s, v0.4s, #16
; CHECK-CVT-SD-NEXT: add v6.4s, v2.4s, v3.4s
; CHECK-CVT-SD-NEXT: add v3.4s, v0.4s, v3.4s
; CHECK-CVT-SD-NEXT: and v4.16b, v4.16b, v1.16b
; CHECK-CVT-SD-NEXT: and v1.16b, v5.16b, v1.16b
; CHECK-CVT-SD-NEXT: fcmeq v5.4s, v2.4s, v2.4s
; CHECK-CVT-SD-NEXT: orr v2.4s, #64, lsl #16
; CHECK-CVT-SD-NEXT: add v4.4s, v4.4s, v6.4s
; CHECK-CVT-SD-NEXT: fcmeq v6.4s, v0.4s, v0.4s
; CHECK-CVT-SD-NEXT: add v1.4s, v1.4s, v3.4s
; CHECK-CVT-SD-NEXT: orr v0.4s, #64, lsl #16
; CHECK-CVT-SD-NEXT: bit v2.16b, v4.16b, v5.16b
; CHECK-CVT-SD-NEXT: bit v0.16b, v1.16b, v6.16b
; CHECK-CVT-SD-NEXT: uzp2 v0.8h, v0.8h, v2.8h
; CHECK-CVT-SD-NEXT: ret
;
; CHECK-BF16-LABEL: test_fptrunc_double_fast:
; CHECK-BF16: // %bb.0:
; CHECK-BF16-NEXT: fcvtxn v0.2s, v0.2d
; CHECK-BF16-NEXT: fcvtxn v2.2s, v2.2d
; CHECK-BF16-NEXT: fcvtxn2 v0.4s, v1.2d
; CHECK-BF16-NEXT: fcvtxn2 v2.4s, v3.2d
; CHECK-BF16-NEXT: bfcvtn v0.4h, v0.4s
; CHECK-BF16-NEXT: bfcvtn2 v0.8h, v2.4s
; CHECK-BF16-NEXT: ret
;
; CHECK-CVT-GI-LABEL: test_fptrunc_double_fast:
; CHECK-CVT-GI: // %bb.0:
; CHECK-CVT-GI-NEXT: fcvtxn v0.2s, v0.2d
; CHECK-CVT-GI-NEXT: fcvtxn v2.2s, v2.2d
; CHECK-CVT-GI-NEXT: movi v6.4s, #64, lsl #16
; CHECK-CVT-GI-NEXT: fcvtxn2 v0.4s, v1.2d
; CHECK-CVT-GI-NEXT: fcvtxn2 v2.4s, v3.2d
; CHECK-CVT-GI-NEXT: movi v1.4s, #1
; CHECK-CVT-GI-NEXT: movi v3.4s, #127, msl #8
; CHECK-CVT-GI-NEXT: ushr v4.4s, v0.4s, #16
; CHECK-CVT-GI-NEXT: ushr v5.4s, v2.4s, #16
; CHECK-CVT-GI-NEXT: fcmeq v7.4s, v0.4s, v0.4s
; CHECK-CVT-GI-NEXT: fcmeq v17.4s, v2.4s, v2.4s
; CHECK-CVT-GI-NEXT: add v16.4s, v0.4s, v3.4s
; CHECK-CVT-GI-NEXT: add v3.4s, v2.4s, v3.4s
; CHECK-CVT-GI-NEXT: orr v0.16b, v0.16b, v6.16b
; CHECK-CVT-GI-NEXT: orr v2.16b, v2.16b, v6.16b
; CHECK-CVT-GI-NEXT: and v4.16b, v4.16b, v1.16b
; CHECK-CVT-GI-NEXT: and v1.16b, v5.16b, v1.16b
; CHECK-CVT-GI-NEXT: mvn v5.16b, v7.16b
; CHECK-CVT-GI-NEXT: mvn v7.16b, v17.16b
; CHECK-CVT-GI-NEXT: add v4.4s, v16.4s, v4.4s
; CHECK-CVT-GI-NEXT: add v1.4s, v3.4s, v1.4s
; CHECK-CVT-GI-NEXT: bif v0.16b, v4.16b, v5.16b
; CHECK-CVT-GI-NEXT: bit v1.16b, v2.16b, v7.16b
; CHECK-CVT-GI-NEXT: shrn v0.4h, v0.4s, #16
; CHECK-CVT-GI-NEXT: shrn v1.4h, v1.4s, #16
; CHECK-CVT-GI-NEXT: mov v0.d[1], v1.d[0]
; CHECK-CVT-GI-NEXT: ret
%1 = fptrunc fast <8 x double> %a to <8 x bfloat>
ret <8 x bfloat> %1
}
define <8 x float> @test_fpext_float(<8 x bfloat> %a) {
; CHECK-CVT-SD-LABEL: test_fpext_float:
; CHECK-CVT-SD: // %bb.0:
; CHECK-CVT-SD-NEXT: shll2 v1.4s, v0.8h, #16
; CHECK-CVT-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-CVT-SD-NEXT: ret
;
; CHECK-BF16-SD-LABEL: test_fpext_float:
; CHECK-BF16-SD: // %bb.0:
; CHECK-BF16-SD-NEXT: shll2 v1.4s, v0.8h, #16
; CHECK-BF16-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16-SD-NEXT: ret
;
; CHECK-BF16SVE-SD-LABEL: test_fpext_float:
; CHECK-BF16SVE-SD: // %bb.0:
; CHECK-BF16SVE-SD-NEXT: shll2 v1.4s, v0.8h, #16
; CHECK-BF16SVE-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16SVE-SD-NEXT: ret
;
; CHECK-CVT-GI-LABEL: test_fpext_float:
; CHECK-CVT-GI: // %bb.0:
; CHECK-CVT-GI-NEXT: shll v2.4s, v0.4h, #16
; CHECK-CVT-GI-NEXT: shll2 v1.4s, v0.8h, #16
; CHECK-CVT-GI-NEXT: mov v0.16b, v2.16b
; CHECK-CVT-GI-NEXT: ret
;
; CHECK-BF16-GI-LABEL: test_fpext_float:
; CHECK-BF16-GI: // %bb.0:
; CHECK-BF16-GI-NEXT: shll v2.4s, v0.4h, #16
; CHECK-BF16-GI-NEXT: shll2 v1.4s, v0.8h, #16
; CHECK-BF16-GI-NEXT: mov v0.16b, v2.16b
; CHECK-BF16-GI-NEXT: ret
%1 = fpext <8 x bfloat> %a to <8 x float>
ret <8 x float> %1
}
define <8 x double> @test_fpext_double(<8 x bfloat> %a) {
; CHECK-CVT-SD-LABEL: test_fpext_double:
; CHECK-CVT-SD: // %bb.0:
; CHECK-CVT-SD-NEXT: shll v1.4s, v0.4h, #16
; CHECK-CVT-SD-NEXT: shll2 v2.4s, v0.8h, #16
; CHECK-CVT-SD-NEXT: fcvtl v0.2d, v1.2s
; CHECK-CVT-SD-NEXT: fcvtl2 v3.2d, v2.4s
; CHECK-CVT-SD-NEXT: fcvtl2 v1.2d, v1.4s
; CHECK-CVT-SD-NEXT: fcvtl v2.2d, v2.2s
; CHECK-CVT-SD-NEXT: ret
;
; CHECK-BF16-SD-LABEL: test_fpext_double:
; CHECK-BF16-SD: // %bb.0:
; CHECK-BF16-SD-NEXT: shll v1.4s, v0.4h, #16
; CHECK-BF16-SD-NEXT: shll2 v2.4s, v0.8h, #16
; CHECK-BF16-SD-NEXT: fcvtl v0.2d, v1.2s
; CHECK-BF16-SD-NEXT: fcvtl2 v3.2d, v2.4s
; CHECK-BF16-SD-NEXT: fcvtl2 v1.2d, v1.4s
; CHECK-BF16-SD-NEXT: fcvtl v2.2d, v2.2s
; CHECK-BF16-SD-NEXT: ret
;
; CHECK-BF16SVE-SD-LABEL: test_fpext_double:
; CHECK-BF16SVE-SD: // %bb.0:
; CHECK-BF16SVE-SD-NEXT: shll v1.4s, v0.4h, #16
; CHECK-BF16SVE-SD-NEXT: shll2 v2.4s, v0.8h, #16
; CHECK-BF16SVE-SD-NEXT: fcvtl v0.2d, v1.2s
; CHECK-BF16SVE-SD-NEXT: fcvtl2 v3.2d, v2.4s
; CHECK-BF16SVE-SD-NEXT: fcvtl2 v1.2d, v1.4s
; CHECK-BF16SVE-SD-NEXT: fcvtl v2.2d, v2.2s
; CHECK-BF16SVE-SD-NEXT: ret
;
; CHECK-CVT-GI-LABEL: test_fpext_double:
; CHECK-CVT-GI: // %bb.0:
; CHECK-CVT-GI-NEXT: shll v1.4s, v0.4h, #16
; CHECK-CVT-GI-NEXT: shll2 v3.4s, v0.8h, #16
; CHECK-CVT-GI-NEXT: fcvtl v0.2d, v1.2s
; CHECK-CVT-GI-NEXT: fcvtl2 v1.2d, v1.4s
; CHECK-CVT-GI-NEXT: fcvtl v2.2d, v3.2s
; CHECK-CVT-GI-NEXT: fcvtl2 v3.2d, v3.4s
; CHECK-CVT-GI-NEXT: ret
;
; CHECK-BF16-GI-LABEL: test_fpext_double:
; CHECK-BF16-GI: // %bb.0:
; CHECK-BF16-GI-NEXT: shll v1.4s, v0.4h, #16
; CHECK-BF16-GI-NEXT: shll2 v3.4s, v0.8h, #16
; CHECK-BF16-GI-NEXT: fcvtl v0.2d, v1.2s
; CHECK-BF16-GI-NEXT: fcvtl2 v1.2d, v1.4s
; CHECK-BF16-GI-NEXT: fcvtl v2.2d, v3.2s
; CHECK-BF16-GI-NEXT: fcvtl2 v3.2d, v3.4s
; CHECK-BF16-GI-NEXT: ret
%1 = fpext <8 x bfloat> %a to <8 x double>
ret <8 x double> %1
}
define <8 x float> @test_fpext_float_fast(<8 x bfloat> %a) {
; CHECK-CVT-SD-LABEL: test_fpext_float_fast:
; CHECK-CVT-SD: // %bb.0:
; CHECK-CVT-SD-NEXT: shll2 v1.4s, v0.8h, #16
; CHECK-CVT-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-CVT-SD-NEXT: ret
;
; CHECK-BF16-SD-LABEL: test_fpext_float_fast:
; CHECK-BF16-SD: // %bb.0:
; CHECK-BF16-SD-NEXT: shll2 v1.4s, v0.8h, #16
; CHECK-BF16-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16-SD-NEXT: ret
;
; CHECK-BF16SVE-SD-LABEL: test_fpext_float_fast:
; CHECK-BF16SVE-SD: // %bb.0:
; CHECK-BF16SVE-SD-NEXT: shll2 v1.4s, v0.8h, #16
; CHECK-BF16SVE-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16SVE-SD-NEXT: ret
;
; CHECK-CVT-GI-LABEL: test_fpext_float_fast:
; CHECK-CVT-GI: // %bb.0:
; CHECK-CVT-GI-NEXT: shll v2.4s, v0.4h, #16
; CHECK-CVT-GI-NEXT: shll2 v1.4s, v0.8h, #16
; CHECK-CVT-GI-NEXT: mov v0.16b, v2.16b
; CHECK-CVT-GI-NEXT: ret
;
; CHECK-BF16-GI-LABEL: test_fpext_float_fast:
; CHECK-BF16-GI: // %bb.0:
; CHECK-BF16-GI-NEXT: shll v2.4s, v0.4h, #16
; CHECK-BF16-GI-NEXT: shll2 v1.4s, v0.8h, #16
; CHECK-BF16-GI-NEXT: mov v0.16b, v2.16b
; CHECK-BF16-GI-NEXT: ret
%1 = fpext fast <8 x bfloat> %a to <8 x float>
ret <8 x float> %1
}
define <8 x double> @test_fpext_double_fast(<8 x bfloat> %a) {
; CHECK-CVT-SD-LABEL: test_fpext_double_fast:
; CHECK-CVT-SD: // %bb.0:
; CHECK-CVT-SD-NEXT: shll v1.4s, v0.4h, #16
; CHECK-CVT-SD-NEXT: shll2 v2.4s, v0.8h, #16
; CHECK-CVT-SD-NEXT: fcvtl v0.2d, v1.2s
; CHECK-CVT-SD-NEXT: fcvtl2 v3.2d, v2.4s
; CHECK-CVT-SD-NEXT: fcvtl2 v1.2d, v1.4s
; CHECK-CVT-SD-NEXT: fcvtl v2.2d, v2.2s
; CHECK-CVT-SD-NEXT: ret
;
; CHECK-BF16-SD-LABEL: test_fpext_double_fast:
; CHECK-BF16-SD: // %bb.0:
; CHECK-BF16-SD-NEXT: shll v1.4s, v0.4h, #16
; CHECK-BF16-SD-NEXT: shll2 v2.4s, v0.8h, #16
; CHECK-BF16-SD-NEXT: fcvtl v0.2d, v1.2s
; CHECK-BF16-SD-NEXT: fcvtl2 v3.2d, v2.4s
; CHECK-BF16-SD-NEXT: fcvtl2 v1.2d, v1.4s
; CHECK-BF16-SD-NEXT: fcvtl v2.2d, v2.2s
; CHECK-BF16-SD-NEXT: ret
;
; CHECK-BF16SVE-SD-LABEL: test_fpext_double_fast:
; CHECK-BF16SVE-SD: // %bb.0:
; CHECK-BF16SVE-SD-NEXT: shll v1.4s, v0.4h, #16
; CHECK-BF16SVE-SD-NEXT: shll2 v2.4s, v0.8h, #16
; CHECK-BF16SVE-SD-NEXT: fcvtl v0.2d, v1.2s
; CHECK-BF16SVE-SD-NEXT: fcvtl2 v3.2d, v2.4s
; CHECK-BF16SVE-SD-NEXT: fcvtl2 v1.2d, v1.4s
; CHECK-BF16SVE-SD-NEXT: fcvtl v2.2d, v2.2s
; CHECK-BF16SVE-SD-NEXT: ret
;
; CHECK-CVT-GI-LABEL: test_fpext_double_fast:
; CHECK-CVT-GI: // %bb.0:
; CHECK-CVT-GI-NEXT: shll v1.4s, v0.4h, #16
; CHECK-CVT-GI-NEXT: shll2 v3.4s, v0.8h, #16
; CHECK-CVT-GI-NEXT: fcvtl v0.2d, v1.2s
; CHECK-CVT-GI-NEXT: fcvtl2 v1.2d, v1.4s
; CHECK-CVT-GI-NEXT: fcvtl v2.2d, v3.2s
; CHECK-CVT-GI-NEXT: fcvtl2 v3.2d, v3.4s
; CHECK-CVT-GI-NEXT: ret
;
; CHECK-BF16-GI-LABEL: test_fpext_double_fast:
; CHECK-BF16-GI: // %bb.0:
; CHECK-BF16-GI-NEXT: shll v1.4s, v0.4h, #16
; CHECK-BF16-GI-NEXT: shll2 v3.4s, v0.8h, #16
; CHECK-BF16-GI-NEXT: fcvtl v0.2d, v1.2s
; CHECK-BF16-GI-NEXT: fcvtl2 v1.2d, v1.4s
; CHECK-BF16-GI-NEXT: fcvtl v2.2d, v3.2s
; CHECK-BF16-GI-NEXT: fcvtl2 v3.2d, v3.4s
; CHECK-BF16-GI-NEXT: ret
%1 = fpext fast <8 x bfloat> %a to <8 x double>
ret <8 x double> %1
}
define <8 x i16> @test_bitcast_bfloattoi16(float, <8 x bfloat> %a) {
; CHECK-LABEL: test_bitcast_bfloattoi16:
; CHECK: // %bb.0:
; CHECK-NEXT: mov v0.16b, v1.16b
; CHECK-NEXT: ret
%2 = bitcast <8 x bfloat> %a to <8 x i16>
ret <8 x i16> %2
}
define <8 x bfloat> @test_bitcast_i16tobfloat(float, <8 x i16> %a) {
; CHECK-LABEL: test_bitcast_i16tobfloat:
; CHECK: // %bb.0:
; CHECK-NEXT: mov v0.16b, v1.16b
; CHECK-NEXT: ret
%2 = bitcast <8 x i16> %a to <8 x bfloat>
ret <8 x bfloat> %2
}
define <8 x half> @test_bitcast_bfloattof16(float, <8 x bfloat> %a) {
; CHECK-LABEL: test_bitcast_bfloattof16:
; CHECK: // %bb.0:
; CHECK-NEXT: mov v0.16b, v1.16b
; CHECK-NEXT: ret
%2 = bitcast <8 x bfloat> %a to <8 x half>
ret <8 x half> %2
}
define <8 x bfloat> @test_bitcast_f16tobfloat(float, <8 x half> %a) {
; CHECK-LABEL: test_bitcast_f16tobfloat:
; CHECK: // %bb.0:
; CHECK-NEXT: mov v0.16b, v1.16b
; CHECK-NEXT: ret
%2 = bitcast <8 x half> %a to <8 x bfloat>
ret <8 x bfloat> %2
}
define <8 x bfloat> @test_sqrt(<8 x bfloat> %a) #0 {
; CHECK-CVT-SD-LABEL: test_sqrt:
; CHECK-CVT-SD: // %bb.0:
; CHECK-CVT-SD-NEXT: mov h1, v0.h[1]
; CHECK-CVT-SD-NEXT: shll v2.4s, v0.4h, #16
; CHECK-CVT-SD-NEXT: mov w8, #32767 // =0x7fff
; CHECK-CVT-SD-NEXT: mov h3, v0.h[2]
; CHECK-CVT-SD-NEXT: mov h4, v0.h[3]
; CHECK-CVT-SD-NEXT: mov h5, v0.h[4]
; CHECK-CVT-SD-NEXT: mov h6, v0.h[5]
; CHECK-CVT-SD-NEXT: mov h7, v0.h[6]
; CHECK-CVT-SD-NEXT: mov h0, v0.h[7]
; CHECK-CVT-SD-NEXT: fsqrt s2, s2
; CHECK-CVT-SD-NEXT: shll v1.4s, v1.4h, #16
; CHECK-CVT-SD-NEXT: shll v3.4s, v3.4h, #16
; CHECK-CVT-SD-NEXT: shll v4.4s, v4.4h, #16
; CHECK-CVT-SD-NEXT: shll v5.4s, v5.4h, #16
; CHECK-CVT-SD-NEXT: shll v6.4s, v6.4h, #16
; CHECK-CVT-SD-NEXT: shll v7.4s, v7.4h, #16
; CHECK-CVT-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-CVT-SD-NEXT: fmov w10, s2
; CHECK-CVT-SD-NEXT: ubfx w12, w10, #16, #1
; CHECK-CVT-SD-NEXT: add w10, w10, w8
; CHECK-CVT-SD-NEXT: add w10, w12, w10
; CHECK-CVT-SD-NEXT: lsr w10, w10, #16
; CHECK-CVT-SD-NEXT: fsqrt s1, s1
; CHECK-CVT-SD-NEXT: fmov w9, s1
; CHECK-CVT-SD-NEXT: ubfx w11, w9, #16, #1
; CHECK-CVT-SD-NEXT: add w9, w9, w8
; CHECK-CVT-SD-NEXT: add w9, w11, w9
; CHECK-CVT-SD-NEXT: lsr w9, w9, #16
; CHECK-CVT-SD-NEXT: fsqrt s3, s3
; CHECK-CVT-SD-NEXT: fmov s2, w9
; CHECK-CVT-SD-NEXT: fmov w11, s3
; CHECK-CVT-SD-NEXT: ubfx w12, w11, #16, #1
; CHECK-CVT-SD-NEXT: add w9, w11, w8
; CHECK-CVT-SD-NEXT: add w9, w12, w9
; CHECK-CVT-SD-NEXT: lsr w9, w9, #16
; CHECK-CVT-SD-NEXT: fsqrt s4, s4
; CHECK-CVT-SD-NEXT: fsqrt s5, s5
; CHECK-CVT-SD-NEXT: fsqrt s6, s6
; CHECK-CVT-SD-NEXT: fsqrt s7, s7
; CHECK-CVT-SD-NEXT: fsqrt s1, s0
; CHECK-CVT-SD-NEXT: fmov s0, w10
; CHECK-CVT-SD-NEXT: fmov w10, s4
; CHECK-CVT-SD-NEXT: mov v0.h[1], v2.h[0]
; CHECK-CVT-SD-NEXT: ubfx w11, w10, #16, #1
; CHECK-CVT-SD-NEXT: fmov s2, w9
; CHECK-CVT-SD-NEXT: add w9, w10, w8
; CHECK-CVT-SD-NEXT: fmov w10, s5
; CHECK-CVT-SD-NEXT: add w9, w11, w9
; CHECK-CVT-SD-NEXT: lsr w9, w9, #16
; CHECK-CVT-SD-NEXT: mov v0.h[2], v2.h[0]
; CHECK-CVT-SD-NEXT: ubfx w11, w10, #16, #1
; CHECK-CVT-SD-NEXT: fmov s2, w9
; CHECK-CVT-SD-NEXT: add w9, w10, w8
; CHECK-CVT-SD-NEXT: fmov w10, s6
; CHECK-CVT-SD-NEXT: add w9, w11, w9
; CHECK-CVT-SD-NEXT: lsr w9, w9, #16
; CHECK-CVT-SD-NEXT: mov v0.h[3], v2.h[0]
; CHECK-CVT-SD-NEXT: ubfx w11, w10, #16, #1
; CHECK-CVT-SD-NEXT: fmov s2, w9
; CHECK-CVT-SD-NEXT: add w9, w10, w8
; CHECK-CVT-SD-NEXT: fmov w10, s7
; CHECK-CVT-SD-NEXT: add w9, w11, w9
; CHECK-CVT-SD-NEXT: lsr w9, w9, #16
; CHECK-CVT-SD-NEXT: mov v0.h[4], v2.h[0]
; CHECK-CVT-SD-NEXT: ubfx w11, w10, #16, #1
; CHECK-CVT-SD-NEXT: fmov s2, w9
; CHECK-CVT-SD-NEXT: add w9, w10, w8
; CHECK-CVT-SD-NEXT: add w9, w11, w9
; CHECK-CVT-SD-NEXT: lsr w9, w9, #16
; CHECK-CVT-SD-NEXT: mov v0.h[5], v2.h[0]
; CHECK-CVT-SD-NEXT: fmov w10, s1
; CHECK-CVT-SD-NEXT: fmov s1, w9
; CHECK-CVT-SD-NEXT: ubfx w11, w10, #16, #1
; CHECK-CVT-SD-NEXT: add w8, w10, w8
; CHECK-CVT-SD-NEXT: mov v0.h[6], v1.h[0]
; CHECK-CVT-SD-NEXT: add w8, w11, w8
; CHECK-CVT-SD-NEXT: lsr w8, w8, #16
; CHECK-CVT-SD-NEXT: fmov s1, w8
; CHECK-CVT-SD-NEXT: mov v0.h[7], v1.h[0]
; CHECK-CVT-SD-NEXT: ret
;
; CHECK-BF16-SD-LABEL: test_sqrt:
; CHECK-BF16-SD: // %bb.0:
; CHECK-BF16-SD-NEXT: mov h1, v0.h[1]
; CHECK-BF16-SD-NEXT: shll v2.4s, v0.4h, #16
; CHECK-BF16-SD-NEXT: mov h3, v0.h[2]
; CHECK-BF16-SD-NEXT: mov h4, v0.h[3]
; CHECK-BF16-SD-NEXT: mov h5, v0.h[4]
; CHECK-BF16-SD-NEXT: mov h6, v0.h[5]
; CHECK-BF16-SD-NEXT: mov h7, v0.h[6]
; CHECK-BF16-SD-NEXT: mov h0, v0.h[7]
; CHECK-BF16-SD-NEXT: fsqrt s2, s2
; CHECK-BF16-SD-NEXT: shll v1.4s, v1.4h, #16
; CHECK-BF16-SD-NEXT: shll v3.4s, v3.4h, #16
; CHECK-BF16-SD-NEXT: shll v4.4s, v4.4h, #16
; CHECK-BF16-SD-NEXT: shll v5.4s, v5.4h, #16
; CHECK-BF16-SD-NEXT: shll v6.4s, v6.4h, #16
; CHECK-BF16-SD-NEXT: shll v7.4s, v7.4h, #16
; CHECK-BF16-SD-NEXT: shll v16.4s, v0.4h, #16
; CHECK-BF16-SD-NEXT: bfcvt h0, s2
; CHECK-BF16-SD-NEXT: fsqrt s1, s1
; CHECK-BF16-SD-NEXT: bfcvt h1, s1
; CHECK-BF16-SD-NEXT: mov v0.h[1], v1.h[0]
; CHECK-BF16-SD-NEXT: fsqrt s3, s3
; CHECK-BF16-SD-NEXT: bfcvt h1, s3
; CHECK-BF16-SD-NEXT: mov v0.h[2], v1.h[0]
; CHECK-BF16-SD-NEXT: fsqrt s4, s4
; CHECK-BF16-SD-NEXT: bfcvt h1, s4
; CHECK-BF16-SD-NEXT: mov v0.h[3], v1.h[0]
; CHECK-BF16-SD-NEXT: fsqrt s5, s5
; CHECK-BF16-SD-NEXT: bfcvt h1, s5
; CHECK-BF16-SD-NEXT: mov v0.h[4], v1.h[0]
; CHECK-BF16-SD-NEXT: fsqrt s6, s6
; CHECK-BF16-SD-NEXT: bfcvt h1, s6
; CHECK-BF16-SD-NEXT: mov v0.h[5], v1.h[0]
; CHECK-BF16-SD-NEXT: fsqrt s7, s7
; CHECK-BF16-SD-NEXT: bfcvt h1, s7
; CHECK-BF16-SD-NEXT: mov v0.h[6], v1.h[0]
; CHECK-BF16-SD-NEXT: fsqrt s2, s16
; CHECK-BF16-SD-NEXT: bfcvt h1, s2
; CHECK-BF16-SD-NEXT: mov v0.h[7], v1.h[0]
; CHECK-BF16-SD-NEXT: ret
;
; CHECK-BF16SVE-SD-LABEL: test_sqrt:
; CHECK-BF16SVE-SD: // %bb.0:
; CHECK-BF16SVE-SD-NEXT: mov h1, v0.h[1]
; CHECK-BF16SVE-SD-NEXT: shll v2.4s, v0.4h, #16
; CHECK-BF16SVE-SD-NEXT: mov h3, v0.h[2]
; CHECK-BF16SVE-SD-NEXT: mov h4, v0.h[3]
; CHECK-BF16SVE-SD-NEXT: mov h5, v0.h[4]
; CHECK-BF16SVE-SD-NEXT: mov h6, v0.h[5]
; CHECK-BF16SVE-SD-NEXT: mov h7, v0.h[6]
; CHECK-BF16SVE-SD-NEXT: mov h0, v0.h[7]
; CHECK-BF16SVE-SD-NEXT: fsqrt s2, s2
; CHECK-BF16SVE-SD-NEXT: shll v1.4s, v1.4h, #16
; CHECK-BF16SVE-SD-NEXT: shll v3.4s, v3.4h, #16
; CHECK-BF16SVE-SD-NEXT: shll v4.4s, v4.4h, #16
; CHECK-BF16SVE-SD-NEXT: shll v5.4s, v5.4h, #16
; CHECK-BF16SVE-SD-NEXT: shll v6.4s, v6.4h, #16
; CHECK-BF16SVE-SD-NEXT: shll v7.4s, v7.4h, #16
; CHECK-BF16SVE-SD-NEXT: shll v16.4s, v0.4h, #16
; CHECK-BF16SVE-SD-NEXT: bfcvt h0, s2
; CHECK-BF16SVE-SD-NEXT: fsqrt s1, s1
; CHECK-BF16SVE-SD-NEXT: bfcvt h1, s1
; CHECK-BF16SVE-SD-NEXT: mov v0.h[1], v1.h[0]
; CHECK-BF16SVE-SD-NEXT: fsqrt s3, s3
; CHECK-BF16SVE-SD-NEXT: bfcvt h1, s3
; CHECK-BF16SVE-SD-NEXT: mov v0.h[2], v1.h[0]
; CHECK-BF16SVE-SD-NEXT: fsqrt s4, s4
; CHECK-BF16SVE-SD-NEXT: bfcvt h1, s4
; CHECK-BF16SVE-SD-NEXT: mov v0.h[3], v1.h[0]
; CHECK-BF16SVE-SD-NEXT: fsqrt s5, s5
; CHECK-BF16SVE-SD-NEXT: bfcvt h1, s5
; CHECK-BF16SVE-SD-NEXT: mov v0.h[4], v1.h[0]
; CHECK-BF16SVE-SD-NEXT: fsqrt s6, s6
; CHECK-BF16SVE-SD-NEXT: bfcvt h1, s6
; CHECK-BF16SVE-SD-NEXT: mov v0.h[5], v1.h[0]
; CHECK-BF16SVE-SD-NEXT: fsqrt s7, s7
; CHECK-BF16SVE-SD-NEXT: bfcvt h1, s7
; CHECK-BF16SVE-SD-NEXT: mov v0.h[6], v1.h[0]
; CHECK-BF16SVE-SD-NEXT: fsqrt s2, s16
; CHECK-BF16SVE-SD-NEXT: bfcvt h1, s2
; CHECK-BF16SVE-SD-NEXT: mov v0.h[7], v1.h[0]
; CHECK-BF16SVE-SD-NEXT: ret
;
; CHECK-CVT-GI-LABEL: test_sqrt:
; CHECK-CVT-GI: // %bb.0:
; CHECK-CVT-GI-NEXT: shll v1.4s, v0.4h, #16
; CHECK-CVT-GI-NEXT: shll2 v0.4s, v0.8h, #16
; CHECK-CVT-GI-NEXT: movi v2.4s, #1
; CHECK-CVT-GI-NEXT: movi v3.4s, #127, msl #8
; CHECK-CVT-GI-NEXT: movi v6.4s, #64, lsl #16
; CHECK-CVT-GI-NEXT: fsqrt v1.4s, v1.4s
; CHECK-CVT-GI-NEXT: fsqrt v0.4s, v0.4s
; CHECK-CVT-GI-NEXT: ushr v4.4s, v1.4s, #16
; CHECK-CVT-GI-NEXT: fcmeq v7.4s, v1.4s, v1.4s
; CHECK-CVT-GI-NEXT: add v16.4s, v1.4s, v3.4s
; CHECK-CVT-GI-NEXT: orr v1.16b, v1.16b, v6.16b
; CHECK-CVT-GI-NEXT: and v4.16b, v4.16b, v2.16b
; CHECK-CVT-GI-NEXT: add v4.4s, v16.4s, v4.4s
; CHECK-CVT-GI-NEXT: ushr v5.4s, v0.4s, #16
; CHECK-CVT-GI-NEXT: fcmeq v17.4s, v0.4s, v0.4s
; CHECK-CVT-GI-NEXT: add v3.4s, v0.4s, v3.4s
; CHECK-CVT-GI-NEXT: orr v0.16b, v0.16b, v6.16b
; CHECK-CVT-GI-NEXT: and v2.16b, v5.16b, v2.16b
; CHECK-CVT-GI-NEXT: mvn v5.16b, v7.16b
; CHECK-CVT-GI-NEXT: mvn v7.16b, v17.16b
; CHECK-CVT-GI-NEXT: add v2.4s, v3.4s, v2.4s
; CHECK-CVT-GI-NEXT: bif v1.16b, v4.16b, v5.16b
; CHECK-CVT-GI-NEXT: bit v2.16b, v0.16b, v7.16b
; CHECK-CVT-GI-NEXT: shrn v0.4h, v1.4s, #16
; CHECK-CVT-GI-NEXT: shrn v1.4h, v2.4s, #16
; CHECK-CVT-GI-NEXT: mov v0.d[1], v1.d[0]
; CHECK-CVT-GI-NEXT: ret
;
; CHECK-BF16-GI-LABEL: test_sqrt:
; CHECK-BF16-GI: // %bb.0:
; CHECK-BF16-GI-NEXT: shll v1.4s, v0.4h, #16
; CHECK-BF16-GI-NEXT: shll2 v0.4s, v0.8h, #16
; CHECK-BF16-GI-NEXT: fsqrt v1.4s, v1.4s
; CHECK-BF16-GI-NEXT: fsqrt v2.4s, v0.4s
; CHECK-BF16-GI-NEXT: bfcvtn v0.4h, v1.4s
; CHECK-BF16-GI-NEXT: bfcvtn2 v0.8h, v2.4s
; CHECK-BF16-GI-NEXT: ret
%r = call <8 x bfloat> @llvm.sqrt.v8bf16(<8 x bfloat> %a)
ret <8 x bfloat> %r
}
define <8 x bfloat> @test_powi(<8 x bfloat> %a, i32 %b) #0 {
; CHECK-CVT-SD-LABEL: test_powi:
; CHECK-CVT-SD: // %bb.0:
; CHECK-CVT-SD-NEXT: sub sp, sp, #64
; CHECK-CVT-SD-NEXT: mov h1, v0.h[1]
; CHECK-CVT-SD-NEXT: str q0, [sp] // 16-byte Spill
; CHECK-CVT-SD-NEXT: str x30, [sp, #32] // 8-byte Spill
; CHECK-CVT-SD-NEXT: stp x20, x19, [sp, #48] // 16-byte Folded Spill
; CHECK-CVT-SD-NEXT: mov w19, w0
; CHECK-CVT-SD-NEXT: shll v0.4s, v1.4h, #16
; CHECK-CVT-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-CVT-SD-NEXT: bl __powisf2
; CHECK-CVT-SD-NEXT: fmov w8, s0
; CHECK-CVT-SD-NEXT: mov w20, #32767 // =0x7fff
; CHECK-CVT-SD-NEXT: mov w0, w19
; CHECK-CVT-SD-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-SD-NEXT: add w8, w8, w20
; CHECK-CVT-SD-NEXT: add w8, w9, w8
; CHECK-CVT-SD-NEXT: lsr w8, w8, #16
; CHECK-CVT-SD-NEXT: fmov s0, w8
; CHECK-CVT-SD-NEXT: str q0, [sp, #16] // 16-byte Spill
; CHECK-CVT-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-CVT-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-CVT-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-CVT-SD-NEXT: bl __powisf2
; CHECK-CVT-SD-NEXT: fmov w8, s0
; CHECK-CVT-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload
; CHECK-CVT-SD-NEXT: mov w0, w19
; CHECK-CVT-SD-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-SD-NEXT: add w8, w8, w20
; CHECK-CVT-SD-NEXT: add w8, w9, w8
; CHECK-CVT-SD-NEXT: lsr w8, w8, #16
; CHECK-CVT-SD-NEXT: fmov s0, w8
; CHECK-CVT-SD-NEXT: mov v0.h[1], v1.h[0]
; CHECK-CVT-SD-NEXT: str q0, [sp, #16] // 16-byte Spill
; CHECK-CVT-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-CVT-SD-NEXT: mov h0, v0.h[2]
; CHECK-CVT-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-CVT-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-CVT-SD-NEXT: bl __powisf2
; CHECK-CVT-SD-NEXT: fmov w8, s0
; CHECK-CVT-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload
; CHECK-CVT-SD-NEXT: mov w0, w19
; CHECK-CVT-SD-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-SD-NEXT: add w8, w8, w20
; CHECK-CVT-SD-NEXT: add w8, w9, w8
; CHECK-CVT-SD-NEXT: lsr w8, w8, #16
; CHECK-CVT-SD-NEXT: fmov s0, w8
; CHECK-CVT-SD-NEXT: mov v1.h[2], v0.h[0]
; CHECK-CVT-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-CVT-SD-NEXT: mov h0, v0.h[3]
; CHECK-CVT-SD-NEXT: str q1, [sp, #16] // 16-byte Spill
; CHECK-CVT-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-CVT-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-CVT-SD-NEXT: bl __powisf2
; CHECK-CVT-SD-NEXT: fmov w8, s0
; CHECK-CVT-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload
; CHECK-CVT-SD-NEXT: mov w0, w19
; CHECK-CVT-SD-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-SD-NEXT: add w8, w8, w20
; CHECK-CVT-SD-NEXT: add w8, w9, w8
; CHECK-CVT-SD-NEXT: lsr w8, w8, #16
; CHECK-CVT-SD-NEXT: fmov s0, w8
; CHECK-CVT-SD-NEXT: mov v1.h[3], v0.h[0]
; CHECK-CVT-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-CVT-SD-NEXT: mov h0, v0.h[4]
; CHECK-CVT-SD-NEXT: str q1, [sp, #16] // 16-byte Spill
; CHECK-CVT-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-CVT-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-CVT-SD-NEXT: bl __powisf2
; CHECK-CVT-SD-NEXT: fmov w8, s0
; CHECK-CVT-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload
; CHECK-CVT-SD-NEXT: mov w0, w19
; CHECK-CVT-SD-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-SD-NEXT: add w8, w8, w20
; CHECK-CVT-SD-NEXT: add w8, w9, w8
; CHECK-CVT-SD-NEXT: lsr w8, w8, #16
; CHECK-CVT-SD-NEXT: fmov s0, w8
; CHECK-CVT-SD-NEXT: mov v1.h[4], v0.h[0]
; CHECK-CVT-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-CVT-SD-NEXT: mov h0, v0.h[5]
; CHECK-CVT-SD-NEXT: str q1, [sp, #16] // 16-byte Spill
; CHECK-CVT-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-CVT-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-CVT-SD-NEXT: bl __powisf2
; CHECK-CVT-SD-NEXT: fmov w8, s0
; CHECK-CVT-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload
; CHECK-CVT-SD-NEXT: mov w0, w19
; CHECK-CVT-SD-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-SD-NEXT: add w8, w8, w20
; CHECK-CVT-SD-NEXT: add w8, w9, w8
; CHECK-CVT-SD-NEXT: lsr w8, w8, #16
; CHECK-CVT-SD-NEXT: fmov s0, w8
; CHECK-CVT-SD-NEXT: mov v1.h[5], v0.h[0]
; CHECK-CVT-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-CVT-SD-NEXT: mov h0, v0.h[6]
; CHECK-CVT-SD-NEXT: str q1, [sp, #16] // 16-byte Spill
; CHECK-CVT-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-CVT-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-CVT-SD-NEXT: bl __powisf2
; CHECK-CVT-SD-NEXT: fmov w8, s0
; CHECK-CVT-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload
; CHECK-CVT-SD-NEXT: mov w0, w19
; CHECK-CVT-SD-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-SD-NEXT: add w8, w8, w20
; CHECK-CVT-SD-NEXT: add w8, w9, w8
; CHECK-CVT-SD-NEXT: lsr w8, w8, #16
; CHECK-CVT-SD-NEXT: fmov s0, w8
; CHECK-CVT-SD-NEXT: mov v1.h[6], v0.h[0]
; CHECK-CVT-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-CVT-SD-NEXT: mov h0, v0.h[7]
; CHECK-CVT-SD-NEXT: str q1, [sp, #16] // 16-byte Spill
; CHECK-CVT-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-CVT-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-CVT-SD-NEXT: bl __powisf2
; CHECK-CVT-SD-NEXT: fmov w8, s0
; CHECK-CVT-SD-NEXT: ldr q0, [sp, #16] // 16-byte Reload
; CHECK-CVT-SD-NEXT: ldr x30, [sp, #32] // 8-byte Reload
; CHECK-CVT-SD-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-SD-NEXT: add w8, w8, w20
; CHECK-CVT-SD-NEXT: ldp x20, x19, [sp, #48] // 16-byte Folded Reload
; CHECK-CVT-SD-NEXT: add w8, w9, w8
; CHECK-CVT-SD-NEXT: lsr w8, w8, #16
; CHECK-CVT-SD-NEXT: fmov s1, w8
; CHECK-CVT-SD-NEXT: mov v0.h[7], v1.h[0]
; CHECK-CVT-SD-NEXT: add sp, sp, #64
; CHECK-CVT-SD-NEXT: ret
;
; CHECK-BF16-SD-LABEL: test_powi:
; CHECK-BF16-SD: // %bb.0:
; CHECK-BF16-SD-NEXT: sub sp, sp, #48
; CHECK-BF16-SD-NEXT: mov h1, v0.h[1]
; CHECK-BF16-SD-NEXT: str q0, [sp] // 16-byte Spill
; CHECK-BF16-SD-NEXT: stp x30, x19, [sp, #32] // 16-byte Folded Spill
; CHECK-BF16-SD-NEXT: mov w19, w0
; CHECK-BF16-SD-NEXT: shll v0.4s, v1.4h, #16
; CHECK-BF16-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16-SD-NEXT: bl __powisf2
; CHECK-BF16-SD-NEXT: bfcvt h0, s0
; CHECK-BF16-SD-NEXT: mov w0, w19
; CHECK-BF16-SD-NEXT: str q0, [sp, #16] // 16-byte Spill
; CHECK-BF16-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-BF16-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16-SD-NEXT: bl __powisf2
; CHECK-BF16-SD-NEXT: bfcvt h0, s0
; CHECK-BF16-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload
; CHECK-BF16-SD-NEXT: mov w0, w19
; CHECK-BF16-SD-NEXT: mov v0.h[1], v1.h[0]
; CHECK-BF16-SD-NEXT: str q0, [sp, #16] // 16-byte Spill
; CHECK-BF16-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-BF16-SD-NEXT: mov h0, v0.h[2]
; CHECK-BF16-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16-SD-NEXT: bl __powisf2
; CHECK-BF16-SD-NEXT: bfcvt h0, s0
; CHECK-BF16-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload
; CHECK-BF16-SD-NEXT: mov w0, w19
; CHECK-BF16-SD-NEXT: mov v1.h[2], v0.h[0]
; CHECK-BF16-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-BF16-SD-NEXT: mov h0, v0.h[3]
; CHECK-BF16-SD-NEXT: str q1, [sp, #16] // 16-byte Spill
; CHECK-BF16-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16-SD-NEXT: bl __powisf2
; CHECK-BF16-SD-NEXT: bfcvt h0, s0
; CHECK-BF16-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload
; CHECK-BF16-SD-NEXT: mov w0, w19
; CHECK-BF16-SD-NEXT: mov v1.h[3], v0.h[0]
; CHECK-BF16-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-BF16-SD-NEXT: mov h0, v0.h[4]
; CHECK-BF16-SD-NEXT: str q1, [sp, #16] // 16-byte Spill
; CHECK-BF16-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16-SD-NEXT: bl __powisf2
; CHECK-BF16-SD-NEXT: bfcvt h0, s0
; CHECK-BF16-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload
; CHECK-BF16-SD-NEXT: mov w0, w19
; CHECK-BF16-SD-NEXT: mov v1.h[4], v0.h[0]
; CHECK-BF16-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-BF16-SD-NEXT: mov h0, v0.h[5]
; CHECK-BF16-SD-NEXT: str q1, [sp, #16] // 16-byte Spill
; CHECK-BF16-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16-SD-NEXT: bl __powisf2
; CHECK-BF16-SD-NEXT: bfcvt h0, s0
; CHECK-BF16-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload
; CHECK-BF16-SD-NEXT: mov w0, w19
; CHECK-BF16-SD-NEXT: mov v1.h[5], v0.h[0]
; CHECK-BF16-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-BF16-SD-NEXT: mov h0, v0.h[6]
; CHECK-BF16-SD-NEXT: str q1, [sp, #16] // 16-byte Spill
; CHECK-BF16-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16-SD-NEXT: bl __powisf2
; CHECK-BF16-SD-NEXT: bfcvt h0, s0
; CHECK-BF16-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload
; CHECK-BF16-SD-NEXT: mov w0, w19
; CHECK-BF16-SD-NEXT: mov v1.h[6], v0.h[0]
; CHECK-BF16-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-BF16-SD-NEXT: mov h0, v0.h[7]
; CHECK-BF16-SD-NEXT: str q1, [sp, #16] // 16-byte Spill
; CHECK-BF16-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16-SD-NEXT: bl __powisf2
; CHECK-BF16-SD-NEXT: bfcvt h1, s0
; CHECK-BF16-SD-NEXT: ldr q0, [sp, #16] // 16-byte Reload
; CHECK-BF16-SD-NEXT: ldp x30, x19, [sp, #32] // 16-byte Folded Reload
; CHECK-BF16-SD-NEXT: mov v0.h[7], v1.h[0]
; CHECK-BF16-SD-NEXT: add sp, sp, #48
; CHECK-BF16-SD-NEXT: ret
;
; CHECK-BF16SVE-SD-LABEL: test_powi:
; CHECK-BF16SVE-SD: // %bb.0:
; CHECK-BF16SVE-SD-NEXT: sub sp, sp, #48
; CHECK-BF16SVE-SD-NEXT: mov h1, v0.h[1]
; CHECK-BF16SVE-SD-NEXT: str q0, [sp] // 16-byte Spill
; CHECK-BF16SVE-SD-NEXT: stp x30, x19, [sp, #32] // 16-byte Folded Spill
; CHECK-BF16SVE-SD-NEXT: mov w19, w0
; CHECK-BF16SVE-SD-NEXT: shll v0.4s, v1.4h, #16
; CHECK-BF16SVE-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16SVE-SD-NEXT: bl __powisf2
; CHECK-BF16SVE-SD-NEXT: bfcvt h0, s0
; CHECK-BF16SVE-SD-NEXT: mov w0, w19
; CHECK-BF16SVE-SD-NEXT: str q0, [sp, #16] // 16-byte Spill
; CHECK-BF16SVE-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-BF16SVE-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16SVE-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16SVE-SD-NEXT: bl __powisf2
; CHECK-BF16SVE-SD-NEXT: bfcvt h0, s0
; CHECK-BF16SVE-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload
; CHECK-BF16SVE-SD-NEXT: mov w0, w19
; CHECK-BF16SVE-SD-NEXT: mov v0.h[1], v1.h[0]
; CHECK-BF16SVE-SD-NEXT: str q0, [sp, #16] // 16-byte Spill
; CHECK-BF16SVE-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-BF16SVE-SD-NEXT: mov h0, v0.h[2]
; CHECK-BF16SVE-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16SVE-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16SVE-SD-NEXT: bl __powisf2
; CHECK-BF16SVE-SD-NEXT: bfcvt h0, s0
; CHECK-BF16SVE-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload
; CHECK-BF16SVE-SD-NEXT: mov w0, w19
; CHECK-BF16SVE-SD-NEXT: mov v1.h[2], v0.h[0]
; CHECK-BF16SVE-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-BF16SVE-SD-NEXT: mov h0, v0.h[3]
; CHECK-BF16SVE-SD-NEXT: str q1, [sp, #16] // 16-byte Spill
; CHECK-BF16SVE-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16SVE-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16SVE-SD-NEXT: bl __powisf2
; CHECK-BF16SVE-SD-NEXT: bfcvt h0, s0
; CHECK-BF16SVE-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload
; CHECK-BF16SVE-SD-NEXT: mov w0, w19
; CHECK-BF16SVE-SD-NEXT: mov v1.h[3], v0.h[0]
; CHECK-BF16SVE-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-BF16SVE-SD-NEXT: mov h0, v0.h[4]
; CHECK-BF16SVE-SD-NEXT: str q1, [sp, #16] // 16-byte Spill
; CHECK-BF16SVE-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16SVE-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16SVE-SD-NEXT: bl __powisf2
; CHECK-BF16SVE-SD-NEXT: bfcvt h0, s0
; CHECK-BF16SVE-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload
; CHECK-BF16SVE-SD-NEXT: mov w0, w19
; CHECK-BF16SVE-SD-NEXT: mov v1.h[4], v0.h[0]
; CHECK-BF16SVE-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-BF16SVE-SD-NEXT: mov h0, v0.h[5]
; CHECK-BF16SVE-SD-NEXT: str q1, [sp, #16] // 16-byte Spill
; CHECK-BF16SVE-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16SVE-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16SVE-SD-NEXT: bl __powisf2
; CHECK-BF16SVE-SD-NEXT: bfcvt h0, s0
; CHECK-BF16SVE-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload
; CHECK-BF16SVE-SD-NEXT: mov w0, w19
; CHECK-BF16SVE-SD-NEXT: mov v1.h[5], v0.h[0]
; CHECK-BF16SVE-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-BF16SVE-SD-NEXT: mov h0, v0.h[6]
; CHECK-BF16SVE-SD-NEXT: str q1, [sp, #16] // 16-byte Spill
; CHECK-BF16SVE-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16SVE-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16SVE-SD-NEXT: bl __powisf2
; CHECK-BF16SVE-SD-NEXT: bfcvt h0, s0
; CHECK-BF16SVE-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload
; CHECK-BF16SVE-SD-NEXT: mov w0, w19
; CHECK-BF16SVE-SD-NEXT: mov v1.h[6], v0.h[0]
; CHECK-BF16SVE-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-BF16SVE-SD-NEXT: mov h0, v0.h[7]
; CHECK-BF16SVE-SD-NEXT: str q1, [sp, #16] // 16-byte Spill
; CHECK-BF16SVE-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16SVE-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16SVE-SD-NEXT: bl __powisf2
; CHECK-BF16SVE-SD-NEXT: bfcvt h1, s0
; CHECK-BF16SVE-SD-NEXT: ldr q0, [sp, #16] // 16-byte Reload
; CHECK-BF16SVE-SD-NEXT: ldp x30, x19, [sp, #32] // 16-byte Folded Reload
; CHECK-BF16SVE-SD-NEXT: mov v0.h[7], v1.h[0]
; CHECK-BF16SVE-SD-NEXT: add sp, sp, #48
; CHECK-BF16SVE-SD-NEXT: ret
;
; CHECK-CVT-GI-LABEL: test_powi:
; CHECK-CVT-GI: // %bb.0:
; CHECK-CVT-GI-NEXT: str d14, [sp, #-144]! // 8-byte Folded Spill
; CHECK-CVT-GI-NEXT: stp d13, d12, [sp, #16] // 16-byte Folded Spill
; CHECK-CVT-GI-NEXT: mov h12, v0.h[1]
; CHECK-CVT-GI-NEXT: mov h13, v0.h[2]
; CHECK-CVT-GI-NEXT: stp d11, d10, [sp, #32] // 16-byte Folded Spill
; CHECK-CVT-GI-NEXT: mov h14, v0.h[3]
; CHECK-CVT-GI-NEXT: mov h11, v0.h[4]
; CHECK-CVT-GI-NEXT: stp d9, d8, [sp, #48] // 16-byte Folded Spill
; CHECK-CVT-GI-NEXT: mov h10, v0.h[5]
; CHECK-CVT-GI-NEXT: mov h9, v0.h[6]
; CHECK-CVT-GI-NEXT: mov h8, v0.h[7]
; CHECK-CVT-GI-NEXT: shll v0.4s, v0.4h, #16
; CHECK-CVT-GI-NEXT: stp x30, x27, [sp, #64] // 16-byte Folded Spill
; CHECK-CVT-GI-NEXT: stp x26, x25, [sp, #80] // 16-byte Folded Spill
; CHECK-CVT-GI-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-CVT-GI-NEXT: stp x24, x23, [sp, #96] // 16-byte Folded Spill
; CHECK-CVT-GI-NEXT: stp x22, x21, [sp, #112] // 16-byte Folded Spill
; CHECK-CVT-GI-NEXT: stp x20, x19, [sp, #128] // 16-byte Folded Spill
; CHECK-CVT-GI-NEXT: mov w19, w0
; CHECK-CVT-GI-NEXT: bl __powisf2
; CHECK-CVT-GI-NEXT: fmov w8, s0
; CHECK-CVT-GI-NEXT: mov w20, #32767 // =0x7fff
; CHECK-CVT-GI-NEXT: fcmp s0, #0.0
; CHECK-CVT-GI-NEXT: shll v0.4s, v12.4h, #16
; CHECK-CVT-GI-NEXT: mov w0, w19
; CHECK-CVT-GI-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-CVT-GI-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-GI-NEXT: add w10, w8, w20
; CHECK-CVT-GI-NEXT: orr w8, w8, #0x400000
; CHECK-CVT-GI-NEXT: add w9, w10, w9
; CHECK-CVT-GI-NEXT: csel w8, w8, w9, vs
; CHECK-CVT-GI-NEXT: lsr w21, w8, #16
; CHECK-CVT-GI-NEXT: bl __powisf2
; CHECK-CVT-GI-NEXT: shll v1.4s, v13.4h, #16
; CHECK-CVT-GI-NEXT: fmov w8, s0
; CHECK-CVT-GI-NEXT: mov w0, w19
; CHECK-CVT-GI-NEXT: fcmp s0, #0.0
; CHECK-CVT-GI-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-GI-NEXT: fmov s0, s1
; CHECK-CVT-GI-NEXT: add w10, w8, w20
; CHECK-CVT-GI-NEXT: orr w8, w8, #0x400000
; CHECK-CVT-GI-NEXT: add w9, w10, w9
; CHECK-CVT-GI-NEXT: csel w8, w8, w9, vs
; CHECK-CVT-GI-NEXT: lsr w22, w8, #16
; CHECK-CVT-GI-NEXT: bl __powisf2
; CHECK-CVT-GI-NEXT: shll v1.4s, v14.4h, #16
; CHECK-CVT-GI-NEXT: fmov w8, s0
; CHECK-CVT-GI-NEXT: mov w0, w19
; CHECK-CVT-GI-NEXT: fcmp s0, #0.0
; CHECK-CVT-GI-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-GI-NEXT: fmov s0, s1
; CHECK-CVT-GI-NEXT: add w10, w8, w20
; CHECK-CVT-GI-NEXT: orr w8, w8, #0x400000
; CHECK-CVT-GI-NEXT: add w9, w10, w9
; CHECK-CVT-GI-NEXT: csel w8, w8, w9, vs
; CHECK-CVT-GI-NEXT: lsr w23, w8, #16
; CHECK-CVT-GI-NEXT: bl __powisf2
; CHECK-CVT-GI-NEXT: shll v1.4s, v11.4h, #16
; CHECK-CVT-GI-NEXT: fmov w8, s0
; CHECK-CVT-GI-NEXT: mov w0, w19
; CHECK-CVT-GI-NEXT: fcmp s0, #0.0
; CHECK-CVT-GI-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-GI-NEXT: fmov s0, s1
; CHECK-CVT-GI-NEXT: add w10, w8, w20
; CHECK-CVT-GI-NEXT: orr w8, w8, #0x400000
; CHECK-CVT-GI-NEXT: add w9, w10, w9
; CHECK-CVT-GI-NEXT: csel w8, w8, w9, vs
; CHECK-CVT-GI-NEXT: lsr w24, w8, #16
; CHECK-CVT-GI-NEXT: bl __powisf2
; CHECK-CVT-GI-NEXT: shll v1.4s, v10.4h, #16
; CHECK-CVT-GI-NEXT: fmov w8, s0
; CHECK-CVT-GI-NEXT: mov w0, w19
; CHECK-CVT-GI-NEXT: fcmp s0, #0.0
; CHECK-CVT-GI-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-GI-NEXT: fmov s0, s1
; CHECK-CVT-GI-NEXT: add w10, w8, w20
; CHECK-CVT-GI-NEXT: orr w8, w8, #0x400000
; CHECK-CVT-GI-NEXT: add w9, w10, w9
; CHECK-CVT-GI-NEXT: csel w8, w8, w9, vs
; CHECK-CVT-GI-NEXT: lsr w25, w8, #16
; CHECK-CVT-GI-NEXT: bl __powisf2
; CHECK-CVT-GI-NEXT: shll v1.4s, v9.4h, #16
; CHECK-CVT-GI-NEXT: fmov w8, s0
; CHECK-CVT-GI-NEXT: mov w0, w19
; CHECK-CVT-GI-NEXT: fcmp s0, #0.0
; CHECK-CVT-GI-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-GI-NEXT: fmov s0, s1
; CHECK-CVT-GI-NEXT: add w10, w8, w20
; CHECK-CVT-GI-NEXT: orr w8, w8, #0x400000
; CHECK-CVT-GI-NEXT: add w9, w10, w9
; CHECK-CVT-GI-NEXT: csel w8, w8, w9, vs
; CHECK-CVT-GI-NEXT: lsr w26, w8, #16
; CHECK-CVT-GI-NEXT: bl __powisf2
; CHECK-CVT-GI-NEXT: shll v1.4s, v8.4h, #16
; CHECK-CVT-GI-NEXT: fmov w8, s0
; CHECK-CVT-GI-NEXT: mov w0, w19
; CHECK-CVT-GI-NEXT: fcmp s0, #0.0
; CHECK-CVT-GI-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-GI-NEXT: fmov s0, s1
; CHECK-CVT-GI-NEXT: add w10, w8, w20
; CHECK-CVT-GI-NEXT: orr w8, w8, #0x400000
; CHECK-CVT-GI-NEXT: add w9, w10, w9
; CHECK-CVT-GI-NEXT: csel w8, w8, w9, vs
; CHECK-CVT-GI-NEXT: lsr w27, w8, #16
; CHECK-CVT-GI-NEXT: bl __powisf2
; CHECK-CVT-GI-NEXT: fmov s1, w21
; CHECK-CVT-GI-NEXT: fmov w8, s0
; CHECK-CVT-GI-NEXT: fcmp s0, #0.0
; CHECK-CVT-GI-NEXT: ldp d9, d8, [sp, #48] // 16-byte Folded Reload
; CHECK-CVT-GI-NEXT: ldp d11, d10, [sp, #32] // 16-byte Folded Reload
; CHECK-CVT-GI-NEXT: mov v1.h[1], w22
; CHECK-CVT-GI-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-GI-NEXT: add w10, w8, w20
; CHECK-CVT-GI-NEXT: orr w8, w8, #0x400000
; CHECK-CVT-GI-NEXT: ldp x20, x19, [sp, #128] // 16-byte Folded Reload
; CHECK-CVT-GI-NEXT: add w9, w10, w9
; CHECK-CVT-GI-NEXT: ldp x22, x21, [sp, #112] // 16-byte Folded Reload
; CHECK-CVT-GI-NEXT: csel w8, w8, w9, vs
; CHECK-CVT-GI-NEXT: ldp d13, d12, [sp, #16] // 16-byte Folded Reload
; CHECK-CVT-GI-NEXT: mov v1.h[2], w23
; CHECK-CVT-GI-NEXT: lsr w8, w8, #16
; CHECK-CVT-GI-NEXT: mov v1.h[3], w24
; CHECK-CVT-GI-NEXT: ldp x24, x23, [sp, #96] // 16-byte Folded Reload
; CHECK-CVT-GI-NEXT: mov v1.h[4], w25
; CHECK-CVT-GI-NEXT: mov v1.h[5], w26
; CHECK-CVT-GI-NEXT: ldp x26, x25, [sp, #80] // 16-byte Folded Reload
; CHECK-CVT-GI-NEXT: mov v1.h[6], w27
; CHECK-CVT-GI-NEXT: ldp x30, x27, [sp, #64] // 16-byte Folded Reload
; CHECK-CVT-GI-NEXT: mov v1.h[7], w8
; CHECK-CVT-GI-NEXT: mov v0.16b, v1.16b
; CHECK-CVT-GI-NEXT: ldr d14, [sp], #144 // 8-byte Folded Reload
; CHECK-CVT-GI-NEXT: ret
;
; CHECK-BF16-GI-LABEL: test_powi:
; CHECK-BF16-GI: // %bb.0:
; CHECK-BF16-GI-NEXT: sub sp, sp, #192
; CHECK-BF16-GI-NEXT: str d14, [sp, #112] // 8-byte Spill
; CHECK-BF16-GI-NEXT: mov h14, v0.h[6]
; CHECK-BF16-GI-NEXT: stp d13, d12, [sp, #128] // 16-byte Folded Spill
; CHECK-BF16-GI-NEXT: mov h12, v0.h[4]
; CHECK-BF16-GI-NEXT: mov h13, v0.h[5]
; CHECK-BF16-GI-NEXT: stp d11, d10, [sp, #144] // 16-byte Folded Spill
; CHECK-BF16-GI-NEXT: mov h10, v0.h[2]
; CHECK-BF16-GI-NEXT: mov h11, v0.h[3]
; CHECK-BF16-GI-NEXT: stp d9, d8, [sp, #160] // 16-byte Folded Spill
; CHECK-BF16-GI-NEXT: mov h9, v0.h[1]
; CHECK-BF16-GI-NEXT: mov h8, v0.h[7]
; CHECK-BF16-GI-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16-GI-NEXT: stp x30, x19, [sp, #176] // 16-byte Folded Spill
; CHECK-BF16-GI-NEXT: mov w19, w0
; CHECK-BF16-GI-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16-GI-NEXT: bl __powisf2
; CHECK-BF16-GI-NEXT: bfcvt h0, s0
; CHECK-BF16-GI-NEXT: mov w0, w19
; CHECK-BF16-GI-NEXT: str q0, [sp, #96] // 16-byte Spill
; CHECK-BF16-GI-NEXT: shll v0.4s, v9.4h, #16
; CHECK-BF16-GI-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16-GI-NEXT: bl __powisf2
; CHECK-BF16-GI-NEXT: bfcvt h0, s0
; CHECK-BF16-GI-NEXT: mov w0, w19
; CHECK-BF16-GI-NEXT: str q0, [sp, #80] // 16-byte Spill
; CHECK-BF16-GI-NEXT: shll v0.4s, v10.4h, #16
; CHECK-BF16-GI-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16-GI-NEXT: bl __powisf2
; CHECK-BF16-GI-NEXT: bfcvt h0, s0
; CHECK-BF16-GI-NEXT: mov w0, w19
; CHECK-BF16-GI-NEXT: str q0, [sp, #64] // 16-byte Spill
; CHECK-BF16-GI-NEXT: shll v0.4s, v11.4h, #16
; CHECK-BF16-GI-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16-GI-NEXT: bl __powisf2
; CHECK-BF16-GI-NEXT: bfcvt h0, s0
; CHECK-BF16-GI-NEXT: mov w0, w19
; CHECK-BF16-GI-NEXT: str q0, [sp, #48] // 16-byte Spill
; CHECK-BF16-GI-NEXT: shll v0.4s, v12.4h, #16
; CHECK-BF16-GI-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16-GI-NEXT: bl __powisf2
; CHECK-BF16-GI-NEXT: bfcvt h0, s0
; CHECK-BF16-GI-NEXT: mov w0, w19
; CHECK-BF16-GI-NEXT: str q0, [sp, #32] // 16-byte Spill
; CHECK-BF16-GI-NEXT: shll v0.4s, v13.4h, #16
; CHECK-BF16-GI-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16-GI-NEXT: bl __powisf2
; CHECK-BF16-GI-NEXT: bfcvt h0, s0
; CHECK-BF16-GI-NEXT: mov w0, w19
; CHECK-BF16-GI-NEXT: str q0, [sp, #16] // 16-byte Spill
; CHECK-BF16-GI-NEXT: shll v0.4s, v14.4h, #16
; CHECK-BF16-GI-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16-GI-NEXT: bl __powisf2
; CHECK-BF16-GI-NEXT: bfcvt h0, s0
; CHECK-BF16-GI-NEXT: mov w0, w19
; CHECK-BF16-GI-NEXT: str q0, [sp] // 16-byte Spill
; CHECK-BF16-GI-NEXT: shll v0.4s, v8.4h, #16
; CHECK-BF16-GI-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16-GI-NEXT: bl __powisf2
; CHECK-BF16-GI-NEXT: ldp q2, q1, [sp, #80] // 32-byte Folded Reload
; CHECK-BF16-GI-NEXT: bfcvt h0, s0
; CHECK-BF16-GI-NEXT: ldp x30, x19, [sp, #176] // 16-byte Folded Reload
; CHECK-BF16-GI-NEXT: ldr d14, [sp, #112] // 8-byte Reload
; CHECK-BF16-GI-NEXT: ldp d9, d8, [sp, #160] // 16-byte Folded Reload
; CHECK-BF16-GI-NEXT: mov v1.h[1], v2.h[0]
; CHECK-BF16-GI-NEXT: ldp q2, q3, [sp, #48] // 32-byte Folded Reload
; CHECK-BF16-GI-NEXT: ldp d11, d10, [sp, #144] // 16-byte Folded Reload
; CHECK-BF16-GI-NEXT: ldp d13, d12, [sp, #128] // 16-byte Folded Reload
; CHECK-BF16-GI-NEXT: mov v1.h[2], v3.h[0]
; CHECK-BF16-GI-NEXT: mov v1.h[3], v2.h[0]
; CHECK-BF16-GI-NEXT: ldp q2, q3, [sp, #16] // 32-byte Folded Reload
; CHECK-BF16-GI-NEXT: mov v1.h[4], v3.h[0]
; CHECK-BF16-GI-NEXT: mov v1.h[5], v2.h[0]
; CHECK-BF16-GI-NEXT: ldr q2, [sp] // 16-byte Reload
; CHECK-BF16-GI-NEXT: mov v1.h[6], v2.h[0]
; CHECK-BF16-GI-NEXT: mov v1.h[7], v0.h[0]
; CHECK-BF16-GI-NEXT: mov v0.16b, v1.16b
; CHECK-BF16-GI-NEXT: add sp, sp, #192
; CHECK-BF16-GI-NEXT: ret
%r = call <8 x bfloat> @llvm.powi.v8bf16.v8i32(<8 x bfloat> %a, i32 %b)
ret <8 x bfloat> %r
}
define <8 x bfloat> @test_sin(<8 x bfloat> %a) #0 {
; CHECK-CVT-SD-LABEL: test_sin:
; CHECK-CVT-SD: // %bb.0:
; CHECK-CVT-SD-NEXT: sub sp, sp, #48
; CHECK-CVT-SD-NEXT: mov h1, v0.h[1]
; CHECK-CVT-SD-NEXT: str q0, [sp] // 16-byte Spill
; CHECK-CVT-SD-NEXT: stp x30, x19, [sp, #32] // 16-byte Folded Spill
; CHECK-CVT-SD-NEXT: shll v0.4s, v1.4h, #16
; CHECK-CVT-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-CVT-SD-NEXT: bl sinf
; CHECK-CVT-SD-NEXT: fmov w8, s0
; CHECK-CVT-SD-NEXT: mov w19, #32767 // =0x7fff
; CHECK-CVT-SD-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-SD-NEXT: add w8, w8, w19
; CHECK-CVT-SD-NEXT: add w8, w9, w8
; CHECK-CVT-SD-NEXT: lsr w8, w8, #16
; CHECK-CVT-SD-NEXT: fmov s0, w8
; CHECK-CVT-SD-NEXT: str q0, [sp, #16] // 16-byte Spill
; CHECK-CVT-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-CVT-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-CVT-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-CVT-SD-NEXT: bl sinf
; CHECK-CVT-SD-NEXT: fmov w8, s0
; CHECK-CVT-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload
; CHECK-CVT-SD-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-SD-NEXT: add w8, w8, w19
; CHECK-CVT-SD-NEXT: add w8, w9, w8
; CHECK-CVT-SD-NEXT: lsr w8, w8, #16
; CHECK-CVT-SD-NEXT: fmov s0, w8
; CHECK-CVT-SD-NEXT: mov v0.h[1], v1.h[0]
; CHECK-CVT-SD-NEXT: str q0, [sp, #16] // 16-byte Spill
; CHECK-CVT-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-CVT-SD-NEXT: mov h0, v0.h[2]
; CHECK-CVT-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-CVT-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-CVT-SD-NEXT: bl sinf
; CHECK-CVT-SD-NEXT: fmov w8, s0
; CHECK-CVT-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload
; CHECK-CVT-SD-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-SD-NEXT: add w8, w8, w19
; CHECK-CVT-SD-NEXT: add w8, w9, w8
; CHECK-CVT-SD-NEXT: lsr w8, w8, #16
; CHECK-CVT-SD-NEXT: fmov s0, w8
; CHECK-CVT-SD-NEXT: mov v1.h[2], v0.h[0]
; CHECK-CVT-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-CVT-SD-NEXT: mov h0, v0.h[3]
; CHECK-CVT-SD-NEXT: str q1, [sp, #16] // 16-byte Spill
; CHECK-CVT-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-CVT-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-CVT-SD-NEXT: bl sinf
; CHECK-CVT-SD-NEXT: fmov w8, s0
; CHECK-CVT-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload
; CHECK-CVT-SD-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-SD-NEXT: add w8, w8, w19
; CHECK-CVT-SD-NEXT: add w8, w9, w8
; CHECK-CVT-SD-NEXT: lsr w8, w8, #16
; CHECK-CVT-SD-NEXT: fmov s0, w8
; CHECK-CVT-SD-NEXT: mov v1.h[3], v0.h[0]
; CHECK-CVT-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-CVT-SD-NEXT: mov h0, v0.h[4]
; CHECK-CVT-SD-NEXT: str q1, [sp, #16] // 16-byte Spill
; CHECK-CVT-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-CVT-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-CVT-SD-NEXT: bl sinf
; CHECK-CVT-SD-NEXT: fmov w8, s0
; CHECK-CVT-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload
; CHECK-CVT-SD-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-SD-NEXT: add w8, w8, w19
; CHECK-CVT-SD-NEXT: add w8, w9, w8
; CHECK-CVT-SD-NEXT: lsr w8, w8, #16
; CHECK-CVT-SD-NEXT: fmov s0, w8
; CHECK-CVT-SD-NEXT: mov v1.h[4], v0.h[0]
; CHECK-CVT-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-CVT-SD-NEXT: mov h0, v0.h[5]
; CHECK-CVT-SD-NEXT: str q1, [sp, #16] // 16-byte Spill
; CHECK-CVT-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-CVT-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-CVT-SD-NEXT: bl sinf
; CHECK-CVT-SD-NEXT: fmov w8, s0
; CHECK-CVT-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload
; CHECK-CVT-SD-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-SD-NEXT: add w8, w8, w19
; CHECK-CVT-SD-NEXT: add w8, w9, w8
; CHECK-CVT-SD-NEXT: lsr w8, w8, #16
; CHECK-CVT-SD-NEXT: fmov s0, w8
; CHECK-CVT-SD-NEXT: mov v1.h[5], v0.h[0]
; CHECK-CVT-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-CVT-SD-NEXT: mov h0, v0.h[6]
; CHECK-CVT-SD-NEXT: str q1, [sp, #16] // 16-byte Spill
; CHECK-CVT-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-CVT-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-CVT-SD-NEXT: bl sinf
; CHECK-CVT-SD-NEXT: fmov w8, s0
; CHECK-CVT-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload
; CHECK-CVT-SD-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-SD-NEXT: add w8, w8, w19
; CHECK-CVT-SD-NEXT: add w8, w9, w8
; CHECK-CVT-SD-NEXT: lsr w8, w8, #16
; CHECK-CVT-SD-NEXT: fmov s0, w8
; CHECK-CVT-SD-NEXT: mov v1.h[6], v0.h[0]
; CHECK-CVT-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-CVT-SD-NEXT: mov h0, v0.h[7]
; CHECK-CVT-SD-NEXT: str q1, [sp, #16] // 16-byte Spill
; CHECK-CVT-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-CVT-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-CVT-SD-NEXT: bl sinf
; CHECK-CVT-SD-NEXT: fmov w8, s0
; CHECK-CVT-SD-NEXT: ldr q0, [sp, #16] // 16-byte Reload
; CHECK-CVT-SD-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-SD-NEXT: add w8, w8, w19
; CHECK-CVT-SD-NEXT: ldp x30, x19, [sp, #32] // 16-byte Folded Reload
; CHECK-CVT-SD-NEXT: add w8, w9, w8
; CHECK-CVT-SD-NEXT: lsr w8, w8, #16
; CHECK-CVT-SD-NEXT: fmov s1, w8
; CHECK-CVT-SD-NEXT: mov v0.h[7], v1.h[0]
; CHECK-CVT-SD-NEXT: add sp, sp, #48
; CHECK-CVT-SD-NEXT: ret
;
; CHECK-BF16-SD-LABEL: test_sin:
; CHECK-BF16-SD: // %bb.0:
; CHECK-BF16-SD-NEXT: sub sp, sp, #48
; CHECK-BF16-SD-NEXT: mov h1, v0.h[1]
; CHECK-BF16-SD-NEXT: str q0, [sp] // 16-byte Spill
; CHECK-BF16-SD-NEXT: str x30, [sp, #32] // 8-byte Spill
; CHECK-BF16-SD-NEXT: shll v0.4s, v1.4h, #16
; CHECK-BF16-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16-SD-NEXT: bl sinf
; CHECK-BF16-SD-NEXT: bfcvt h0, s0
; CHECK-BF16-SD-NEXT: str q0, [sp, #16] // 16-byte Spill
; CHECK-BF16-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-BF16-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16-SD-NEXT: bl sinf
; CHECK-BF16-SD-NEXT: bfcvt h0, s0
; CHECK-BF16-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload
; CHECK-BF16-SD-NEXT: mov v0.h[1], v1.h[0]
; CHECK-BF16-SD-NEXT: str q0, [sp, #16] // 16-byte Spill
; CHECK-BF16-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-BF16-SD-NEXT: mov h0, v0.h[2]
; CHECK-BF16-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16-SD-NEXT: bl sinf
; CHECK-BF16-SD-NEXT: bfcvt h0, s0
; CHECK-BF16-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload
; CHECK-BF16-SD-NEXT: mov v1.h[2], v0.h[0]
; CHECK-BF16-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-BF16-SD-NEXT: mov h0, v0.h[3]
; CHECK-BF16-SD-NEXT: str q1, [sp, #16] // 16-byte Spill
; CHECK-BF16-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16-SD-NEXT: bl sinf
; CHECK-BF16-SD-NEXT: bfcvt h0, s0
; CHECK-BF16-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload
; CHECK-BF16-SD-NEXT: mov v1.h[3], v0.h[0]
; CHECK-BF16-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-BF16-SD-NEXT: mov h0, v0.h[4]
; CHECK-BF16-SD-NEXT: str q1, [sp, #16] // 16-byte Spill
; CHECK-BF16-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16-SD-NEXT: bl sinf
; CHECK-BF16-SD-NEXT: bfcvt h0, s0
; CHECK-BF16-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload
; CHECK-BF16-SD-NEXT: mov v1.h[4], v0.h[0]
; CHECK-BF16-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-BF16-SD-NEXT: mov h0, v0.h[5]
; CHECK-BF16-SD-NEXT: str q1, [sp, #16] // 16-byte Spill
; CHECK-BF16-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16-SD-NEXT: bl sinf
; CHECK-BF16-SD-NEXT: bfcvt h0, s0
; CHECK-BF16-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload
; CHECK-BF16-SD-NEXT: mov v1.h[5], v0.h[0]
; CHECK-BF16-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-BF16-SD-NEXT: mov h0, v0.h[6]
; CHECK-BF16-SD-NEXT: str q1, [sp, #16] // 16-byte Spill
; CHECK-BF16-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16-SD-NEXT: bl sinf
; CHECK-BF16-SD-NEXT: bfcvt h0, s0
; CHECK-BF16-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload
; CHECK-BF16-SD-NEXT: mov v1.h[6], v0.h[0]
; CHECK-BF16-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-BF16-SD-NEXT: mov h0, v0.h[7]
; CHECK-BF16-SD-NEXT: str q1, [sp, #16] // 16-byte Spill
; CHECK-BF16-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16-SD-NEXT: bl sinf
; CHECK-BF16-SD-NEXT: bfcvt h1, s0
; CHECK-BF16-SD-NEXT: ldr q0, [sp, #16] // 16-byte Reload
; CHECK-BF16-SD-NEXT: ldr x30, [sp, #32] // 8-byte Reload
; CHECK-BF16-SD-NEXT: mov v0.h[7], v1.h[0]
; CHECK-BF16-SD-NEXT: add sp, sp, #48
; CHECK-BF16-SD-NEXT: ret
;
; CHECK-BF16SVE-SD-LABEL: test_sin:
; CHECK-BF16SVE-SD: // %bb.0:
; CHECK-BF16SVE-SD-NEXT: sub sp, sp, #48
; CHECK-BF16SVE-SD-NEXT: mov h1, v0.h[1]
; CHECK-BF16SVE-SD-NEXT: str q0, [sp] // 16-byte Spill
; CHECK-BF16SVE-SD-NEXT: str x30, [sp, #32] // 8-byte Spill
; CHECK-BF16SVE-SD-NEXT: shll v0.4s, v1.4h, #16
; CHECK-BF16SVE-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16SVE-SD-NEXT: bl sinf
; CHECK-BF16SVE-SD-NEXT: bfcvt h0, s0
; CHECK-BF16SVE-SD-NEXT: str q0, [sp, #16] // 16-byte Spill
; CHECK-BF16SVE-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-BF16SVE-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16SVE-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16SVE-SD-NEXT: bl sinf
; CHECK-BF16SVE-SD-NEXT: bfcvt h0, s0
; CHECK-BF16SVE-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload
; CHECK-BF16SVE-SD-NEXT: mov v0.h[1], v1.h[0]
; CHECK-BF16SVE-SD-NEXT: str q0, [sp, #16] // 16-byte Spill
; CHECK-BF16SVE-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-BF16SVE-SD-NEXT: mov h0, v0.h[2]
; CHECK-BF16SVE-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16SVE-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16SVE-SD-NEXT: bl sinf
; CHECK-BF16SVE-SD-NEXT: bfcvt h0, s0
; CHECK-BF16SVE-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload
; CHECK-BF16SVE-SD-NEXT: mov v1.h[2], v0.h[0]
; CHECK-BF16SVE-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-BF16SVE-SD-NEXT: mov h0, v0.h[3]
; CHECK-BF16SVE-SD-NEXT: str q1, [sp, #16] // 16-byte Spill
; CHECK-BF16SVE-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16SVE-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16SVE-SD-NEXT: bl sinf
; CHECK-BF16SVE-SD-NEXT: bfcvt h0, s0
; CHECK-BF16SVE-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload
; CHECK-BF16SVE-SD-NEXT: mov v1.h[3], v0.h[0]
; CHECK-BF16SVE-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-BF16SVE-SD-NEXT: mov h0, v0.h[4]
; CHECK-BF16SVE-SD-NEXT: str q1, [sp, #16] // 16-byte Spill
; CHECK-BF16SVE-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16SVE-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16SVE-SD-NEXT: bl sinf
; CHECK-BF16SVE-SD-NEXT: bfcvt h0, s0
; CHECK-BF16SVE-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload
; CHECK-BF16SVE-SD-NEXT: mov v1.h[4], v0.h[0]
; CHECK-BF16SVE-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-BF16SVE-SD-NEXT: mov h0, v0.h[5]
; CHECK-BF16SVE-SD-NEXT: str q1, [sp, #16] // 16-byte Spill
; CHECK-BF16SVE-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16SVE-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16SVE-SD-NEXT: bl sinf
; CHECK-BF16SVE-SD-NEXT: bfcvt h0, s0
; CHECK-BF16SVE-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload
; CHECK-BF16SVE-SD-NEXT: mov v1.h[5], v0.h[0]
; CHECK-BF16SVE-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-BF16SVE-SD-NEXT: mov h0, v0.h[6]
; CHECK-BF16SVE-SD-NEXT: str q1, [sp, #16] // 16-byte Spill
; CHECK-BF16SVE-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16SVE-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16SVE-SD-NEXT: bl sinf
; CHECK-BF16SVE-SD-NEXT: bfcvt h0, s0
; CHECK-BF16SVE-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload
; CHECK-BF16SVE-SD-NEXT: mov v1.h[6], v0.h[0]
; CHECK-BF16SVE-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-BF16SVE-SD-NEXT: mov h0, v0.h[7]
; CHECK-BF16SVE-SD-NEXT: str q1, [sp, #16] // 16-byte Spill
; CHECK-BF16SVE-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16SVE-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16SVE-SD-NEXT: bl sinf
; CHECK-BF16SVE-SD-NEXT: bfcvt h1, s0
; CHECK-BF16SVE-SD-NEXT: ldr q0, [sp, #16] // 16-byte Reload
; CHECK-BF16SVE-SD-NEXT: ldr x30, [sp, #32] // 8-byte Reload
; CHECK-BF16SVE-SD-NEXT: mov v0.h[7], v1.h[0]
; CHECK-BF16SVE-SD-NEXT: add sp, sp, #48
; CHECK-BF16SVE-SD-NEXT: ret
;
; CHECK-CVT-GI-LABEL: test_sin:
; CHECK-CVT-GI: // %bb.0:
; CHECK-CVT-GI-NEXT: str d14, [sp, #-128]! // 8-byte Folded Spill
; CHECK-CVT-GI-NEXT: stp d13, d12, [sp, #8] // 16-byte Folded Spill
; CHECK-CVT-GI-NEXT: mov h12, v0.h[1]
; CHECK-CVT-GI-NEXT: mov h13, v0.h[2]
; CHECK-CVT-GI-NEXT: stp d11, d10, [sp, #24] // 16-byte Folded Spill
; CHECK-CVT-GI-NEXT: mov h14, v0.h[3]
; CHECK-CVT-GI-NEXT: mov h11, v0.h[4]
; CHECK-CVT-GI-NEXT: stp d9, d8, [sp, #40] // 16-byte Folded Spill
; CHECK-CVT-GI-NEXT: mov h10, v0.h[5]
; CHECK-CVT-GI-NEXT: mov h9, v0.h[6]
; CHECK-CVT-GI-NEXT: mov h8, v0.h[7]
; CHECK-CVT-GI-NEXT: shll v0.4s, v0.4h, #16
; CHECK-CVT-GI-NEXT: str x30, [sp, #56] // 8-byte Spill
; CHECK-CVT-GI-NEXT: stp x26, x25, [sp, #64] // 16-byte Folded Spill
; CHECK-CVT-GI-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-CVT-GI-NEXT: stp x24, x23, [sp, #80] // 16-byte Folded Spill
; CHECK-CVT-GI-NEXT: stp x22, x21, [sp, #96] // 16-byte Folded Spill
; CHECK-CVT-GI-NEXT: stp x20, x19, [sp, #112] // 16-byte Folded Spill
; CHECK-CVT-GI-NEXT: bl sinf
; CHECK-CVT-GI-NEXT: fmov w8, s0
; CHECK-CVT-GI-NEXT: mov w19, #32767 // =0x7fff
; CHECK-CVT-GI-NEXT: fcmp s0, #0.0
; CHECK-CVT-GI-NEXT: shll v0.4s, v12.4h, #16
; CHECK-CVT-GI-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-CVT-GI-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-GI-NEXT: add w10, w8, w19
; CHECK-CVT-GI-NEXT: orr w8, w8, #0x400000
; CHECK-CVT-GI-NEXT: add w9, w10, w9
; CHECK-CVT-GI-NEXT: csel w8, w8, w9, vs
; CHECK-CVT-GI-NEXT: lsr w20, w8, #16
; CHECK-CVT-GI-NEXT: bl sinf
; CHECK-CVT-GI-NEXT: shll v1.4s, v13.4h, #16
; CHECK-CVT-GI-NEXT: fmov w8, s0
; CHECK-CVT-GI-NEXT: fcmp s0, #0.0
; CHECK-CVT-GI-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-GI-NEXT: fmov s0, s1
; CHECK-CVT-GI-NEXT: add w10, w8, w19
; CHECK-CVT-GI-NEXT: orr w8, w8, #0x400000
; CHECK-CVT-GI-NEXT: add w9, w10, w9
; CHECK-CVT-GI-NEXT: csel w8, w8, w9, vs
; CHECK-CVT-GI-NEXT: lsr w21, w8, #16
; CHECK-CVT-GI-NEXT: bl sinf
; CHECK-CVT-GI-NEXT: shll v1.4s, v14.4h, #16
; CHECK-CVT-GI-NEXT: fmov w8, s0
; CHECK-CVT-GI-NEXT: fcmp s0, #0.0
; CHECK-CVT-GI-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-GI-NEXT: fmov s0, s1
; CHECK-CVT-GI-NEXT: add w10, w8, w19
; CHECK-CVT-GI-NEXT: orr w8, w8, #0x400000
; CHECK-CVT-GI-NEXT: add w9, w10, w9
; CHECK-CVT-GI-NEXT: csel w8, w8, w9, vs
; CHECK-CVT-GI-NEXT: lsr w22, w8, #16
; CHECK-CVT-GI-NEXT: bl sinf
; CHECK-CVT-GI-NEXT: shll v1.4s, v11.4h, #16
; CHECK-CVT-GI-NEXT: fmov w8, s0
; CHECK-CVT-GI-NEXT: fcmp s0, #0.0
; CHECK-CVT-GI-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-GI-NEXT: fmov s0, s1
; CHECK-CVT-GI-NEXT: add w10, w8, w19
; CHECK-CVT-GI-NEXT: orr w8, w8, #0x400000
; CHECK-CVT-GI-NEXT: add w9, w10, w9
; CHECK-CVT-GI-NEXT: csel w8, w8, w9, vs
; CHECK-CVT-GI-NEXT: lsr w23, w8, #16
; CHECK-CVT-GI-NEXT: bl sinf
; CHECK-CVT-GI-NEXT: shll v1.4s, v10.4h, #16
; CHECK-CVT-GI-NEXT: fmov w8, s0
; CHECK-CVT-GI-NEXT: fcmp s0, #0.0
; CHECK-CVT-GI-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-GI-NEXT: fmov s0, s1
; CHECK-CVT-GI-NEXT: add w10, w8, w19
; CHECK-CVT-GI-NEXT: orr w8, w8, #0x400000
; CHECK-CVT-GI-NEXT: add w9, w10, w9
; CHECK-CVT-GI-NEXT: csel w8, w8, w9, vs
; CHECK-CVT-GI-NEXT: lsr w24, w8, #16
; CHECK-CVT-GI-NEXT: bl sinf
; CHECK-CVT-GI-NEXT: shll v1.4s, v9.4h, #16
; CHECK-CVT-GI-NEXT: fmov w8, s0
; CHECK-CVT-GI-NEXT: fcmp s0, #0.0
; CHECK-CVT-GI-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-GI-NEXT: fmov s0, s1
; CHECK-CVT-GI-NEXT: add w10, w8, w19
; CHECK-CVT-GI-NEXT: orr w8, w8, #0x400000
; CHECK-CVT-GI-NEXT: add w9, w10, w9
; CHECK-CVT-GI-NEXT: csel w8, w8, w9, vs
; CHECK-CVT-GI-NEXT: lsr w25, w8, #16
; CHECK-CVT-GI-NEXT: bl sinf
; CHECK-CVT-GI-NEXT: shll v1.4s, v8.4h, #16
; CHECK-CVT-GI-NEXT: fmov w8, s0
; CHECK-CVT-GI-NEXT: fcmp s0, #0.0
; CHECK-CVT-GI-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-GI-NEXT: fmov s0, s1
; CHECK-CVT-GI-NEXT: add w10, w8, w19
; CHECK-CVT-GI-NEXT: orr w8, w8, #0x400000
; CHECK-CVT-GI-NEXT: add w9, w10, w9
; CHECK-CVT-GI-NEXT: csel w8, w8, w9, vs
; CHECK-CVT-GI-NEXT: lsr w26, w8, #16
; CHECK-CVT-GI-NEXT: bl sinf
; CHECK-CVT-GI-NEXT: fmov s1, w20
; CHECK-CVT-GI-NEXT: fmov w8, s0
; CHECK-CVT-GI-NEXT: ldr x30, [sp, #56] // 8-byte Reload
; CHECK-CVT-GI-NEXT: fcmp s0, #0.0
; CHECK-CVT-GI-NEXT: ldp d9, d8, [sp, #40] // 16-byte Folded Reload
; CHECK-CVT-GI-NEXT: ldp d11, d10, [sp, #24] // 16-byte Folded Reload
; CHECK-CVT-GI-NEXT: mov v1.h[1], w21
; CHECK-CVT-GI-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-GI-NEXT: add w10, w8, w19
; CHECK-CVT-GI-NEXT: orr w8, w8, #0x400000
; CHECK-CVT-GI-NEXT: ldp x20, x19, [sp, #112] // 16-byte Folded Reload
; CHECK-CVT-GI-NEXT: add w9, w10, w9
; CHECK-CVT-GI-NEXT: ldp d13, d12, [sp, #8] // 16-byte Folded Reload
; CHECK-CVT-GI-NEXT: csel w8, w8, w9, vs
; CHECK-CVT-GI-NEXT: mov v1.h[2], w22
; CHECK-CVT-GI-NEXT: lsr w8, w8, #16
; CHECK-CVT-GI-NEXT: ldp x22, x21, [sp, #96] // 16-byte Folded Reload
; CHECK-CVT-GI-NEXT: mov v1.h[3], w23
; CHECK-CVT-GI-NEXT: mov v1.h[4], w24
; CHECK-CVT-GI-NEXT: ldp x24, x23, [sp, #80] // 16-byte Folded Reload
; CHECK-CVT-GI-NEXT: mov v1.h[5], w25
; CHECK-CVT-GI-NEXT: mov v1.h[6], w26
; CHECK-CVT-GI-NEXT: ldp x26, x25, [sp, #64] // 16-byte Folded Reload
; CHECK-CVT-GI-NEXT: mov v1.h[7], w8
; CHECK-CVT-GI-NEXT: mov v0.16b, v1.16b
; CHECK-CVT-GI-NEXT: ldr d14, [sp], #128 // 8-byte Folded Reload
; CHECK-CVT-GI-NEXT: ret
;
; CHECK-BF16-GI-LABEL: test_sin:
; CHECK-BF16-GI: // %bb.0:
; CHECK-BF16-GI-NEXT: sub sp, sp, #176
; CHECK-BF16-GI-NEXT: str d14, [sp, #112] // 8-byte Spill
; CHECK-BF16-GI-NEXT: mov h14, v0.h[6]
; CHECK-BF16-GI-NEXT: stp d13, d12, [sp, #120] // 16-byte Folded Spill
; CHECK-BF16-GI-NEXT: mov h12, v0.h[4]
; CHECK-BF16-GI-NEXT: mov h13, v0.h[5]
; CHECK-BF16-GI-NEXT: stp d11, d10, [sp, #136] // 16-byte Folded Spill
; CHECK-BF16-GI-NEXT: mov h10, v0.h[2]
; CHECK-BF16-GI-NEXT: mov h11, v0.h[3]
; CHECK-BF16-GI-NEXT: stp d9, d8, [sp, #152] // 16-byte Folded Spill
; CHECK-BF16-GI-NEXT: mov h9, v0.h[1]
; CHECK-BF16-GI-NEXT: mov h8, v0.h[7]
; CHECK-BF16-GI-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16-GI-NEXT: str x30, [sp, #168] // 8-byte Spill
; CHECK-BF16-GI-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16-GI-NEXT: bl sinf
; CHECK-BF16-GI-NEXT: bfcvt h0, s0
; CHECK-BF16-GI-NEXT: str q0, [sp, #96] // 16-byte Spill
; CHECK-BF16-GI-NEXT: shll v0.4s, v9.4h, #16
; CHECK-BF16-GI-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16-GI-NEXT: bl sinf
; CHECK-BF16-GI-NEXT: bfcvt h0, s0
; CHECK-BF16-GI-NEXT: str q0, [sp, #80] // 16-byte Spill
; CHECK-BF16-GI-NEXT: shll v0.4s, v10.4h, #16
; CHECK-BF16-GI-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16-GI-NEXT: bl sinf
; CHECK-BF16-GI-NEXT: bfcvt h0, s0
; CHECK-BF16-GI-NEXT: str q0, [sp, #64] // 16-byte Spill
; CHECK-BF16-GI-NEXT: shll v0.4s, v11.4h, #16
; CHECK-BF16-GI-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16-GI-NEXT: bl sinf
; CHECK-BF16-GI-NEXT: bfcvt h0, s0
; CHECK-BF16-GI-NEXT: str q0, [sp, #48] // 16-byte Spill
; CHECK-BF16-GI-NEXT: shll v0.4s, v12.4h, #16
; CHECK-BF16-GI-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16-GI-NEXT: bl sinf
; CHECK-BF16-GI-NEXT: bfcvt h0, s0
; CHECK-BF16-GI-NEXT: str q0, [sp, #32] // 16-byte Spill
; CHECK-BF16-GI-NEXT: shll v0.4s, v13.4h, #16
; CHECK-BF16-GI-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16-GI-NEXT: bl sinf
; CHECK-BF16-GI-NEXT: bfcvt h0, s0
; CHECK-BF16-GI-NEXT: str q0, [sp, #16] // 16-byte Spill
; CHECK-BF16-GI-NEXT: shll v0.4s, v14.4h, #16
; CHECK-BF16-GI-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16-GI-NEXT: bl sinf
; CHECK-BF16-GI-NEXT: bfcvt h0, s0
; CHECK-BF16-GI-NEXT: str q0, [sp] // 16-byte Spill
; CHECK-BF16-GI-NEXT: shll v0.4s, v8.4h, #16
; CHECK-BF16-GI-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16-GI-NEXT: bl sinf
; CHECK-BF16-GI-NEXT: ldp q2, q1, [sp, #80] // 32-byte Folded Reload
; CHECK-BF16-GI-NEXT: bfcvt h0, s0
; CHECK-BF16-GI-NEXT: ldp d9, d8, [sp, #152] // 16-byte Folded Reload
; CHECK-BF16-GI-NEXT: ldr x30, [sp, #168] // 8-byte Reload
; CHECK-BF16-GI-NEXT: ldp d11, d10, [sp, #136] // 16-byte Folded Reload
; CHECK-BF16-GI-NEXT: ldr d14, [sp, #112] // 8-byte Reload
; CHECK-BF16-GI-NEXT: mov v1.h[1], v2.h[0]
; CHECK-BF16-GI-NEXT: ldp q2, q3, [sp, #48] // 32-byte Folded Reload
; CHECK-BF16-GI-NEXT: ldp d13, d12, [sp, #120] // 16-byte Folded Reload
; CHECK-BF16-GI-NEXT: mov v1.h[2], v3.h[0]
; CHECK-BF16-GI-NEXT: mov v1.h[3], v2.h[0]
; CHECK-BF16-GI-NEXT: ldp q2, q3, [sp, #16] // 32-byte Folded Reload
; CHECK-BF16-GI-NEXT: mov v1.h[4], v3.h[0]
; CHECK-BF16-GI-NEXT: mov v1.h[5], v2.h[0]
; CHECK-BF16-GI-NEXT: ldr q2, [sp] // 16-byte Reload
; CHECK-BF16-GI-NEXT: mov v1.h[6], v2.h[0]
; CHECK-BF16-GI-NEXT: mov v1.h[7], v0.h[0]
; CHECK-BF16-GI-NEXT: mov v0.16b, v1.16b
; CHECK-BF16-GI-NEXT: add sp, sp, #176
; CHECK-BF16-GI-NEXT: ret
%r = call <8 x bfloat> @llvm.sin.v8bf16(<8 x bfloat> %a)
ret <8 x bfloat> %r
}
define <8 x bfloat> @test_cos(<8 x bfloat> %a) #0 {
; CHECK-CVT-SD-LABEL: test_cos:
; CHECK-CVT-SD: // %bb.0:
; CHECK-CVT-SD-NEXT: sub sp, sp, #48
; CHECK-CVT-SD-NEXT: mov h1, v0.h[1]
; CHECK-CVT-SD-NEXT: str q0, [sp] // 16-byte Spill
; CHECK-CVT-SD-NEXT: stp x30, x19, [sp, #32] // 16-byte Folded Spill
; CHECK-CVT-SD-NEXT: shll v0.4s, v1.4h, #16
; CHECK-CVT-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-CVT-SD-NEXT: bl cosf
; CHECK-CVT-SD-NEXT: fmov w8, s0
; CHECK-CVT-SD-NEXT: mov w19, #32767 // =0x7fff
; CHECK-CVT-SD-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-SD-NEXT: add w8, w8, w19
; CHECK-CVT-SD-NEXT: add w8, w9, w8
; CHECK-CVT-SD-NEXT: lsr w8, w8, #16
; CHECK-CVT-SD-NEXT: fmov s0, w8
; CHECK-CVT-SD-NEXT: str q0, [sp, #16] // 16-byte Spill
; CHECK-CVT-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-CVT-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-CVT-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-CVT-SD-NEXT: bl cosf
; CHECK-CVT-SD-NEXT: fmov w8, s0
; CHECK-CVT-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload
; CHECK-CVT-SD-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-SD-NEXT: add w8, w8, w19
; CHECK-CVT-SD-NEXT: add w8, w9, w8
; CHECK-CVT-SD-NEXT: lsr w8, w8, #16
; CHECK-CVT-SD-NEXT: fmov s0, w8
; CHECK-CVT-SD-NEXT: mov v0.h[1], v1.h[0]
; CHECK-CVT-SD-NEXT: str q0, [sp, #16] // 16-byte Spill
; CHECK-CVT-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-CVT-SD-NEXT: mov h0, v0.h[2]
; CHECK-CVT-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-CVT-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-CVT-SD-NEXT: bl cosf
; CHECK-CVT-SD-NEXT: fmov w8, s0
; CHECK-CVT-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload
; CHECK-CVT-SD-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-SD-NEXT: add w8, w8, w19
; CHECK-CVT-SD-NEXT: add w8, w9, w8
; CHECK-CVT-SD-NEXT: lsr w8, w8, #16
; CHECK-CVT-SD-NEXT: fmov s0, w8
; CHECK-CVT-SD-NEXT: mov v1.h[2], v0.h[0]
; CHECK-CVT-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-CVT-SD-NEXT: mov h0, v0.h[3]
; CHECK-CVT-SD-NEXT: str q1, [sp, #16] // 16-byte Spill
; CHECK-CVT-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-CVT-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-CVT-SD-NEXT: bl cosf
; CHECK-CVT-SD-NEXT: fmov w8, s0
; CHECK-CVT-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload
; CHECK-CVT-SD-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-SD-NEXT: add w8, w8, w19
; CHECK-CVT-SD-NEXT: add w8, w9, w8
; CHECK-CVT-SD-NEXT: lsr w8, w8, #16
; CHECK-CVT-SD-NEXT: fmov s0, w8
; CHECK-CVT-SD-NEXT: mov v1.h[3], v0.h[0]
; CHECK-CVT-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-CVT-SD-NEXT: mov h0, v0.h[4]
; CHECK-CVT-SD-NEXT: str q1, [sp, #16] // 16-byte Spill
; CHECK-CVT-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-CVT-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-CVT-SD-NEXT: bl cosf
; CHECK-CVT-SD-NEXT: fmov w8, s0
; CHECK-CVT-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload
; CHECK-CVT-SD-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-SD-NEXT: add w8, w8, w19
; CHECK-CVT-SD-NEXT: add w8, w9, w8
; CHECK-CVT-SD-NEXT: lsr w8, w8, #16
; CHECK-CVT-SD-NEXT: fmov s0, w8
; CHECK-CVT-SD-NEXT: mov v1.h[4], v0.h[0]
; CHECK-CVT-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-CVT-SD-NEXT: mov h0, v0.h[5]
; CHECK-CVT-SD-NEXT: str q1, [sp, #16] // 16-byte Spill
; CHECK-CVT-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-CVT-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-CVT-SD-NEXT: bl cosf
; CHECK-CVT-SD-NEXT: fmov w8, s0
; CHECK-CVT-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload
; CHECK-CVT-SD-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-SD-NEXT: add w8, w8, w19
; CHECK-CVT-SD-NEXT: add w8, w9, w8
; CHECK-CVT-SD-NEXT: lsr w8, w8, #16
; CHECK-CVT-SD-NEXT: fmov s0, w8
; CHECK-CVT-SD-NEXT: mov v1.h[5], v0.h[0]
; CHECK-CVT-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-CVT-SD-NEXT: mov h0, v0.h[6]
; CHECK-CVT-SD-NEXT: str q1, [sp, #16] // 16-byte Spill
; CHECK-CVT-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-CVT-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-CVT-SD-NEXT: bl cosf
; CHECK-CVT-SD-NEXT: fmov w8, s0
; CHECK-CVT-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload
; CHECK-CVT-SD-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-SD-NEXT: add w8, w8, w19
; CHECK-CVT-SD-NEXT: add w8, w9, w8
; CHECK-CVT-SD-NEXT: lsr w8, w8, #16
; CHECK-CVT-SD-NEXT: fmov s0, w8
; CHECK-CVT-SD-NEXT: mov v1.h[6], v0.h[0]
; CHECK-CVT-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-CVT-SD-NEXT: mov h0, v0.h[7]
; CHECK-CVT-SD-NEXT: str q1, [sp, #16] // 16-byte Spill
; CHECK-CVT-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-CVT-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-CVT-SD-NEXT: bl cosf
; CHECK-CVT-SD-NEXT: fmov w8, s0
; CHECK-CVT-SD-NEXT: ldr q0, [sp, #16] // 16-byte Reload
; CHECK-CVT-SD-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-SD-NEXT: add w8, w8, w19
; CHECK-CVT-SD-NEXT: ldp x30, x19, [sp, #32] // 16-byte Folded Reload
; CHECK-CVT-SD-NEXT: add w8, w9, w8
; CHECK-CVT-SD-NEXT: lsr w8, w8, #16
; CHECK-CVT-SD-NEXT: fmov s1, w8
; CHECK-CVT-SD-NEXT: mov v0.h[7], v1.h[0]
; CHECK-CVT-SD-NEXT: add sp, sp, #48
; CHECK-CVT-SD-NEXT: ret
;
; CHECK-BF16-SD-LABEL: test_cos:
; CHECK-BF16-SD: // %bb.0:
; CHECK-BF16-SD-NEXT: sub sp, sp, #48
; CHECK-BF16-SD-NEXT: mov h1, v0.h[1]
; CHECK-BF16-SD-NEXT: str q0, [sp] // 16-byte Spill
; CHECK-BF16-SD-NEXT: str x30, [sp, #32] // 8-byte Spill
; CHECK-BF16-SD-NEXT: shll v0.4s, v1.4h, #16
; CHECK-BF16-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16-SD-NEXT: bl cosf
; CHECK-BF16-SD-NEXT: bfcvt h0, s0
; CHECK-BF16-SD-NEXT: str q0, [sp, #16] // 16-byte Spill
; CHECK-BF16-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-BF16-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16-SD-NEXT: bl cosf
; CHECK-BF16-SD-NEXT: bfcvt h0, s0
; CHECK-BF16-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload
; CHECK-BF16-SD-NEXT: mov v0.h[1], v1.h[0]
; CHECK-BF16-SD-NEXT: str q0, [sp, #16] // 16-byte Spill
; CHECK-BF16-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-BF16-SD-NEXT: mov h0, v0.h[2]
; CHECK-BF16-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16-SD-NEXT: bl cosf
; CHECK-BF16-SD-NEXT: bfcvt h0, s0
; CHECK-BF16-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload
; CHECK-BF16-SD-NEXT: mov v1.h[2], v0.h[0]
; CHECK-BF16-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-BF16-SD-NEXT: mov h0, v0.h[3]
; CHECK-BF16-SD-NEXT: str q1, [sp, #16] // 16-byte Spill
; CHECK-BF16-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16-SD-NEXT: bl cosf
; CHECK-BF16-SD-NEXT: bfcvt h0, s0
; CHECK-BF16-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload
; CHECK-BF16-SD-NEXT: mov v1.h[3], v0.h[0]
; CHECK-BF16-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-BF16-SD-NEXT: mov h0, v0.h[4]
; CHECK-BF16-SD-NEXT: str q1, [sp, #16] // 16-byte Spill
; CHECK-BF16-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16-SD-NEXT: bl cosf
; CHECK-BF16-SD-NEXT: bfcvt h0, s0
; CHECK-BF16-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload
; CHECK-BF16-SD-NEXT: mov v1.h[4], v0.h[0]
; CHECK-BF16-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-BF16-SD-NEXT: mov h0, v0.h[5]
; CHECK-BF16-SD-NEXT: str q1, [sp, #16] // 16-byte Spill
; CHECK-BF16-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16-SD-NEXT: bl cosf
; CHECK-BF16-SD-NEXT: bfcvt h0, s0
; CHECK-BF16-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload
; CHECK-BF16-SD-NEXT: mov v1.h[5], v0.h[0]
; CHECK-BF16-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-BF16-SD-NEXT: mov h0, v0.h[6]
; CHECK-BF16-SD-NEXT: str q1, [sp, #16] // 16-byte Spill
; CHECK-BF16-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16-SD-NEXT: bl cosf
; CHECK-BF16-SD-NEXT: bfcvt h0, s0
; CHECK-BF16-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload
; CHECK-BF16-SD-NEXT: mov v1.h[6], v0.h[0]
; CHECK-BF16-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-BF16-SD-NEXT: mov h0, v0.h[7]
; CHECK-BF16-SD-NEXT: str q1, [sp, #16] // 16-byte Spill
; CHECK-BF16-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16-SD-NEXT: bl cosf
; CHECK-BF16-SD-NEXT: bfcvt h1, s0
; CHECK-BF16-SD-NEXT: ldr q0, [sp, #16] // 16-byte Reload
; CHECK-BF16-SD-NEXT: ldr x30, [sp, #32] // 8-byte Reload
; CHECK-BF16-SD-NEXT: mov v0.h[7], v1.h[0]
; CHECK-BF16-SD-NEXT: add sp, sp, #48
; CHECK-BF16-SD-NEXT: ret
;
; CHECK-BF16SVE-SD-LABEL: test_cos:
; CHECK-BF16SVE-SD: // %bb.0:
; CHECK-BF16SVE-SD-NEXT: sub sp, sp, #48
; CHECK-BF16SVE-SD-NEXT: mov h1, v0.h[1]
; CHECK-BF16SVE-SD-NEXT: str q0, [sp] // 16-byte Spill
; CHECK-BF16SVE-SD-NEXT: str x30, [sp, #32] // 8-byte Spill
; CHECK-BF16SVE-SD-NEXT: shll v0.4s, v1.4h, #16
; CHECK-BF16SVE-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16SVE-SD-NEXT: bl cosf
; CHECK-BF16SVE-SD-NEXT: bfcvt h0, s0
; CHECK-BF16SVE-SD-NEXT: str q0, [sp, #16] // 16-byte Spill
; CHECK-BF16SVE-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-BF16SVE-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16SVE-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16SVE-SD-NEXT: bl cosf
; CHECK-BF16SVE-SD-NEXT: bfcvt h0, s0
; CHECK-BF16SVE-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload
; CHECK-BF16SVE-SD-NEXT: mov v0.h[1], v1.h[0]
; CHECK-BF16SVE-SD-NEXT: str q0, [sp, #16] // 16-byte Spill
; CHECK-BF16SVE-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-BF16SVE-SD-NEXT: mov h0, v0.h[2]
; CHECK-BF16SVE-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16SVE-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16SVE-SD-NEXT: bl cosf
; CHECK-BF16SVE-SD-NEXT: bfcvt h0, s0
; CHECK-BF16SVE-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload
; CHECK-BF16SVE-SD-NEXT: mov v1.h[2], v0.h[0]
; CHECK-BF16SVE-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-BF16SVE-SD-NEXT: mov h0, v0.h[3]
; CHECK-BF16SVE-SD-NEXT: str q1, [sp, #16] // 16-byte Spill
; CHECK-BF16SVE-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16SVE-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16SVE-SD-NEXT: bl cosf
; CHECK-BF16SVE-SD-NEXT: bfcvt h0, s0
; CHECK-BF16SVE-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload
; CHECK-BF16SVE-SD-NEXT: mov v1.h[3], v0.h[0]
; CHECK-BF16SVE-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-BF16SVE-SD-NEXT: mov h0, v0.h[4]
; CHECK-BF16SVE-SD-NEXT: str q1, [sp, #16] // 16-byte Spill
; CHECK-BF16SVE-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16SVE-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16SVE-SD-NEXT: bl cosf
; CHECK-BF16SVE-SD-NEXT: bfcvt h0, s0
; CHECK-BF16SVE-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload
; CHECK-BF16SVE-SD-NEXT: mov v1.h[4], v0.h[0]
; CHECK-BF16SVE-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-BF16SVE-SD-NEXT: mov h0, v0.h[5]
; CHECK-BF16SVE-SD-NEXT: str q1, [sp, #16] // 16-byte Spill
; CHECK-BF16SVE-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16SVE-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16SVE-SD-NEXT: bl cosf
; CHECK-BF16SVE-SD-NEXT: bfcvt h0, s0
; CHECK-BF16SVE-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload
; CHECK-BF16SVE-SD-NEXT: mov v1.h[5], v0.h[0]
; CHECK-BF16SVE-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-BF16SVE-SD-NEXT: mov h0, v0.h[6]
; CHECK-BF16SVE-SD-NEXT: str q1, [sp, #16] // 16-byte Spill
; CHECK-BF16SVE-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16SVE-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16SVE-SD-NEXT: bl cosf
; CHECK-BF16SVE-SD-NEXT: bfcvt h0, s0
; CHECK-BF16SVE-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload
; CHECK-BF16SVE-SD-NEXT: mov v1.h[6], v0.h[0]
; CHECK-BF16SVE-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-BF16SVE-SD-NEXT: mov h0, v0.h[7]
; CHECK-BF16SVE-SD-NEXT: str q1, [sp, #16] // 16-byte Spill
; CHECK-BF16SVE-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16SVE-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16SVE-SD-NEXT: bl cosf
; CHECK-BF16SVE-SD-NEXT: bfcvt h1, s0
; CHECK-BF16SVE-SD-NEXT: ldr q0, [sp, #16] // 16-byte Reload
; CHECK-BF16SVE-SD-NEXT: ldr x30, [sp, #32] // 8-byte Reload
; CHECK-BF16SVE-SD-NEXT: mov v0.h[7], v1.h[0]
; CHECK-BF16SVE-SD-NEXT: add sp, sp, #48
; CHECK-BF16SVE-SD-NEXT: ret
;
; CHECK-CVT-GI-LABEL: test_cos:
; CHECK-CVT-GI: // %bb.0:
; CHECK-CVT-GI-NEXT: str d14, [sp, #-128]! // 8-byte Folded Spill
; CHECK-CVT-GI-NEXT: stp d13, d12, [sp, #8] // 16-byte Folded Spill
; CHECK-CVT-GI-NEXT: mov h12, v0.h[1]
; CHECK-CVT-GI-NEXT: mov h13, v0.h[2]
; CHECK-CVT-GI-NEXT: stp d11, d10, [sp, #24] // 16-byte Folded Spill
; CHECK-CVT-GI-NEXT: mov h14, v0.h[3]
; CHECK-CVT-GI-NEXT: mov h11, v0.h[4]
; CHECK-CVT-GI-NEXT: stp d9, d8, [sp, #40] // 16-byte Folded Spill
; CHECK-CVT-GI-NEXT: mov h10, v0.h[5]
; CHECK-CVT-GI-NEXT: mov h9, v0.h[6]
; CHECK-CVT-GI-NEXT: mov h8, v0.h[7]
; CHECK-CVT-GI-NEXT: shll v0.4s, v0.4h, #16
; CHECK-CVT-GI-NEXT: str x30, [sp, #56] // 8-byte Spill
; CHECK-CVT-GI-NEXT: stp x26, x25, [sp, #64] // 16-byte Folded Spill
; CHECK-CVT-GI-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-CVT-GI-NEXT: stp x24, x23, [sp, #80] // 16-byte Folded Spill
; CHECK-CVT-GI-NEXT: stp x22, x21, [sp, #96] // 16-byte Folded Spill
; CHECK-CVT-GI-NEXT: stp x20, x19, [sp, #112] // 16-byte Folded Spill
; CHECK-CVT-GI-NEXT: bl cosf
; CHECK-CVT-GI-NEXT: fmov w8, s0
; CHECK-CVT-GI-NEXT: mov w19, #32767 // =0x7fff
; CHECK-CVT-GI-NEXT: fcmp s0, #0.0
; CHECK-CVT-GI-NEXT: shll v0.4s, v12.4h, #16
; CHECK-CVT-GI-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-CVT-GI-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-GI-NEXT: add w10, w8, w19
; CHECK-CVT-GI-NEXT: orr w8, w8, #0x400000
; CHECK-CVT-GI-NEXT: add w9, w10, w9
; CHECK-CVT-GI-NEXT: csel w8, w8, w9, vs
; CHECK-CVT-GI-NEXT: lsr w20, w8, #16
; CHECK-CVT-GI-NEXT: bl cosf
; CHECK-CVT-GI-NEXT: shll v1.4s, v13.4h, #16
; CHECK-CVT-GI-NEXT: fmov w8, s0
; CHECK-CVT-GI-NEXT: fcmp s0, #0.0
; CHECK-CVT-GI-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-GI-NEXT: fmov s0, s1
; CHECK-CVT-GI-NEXT: add w10, w8, w19
; CHECK-CVT-GI-NEXT: orr w8, w8, #0x400000
; CHECK-CVT-GI-NEXT: add w9, w10, w9
; CHECK-CVT-GI-NEXT: csel w8, w8, w9, vs
; CHECK-CVT-GI-NEXT: lsr w21, w8, #16
; CHECK-CVT-GI-NEXT: bl cosf
; CHECK-CVT-GI-NEXT: shll v1.4s, v14.4h, #16
; CHECK-CVT-GI-NEXT: fmov w8, s0
; CHECK-CVT-GI-NEXT: fcmp s0, #0.0
; CHECK-CVT-GI-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-GI-NEXT: fmov s0, s1
; CHECK-CVT-GI-NEXT: add w10, w8, w19
; CHECK-CVT-GI-NEXT: orr w8, w8, #0x400000
; CHECK-CVT-GI-NEXT: add w9, w10, w9
; CHECK-CVT-GI-NEXT: csel w8, w8, w9, vs
; CHECK-CVT-GI-NEXT: lsr w22, w8, #16
; CHECK-CVT-GI-NEXT: bl cosf
; CHECK-CVT-GI-NEXT: shll v1.4s, v11.4h, #16
; CHECK-CVT-GI-NEXT: fmov w8, s0
; CHECK-CVT-GI-NEXT: fcmp s0, #0.0
; CHECK-CVT-GI-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-GI-NEXT: fmov s0, s1
; CHECK-CVT-GI-NEXT: add w10, w8, w19
; CHECK-CVT-GI-NEXT: orr w8, w8, #0x400000
; CHECK-CVT-GI-NEXT: add w9, w10, w9
; CHECK-CVT-GI-NEXT: csel w8, w8, w9, vs
; CHECK-CVT-GI-NEXT: lsr w23, w8, #16
; CHECK-CVT-GI-NEXT: bl cosf
; CHECK-CVT-GI-NEXT: shll v1.4s, v10.4h, #16
; CHECK-CVT-GI-NEXT: fmov w8, s0
; CHECK-CVT-GI-NEXT: fcmp s0, #0.0
; CHECK-CVT-GI-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-GI-NEXT: fmov s0, s1
; CHECK-CVT-GI-NEXT: add w10, w8, w19
; CHECK-CVT-GI-NEXT: orr w8, w8, #0x400000
; CHECK-CVT-GI-NEXT: add w9, w10, w9
; CHECK-CVT-GI-NEXT: csel w8, w8, w9, vs
; CHECK-CVT-GI-NEXT: lsr w24, w8, #16
; CHECK-CVT-GI-NEXT: bl cosf
; CHECK-CVT-GI-NEXT: shll v1.4s, v9.4h, #16
; CHECK-CVT-GI-NEXT: fmov w8, s0
; CHECK-CVT-GI-NEXT: fcmp s0, #0.0
; CHECK-CVT-GI-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-GI-NEXT: fmov s0, s1
; CHECK-CVT-GI-NEXT: add w10, w8, w19
; CHECK-CVT-GI-NEXT: orr w8, w8, #0x400000
; CHECK-CVT-GI-NEXT: add w9, w10, w9
; CHECK-CVT-GI-NEXT: csel w8, w8, w9, vs
; CHECK-CVT-GI-NEXT: lsr w25, w8, #16
; CHECK-CVT-GI-NEXT: bl cosf
; CHECK-CVT-GI-NEXT: shll v1.4s, v8.4h, #16
; CHECK-CVT-GI-NEXT: fmov w8, s0
; CHECK-CVT-GI-NEXT: fcmp s0, #0.0
; CHECK-CVT-GI-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-GI-NEXT: fmov s0, s1
; CHECK-CVT-GI-NEXT: add w10, w8, w19
; CHECK-CVT-GI-NEXT: orr w8, w8, #0x400000
; CHECK-CVT-GI-NEXT: add w9, w10, w9
; CHECK-CVT-GI-NEXT: csel w8, w8, w9, vs
; CHECK-CVT-GI-NEXT: lsr w26, w8, #16
; CHECK-CVT-GI-NEXT: bl cosf
; CHECK-CVT-GI-NEXT: fmov s1, w20
; CHECK-CVT-GI-NEXT: fmov w8, s0
; CHECK-CVT-GI-NEXT: ldr x30, [sp, #56] // 8-byte Reload
; CHECK-CVT-GI-NEXT: fcmp s0, #0.0
; CHECK-CVT-GI-NEXT: ldp d9, d8, [sp, #40] // 16-byte Folded Reload
; CHECK-CVT-GI-NEXT: ldp d11, d10, [sp, #24] // 16-byte Folded Reload
; CHECK-CVT-GI-NEXT: mov v1.h[1], w21
; CHECK-CVT-GI-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-GI-NEXT: add w10, w8, w19
; CHECK-CVT-GI-NEXT: orr w8, w8, #0x400000
; CHECK-CVT-GI-NEXT: ldp x20, x19, [sp, #112] // 16-byte Folded Reload
; CHECK-CVT-GI-NEXT: add w9, w10, w9
; CHECK-CVT-GI-NEXT: ldp d13, d12, [sp, #8] // 16-byte Folded Reload
; CHECK-CVT-GI-NEXT: csel w8, w8, w9, vs
; CHECK-CVT-GI-NEXT: mov v1.h[2], w22
; CHECK-CVT-GI-NEXT: lsr w8, w8, #16
; CHECK-CVT-GI-NEXT: ldp x22, x21, [sp, #96] // 16-byte Folded Reload
; CHECK-CVT-GI-NEXT: mov v1.h[3], w23
; CHECK-CVT-GI-NEXT: mov v1.h[4], w24
; CHECK-CVT-GI-NEXT: ldp x24, x23, [sp, #80] // 16-byte Folded Reload
; CHECK-CVT-GI-NEXT: mov v1.h[5], w25
; CHECK-CVT-GI-NEXT: mov v1.h[6], w26
; CHECK-CVT-GI-NEXT: ldp x26, x25, [sp, #64] // 16-byte Folded Reload
; CHECK-CVT-GI-NEXT: mov v1.h[7], w8
; CHECK-CVT-GI-NEXT: mov v0.16b, v1.16b
; CHECK-CVT-GI-NEXT: ldr d14, [sp], #128 // 8-byte Folded Reload
; CHECK-CVT-GI-NEXT: ret
;
; CHECK-BF16-GI-LABEL: test_cos:
; CHECK-BF16-GI: // %bb.0:
; CHECK-BF16-GI-NEXT: sub sp, sp, #176
; CHECK-BF16-GI-NEXT: str d14, [sp, #112] // 8-byte Spill
; CHECK-BF16-GI-NEXT: mov h14, v0.h[6]
; CHECK-BF16-GI-NEXT: stp d13, d12, [sp, #120] // 16-byte Folded Spill
; CHECK-BF16-GI-NEXT: mov h12, v0.h[4]
; CHECK-BF16-GI-NEXT: mov h13, v0.h[5]
; CHECK-BF16-GI-NEXT: stp d11, d10, [sp, #136] // 16-byte Folded Spill
; CHECK-BF16-GI-NEXT: mov h10, v0.h[2]
; CHECK-BF16-GI-NEXT: mov h11, v0.h[3]
; CHECK-BF16-GI-NEXT: stp d9, d8, [sp, #152] // 16-byte Folded Spill
; CHECK-BF16-GI-NEXT: mov h9, v0.h[1]
; CHECK-BF16-GI-NEXT: mov h8, v0.h[7]
; CHECK-BF16-GI-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16-GI-NEXT: str x30, [sp, #168] // 8-byte Spill
; CHECK-BF16-GI-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16-GI-NEXT: bl cosf
; CHECK-BF16-GI-NEXT: bfcvt h0, s0
; CHECK-BF16-GI-NEXT: str q0, [sp, #96] // 16-byte Spill
; CHECK-BF16-GI-NEXT: shll v0.4s, v9.4h, #16
; CHECK-BF16-GI-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16-GI-NEXT: bl cosf
; CHECK-BF16-GI-NEXT: bfcvt h0, s0
; CHECK-BF16-GI-NEXT: str q0, [sp, #80] // 16-byte Spill
; CHECK-BF16-GI-NEXT: shll v0.4s, v10.4h, #16
; CHECK-BF16-GI-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16-GI-NEXT: bl cosf
; CHECK-BF16-GI-NEXT: bfcvt h0, s0
; CHECK-BF16-GI-NEXT: str q0, [sp, #64] // 16-byte Spill
; CHECK-BF16-GI-NEXT: shll v0.4s, v11.4h, #16
; CHECK-BF16-GI-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16-GI-NEXT: bl cosf
; CHECK-BF16-GI-NEXT: bfcvt h0, s0
; CHECK-BF16-GI-NEXT: str q0, [sp, #48] // 16-byte Spill
; CHECK-BF16-GI-NEXT: shll v0.4s, v12.4h, #16
; CHECK-BF16-GI-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16-GI-NEXT: bl cosf
; CHECK-BF16-GI-NEXT: bfcvt h0, s0
; CHECK-BF16-GI-NEXT: str q0, [sp, #32] // 16-byte Spill
; CHECK-BF16-GI-NEXT: shll v0.4s, v13.4h, #16
; CHECK-BF16-GI-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16-GI-NEXT: bl cosf
; CHECK-BF16-GI-NEXT: bfcvt h0, s0
; CHECK-BF16-GI-NEXT: str q0, [sp, #16] // 16-byte Spill
; CHECK-BF16-GI-NEXT: shll v0.4s, v14.4h, #16
; CHECK-BF16-GI-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16-GI-NEXT: bl cosf
; CHECK-BF16-GI-NEXT: bfcvt h0, s0
; CHECK-BF16-GI-NEXT: str q0, [sp] // 16-byte Spill
; CHECK-BF16-GI-NEXT: shll v0.4s, v8.4h, #16
; CHECK-BF16-GI-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16-GI-NEXT: bl cosf
; CHECK-BF16-GI-NEXT: ldp q2, q1, [sp, #80] // 32-byte Folded Reload
; CHECK-BF16-GI-NEXT: bfcvt h0, s0
; CHECK-BF16-GI-NEXT: ldp d9, d8, [sp, #152] // 16-byte Folded Reload
; CHECK-BF16-GI-NEXT: ldr x30, [sp, #168] // 8-byte Reload
; CHECK-BF16-GI-NEXT: ldp d11, d10, [sp, #136] // 16-byte Folded Reload
; CHECK-BF16-GI-NEXT: ldr d14, [sp, #112] // 8-byte Reload
; CHECK-BF16-GI-NEXT: mov v1.h[1], v2.h[0]
; CHECK-BF16-GI-NEXT: ldp q2, q3, [sp, #48] // 32-byte Folded Reload
; CHECK-BF16-GI-NEXT: ldp d13, d12, [sp, #120] // 16-byte Folded Reload
; CHECK-BF16-GI-NEXT: mov v1.h[2], v3.h[0]
; CHECK-BF16-GI-NEXT: mov v1.h[3], v2.h[0]
; CHECK-BF16-GI-NEXT: ldp q2, q3, [sp, #16] // 32-byte Folded Reload
; CHECK-BF16-GI-NEXT: mov v1.h[4], v3.h[0]
; CHECK-BF16-GI-NEXT: mov v1.h[5], v2.h[0]
; CHECK-BF16-GI-NEXT: ldr q2, [sp] // 16-byte Reload
; CHECK-BF16-GI-NEXT: mov v1.h[6], v2.h[0]
; CHECK-BF16-GI-NEXT: mov v1.h[7], v0.h[0]
; CHECK-BF16-GI-NEXT: mov v0.16b, v1.16b
; CHECK-BF16-GI-NEXT: add sp, sp, #176
; CHECK-BF16-GI-NEXT: ret
%r = call <8 x bfloat> @llvm.cos.v8bf16(<8 x bfloat> %a)
ret <8 x bfloat> %r
}
define <8 x bfloat> @test_tan(<8 x bfloat> %a) #0 {
; CHECK-CVT-SD-LABEL: test_tan:
; CHECK-CVT-SD: // %bb.0:
; CHECK-CVT-SD-NEXT: sub sp, sp, #48
; CHECK-CVT-SD-NEXT: mov h1, v0.h[1]
; CHECK-CVT-SD-NEXT: str q0, [sp] // 16-byte Spill
; CHECK-CVT-SD-NEXT: stp x30, x19, [sp, #32] // 16-byte Folded Spill
; CHECK-CVT-SD-NEXT: shll v0.4s, v1.4h, #16
; CHECK-CVT-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-CVT-SD-NEXT: bl tanf
; CHECK-CVT-SD-NEXT: fmov w8, s0
; CHECK-CVT-SD-NEXT: mov w19, #32767 // =0x7fff
; CHECK-CVT-SD-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-SD-NEXT: add w8, w8, w19
; CHECK-CVT-SD-NEXT: add w8, w9, w8
; CHECK-CVT-SD-NEXT: lsr w8, w8, #16
; CHECK-CVT-SD-NEXT: fmov s0, w8
; CHECK-CVT-SD-NEXT: str q0, [sp, #16] // 16-byte Spill
; CHECK-CVT-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-CVT-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-CVT-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-CVT-SD-NEXT: bl tanf
; CHECK-CVT-SD-NEXT: fmov w8, s0
; CHECK-CVT-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload
; CHECK-CVT-SD-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-SD-NEXT: add w8, w8, w19
; CHECK-CVT-SD-NEXT: add w8, w9, w8
; CHECK-CVT-SD-NEXT: lsr w8, w8, #16
; CHECK-CVT-SD-NEXT: fmov s0, w8
; CHECK-CVT-SD-NEXT: mov v0.h[1], v1.h[0]
; CHECK-CVT-SD-NEXT: str q0, [sp, #16] // 16-byte Spill
; CHECK-CVT-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-CVT-SD-NEXT: mov h0, v0.h[2]
; CHECK-CVT-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-CVT-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-CVT-SD-NEXT: bl tanf
; CHECK-CVT-SD-NEXT: fmov w8, s0
; CHECK-CVT-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload
; CHECK-CVT-SD-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-SD-NEXT: add w8, w8, w19
; CHECK-CVT-SD-NEXT: add w8, w9, w8
; CHECK-CVT-SD-NEXT: lsr w8, w8, #16
; CHECK-CVT-SD-NEXT: fmov s0, w8
; CHECK-CVT-SD-NEXT: mov v1.h[2], v0.h[0]
; CHECK-CVT-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-CVT-SD-NEXT: mov h0, v0.h[3]
; CHECK-CVT-SD-NEXT: str q1, [sp, #16] // 16-byte Spill
; CHECK-CVT-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-CVT-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-CVT-SD-NEXT: bl tanf
; CHECK-CVT-SD-NEXT: fmov w8, s0
; CHECK-CVT-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload
; CHECK-CVT-SD-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-SD-NEXT: add w8, w8, w19
; CHECK-CVT-SD-NEXT: add w8, w9, w8
; CHECK-CVT-SD-NEXT: lsr w8, w8, #16
; CHECK-CVT-SD-NEXT: fmov s0, w8
; CHECK-CVT-SD-NEXT: mov v1.h[3], v0.h[0]
; CHECK-CVT-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-CVT-SD-NEXT: mov h0, v0.h[4]
; CHECK-CVT-SD-NEXT: str q1, [sp, #16] // 16-byte Spill
; CHECK-CVT-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-CVT-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-CVT-SD-NEXT: bl tanf
; CHECK-CVT-SD-NEXT: fmov w8, s0
; CHECK-CVT-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload
; CHECK-CVT-SD-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-SD-NEXT: add w8, w8, w19
; CHECK-CVT-SD-NEXT: add w8, w9, w8
; CHECK-CVT-SD-NEXT: lsr w8, w8, #16
; CHECK-CVT-SD-NEXT: fmov s0, w8
; CHECK-CVT-SD-NEXT: mov v1.h[4], v0.h[0]
; CHECK-CVT-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-CVT-SD-NEXT: mov h0, v0.h[5]
; CHECK-CVT-SD-NEXT: str q1, [sp, #16] // 16-byte Spill
; CHECK-CVT-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-CVT-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-CVT-SD-NEXT: bl tanf
; CHECK-CVT-SD-NEXT: fmov w8, s0
; CHECK-CVT-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload
; CHECK-CVT-SD-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-SD-NEXT: add w8, w8, w19
; CHECK-CVT-SD-NEXT: add w8, w9, w8
; CHECK-CVT-SD-NEXT: lsr w8, w8, #16
; CHECK-CVT-SD-NEXT: fmov s0, w8
; CHECK-CVT-SD-NEXT: mov v1.h[5], v0.h[0]
; CHECK-CVT-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-CVT-SD-NEXT: mov h0, v0.h[6]
; CHECK-CVT-SD-NEXT: str q1, [sp, #16] // 16-byte Spill
; CHECK-CVT-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-CVT-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-CVT-SD-NEXT: bl tanf
; CHECK-CVT-SD-NEXT: fmov w8, s0
; CHECK-CVT-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload
; CHECK-CVT-SD-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-SD-NEXT: add w8, w8, w19
; CHECK-CVT-SD-NEXT: add w8, w9, w8
; CHECK-CVT-SD-NEXT: lsr w8, w8, #16
; CHECK-CVT-SD-NEXT: fmov s0, w8
; CHECK-CVT-SD-NEXT: mov v1.h[6], v0.h[0]
; CHECK-CVT-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-CVT-SD-NEXT: mov h0, v0.h[7]
; CHECK-CVT-SD-NEXT: str q1, [sp, #16] // 16-byte Spill
; CHECK-CVT-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-CVT-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-CVT-SD-NEXT: bl tanf
; CHECK-CVT-SD-NEXT: fmov w8, s0
; CHECK-CVT-SD-NEXT: ldr q0, [sp, #16] // 16-byte Reload
; CHECK-CVT-SD-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-SD-NEXT: add w8, w8, w19
; CHECK-CVT-SD-NEXT: ldp x30, x19, [sp, #32] // 16-byte Folded Reload
; CHECK-CVT-SD-NEXT: add w8, w9, w8
; CHECK-CVT-SD-NEXT: lsr w8, w8, #16
; CHECK-CVT-SD-NEXT: fmov s1, w8
; CHECK-CVT-SD-NEXT: mov v0.h[7], v1.h[0]
; CHECK-CVT-SD-NEXT: add sp, sp, #48
; CHECK-CVT-SD-NEXT: ret
;
; CHECK-BF16-SD-LABEL: test_tan:
; CHECK-BF16-SD: // %bb.0:
; CHECK-BF16-SD-NEXT: sub sp, sp, #48
; CHECK-BF16-SD-NEXT: mov h1, v0.h[1]
; CHECK-BF16-SD-NEXT: str q0, [sp] // 16-byte Spill
; CHECK-BF16-SD-NEXT: str x30, [sp, #32] // 8-byte Spill
; CHECK-BF16-SD-NEXT: shll v0.4s, v1.4h, #16
; CHECK-BF16-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16-SD-NEXT: bl tanf
; CHECK-BF16-SD-NEXT: bfcvt h0, s0
; CHECK-BF16-SD-NEXT: str q0, [sp, #16] // 16-byte Spill
; CHECK-BF16-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-BF16-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16-SD-NEXT: bl tanf
; CHECK-BF16-SD-NEXT: bfcvt h0, s0
; CHECK-BF16-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload
; CHECK-BF16-SD-NEXT: mov v0.h[1], v1.h[0]
; CHECK-BF16-SD-NEXT: str q0, [sp, #16] // 16-byte Spill
; CHECK-BF16-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-BF16-SD-NEXT: mov h0, v0.h[2]
; CHECK-BF16-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16-SD-NEXT: bl tanf
; CHECK-BF16-SD-NEXT: bfcvt h0, s0
; CHECK-BF16-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload
; CHECK-BF16-SD-NEXT: mov v1.h[2], v0.h[0]
; CHECK-BF16-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-BF16-SD-NEXT: mov h0, v0.h[3]
; CHECK-BF16-SD-NEXT: str q1, [sp, #16] // 16-byte Spill
; CHECK-BF16-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16-SD-NEXT: bl tanf
; CHECK-BF16-SD-NEXT: bfcvt h0, s0
; CHECK-BF16-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload
; CHECK-BF16-SD-NEXT: mov v1.h[3], v0.h[0]
; CHECK-BF16-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-BF16-SD-NEXT: mov h0, v0.h[4]
; CHECK-BF16-SD-NEXT: str q1, [sp, #16] // 16-byte Spill
; CHECK-BF16-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16-SD-NEXT: bl tanf
; CHECK-BF16-SD-NEXT: bfcvt h0, s0
; CHECK-BF16-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload
; CHECK-BF16-SD-NEXT: mov v1.h[4], v0.h[0]
; CHECK-BF16-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-BF16-SD-NEXT: mov h0, v0.h[5]
; CHECK-BF16-SD-NEXT: str q1, [sp, #16] // 16-byte Spill
; CHECK-BF16-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16-SD-NEXT: bl tanf
; CHECK-BF16-SD-NEXT: bfcvt h0, s0
; CHECK-BF16-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload
; CHECK-BF16-SD-NEXT: mov v1.h[5], v0.h[0]
; CHECK-BF16-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-BF16-SD-NEXT: mov h0, v0.h[6]
; CHECK-BF16-SD-NEXT: str q1, [sp, #16] // 16-byte Spill
; CHECK-BF16-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16-SD-NEXT: bl tanf
; CHECK-BF16-SD-NEXT: bfcvt h0, s0
; CHECK-BF16-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload
; CHECK-BF16-SD-NEXT: mov v1.h[6], v0.h[0]
; CHECK-BF16-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-BF16-SD-NEXT: mov h0, v0.h[7]
; CHECK-BF16-SD-NEXT: str q1, [sp, #16] // 16-byte Spill
; CHECK-BF16-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16-SD-NEXT: bl tanf
; CHECK-BF16-SD-NEXT: bfcvt h1, s0
; CHECK-BF16-SD-NEXT: ldr q0, [sp, #16] // 16-byte Reload
; CHECK-BF16-SD-NEXT: ldr x30, [sp, #32] // 8-byte Reload
; CHECK-BF16-SD-NEXT: mov v0.h[7], v1.h[0]
; CHECK-BF16-SD-NEXT: add sp, sp, #48
; CHECK-BF16-SD-NEXT: ret
;
; CHECK-BF16SVE-SD-LABEL: test_tan:
; CHECK-BF16SVE-SD: // %bb.0:
; CHECK-BF16SVE-SD-NEXT: sub sp, sp, #48
; CHECK-BF16SVE-SD-NEXT: mov h1, v0.h[1]
; CHECK-BF16SVE-SD-NEXT: str q0, [sp] // 16-byte Spill
; CHECK-BF16SVE-SD-NEXT: str x30, [sp, #32] // 8-byte Spill
; CHECK-BF16SVE-SD-NEXT: shll v0.4s, v1.4h, #16
; CHECK-BF16SVE-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16SVE-SD-NEXT: bl tanf
; CHECK-BF16SVE-SD-NEXT: bfcvt h0, s0
; CHECK-BF16SVE-SD-NEXT: str q0, [sp, #16] // 16-byte Spill
; CHECK-BF16SVE-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-BF16SVE-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16SVE-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16SVE-SD-NEXT: bl tanf
; CHECK-BF16SVE-SD-NEXT: bfcvt h0, s0
; CHECK-BF16SVE-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload
; CHECK-BF16SVE-SD-NEXT: mov v0.h[1], v1.h[0]
; CHECK-BF16SVE-SD-NEXT: str q0, [sp, #16] // 16-byte Spill
; CHECK-BF16SVE-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-BF16SVE-SD-NEXT: mov h0, v0.h[2]
; CHECK-BF16SVE-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16SVE-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16SVE-SD-NEXT: bl tanf
; CHECK-BF16SVE-SD-NEXT: bfcvt h0, s0
; CHECK-BF16SVE-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload
; CHECK-BF16SVE-SD-NEXT: mov v1.h[2], v0.h[0]
; CHECK-BF16SVE-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-BF16SVE-SD-NEXT: mov h0, v0.h[3]
; CHECK-BF16SVE-SD-NEXT: str q1, [sp, #16] // 16-byte Spill
; CHECK-BF16SVE-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16SVE-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16SVE-SD-NEXT: bl tanf
; CHECK-BF16SVE-SD-NEXT: bfcvt h0, s0
; CHECK-BF16SVE-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload
; CHECK-BF16SVE-SD-NEXT: mov v1.h[3], v0.h[0]
; CHECK-BF16SVE-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-BF16SVE-SD-NEXT: mov h0, v0.h[4]
; CHECK-BF16SVE-SD-NEXT: str q1, [sp, #16] // 16-byte Spill
; CHECK-BF16SVE-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16SVE-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16SVE-SD-NEXT: bl tanf
; CHECK-BF16SVE-SD-NEXT: bfcvt h0, s0
; CHECK-BF16SVE-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload
; CHECK-BF16SVE-SD-NEXT: mov v1.h[4], v0.h[0]
; CHECK-BF16SVE-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-BF16SVE-SD-NEXT: mov h0, v0.h[5]
; CHECK-BF16SVE-SD-NEXT: str q1, [sp, #16] // 16-byte Spill
; CHECK-BF16SVE-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16SVE-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16SVE-SD-NEXT: bl tanf
; CHECK-BF16SVE-SD-NEXT: bfcvt h0, s0
; CHECK-BF16SVE-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload
; CHECK-BF16SVE-SD-NEXT: mov v1.h[5], v0.h[0]
; CHECK-BF16SVE-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-BF16SVE-SD-NEXT: mov h0, v0.h[6]
; CHECK-BF16SVE-SD-NEXT: str q1, [sp, #16] // 16-byte Spill
; CHECK-BF16SVE-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16SVE-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16SVE-SD-NEXT: bl tanf
; CHECK-BF16SVE-SD-NEXT: bfcvt h0, s0
; CHECK-BF16SVE-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload
; CHECK-BF16SVE-SD-NEXT: mov v1.h[6], v0.h[0]
; CHECK-BF16SVE-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-BF16SVE-SD-NEXT: mov h0, v0.h[7]
; CHECK-BF16SVE-SD-NEXT: str q1, [sp, #16] // 16-byte Spill
; CHECK-BF16SVE-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16SVE-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16SVE-SD-NEXT: bl tanf
; CHECK-BF16SVE-SD-NEXT: bfcvt h1, s0
; CHECK-BF16SVE-SD-NEXT: ldr q0, [sp, #16] // 16-byte Reload
; CHECK-BF16SVE-SD-NEXT: ldr x30, [sp, #32] // 8-byte Reload
; CHECK-BF16SVE-SD-NEXT: mov v0.h[7], v1.h[0]
; CHECK-BF16SVE-SD-NEXT: add sp, sp, #48
; CHECK-BF16SVE-SD-NEXT: ret
;
; CHECK-CVT-GI-LABEL: test_tan:
; CHECK-CVT-GI: // %bb.0:
; CHECK-CVT-GI-NEXT: str d14, [sp, #-128]! // 8-byte Folded Spill
; CHECK-CVT-GI-NEXT: stp d13, d12, [sp, #8] // 16-byte Folded Spill
; CHECK-CVT-GI-NEXT: mov h12, v0.h[1]
; CHECK-CVT-GI-NEXT: mov h13, v0.h[2]
; CHECK-CVT-GI-NEXT: stp d11, d10, [sp, #24] // 16-byte Folded Spill
; CHECK-CVT-GI-NEXT: mov h14, v0.h[3]
; CHECK-CVT-GI-NEXT: mov h11, v0.h[4]
; CHECK-CVT-GI-NEXT: stp d9, d8, [sp, #40] // 16-byte Folded Spill
; CHECK-CVT-GI-NEXT: mov h10, v0.h[5]
; CHECK-CVT-GI-NEXT: mov h9, v0.h[6]
; CHECK-CVT-GI-NEXT: mov h8, v0.h[7]
; CHECK-CVT-GI-NEXT: shll v0.4s, v0.4h, #16
; CHECK-CVT-GI-NEXT: str x30, [sp, #56] // 8-byte Spill
; CHECK-CVT-GI-NEXT: stp x26, x25, [sp, #64] // 16-byte Folded Spill
; CHECK-CVT-GI-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-CVT-GI-NEXT: stp x24, x23, [sp, #80] // 16-byte Folded Spill
; CHECK-CVT-GI-NEXT: stp x22, x21, [sp, #96] // 16-byte Folded Spill
; CHECK-CVT-GI-NEXT: stp x20, x19, [sp, #112] // 16-byte Folded Spill
; CHECK-CVT-GI-NEXT: bl tanf
; CHECK-CVT-GI-NEXT: fmov w8, s0
; CHECK-CVT-GI-NEXT: mov w19, #32767 // =0x7fff
; CHECK-CVT-GI-NEXT: fcmp s0, #0.0
; CHECK-CVT-GI-NEXT: shll v0.4s, v12.4h, #16
; CHECK-CVT-GI-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-CVT-GI-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-GI-NEXT: add w10, w8, w19
; CHECK-CVT-GI-NEXT: orr w8, w8, #0x400000
; CHECK-CVT-GI-NEXT: add w9, w10, w9
; CHECK-CVT-GI-NEXT: csel w8, w8, w9, vs
; CHECK-CVT-GI-NEXT: lsr w20, w8, #16
; CHECK-CVT-GI-NEXT: bl tanf
; CHECK-CVT-GI-NEXT: shll v1.4s, v13.4h, #16
; CHECK-CVT-GI-NEXT: fmov w8, s0
; CHECK-CVT-GI-NEXT: fcmp s0, #0.0
; CHECK-CVT-GI-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-GI-NEXT: fmov s0, s1
; CHECK-CVT-GI-NEXT: add w10, w8, w19
; CHECK-CVT-GI-NEXT: orr w8, w8, #0x400000
; CHECK-CVT-GI-NEXT: add w9, w10, w9
; CHECK-CVT-GI-NEXT: csel w8, w8, w9, vs
; CHECK-CVT-GI-NEXT: lsr w21, w8, #16
; CHECK-CVT-GI-NEXT: bl tanf
; CHECK-CVT-GI-NEXT: shll v1.4s, v14.4h, #16
; CHECK-CVT-GI-NEXT: fmov w8, s0
; CHECK-CVT-GI-NEXT: fcmp s0, #0.0
; CHECK-CVT-GI-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-GI-NEXT: fmov s0, s1
; CHECK-CVT-GI-NEXT: add w10, w8, w19
; CHECK-CVT-GI-NEXT: orr w8, w8, #0x400000
; CHECK-CVT-GI-NEXT: add w9, w10, w9
; CHECK-CVT-GI-NEXT: csel w8, w8, w9, vs
; CHECK-CVT-GI-NEXT: lsr w22, w8, #16
; CHECK-CVT-GI-NEXT: bl tanf
; CHECK-CVT-GI-NEXT: shll v1.4s, v11.4h, #16
; CHECK-CVT-GI-NEXT: fmov w8, s0
; CHECK-CVT-GI-NEXT: fcmp s0, #0.0
; CHECK-CVT-GI-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-GI-NEXT: fmov s0, s1
; CHECK-CVT-GI-NEXT: add w10, w8, w19
; CHECK-CVT-GI-NEXT: orr w8, w8, #0x400000
; CHECK-CVT-GI-NEXT: add w9, w10, w9
; CHECK-CVT-GI-NEXT: csel w8, w8, w9, vs
; CHECK-CVT-GI-NEXT: lsr w23, w8, #16
; CHECK-CVT-GI-NEXT: bl tanf
; CHECK-CVT-GI-NEXT: shll v1.4s, v10.4h, #16
; CHECK-CVT-GI-NEXT: fmov w8, s0
; CHECK-CVT-GI-NEXT: fcmp s0, #0.0
; CHECK-CVT-GI-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-GI-NEXT: fmov s0, s1
; CHECK-CVT-GI-NEXT: add w10, w8, w19
; CHECK-CVT-GI-NEXT: orr w8, w8, #0x400000
; CHECK-CVT-GI-NEXT: add w9, w10, w9
; CHECK-CVT-GI-NEXT: csel w8, w8, w9, vs
; CHECK-CVT-GI-NEXT: lsr w24, w8, #16
; CHECK-CVT-GI-NEXT: bl tanf
; CHECK-CVT-GI-NEXT: shll v1.4s, v9.4h, #16
; CHECK-CVT-GI-NEXT: fmov w8, s0
; CHECK-CVT-GI-NEXT: fcmp s0, #0.0
; CHECK-CVT-GI-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-GI-NEXT: fmov s0, s1
; CHECK-CVT-GI-NEXT: add w10, w8, w19
; CHECK-CVT-GI-NEXT: orr w8, w8, #0x400000
; CHECK-CVT-GI-NEXT: add w9, w10, w9
; CHECK-CVT-GI-NEXT: csel w8, w8, w9, vs
; CHECK-CVT-GI-NEXT: lsr w25, w8, #16
; CHECK-CVT-GI-NEXT: bl tanf
; CHECK-CVT-GI-NEXT: shll v1.4s, v8.4h, #16
; CHECK-CVT-GI-NEXT: fmov w8, s0
; CHECK-CVT-GI-NEXT: fcmp s0, #0.0
; CHECK-CVT-GI-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-GI-NEXT: fmov s0, s1
; CHECK-CVT-GI-NEXT: add w10, w8, w19
; CHECK-CVT-GI-NEXT: orr w8, w8, #0x400000
; CHECK-CVT-GI-NEXT: add w9, w10, w9
; CHECK-CVT-GI-NEXT: csel w8, w8, w9, vs
; CHECK-CVT-GI-NEXT: lsr w26, w8, #16
; CHECK-CVT-GI-NEXT: bl tanf
; CHECK-CVT-GI-NEXT: fmov s1, w20
; CHECK-CVT-GI-NEXT: fmov w8, s0
; CHECK-CVT-GI-NEXT: ldr x30, [sp, #56] // 8-byte Reload
; CHECK-CVT-GI-NEXT: fcmp s0, #0.0
; CHECK-CVT-GI-NEXT: ldp d9, d8, [sp, #40] // 16-byte Folded Reload
; CHECK-CVT-GI-NEXT: ldp d11, d10, [sp, #24] // 16-byte Folded Reload
; CHECK-CVT-GI-NEXT: mov v1.h[1], w21
; CHECK-CVT-GI-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-GI-NEXT: add w10, w8, w19
; CHECK-CVT-GI-NEXT: orr w8, w8, #0x400000
; CHECK-CVT-GI-NEXT: ldp x20, x19, [sp, #112] // 16-byte Folded Reload
; CHECK-CVT-GI-NEXT: add w9, w10, w9
; CHECK-CVT-GI-NEXT: ldp d13, d12, [sp, #8] // 16-byte Folded Reload
; CHECK-CVT-GI-NEXT: csel w8, w8, w9, vs
; CHECK-CVT-GI-NEXT: mov v1.h[2], w22
; CHECK-CVT-GI-NEXT: lsr w8, w8, #16
; CHECK-CVT-GI-NEXT: ldp x22, x21, [sp, #96] // 16-byte Folded Reload
; CHECK-CVT-GI-NEXT: mov v1.h[3], w23
; CHECK-CVT-GI-NEXT: mov v1.h[4], w24
; CHECK-CVT-GI-NEXT: ldp x24, x23, [sp, #80] // 16-byte Folded Reload
; CHECK-CVT-GI-NEXT: mov v1.h[5], w25
; CHECK-CVT-GI-NEXT: mov v1.h[6], w26
; CHECK-CVT-GI-NEXT: ldp x26, x25, [sp, #64] // 16-byte Folded Reload
; CHECK-CVT-GI-NEXT: mov v1.h[7], w8
; CHECK-CVT-GI-NEXT: mov v0.16b, v1.16b
; CHECK-CVT-GI-NEXT: ldr d14, [sp], #128 // 8-byte Folded Reload
; CHECK-CVT-GI-NEXT: ret
;
; CHECK-BF16-GI-LABEL: test_tan:
; CHECK-BF16-GI: // %bb.0:
; CHECK-BF16-GI-NEXT: sub sp, sp, #176
; CHECK-BF16-GI-NEXT: str d14, [sp, #112] // 8-byte Spill
; CHECK-BF16-GI-NEXT: mov h14, v0.h[6]
; CHECK-BF16-GI-NEXT: stp d13, d12, [sp, #120] // 16-byte Folded Spill
; CHECK-BF16-GI-NEXT: mov h12, v0.h[4]
; CHECK-BF16-GI-NEXT: mov h13, v0.h[5]
; CHECK-BF16-GI-NEXT: stp d11, d10, [sp, #136] // 16-byte Folded Spill
; CHECK-BF16-GI-NEXT: mov h10, v0.h[2]
; CHECK-BF16-GI-NEXT: mov h11, v0.h[3]
; CHECK-BF16-GI-NEXT: stp d9, d8, [sp, #152] // 16-byte Folded Spill
; CHECK-BF16-GI-NEXT: mov h9, v0.h[1]
; CHECK-BF16-GI-NEXT: mov h8, v0.h[7]
; CHECK-BF16-GI-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16-GI-NEXT: str x30, [sp, #168] // 8-byte Spill
; CHECK-BF16-GI-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16-GI-NEXT: bl tanf
; CHECK-BF16-GI-NEXT: bfcvt h0, s0
; CHECK-BF16-GI-NEXT: str q0, [sp, #96] // 16-byte Spill
; CHECK-BF16-GI-NEXT: shll v0.4s, v9.4h, #16
; CHECK-BF16-GI-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16-GI-NEXT: bl tanf
; CHECK-BF16-GI-NEXT: bfcvt h0, s0
; CHECK-BF16-GI-NEXT: str q0, [sp, #80] // 16-byte Spill
; CHECK-BF16-GI-NEXT: shll v0.4s, v10.4h, #16
; CHECK-BF16-GI-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16-GI-NEXT: bl tanf
; CHECK-BF16-GI-NEXT: bfcvt h0, s0
; CHECK-BF16-GI-NEXT: str q0, [sp, #64] // 16-byte Spill
; CHECK-BF16-GI-NEXT: shll v0.4s, v11.4h, #16
; CHECK-BF16-GI-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16-GI-NEXT: bl tanf
; CHECK-BF16-GI-NEXT: bfcvt h0, s0
; CHECK-BF16-GI-NEXT: str q0, [sp, #48] // 16-byte Spill
; CHECK-BF16-GI-NEXT: shll v0.4s, v12.4h, #16
; CHECK-BF16-GI-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16-GI-NEXT: bl tanf
; CHECK-BF16-GI-NEXT: bfcvt h0, s0
; CHECK-BF16-GI-NEXT: str q0, [sp, #32] // 16-byte Spill
; CHECK-BF16-GI-NEXT: shll v0.4s, v13.4h, #16
; CHECK-BF16-GI-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16-GI-NEXT: bl tanf
; CHECK-BF16-GI-NEXT: bfcvt h0, s0
; CHECK-BF16-GI-NEXT: str q0, [sp, #16] // 16-byte Spill
; CHECK-BF16-GI-NEXT: shll v0.4s, v14.4h, #16
; CHECK-BF16-GI-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16-GI-NEXT: bl tanf
; CHECK-BF16-GI-NEXT: bfcvt h0, s0
; CHECK-BF16-GI-NEXT: str q0, [sp] // 16-byte Spill
; CHECK-BF16-GI-NEXT: shll v0.4s, v8.4h, #16
; CHECK-BF16-GI-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16-GI-NEXT: bl tanf
; CHECK-BF16-GI-NEXT: ldp q2, q1, [sp, #80] // 32-byte Folded Reload
; CHECK-BF16-GI-NEXT: bfcvt h0, s0
; CHECK-BF16-GI-NEXT: ldp d9, d8, [sp, #152] // 16-byte Folded Reload
; CHECK-BF16-GI-NEXT: ldr x30, [sp, #168] // 8-byte Reload
; CHECK-BF16-GI-NEXT: ldp d11, d10, [sp, #136] // 16-byte Folded Reload
; CHECK-BF16-GI-NEXT: ldr d14, [sp, #112] // 8-byte Reload
; CHECK-BF16-GI-NEXT: mov v1.h[1], v2.h[0]
; CHECK-BF16-GI-NEXT: ldp q2, q3, [sp, #48] // 32-byte Folded Reload
; CHECK-BF16-GI-NEXT: ldp d13, d12, [sp, #120] // 16-byte Folded Reload
; CHECK-BF16-GI-NEXT: mov v1.h[2], v3.h[0]
; CHECK-BF16-GI-NEXT: mov v1.h[3], v2.h[0]
; CHECK-BF16-GI-NEXT: ldp q2, q3, [sp, #16] // 32-byte Folded Reload
; CHECK-BF16-GI-NEXT: mov v1.h[4], v3.h[0]
; CHECK-BF16-GI-NEXT: mov v1.h[5], v2.h[0]
; CHECK-BF16-GI-NEXT: ldr q2, [sp] // 16-byte Reload
; CHECK-BF16-GI-NEXT: mov v1.h[6], v2.h[0]
; CHECK-BF16-GI-NEXT: mov v1.h[7], v0.h[0]
; CHECK-BF16-GI-NEXT: mov v0.16b, v1.16b
; CHECK-BF16-GI-NEXT: add sp, sp, #176
; CHECK-BF16-GI-NEXT: ret
%r = call <8 x bfloat> @llvm.tan.v8bf16(<8 x bfloat> %a)
ret <8 x bfloat> %r
}
define <8 x bfloat> @test_acos(<8 x bfloat> %a) #0 {
; CHECK-CVT-SD-LABEL: test_acos:
; CHECK-CVT-SD: // %bb.0:
; CHECK-CVT-SD-NEXT: sub sp, sp, #48
; CHECK-CVT-SD-NEXT: mov h1, v0.h[1]
; CHECK-CVT-SD-NEXT: str q0, [sp] // 16-byte Spill
; CHECK-CVT-SD-NEXT: stp x30, x19, [sp, #32] // 16-byte Folded Spill
; CHECK-CVT-SD-NEXT: shll v0.4s, v1.4h, #16
; CHECK-CVT-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-CVT-SD-NEXT: bl acosf
; CHECK-CVT-SD-NEXT: fmov w8, s0
; CHECK-CVT-SD-NEXT: mov w19, #32767 // =0x7fff
; CHECK-CVT-SD-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-SD-NEXT: add w8, w8, w19
; CHECK-CVT-SD-NEXT: add w8, w9, w8
; CHECK-CVT-SD-NEXT: lsr w8, w8, #16
; CHECK-CVT-SD-NEXT: fmov s0, w8
; CHECK-CVT-SD-NEXT: str q0, [sp, #16] // 16-byte Spill
; CHECK-CVT-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-CVT-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-CVT-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-CVT-SD-NEXT: bl acosf
; CHECK-CVT-SD-NEXT: fmov w8, s0
; CHECK-CVT-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload
; CHECK-CVT-SD-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-SD-NEXT: add w8, w8, w19
; CHECK-CVT-SD-NEXT: add w8, w9, w8
; CHECK-CVT-SD-NEXT: lsr w8, w8, #16
; CHECK-CVT-SD-NEXT: fmov s0, w8
; CHECK-CVT-SD-NEXT: mov v0.h[1], v1.h[0]
; CHECK-CVT-SD-NEXT: str q0, [sp, #16] // 16-byte Spill
; CHECK-CVT-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-CVT-SD-NEXT: mov h0, v0.h[2]
; CHECK-CVT-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-CVT-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-CVT-SD-NEXT: bl acosf
; CHECK-CVT-SD-NEXT: fmov w8, s0
; CHECK-CVT-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload
; CHECK-CVT-SD-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-SD-NEXT: add w8, w8, w19
; CHECK-CVT-SD-NEXT: add w8, w9, w8
; CHECK-CVT-SD-NEXT: lsr w8, w8, #16
; CHECK-CVT-SD-NEXT: fmov s0, w8
; CHECK-CVT-SD-NEXT: mov v1.h[2], v0.h[0]
; CHECK-CVT-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-CVT-SD-NEXT: mov h0, v0.h[3]
; CHECK-CVT-SD-NEXT: str q1, [sp, #16] // 16-byte Spill
; CHECK-CVT-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-CVT-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-CVT-SD-NEXT: bl acosf
; CHECK-CVT-SD-NEXT: fmov w8, s0
; CHECK-CVT-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload
; CHECK-CVT-SD-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-SD-NEXT: add w8, w8, w19
; CHECK-CVT-SD-NEXT: add w8, w9, w8
; CHECK-CVT-SD-NEXT: lsr w8, w8, #16
; CHECK-CVT-SD-NEXT: fmov s0, w8
; CHECK-CVT-SD-NEXT: mov v1.h[3], v0.h[0]
; CHECK-CVT-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-CVT-SD-NEXT: mov h0, v0.h[4]
; CHECK-CVT-SD-NEXT: str q1, [sp, #16] // 16-byte Spill
; CHECK-CVT-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-CVT-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-CVT-SD-NEXT: bl acosf
; CHECK-CVT-SD-NEXT: fmov w8, s0
; CHECK-CVT-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload
; CHECK-CVT-SD-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-SD-NEXT: add w8, w8, w19
; CHECK-CVT-SD-NEXT: add w8, w9, w8
; CHECK-CVT-SD-NEXT: lsr w8, w8, #16
; CHECK-CVT-SD-NEXT: fmov s0, w8
; CHECK-CVT-SD-NEXT: mov v1.h[4], v0.h[0]
; CHECK-CVT-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-CVT-SD-NEXT: mov h0, v0.h[5]
; CHECK-CVT-SD-NEXT: str q1, [sp, #16] // 16-byte Spill
; CHECK-CVT-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-CVT-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-CVT-SD-NEXT: bl acosf
; CHECK-CVT-SD-NEXT: fmov w8, s0
; CHECK-CVT-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload
; CHECK-CVT-SD-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-SD-NEXT: add w8, w8, w19
; CHECK-CVT-SD-NEXT: add w8, w9, w8
; CHECK-CVT-SD-NEXT: lsr w8, w8, #16
; CHECK-CVT-SD-NEXT: fmov s0, w8
; CHECK-CVT-SD-NEXT: mov v1.h[5], v0.h[0]
; CHECK-CVT-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-CVT-SD-NEXT: mov h0, v0.h[6]
; CHECK-CVT-SD-NEXT: str q1, [sp, #16] // 16-byte Spill
; CHECK-CVT-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-CVT-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-CVT-SD-NEXT: bl acosf
; CHECK-CVT-SD-NEXT: fmov w8, s0
; CHECK-CVT-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload
; CHECK-CVT-SD-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-SD-NEXT: add w8, w8, w19
; CHECK-CVT-SD-NEXT: add w8, w9, w8
; CHECK-CVT-SD-NEXT: lsr w8, w8, #16
; CHECK-CVT-SD-NEXT: fmov s0, w8
; CHECK-CVT-SD-NEXT: mov v1.h[6], v0.h[0]
; CHECK-CVT-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-CVT-SD-NEXT: mov h0, v0.h[7]
; CHECK-CVT-SD-NEXT: str q1, [sp, #16] // 16-byte Spill
; CHECK-CVT-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-CVT-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-CVT-SD-NEXT: bl acosf
; CHECK-CVT-SD-NEXT: fmov w8, s0
; CHECK-CVT-SD-NEXT: ldr q0, [sp, #16] // 16-byte Reload
; CHECK-CVT-SD-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-SD-NEXT: add w8, w8, w19
; CHECK-CVT-SD-NEXT: ldp x30, x19, [sp, #32] // 16-byte Folded Reload
; CHECK-CVT-SD-NEXT: add w8, w9, w8
; CHECK-CVT-SD-NEXT: lsr w8, w8, #16
; CHECK-CVT-SD-NEXT: fmov s1, w8
; CHECK-CVT-SD-NEXT: mov v0.h[7], v1.h[0]
; CHECK-CVT-SD-NEXT: add sp, sp, #48
; CHECK-CVT-SD-NEXT: ret
;
; CHECK-BF16-SD-LABEL: test_acos:
; CHECK-BF16-SD: // %bb.0:
; CHECK-BF16-SD-NEXT: sub sp, sp, #48
; CHECK-BF16-SD-NEXT: mov h1, v0.h[1]
; CHECK-BF16-SD-NEXT: str q0, [sp] // 16-byte Spill
; CHECK-BF16-SD-NEXT: str x30, [sp, #32] // 8-byte Spill
; CHECK-BF16-SD-NEXT: shll v0.4s, v1.4h, #16
; CHECK-BF16-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16-SD-NEXT: bl acosf
; CHECK-BF16-SD-NEXT: bfcvt h0, s0
; CHECK-BF16-SD-NEXT: str q0, [sp, #16] // 16-byte Spill
; CHECK-BF16-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-BF16-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16-SD-NEXT: bl acosf
; CHECK-BF16-SD-NEXT: bfcvt h0, s0
; CHECK-BF16-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload
; CHECK-BF16-SD-NEXT: mov v0.h[1], v1.h[0]
; CHECK-BF16-SD-NEXT: str q0, [sp, #16] // 16-byte Spill
; CHECK-BF16-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-BF16-SD-NEXT: mov h0, v0.h[2]
; CHECK-BF16-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16-SD-NEXT: bl acosf
; CHECK-BF16-SD-NEXT: bfcvt h0, s0
; CHECK-BF16-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload
; CHECK-BF16-SD-NEXT: mov v1.h[2], v0.h[0]
; CHECK-BF16-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-BF16-SD-NEXT: mov h0, v0.h[3]
; CHECK-BF16-SD-NEXT: str q1, [sp, #16] // 16-byte Spill
; CHECK-BF16-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16-SD-NEXT: bl acosf
; CHECK-BF16-SD-NEXT: bfcvt h0, s0
; CHECK-BF16-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload
; CHECK-BF16-SD-NEXT: mov v1.h[3], v0.h[0]
; CHECK-BF16-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-BF16-SD-NEXT: mov h0, v0.h[4]
; CHECK-BF16-SD-NEXT: str q1, [sp, #16] // 16-byte Spill
; CHECK-BF16-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16-SD-NEXT: bl acosf
; CHECK-BF16-SD-NEXT: bfcvt h0, s0
; CHECK-BF16-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload
; CHECK-BF16-SD-NEXT: mov v1.h[4], v0.h[0]
; CHECK-BF16-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-BF16-SD-NEXT: mov h0, v0.h[5]
; CHECK-BF16-SD-NEXT: str q1, [sp, #16] // 16-byte Spill
; CHECK-BF16-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16-SD-NEXT: bl acosf
; CHECK-BF16-SD-NEXT: bfcvt h0, s0
; CHECK-BF16-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload
; CHECK-BF16-SD-NEXT: mov v1.h[5], v0.h[0]
; CHECK-BF16-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-BF16-SD-NEXT: mov h0, v0.h[6]
; CHECK-BF16-SD-NEXT: str q1, [sp, #16] // 16-byte Spill
; CHECK-BF16-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16-SD-NEXT: bl acosf
; CHECK-BF16-SD-NEXT: bfcvt h0, s0
; CHECK-BF16-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload
; CHECK-BF16-SD-NEXT: mov v1.h[6], v0.h[0]
; CHECK-BF16-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-BF16-SD-NEXT: mov h0, v0.h[7]
; CHECK-BF16-SD-NEXT: str q1, [sp, #16] // 16-byte Spill
; CHECK-BF16-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16-SD-NEXT: bl acosf
; CHECK-BF16-SD-NEXT: bfcvt h1, s0
; CHECK-BF16-SD-NEXT: ldr q0, [sp, #16] // 16-byte Reload
; CHECK-BF16-SD-NEXT: ldr x30, [sp, #32] // 8-byte Reload
; CHECK-BF16-SD-NEXT: mov v0.h[7], v1.h[0]
; CHECK-BF16-SD-NEXT: add sp, sp, #48
; CHECK-BF16-SD-NEXT: ret
;
; CHECK-BF16SVE-SD-LABEL: test_acos:
; CHECK-BF16SVE-SD: // %bb.0:
; CHECK-BF16SVE-SD-NEXT: sub sp, sp, #48
; CHECK-BF16SVE-SD-NEXT: mov h1, v0.h[1]
; CHECK-BF16SVE-SD-NEXT: str q0, [sp] // 16-byte Spill
; CHECK-BF16SVE-SD-NEXT: str x30, [sp, #32] // 8-byte Spill
; CHECK-BF16SVE-SD-NEXT: shll v0.4s, v1.4h, #16
; CHECK-BF16SVE-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16SVE-SD-NEXT: bl acosf
; CHECK-BF16SVE-SD-NEXT: bfcvt h0, s0
; CHECK-BF16SVE-SD-NEXT: str q0, [sp, #16] // 16-byte Spill
; CHECK-BF16SVE-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-BF16SVE-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16SVE-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16SVE-SD-NEXT: bl acosf
; CHECK-BF16SVE-SD-NEXT: bfcvt h0, s0
; CHECK-BF16SVE-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload
; CHECK-BF16SVE-SD-NEXT: mov v0.h[1], v1.h[0]
; CHECK-BF16SVE-SD-NEXT: str q0, [sp, #16] // 16-byte Spill
; CHECK-BF16SVE-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-BF16SVE-SD-NEXT: mov h0, v0.h[2]
; CHECK-BF16SVE-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16SVE-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16SVE-SD-NEXT: bl acosf
; CHECK-BF16SVE-SD-NEXT: bfcvt h0, s0
; CHECK-BF16SVE-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload
; CHECK-BF16SVE-SD-NEXT: mov v1.h[2], v0.h[0]
; CHECK-BF16SVE-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-BF16SVE-SD-NEXT: mov h0, v0.h[3]
; CHECK-BF16SVE-SD-NEXT: str q1, [sp, #16] // 16-byte Spill
; CHECK-BF16SVE-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16SVE-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16SVE-SD-NEXT: bl acosf
; CHECK-BF16SVE-SD-NEXT: bfcvt h0, s0
; CHECK-BF16SVE-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload
; CHECK-BF16SVE-SD-NEXT: mov v1.h[3], v0.h[0]
; CHECK-BF16SVE-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-BF16SVE-SD-NEXT: mov h0, v0.h[4]
; CHECK-BF16SVE-SD-NEXT: str q1, [sp, #16] // 16-byte Spill
; CHECK-BF16SVE-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16SVE-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16SVE-SD-NEXT: bl acosf
; CHECK-BF16SVE-SD-NEXT: bfcvt h0, s0
; CHECK-BF16SVE-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload
; CHECK-BF16SVE-SD-NEXT: mov v1.h[4], v0.h[0]
; CHECK-BF16SVE-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-BF16SVE-SD-NEXT: mov h0, v0.h[5]
; CHECK-BF16SVE-SD-NEXT: str q1, [sp, #16] // 16-byte Spill
; CHECK-BF16SVE-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16SVE-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16SVE-SD-NEXT: bl acosf
; CHECK-BF16SVE-SD-NEXT: bfcvt h0, s0
; CHECK-BF16SVE-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload
; CHECK-BF16SVE-SD-NEXT: mov v1.h[5], v0.h[0]
; CHECK-BF16SVE-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-BF16SVE-SD-NEXT: mov h0, v0.h[6]
; CHECK-BF16SVE-SD-NEXT: str q1, [sp, #16] // 16-byte Spill
; CHECK-BF16SVE-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16SVE-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16SVE-SD-NEXT: bl acosf
; CHECK-BF16SVE-SD-NEXT: bfcvt h0, s0
; CHECK-BF16SVE-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload
; CHECK-BF16SVE-SD-NEXT: mov v1.h[6], v0.h[0]
; CHECK-BF16SVE-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-BF16SVE-SD-NEXT: mov h0, v0.h[7]
; CHECK-BF16SVE-SD-NEXT: str q1, [sp, #16] // 16-byte Spill
; CHECK-BF16SVE-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16SVE-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16SVE-SD-NEXT: bl acosf
; CHECK-BF16SVE-SD-NEXT: bfcvt h1, s0
; CHECK-BF16SVE-SD-NEXT: ldr q0, [sp, #16] // 16-byte Reload
; CHECK-BF16SVE-SD-NEXT: ldr x30, [sp, #32] // 8-byte Reload
; CHECK-BF16SVE-SD-NEXT: mov v0.h[7], v1.h[0]
; CHECK-BF16SVE-SD-NEXT: add sp, sp, #48
; CHECK-BF16SVE-SD-NEXT: ret
;
; CHECK-CVT-GI-LABEL: test_acos:
; CHECK-CVT-GI: // %bb.0:
; CHECK-CVT-GI-NEXT: str d14, [sp, #-128]! // 8-byte Folded Spill
; CHECK-CVT-GI-NEXT: stp d13, d12, [sp, #8] // 16-byte Folded Spill
; CHECK-CVT-GI-NEXT: mov h12, v0.h[1]
; CHECK-CVT-GI-NEXT: mov h13, v0.h[2]
; CHECK-CVT-GI-NEXT: stp d11, d10, [sp, #24] // 16-byte Folded Spill
; CHECK-CVT-GI-NEXT: mov h14, v0.h[3]
; CHECK-CVT-GI-NEXT: mov h11, v0.h[4]
; CHECK-CVT-GI-NEXT: stp d9, d8, [sp, #40] // 16-byte Folded Spill
; CHECK-CVT-GI-NEXT: mov h10, v0.h[5]
; CHECK-CVT-GI-NEXT: mov h9, v0.h[6]
; CHECK-CVT-GI-NEXT: mov h8, v0.h[7]
; CHECK-CVT-GI-NEXT: shll v0.4s, v0.4h, #16
; CHECK-CVT-GI-NEXT: str x30, [sp, #56] // 8-byte Spill
; CHECK-CVT-GI-NEXT: stp x26, x25, [sp, #64] // 16-byte Folded Spill
; CHECK-CVT-GI-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-CVT-GI-NEXT: stp x24, x23, [sp, #80] // 16-byte Folded Spill
; CHECK-CVT-GI-NEXT: stp x22, x21, [sp, #96] // 16-byte Folded Spill
; CHECK-CVT-GI-NEXT: stp x20, x19, [sp, #112] // 16-byte Folded Spill
; CHECK-CVT-GI-NEXT: bl acosf
; CHECK-CVT-GI-NEXT: fmov w8, s0
; CHECK-CVT-GI-NEXT: mov w19, #32767 // =0x7fff
; CHECK-CVT-GI-NEXT: fcmp s0, #0.0
; CHECK-CVT-GI-NEXT: shll v0.4s, v12.4h, #16
; CHECK-CVT-GI-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-CVT-GI-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-GI-NEXT: add w10, w8, w19
; CHECK-CVT-GI-NEXT: orr w8, w8, #0x400000
; CHECK-CVT-GI-NEXT: add w9, w10, w9
; CHECK-CVT-GI-NEXT: csel w8, w8, w9, vs
; CHECK-CVT-GI-NEXT: lsr w20, w8, #16
; CHECK-CVT-GI-NEXT: bl acosf
; CHECK-CVT-GI-NEXT: shll v1.4s, v13.4h, #16
; CHECK-CVT-GI-NEXT: fmov w8, s0
; CHECK-CVT-GI-NEXT: fcmp s0, #0.0
; CHECK-CVT-GI-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-GI-NEXT: fmov s0, s1
; CHECK-CVT-GI-NEXT: add w10, w8, w19
; CHECK-CVT-GI-NEXT: orr w8, w8, #0x400000
; CHECK-CVT-GI-NEXT: add w9, w10, w9
; CHECK-CVT-GI-NEXT: csel w8, w8, w9, vs
; CHECK-CVT-GI-NEXT: lsr w21, w8, #16
; CHECK-CVT-GI-NEXT: bl acosf
; CHECK-CVT-GI-NEXT: shll v1.4s, v14.4h, #16
; CHECK-CVT-GI-NEXT: fmov w8, s0
; CHECK-CVT-GI-NEXT: fcmp s0, #0.0
; CHECK-CVT-GI-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-GI-NEXT: fmov s0, s1
; CHECK-CVT-GI-NEXT: add w10, w8, w19
; CHECK-CVT-GI-NEXT: orr w8, w8, #0x400000
; CHECK-CVT-GI-NEXT: add w9, w10, w9
; CHECK-CVT-GI-NEXT: csel w8, w8, w9, vs
; CHECK-CVT-GI-NEXT: lsr w22, w8, #16
; CHECK-CVT-GI-NEXT: bl acosf
; CHECK-CVT-GI-NEXT: shll v1.4s, v11.4h, #16
; CHECK-CVT-GI-NEXT: fmov w8, s0
; CHECK-CVT-GI-NEXT: fcmp s0, #0.0
; CHECK-CVT-GI-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-GI-NEXT: fmov s0, s1
; CHECK-CVT-GI-NEXT: add w10, w8, w19
; CHECK-CVT-GI-NEXT: orr w8, w8, #0x400000
; CHECK-CVT-GI-NEXT: add w9, w10, w9
; CHECK-CVT-GI-NEXT: csel w8, w8, w9, vs
; CHECK-CVT-GI-NEXT: lsr w23, w8, #16
; CHECK-CVT-GI-NEXT: bl acosf
; CHECK-CVT-GI-NEXT: shll v1.4s, v10.4h, #16
; CHECK-CVT-GI-NEXT: fmov w8, s0
; CHECK-CVT-GI-NEXT: fcmp s0, #0.0
; CHECK-CVT-GI-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-GI-NEXT: fmov s0, s1
; CHECK-CVT-GI-NEXT: add w10, w8, w19
; CHECK-CVT-GI-NEXT: orr w8, w8, #0x400000
; CHECK-CVT-GI-NEXT: add w9, w10, w9
; CHECK-CVT-GI-NEXT: csel w8, w8, w9, vs
; CHECK-CVT-GI-NEXT: lsr w24, w8, #16
; CHECK-CVT-GI-NEXT: bl acosf
; CHECK-CVT-GI-NEXT: shll v1.4s, v9.4h, #16
; CHECK-CVT-GI-NEXT: fmov w8, s0
; CHECK-CVT-GI-NEXT: fcmp s0, #0.0
; CHECK-CVT-GI-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-GI-NEXT: fmov s0, s1
; CHECK-CVT-GI-NEXT: add w10, w8, w19
; CHECK-CVT-GI-NEXT: orr w8, w8, #0x400000
; CHECK-CVT-GI-NEXT: add w9, w10, w9
; CHECK-CVT-GI-NEXT: csel w8, w8, w9, vs
; CHECK-CVT-GI-NEXT: lsr w25, w8, #16
; CHECK-CVT-GI-NEXT: bl acosf
; CHECK-CVT-GI-NEXT: shll v1.4s, v8.4h, #16
; CHECK-CVT-GI-NEXT: fmov w8, s0
; CHECK-CVT-GI-NEXT: fcmp s0, #0.0
; CHECK-CVT-GI-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-GI-NEXT: fmov s0, s1
; CHECK-CVT-GI-NEXT: add w10, w8, w19
; CHECK-CVT-GI-NEXT: orr w8, w8, #0x400000
; CHECK-CVT-GI-NEXT: add w9, w10, w9
; CHECK-CVT-GI-NEXT: csel w8, w8, w9, vs
; CHECK-CVT-GI-NEXT: lsr w26, w8, #16
; CHECK-CVT-GI-NEXT: bl acosf
; CHECK-CVT-GI-NEXT: fmov s1, w20
; CHECK-CVT-GI-NEXT: fmov w8, s0
; CHECK-CVT-GI-NEXT: ldr x30, [sp, #56] // 8-byte Reload
; CHECK-CVT-GI-NEXT: fcmp s0, #0.0
; CHECK-CVT-GI-NEXT: ldp d9, d8, [sp, #40] // 16-byte Folded Reload
; CHECK-CVT-GI-NEXT: ldp d11, d10, [sp, #24] // 16-byte Folded Reload
; CHECK-CVT-GI-NEXT: mov v1.h[1], w21
; CHECK-CVT-GI-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-GI-NEXT: add w10, w8, w19
; CHECK-CVT-GI-NEXT: orr w8, w8, #0x400000
; CHECK-CVT-GI-NEXT: ldp x20, x19, [sp, #112] // 16-byte Folded Reload
; CHECK-CVT-GI-NEXT: add w9, w10, w9
; CHECK-CVT-GI-NEXT: ldp d13, d12, [sp, #8] // 16-byte Folded Reload
; CHECK-CVT-GI-NEXT: csel w8, w8, w9, vs
; CHECK-CVT-GI-NEXT: mov v1.h[2], w22
; CHECK-CVT-GI-NEXT: lsr w8, w8, #16
; CHECK-CVT-GI-NEXT: ldp x22, x21, [sp, #96] // 16-byte Folded Reload
; CHECK-CVT-GI-NEXT: mov v1.h[3], w23
; CHECK-CVT-GI-NEXT: mov v1.h[4], w24
; CHECK-CVT-GI-NEXT: ldp x24, x23, [sp, #80] // 16-byte Folded Reload
; CHECK-CVT-GI-NEXT: mov v1.h[5], w25
; CHECK-CVT-GI-NEXT: mov v1.h[6], w26
; CHECK-CVT-GI-NEXT: ldp x26, x25, [sp, #64] // 16-byte Folded Reload
; CHECK-CVT-GI-NEXT: mov v1.h[7], w8
; CHECK-CVT-GI-NEXT: mov v0.16b, v1.16b
; CHECK-CVT-GI-NEXT: ldr d14, [sp], #128 // 8-byte Folded Reload
; CHECK-CVT-GI-NEXT: ret
;
; CHECK-BF16-GI-LABEL: test_acos:
; CHECK-BF16-GI: // %bb.0:
; CHECK-BF16-GI-NEXT: sub sp, sp, #176
; CHECK-BF16-GI-NEXT: str d14, [sp, #112] // 8-byte Spill
; CHECK-BF16-GI-NEXT: mov h14, v0.h[6]
; CHECK-BF16-GI-NEXT: stp d13, d12, [sp, #120] // 16-byte Folded Spill
; CHECK-BF16-GI-NEXT: mov h12, v0.h[4]
; CHECK-BF16-GI-NEXT: mov h13, v0.h[5]
; CHECK-BF16-GI-NEXT: stp d11, d10, [sp, #136] // 16-byte Folded Spill
; CHECK-BF16-GI-NEXT: mov h10, v0.h[2]
; CHECK-BF16-GI-NEXT: mov h11, v0.h[3]
; CHECK-BF16-GI-NEXT: stp d9, d8, [sp, #152] // 16-byte Folded Spill
; CHECK-BF16-GI-NEXT: mov h9, v0.h[1]
; CHECK-BF16-GI-NEXT: mov h8, v0.h[7]
; CHECK-BF16-GI-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16-GI-NEXT: str x30, [sp, #168] // 8-byte Spill
; CHECK-BF16-GI-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16-GI-NEXT: bl acosf
; CHECK-BF16-GI-NEXT: bfcvt h0, s0
; CHECK-BF16-GI-NEXT: str q0, [sp, #96] // 16-byte Spill
; CHECK-BF16-GI-NEXT: shll v0.4s, v9.4h, #16
; CHECK-BF16-GI-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16-GI-NEXT: bl acosf
; CHECK-BF16-GI-NEXT: bfcvt h0, s0
; CHECK-BF16-GI-NEXT: str q0, [sp, #80] // 16-byte Spill
; CHECK-BF16-GI-NEXT: shll v0.4s, v10.4h, #16
; CHECK-BF16-GI-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16-GI-NEXT: bl acosf
; CHECK-BF16-GI-NEXT: bfcvt h0, s0
; CHECK-BF16-GI-NEXT: str q0, [sp, #64] // 16-byte Spill
; CHECK-BF16-GI-NEXT: shll v0.4s, v11.4h, #16
; CHECK-BF16-GI-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16-GI-NEXT: bl acosf
; CHECK-BF16-GI-NEXT: bfcvt h0, s0
; CHECK-BF16-GI-NEXT: str q0, [sp, #48] // 16-byte Spill
; CHECK-BF16-GI-NEXT: shll v0.4s, v12.4h, #16
; CHECK-BF16-GI-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16-GI-NEXT: bl acosf
; CHECK-BF16-GI-NEXT: bfcvt h0, s0
; CHECK-BF16-GI-NEXT: str q0, [sp, #32] // 16-byte Spill
; CHECK-BF16-GI-NEXT: shll v0.4s, v13.4h, #16
; CHECK-BF16-GI-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16-GI-NEXT: bl acosf
; CHECK-BF16-GI-NEXT: bfcvt h0, s0
; CHECK-BF16-GI-NEXT: str q0, [sp, #16] // 16-byte Spill
; CHECK-BF16-GI-NEXT: shll v0.4s, v14.4h, #16
; CHECK-BF16-GI-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16-GI-NEXT: bl acosf
; CHECK-BF16-GI-NEXT: bfcvt h0, s0
; CHECK-BF16-GI-NEXT: str q0, [sp] // 16-byte Spill
; CHECK-BF16-GI-NEXT: shll v0.4s, v8.4h, #16
; CHECK-BF16-GI-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16-GI-NEXT: bl acosf
; CHECK-BF16-GI-NEXT: ldp q2, q1, [sp, #80] // 32-byte Folded Reload
; CHECK-BF16-GI-NEXT: bfcvt h0, s0
; CHECK-BF16-GI-NEXT: ldp d9, d8, [sp, #152] // 16-byte Folded Reload
; CHECK-BF16-GI-NEXT: ldr x30, [sp, #168] // 8-byte Reload
; CHECK-BF16-GI-NEXT: ldp d11, d10, [sp, #136] // 16-byte Folded Reload
; CHECK-BF16-GI-NEXT: ldr d14, [sp, #112] // 8-byte Reload
; CHECK-BF16-GI-NEXT: mov v1.h[1], v2.h[0]
; CHECK-BF16-GI-NEXT: ldp q2, q3, [sp, #48] // 32-byte Folded Reload
; CHECK-BF16-GI-NEXT: ldp d13, d12, [sp, #120] // 16-byte Folded Reload
; CHECK-BF16-GI-NEXT: mov v1.h[2], v3.h[0]
; CHECK-BF16-GI-NEXT: mov v1.h[3], v2.h[0]
; CHECK-BF16-GI-NEXT: ldp q2, q3, [sp, #16] // 32-byte Folded Reload
; CHECK-BF16-GI-NEXT: mov v1.h[4], v3.h[0]
; CHECK-BF16-GI-NEXT: mov v1.h[5], v2.h[0]
; CHECK-BF16-GI-NEXT: ldr q2, [sp] // 16-byte Reload
; CHECK-BF16-GI-NEXT: mov v1.h[6], v2.h[0]
; CHECK-BF16-GI-NEXT: mov v1.h[7], v0.h[0]
; CHECK-BF16-GI-NEXT: mov v0.16b, v1.16b
; CHECK-BF16-GI-NEXT: add sp, sp, #176
; CHECK-BF16-GI-NEXT: ret
%r = call <8 x bfloat> @llvm.acos.v8bf16(<8 x bfloat> %a)
ret <8 x bfloat> %r
}
define <8 x bfloat> @test_asin(<8 x bfloat> %a) #0 {
; CHECK-CVT-SD-LABEL: test_asin:
; CHECK-CVT-SD: // %bb.0:
; CHECK-CVT-SD-NEXT: sub sp, sp, #48
; CHECK-CVT-SD-NEXT: mov h1, v0.h[1]
; CHECK-CVT-SD-NEXT: str q0, [sp] // 16-byte Spill
; CHECK-CVT-SD-NEXT: stp x30, x19, [sp, #32] // 16-byte Folded Spill
; CHECK-CVT-SD-NEXT: shll v0.4s, v1.4h, #16
; CHECK-CVT-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-CVT-SD-NEXT: bl asinf
; CHECK-CVT-SD-NEXT: fmov w8, s0
; CHECK-CVT-SD-NEXT: mov w19, #32767 // =0x7fff
; CHECK-CVT-SD-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-SD-NEXT: add w8, w8, w19
; CHECK-CVT-SD-NEXT: add w8, w9, w8
; CHECK-CVT-SD-NEXT: lsr w8, w8, #16
; CHECK-CVT-SD-NEXT: fmov s0, w8
; CHECK-CVT-SD-NEXT: str q0, [sp, #16] // 16-byte Spill
; CHECK-CVT-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-CVT-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-CVT-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-CVT-SD-NEXT: bl asinf
; CHECK-CVT-SD-NEXT: fmov w8, s0
; CHECK-CVT-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload
; CHECK-CVT-SD-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-SD-NEXT: add w8, w8, w19
; CHECK-CVT-SD-NEXT: add w8, w9, w8
; CHECK-CVT-SD-NEXT: lsr w8, w8, #16
; CHECK-CVT-SD-NEXT: fmov s0, w8
; CHECK-CVT-SD-NEXT: mov v0.h[1], v1.h[0]
; CHECK-CVT-SD-NEXT: str q0, [sp, #16] // 16-byte Spill
; CHECK-CVT-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-CVT-SD-NEXT: mov h0, v0.h[2]
; CHECK-CVT-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-CVT-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-CVT-SD-NEXT: bl asinf
; CHECK-CVT-SD-NEXT: fmov w8, s0
; CHECK-CVT-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload
; CHECK-CVT-SD-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-SD-NEXT: add w8, w8, w19
; CHECK-CVT-SD-NEXT: add w8, w9, w8
; CHECK-CVT-SD-NEXT: lsr w8, w8, #16
; CHECK-CVT-SD-NEXT: fmov s0, w8
; CHECK-CVT-SD-NEXT: mov v1.h[2], v0.h[0]
; CHECK-CVT-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-CVT-SD-NEXT: mov h0, v0.h[3]
; CHECK-CVT-SD-NEXT: str q1, [sp, #16] // 16-byte Spill
; CHECK-CVT-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-CVT-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-CVT-SD-NEXT: bl asinf
; CHECK-CVT-SD-NEXT: fmov w8, s0
; CHECK-CVT-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload
; CHECK-CVT-SD-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-SD-NEXT: add w8, w8, w19
; CHECK-CVT-SD-NEXT: add w8, w9, w8
; CHECK-CVT-SD-NEXT: lsr w8, w8, #16
; CHECK-CVT-SD-NEXT: fmov s0, w8
; CHECK-CVT-SD-NEXT: mov v1.h[3], v0.h[0]
; CHECK-CVT-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-CVT-SD-NEXT: mov h0, v0.h[4]
; CHECK-CVT-SD-NEXT: str q1, [sp, #16] // 16-byte Spill
; CHECK-CVT-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-CVT-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-CVT-SD-NEXT: bl asinf
; CHECK-CVT-SD-NEXT: fmov w8, s0
; CHECK-CVT-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload
; CHECK-CVT-SD-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-SD-NEXT: add w8, w8, w19
; CHECK-CVT-SD-NEXT: add w8, w9, w8
; CHECK-CVT-SD-NEXT: lsr w8, w8, #16
; CHECK-CVT-SD-NEXT: fmov s0, w8
; CHECK-CVT-SD-NEXT: mov v1.h[4], v0.h[0]
; CHECK-CVT-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-CVT-SD-NEXT: mov h0, v0.h[5]
; CHECK-CVT-SD-NEXT: str q1, [sp, #16] // 16-byte Spill
; CHECK-CVT-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-CVT-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-CVT-SD-NEXT: bl asinf
; CHECK-CVT-SD-NEXT: fmov w8, s0
; CHECK-CVT-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload
; CHECK-CVT-SD-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-SD-NEXT: add w8, w8, w19
; CHECK-CVT-SD-NEXT: add w8, w9, w8
; CHECK-CVT-SD-NEXT: lsr w8, w8, #16
; CHECK-CVT-SD-NEXT: fmov s0, w8
; CHECK-CVT-SD-NEXT: mov v1.h[5], v0.h[0]
; CHECK-CVT-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-CVT-SD-NEXT: mov h0, v0.h[6]
; CHECK-CVT-SD-NEXT: str q1, [sp, #16] // 16-byte Spill
; CHECK-CVT-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-CVT-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-CVT-SD-NEXT: bl asinf
; CHECK-CVT-SD-NEXT: fmov w8, s0
; CHECK-CVT-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload
; CHECK-CVT-SD-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-SD-NEXT: add w8, w8, w19
; CHECK-CVT-SD-NEXT: add w8, w9, w8
; CHECK-CVT-SD-NEXT: lsr w8, w8, #16
; CHECK-CVT-SD-NEXT: fmov s0, w8
; CHECK-CVT-SD-NEXT: mov v1.h[6], v0.h[0]
; CHECK-CVT-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-CVT-SD-NEXT: mov h0, v0.h[7]
; CHECK-CVT-SD-NEXT: str q1, [sp, #16] // 16-byte Spill
; CHECK-CVT-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-CVT-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-CVT-SD-NEXT: bl asinf
; CHECK-CVT-SD-NEXT: fmov w8, s0
; CHECK-CVT-SD-NEXT: ldr q0, [sp, #16] // 16-byte Reload
; CHECK-CVT-SD-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-SD-NEXT: add w8, w8, w19
; CHECK-CVT-SD-NEXT: ldp x30, x19, [sp, #32] // 16-byte Folded Reload
; CHECK-CVT-SD-NEXT: add w8, w9, w8
; CHECK-CVT-SD-NEXT: lsr w8, w8, #16
; CHECK-CVT-SD-NEXT: fmov s1, w8
; CHECK-CVT-SD-NEXT: mov v0.h[7], v1.h[0]
; CHECK-CVT-SD-NEXT: add sp, sp, #48
; CHECK-CVT-SD-NEXT: ret
;
; CHECK-BF16-SD-LABEL: test_asin:
; CHECK-BF16-SD: // %bb.0:
; CHECK-BF16-SD-NEXT: sub sp, sp, #48
; CHECK-BF16-SD-NEXT: mov h1, v0.h[1]
; CHECK-BF16-SD-NEXT: str q0, [sp] // 16-byte Spill
; CHECK-BF16-SD-NEXT: str x30, [sp, #32] // 8-byte Spill
; CHECK-BF16-SD-NEXT: shll v0.4s, v1.4h, #16
; CHECK-BF16-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16-SD-NEXT: bl asinf
; CHECK-BF16-SD-NEXT: bfcvt h0, s0
; CHECK-BF16-SD-NEXT: str q0, [sp, #16] // 16-byte Spill
; CHECK-BF16-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-BF16-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16-SD-NEXT: bl asinf
; CHECK-BF16-SD-NEXT: bfcvt h0, s0
; CHECK-BF16-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload
; CHECK-BF16-SD-NEXT: mov v0.h[1], v1.h[0]
; CHECK-BF16-SD-NEXT: str q0, [sp, #16] // 16-byte Spill
; CHECK-BF16-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-BF16-SD-NEXT: mov h0, v0.h[2]
; CHECK-BF16-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16-SD-NEXT: bl asinf
; CHECK-BF16-SD-NEXT: bfcvt h0, s0
; CHECK-BF16-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload
; CHECK-BF16-SD-NEXT: mov v1.h[2], v0.h[0]
; CHECK-BF16-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-BF16-SD-NEXT: mov h0, v0.h[3]
; CHECK-BF16-SD-NEXT: str q1, [sp, #16] // 16-byte Spill
; CHECK-BF16-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16-SD-NEXT: bl asinf
; CHECK-BF16-SD-NEXT: bfcvt h0, s0
; CHECK-BF16-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload
; CHECK-BF16-SD-NEXT: mov v1.h[3], v0.h[0]
; CHECK-BF16-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-BF16-SD-NEXT: mov h0, v0.h[4]
; CHECK-BF16-SD-NEXT: str q1, [sp, #16] // 16-byte Spill
; CHECK-BF16-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16-SD-NEXT: bl asinf
; CHECK-BF16-SD-NEXT: bfcvt h0, s0
; CHECK-BF16-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload
; CHECK-BF16-SD-NEXT: mov v1.h[4], v0.h[0]
; CHECK-BF16-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-BF16-SD-NEXT: mov h0, v0.h[5]
; CHECK-BF16-SD-NEXT: str q1, [sp, #16] // 16-byte Spill
; CHECK-BF16-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16-SD-NEXT: bl asinf
; CHECK-BF16-SD-NEXT: bfcvt h0, s0
; CHECK-BF16-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload
; CHECK-BF16-SD-NEXT: mov v1.h[5], v0.h[0]
; CHECK-BF16-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-BF16-SD-NEXT: mov h0, v0.h[6]
; CHECK-BF16-SD-NEXT: str q1, [sp, #16] // 16-byte Spill
; CHECK-BF16-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16-SD-NEXT: bl asinf
; CHECK-BF16-SD-NEXT: bfcvt h0, s0
; CHECK-BF16-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload
; CHECK-BF16-SD-NEXT: mov v1.h[6], v0.h[0]
; CHECK-BF16-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-BF16-SD-NEXT: mov h0, v0.h[7]
; CHECK-BF16-SD-NEXT: str q1, [sp, #16] // 16-byte Spill
; CHECK-BF16-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16-SD-NEXT: bl asinf
; CHECK-BF16-SD-NEXT: bfcvt h1, s0
; CHECK-BF16-SD-NEXT: ldr q0, [sp, #16] // 16-byte Reload
; CHECK-BF16-SD-NEXT: ldr x30, [sp, #32] // 8-byte Reload
; CHECK-BF16-SD-NEXT: mov v0.h[7], v1.h[0]
; CHECK-BF16-SD-NEXT: add sp, sp, #48
; CHECK-BF16-SD-NEXT: ret
;
; CHECK-BF16SVE-SD-LABEL: test_asin:
; CHECK-BF16SVE-SD: // %bb.0:
; CHECK-BF16SVE-SD-NEXT: sub sp, sp, #48
; CHECK-BF16SVE-SD-NEXT: mov h1, v0.h[1]
; CHECK-BF16SVE-SD-NEXT: str q0, [sp] // 16-byte Spill
; CHECK-BF16SVE-SD-NEXT: str x30, [sp, #32] // 8-byte Spill
; CHECK-BF16SVE-SD-NEXT: shll v0.4s, v1.4h, #16
; CHECK-BF16SVE-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16SVE-SD-NEXT: bl asinf
; CHECK-BF16SVE-SD-NEXT: bfcvt h0, s0
; CHECK-BF16SVE-SD-NEXT: str q0, [sp, #16] // 16-byte Spill
; CHECK-BF16SVE-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-BF16SVE-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16SVE-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16SVE-SD-NEXT: bl asinf
; CHECK-BF16SVE-SD-NEXT: bfcvt h0, s0
; CHECK-BF16SVE-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload
; CHECK-BF16SVE-SD-NEXT: mov v0.h[1], v1.h[0]
; CHECK-BF16SVE-SD-NEXT: str q0, [sp, #16] // 16-byte Spill
; CHECK-BF16SVE-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-BF16SVE-SD-NEXT: mov h0, v0.h[2]
; CHECK-BF16SVE-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16SVE-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16SVE-SD-NEXT: bl asinf
; CHECK-BF16SVE-SD-NEXT: bfcvt h0, s0
; CHECK-BF16SVE-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload
; CHECK-BF16SVE-SD-NEXT: mov v1.h[2], v0.h[0]
; CHECK-BF16SVE-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-BF16SVE-SD-NEXT: mov h0, v0.h[3]
; CHECK-BF16SVE-SD-NEXT: str q1, [sp, #16] // 16-byte Spill
; CHECK-BF16SVE-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16SVE-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16SVE-SD-NEXT: bl asinf
; CHECK-BF16SVE-SD-NEXT: bfcvt h0, s0
; CHECK-BF16SVE-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload
; CHECK-BF16SVE-SD-NEXT: mov v1.h[3], v0.h[0]
; CHECK-BF16SVE-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-BF16SVE-SD-NEXT: mov h0, v0.h[4]
; CHECK-BF16SVE-SD-NEXT: str q1, [sp, #16] // 16-byte Spill
; CHECK-BF16SVE-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16SVE-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16SVE-SD-NEXT: bl asinf
; CHECK-BF16SVE-SD-NEXT: bfcvt h0, s0
; CHECK-BF16SVE-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload
; CHECK-BF16SVE-SD-NEXT: mov v1.h[4], v0.h[0]
; CHECK-BF16SVE-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-BF16SVE-SD-NEXT: mov h0, v0.h[5]
; CHECK-BF16SVE-SD-NEXT: str q1, [sp, #16] // 16-byte Spill
; CHECK-BF16SVE-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16SVE-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16SVE-SD-NEXT: bl asinf
; CHECK-BF16SVE-SD-NEXT: bfcvt h0, s0
; CHECK-BF16SVE-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload
; CHECK-BF16SVE-SD-NEXT: mov v1.h[5], v0.h[0]
; CHECK-BF16SVE-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-BF16SVE-SD-NEXT: mov h0, v0.h[6]
; CHECK-BF16SVE-SD-NEXT: str q1, [sp, #16] // 16-byte Spill
; CHECK-BF16SVE-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16SVE-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16SVE-SD-NEXT: bl asinf
; CHECK-BF16SVE-SD-NEXT: bfcvt h0, s0
; CHECK-BF16SVE-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload
; CHECK-BF16SVE-SD-NEXT: mov v1.h[6], v0.h[0]
; CHECK-BF16SVE-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-BF16SVE-SD-NEXT: mov h0, v0.h[7]
; CHECK-BF16SVE-SD-NEXT: str q1, [sp, #16] // 16-byte Spill
; CHECK-BF16SVE-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16SVE-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16SVE-SD-NEXT: bl asinf
; CHECK-BF16SVE-SD-NEXT: bfcvt h1, s0
; CHECK-BF16SVE-SD-NEXT: ldr q0, [sp, #16] // 16-byte Reload
; CHECK-BF16SVE-SD-NEXT: ldr x30, [sp, #32] // 8-byte Reload
; CHECK-BF16SVE-SD-NEXT: mov v0.h[7], v1.h[0]
; CHECK-BF16SVE-SD-NEXT: add sp, sp, #48
; CHECK-BF16SVE-SD-NEXT: ret
;
; CHECK-CVT-GI-LABEL: test_asin:
; CHECK-CVT-GI: // %bb.0:
; CHECK-CVT-GI-NEXT: str d14, [sp, #-128]! // 8-byte Folded Spill
; CHECK-CVT-GI-NEXT: stp d13, d12, [sp, #8] // 16-byte Folded Spill
; CHECK-CVT-GI-NEXT: mov h12, v0.h[1]
; CHECK-CVT-GI-NEXT: mov h13, v0.h[2]
; CHECK-CVT-GI-NEXT: stp d11, d10, [sp, #24] // 16-byte Folded Spill
; CHECK-CVT-GI-NEXT: mov h14, v0.h[3]
; CHECK-CVT-GI-NEXT: mov h11, v0.h[4]
; CHECK-CVT-GI-NEXT: stp d9, d8, [sp, #40] // 16-byte Folded Spill
; CHECK-CVT-GI-NEXT: mov h10, v0.h[5]
; CHECK-CVT-GI-NEXT: mov h9, v0.h[6]
; CHECK-CVT-GI-NEXT: mov h8, v0.h[7]
; CHECK-CVT-GI-NEXT: shll v0.4s, v0.4h, #16
; CHECK-CVT-GI-NEXT: str x30, [sp, #56] // 8-byte Spill
; CHECK-CVT-GI-NEXT: stp x26, x25, [sp, #64] // 16-byte Folded Spill
; CHECK-CVT-GI-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-CVT-GI-NEXT: stp x24, x23, [sp, #80] // 16-byte Folded Spill
; CHECK-CVT-GI-NEXT: stp x22, x21, [sp, #96] // 16-byte Folded Spill
; CHECK-CVT-GI-NEXT: stp x20, x19, [sp, #112] // 16-byte Folded Spill
; CHECK-CVT-GI-NEXT: bl asinf
; CHECK-CVT-GI-NEXT: fmov w8, s0
; CHECK-CVT-GI-NEXT: mov w19, #32767 // =0x7fff
; CHECK-CVT-GI-NEXT: fcmp s0, #0.0
; CHECK-CVT-GI-NEXT: shll v0.4s, v12.4h, #16
; CHECK-CVT-GI-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-CVT-GI-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-GI-NEXT: add w10, w8, w19
; CHECK-CVT-GI-NEXT: orr w8, w8, #0x400000
; CHECK-CVT-GI-NEXT: add w9, w10, w9
; CHECK-CVT-GI-NEXT: csel w8, w8, w9, vs
; CHECK-CVT-GI-NEXT: lsr w20, w8, #16
; CHECK-CVT-GI-NEXT: bl asinf
; CHECK-CVT-GI-NEXT: shll v1.4s, v13.4h, #16
; CHECK-CVT-GI-NEXT: fmov w8, s0
; CHECK-CVT-GI-NEXT: fcmp s0, #0.0
; CHECK-CVT-GI-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-GI-NEXT: fmov s0, s1
; CHECK-CVT-GI-NEXT: add w10, w8, w19
; CHECK-CVT-GI-NEXT: orr w8, w8, #0x400000
; CHECK-CVT-GI-NEXT: add w9, w10, w9
; CHECK-CVT-GI-NEXT: csel w8, w8, w9, vs
; CHECK-CVT-GI-NEXT: lsr w21, w8, #16
; CHECK-CVT-GI-NEXT: bl asinf
; CHECK-CVT-GI-NEXT: shll v1.4s, v14.4h, #16
; CHECK-CVT-GI-NEXT: fmov w8, s0
; CHECK-CVT-GI-NEXT: fcmp s0, #0.0
; CHECK-CVT-GI-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-GI-NEXT: fmov s0, s1
; CHECK-CVT-GI-NEXT: add w10, w8, w19
; CHECK-CVT-GI-NEXT: orr w8, w8, #0x400000
; CHECK-CVT-GI-NEXT: add w9, w10, w9
; CHECK-CVT-GI-NEXT: csel w8, w8, w9, vs
; CHECK-CVT-GI-NEXT: lsr w22, w8, #16
; CHECK-CVT-GI-NEXT: bl asinf
; CHECK-CVT-GI-NEXT: shll v1.4s, v11.4h, #16
; CHECK-CVT-GI-NEXT: fmov w8, s0
; CHECK-CVT-GI-NEXT: fcmp s0, #0.0
; CHECK-CVT-GI-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-GI-NEXT: fmov s0, s1
; CHECK-CVT-GI-NEXT: add w10, w8, w19
; CHECK-CVT-GI-NEXT: orr w8, w8, #0x400000
; CHECK-CVT-GI-NEXT: add w9, w10, w9
; CHECK-CVT-GI-NEXT: csel w8, w8, w9, vs
; CHECK-CVT-GI-NEXT: lsr w23, w8, #16
; CHECK-CVT-GI-NEXT: bl asinf
; CHECK-CVT-GI-NEXT: shll v1.4s, v10.4h, #16
; CHECK-CVT-GI-NEXT: fmov w8, s0
; CHECK-CVT-GI-NEXT: fcmp s0, #0.0
; CHECK-CVT-GI-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-GI-NEXT: fmov s0, s1
; CHECK-CVT-GI-NEXT: add w10, w8, w19
; CHECK-CVT-GI-NEXT: orr w8, w8, #0x400000
; CHECK-CVT-GI-NEXT: add w9, w10, w9
; CHECK-CVT-GI-NEXT: csel w8, w8, w9, vs
; CHECK-CVT-GI-NEXT: lsr w24, w8, #16
; CHECK-CVT-GI-NEXT: bl asinf
; CHECK-CVT-GI-NEXT: shll v1.4s, v9.4h, #16
; CHECK-CVT-GI-NEXT: fmov w8, s0
; CHECK-CVT-GI-NEXT: fcmp s0, #0.0
; CHECK-CVT-GI-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-GI-NEXT: fmov s0, s1
; CHECK-CVT-GI-NEXT: add w10, w8, w19
; CHECK-CVT-GI-NEXT: orr w8, w8, #0x400000
; CHECK-CVT-GI-NEXT: add w9, w10, w9
; CHECK-CVT-GI-NEXT: csel w8, w8, w9, vs
; CHECK-CVT-GI-NEXT: lsr w25, w8, #16
; CHECK-CVT-GI-NEXT: bl asinf
; CHECK-CVT-GI-NEXT: shll v1.4s, v8.4h, #16
; CHECK-CVT-GI-NEXT: fmov w8, s0
; CHECK-CVT-GI-NEXT: fcmp s0, #0.0
; CHECK-CVT-GI-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-GI-NEXT: fmov s0, s1
; CHECK-CVT-GI-NEXT: add w10, w8, w19
; CHECK-CVT-GI-NEXT: orr w8, w8, #0x400000
; CHECK-CVT-GI-NEXT: add w9, w10, w9
; CHECK-CVT-GI-NEXT: csel w8, w8, w9, vs
; CHECK-CVT-GI-NEXT: lsr w26, w8, #16
; CHECK-CVT-GI-NEXT: bl asinf
; CHECK-CVT-GI-NEXT: fmov s1, w20
; CHECK-CVT-GI-NEXT: fmov w8, s0
; CHECK-CVT-GI-NEXT: ldr x30, [sp, #56] // 8-byte Reload
; CHECK-CVT-GI-NEXT: fcmp s0, #0.0
; CHECK-CVT-GI-NEXT: ldp d9, d8, [sp, #40] // 16-byte Folded Reload
; CHECK-CVT-GI-NEXT: ldp d11, d10, [sp, #24] // 16-byte Folded Reload
; CHECK-CVT-GI-NEXT: mov v1.h[1], w21
; CHECK-CVT-GI-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-GI-NEXT: add w10, w8, w19
; CHECK-CVT-GI-NEXT: orr w8, w8, #0x400000
; CHECK-CVT-GI-NEXT: ldp x20, x19, [sp, #112] // 16-byte Folded Reload
; CHECK-CVT-GI-NEXT: add w9, w10, w9
; CHECK-CVT-GI-NEXT: ldp d13, d12, [sp, #8] // 16-byte Folded Reload
; CHECK-CVT-GI-NEXT: csel w8, w8, w9, vs
; CHECK-CVT-GI-NEXT: mov v1.h[2], w22
; CHECK-CVT-GI-NEXT: lsr w8, w8, #16
; CHECK-CVT-GI-NEXT: ldp x22, x21, [sp, #96] // 16-byte Folded Reload
; CHECK-CVT-GI-NEXT: mov v1.h[3], w23
; CHECK-CVT-GI-NEXT: mov v1.h[4], w24
; CHECK-CVT-GI-NEXT: ldp x24, x23, [sp, #80] // 16-byte Folded Reload
; CHECK-CVT-GI-NEXT: mov v1.h[5], w25
; CHECK-CVT-GI-NEXT: mov v1.h[6], w26
; CHECK-CVT-GI-NEXT: ldp x26, x25, [sp, #64] // 16-byte Folded Reload
; CHECK-CVT-GI-NEXT: mov v1.h[7], w8
; CHECK-CVT-GI-NEXT: mov v0.16b, v1.16b
; CHECK-CVT-GI-NEXT: ldr d14, [sp], #128 // 8-byte Folded Reload
; CHECK-CVT-GI-NEXT: ret
;
; CHECK-BF16-GI-LABEL: test_asin:
; CHECK-BF16-GI: // %bb.0:
; CHECK-BF16-GI-NEXT: sub sp, sp, #176
; CHECK-BF16-GI-NEXT: str d14, [sp, #112] // 8-byte Spill
; CHECK-BF16-GI-NEXT: mov h14, v0.h[6]
; CHECK-BF16-GI-NEXT: stp d13, d12, [sp, #120] // 16-byte Folded Spill
; CHECK-BF16-GI-NEXT: mov h12, v0.h[4]
; CHECK-BF16-GI-NEXT: mov h13, v0.h[5]
; CHECK-BF16-GI-NEXT: stp d11, d10, [sp, #136] // 16-byte Folded Spill
; CHECK-BF16-GI-NEXT: mov h10, v0.h[2]
; CHECK-BF16-GI-NEXT: mov h11, v0.h[3]
; CHECK-BF16-GI-NEXT: stp d9, d8, [sp, #152] // 16-byte Folded Spill
; CHECK-BF16-GI-NEXT: mov h9, v0.h[1]
; CHECK-BF16-GI-NEXT: mov h8, v0.h[7]
; CHECK-BF16-GI-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16-GI-NEXT: str x30, [sp, #168] // 8-byte Spill
; CHECK-BF16-GI-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16-GI-NEXT: bl asinf
; CHECK-BF16-GI-NEXT: bfcvt h0, s0
; CHECK-BF16-GI-NEXT: str q0, [sp, #96] // 16-byte Spill
; CHECK-BF16-GI-NEXT: shll v0.4s, v9.4h, #16
; CHECK-BF16-GI-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16-GI-NEXT: bl asinf
; CHECK-BF16-GI-NEXT: bfcvt h0, s0
; CHECK-BF16-GI-NEXT: str q0, [sp, #80] // 16-byte Spill
; CHECK-BF16-GI-NEXT: shll v0.4s, v10.4h, #16
; CHECK-BF16-GI-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16-GI-NEXT: bl asinf
; CHECK-BF16-GI-NEXT: bfcvt h0, s0
; CHECK-BF16-GI-NEXT: str q0, [sp, #64] // 16-byte Spill
; CHECK-BF16-GI-NEXT: shll v0.4s, v11.4h, #16
; CHECK-BF16-GI-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16-GI-NEXT: bl asinf
; CHECK-BF16-GI-NEXT: bfcvt h0, s0
; CHECK-BF16-GI-NEXT: str q0, [sp, #48] // 16-byte Spill
; CHECK-BF16-GI-NEXT: shll v0.4s, v12.4h, #16
; CHECK-BF16-GI-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16-GI-NEXT: bl asinf
; CHECK-BF16-GI-NEXT: bfcvt h0, s0
; CHECK-BF16-GI-NEXT: str q0, [sp, #32] // 16-byte Spill
; CHECK-BF16-GI-NEXT: shll v0.4s, v13.4h, #16
; CHECK-BF16-GI-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16-GI-NEXT: bl asinf
; CHECK-BF16-GI-NEXT: bfcvt h0, s0
; CHECK-BF16-GI-NEXT: str q0, [sp, #16] // 16-byte Spill
; CHECK-BF16-GI-NEXT: shll v0.4s, v14.4h, #16
; CHECK-BF16-GI-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16-GI-NEXT: bl asinf
; CHECK-BF16-GI-NEXT: bfcvt h0, s0
; CHECK-BF16-GI-NEXT: str q0, [sp] // 16-byte Spill
; CHECK-BF16-GI-NEXT: shll v0.4s, v8.4h, #16
; CHECK-BF16-GI-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16-GI-NEXT: bl asinf
; CHECK-BF16-GI-NEXT: ldp q2, q1, [sp, #80] // 32-byte Folded Reload
; CHECK-BF16-GI-NEXT: bfcvt h0, s0
; CHECK-BF16-GI-NEXT: ldp d9, d8, [sp, #152] // 16-byte Folded Reload
; CHECK-BF16-GI-NEXT: ldr x30, [sp, #168] // 8-byte Reload
; CHECK-BF16-GI-NEXT: ldp d11, d10, [sp, #136] // 16-byte Folded Reload
; CHECK-BF16-GI-NEXT: ldr d14, [sp, #112] // 8-byte Reload
; CHECK-BF16-GI-NEXT: mov v1.h[1], v2.h[0]
; CHECK-BF16-GI-NEXT: ldp q2, q3, [sp, #48] // 32-byte Folded Reload
; CHECK-BF16-GI-NEXT: ldp d13, d12, [sp, #120] // 16-byte Folded Reload
; CHECK-BF16-GI-NEXT: mov v1.h[2], v3.h[0]
; CHECK-BF16-GI-NEXT: mov v1.h[3], v2.h[0]
; CHECK-BF16-GI-NEXT: ldp q2, q3, [sp, #16] // 32-byte Folded Reload
; CHECK-BF16-GI-NEXT: mov v1.h[4], v3.h[0]
; CHECK-BF16-GI-NEXT: mov v1.h[5], v2.h[0]
; CHECK-BF16-GI-NEXT: ldr q2, [sp] // 16-byte Reload
; CHECK-BF16-GI-NEXT: mov v1.h[6], v2.h[0]
; CHECK-BF16-GI-NEXT: mov v1.h[7], v0.h[0]
; CHECK-BF16-GI-NEXT: mov v0.16b, v1.16b
; CHECK-BF16-GI-NEXT: add sp, sp, #176
; CHECK-BF16-GI-NEXT: ret
%r = call <8 x bfloat> @llvm.asin.v8bf16(<8 x bfloat> %a)
ret <8 x bfloat> %r
}
define <8 x bfloat> @test_atan(<8 x bfloat> %a) #0 {
; CHECK-CVT-SD-LABEL: test_atan:
; CHECK-CVT-SD: // %bb.0:
; CHECK-CVT-SD-NEXT: sub sp, sp, #48
; CHECK-CVT-SD-NEXT: mov h1, v0.h[1]
; CHECK-CVT-SD-NEXT: str q0, [sp] // 16-byte Spill
; CHECK-CVT-SD-NEXT: stp x30, x19, [sp, #32] // 16-byte Folded Spill
; CHECK-CVT-SD-NEXT: shll v0.4s, v1.4h, #16
; CHECK-CVT-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-CVT-SD-NEXT: bl atanf
; CHECK-CVT-SD-NEXT: fmov w8, s0
; CHECK-CVT-SD-NEXT: mov w19, #32767 // =0x7fff
; CHECK-CVT-SD-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-SD-NEXT: add w8, w8, w19
; CHECK-CVT-SD-NEXT: add w8, w9, w8
; CHECK-CVT-SD-NEXT: lsr w8, w8, #16
; CHECK-CVT-SD-NEXT: fmov s0, w8
; CHECK-CVT-SD-NEXT: str q0, [sp, #16] // 16-byte Spill
; CHECK-CVT-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-CVT-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-CVT-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-CVT-SD-NEXT: bl atanf
; CHECK-CVT-SD-NEXT: fmov w8, s0
; CHECK-CVT-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload
; CHECK-CVT-SD-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-SD-NEXT: add w8, w8, w19
; CHECK-CVT-SD-NEXT: add w8, w9, w8
; CHECK-CVT-SD-NEXT: lsr w8, w8, #16
; CHECK-CVT-SD-NEXT: fmov s0, w8
; CHECK-CVT-SD-NEXT: mov v0.h[1], v1.h[0]
; CHECK-CVT-SD-NEXT: str q0, [sp, #16] // 16-byte Spill
; CHECK-CVT-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-CVT-SD-NEXT: mov h0, v0.h[2]
; CHECK-CVT-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-CVT-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-CVT-SD-NEXT: bl atanf
; CHECK-CVT-SD-NEXT: fmov w8, s0
; CHECK-CVT-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload
; CHECK-CVT-SD-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-SD-NEXT: add w8, w8, w19
; CHECK-CVT-SD-NEXT: add w8, w9, w8
; CHECK-CVT-SD-NEXT: lsr w8, w8, #16
; CHECK-CVT-SD-NEXT: fmov s0, w8
; CHECK-CVT-SD-NEXT: mov v1.h[2], v0.h[0]
; CHECK-CVT-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-CVT-SD-NEXT: mov h0, v0.h[3]
; CHECK-CVT-SD-NEXT: str q1, [sp, #16] // 16-byte Spill
; CHECK-CVT-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-CVT-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-CVT-SD-NEXT: bl atanf
; CHECK-CVT-SD-NEXT: fmov w8, s0
; CHECK-CVT-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload
; CHECK-CVT-SD-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-SD-NEXT: add w8, w8, w19
; CHECK-CVT-SD-NEXT: add w8, w9, w8
; CHECK-CVT-SD-NEXT: lsr w8, w8, #16
; CHECK-CVT-SD-NEXT: fmov s0, w8
; CHECK-CVT-SD-NEXT: mov v1.h[3], v0.h[0]
; CHECK-CVT-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-CVT-SD-NEXT: mov h0, v0.h[4]
; CHECK-CVT-SD-NEXT: str q1, [sp, #16] // 16-byte Spill
; CHECK-CVT-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-CVT-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-CVT-SD-NEXT: bl atanf
; CHECK-CVT-SD-NEXT: fmov w8, s0
; CHECK-CVT-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload
; CHECK-CVT-SD-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-SD-NEXT: add w8, w8, w19
; CHECK-CVT-SD-NEXT: add w8, w9, w8
; CHECK-CVT-SD-NEXT: lsr w8, w8, #16
; CHECK-CVT-SD-NEXT: fmov s0, w8
; CHECK-CVT-SD-NEXT: mov v1.h[4], v0.h[0]
; CHECK-CVT-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-CVT-SD-NEXT: mov h0, v0.h[5]
; CHECK-CVT-SD-NEXT: str q1, [sp, #16] // 16-byte Spill
; CHECK-CVT-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-CVT-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-CVT-SD-NEXT: bl atanf
; CHECK-CVT-SD-NEXT: fmov w8, s0
; CHECK-CVT-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload
; CHECK-CVT-SD-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-SD-NEXT: add w8, w8, w19
; CHECK-CVT-SD-NEXT: add w8, w9, w8
; CHECK-CVT-SD-NEXT: lsr w8, w8, #16
; CHECK-CVT-SD-NEXT: fmov s0, w8
; CHECK-CVT-SD-NEXT: mov v1.h[5], v0.h[0]
; CHECK-CVT-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-CVT-SD-NEXT: mov h0, v0.h[6]
; CHECK-CVT-SD-NEXT: str q1, [sp, #16] // 16-byte Spill
; CHECK-CVT-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-CVT-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-CVT-SD-NEXT: bl atanf
; CHECK-CVT-SD-NEXT: fmov w8, s0
; CHECK-CVT-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload
; CHECK-CVT-SD-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-SD-NEXT: add w8, w8, w19
; CHECK-CVT-SD-NEXT: add w8, w9, w8
; CHECK-CVT-SD-NEXT: lsr w8, w8, #16
; CHECK-CVT-SD-NEXT: fmov s0, w8
; CHECK-CVT-SD-NEXT: mov v1.h[6], v0.h[0]
; CHECK-CVT-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-CVT-SD-NEXT: mov h0, v0.h[7]
; CHECK-CVT-SD-NEXT: str q1, [sp, #16] // 16-byte Spill
; CHECK-CVT-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-CVT-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-CVT-SD-NEXT: bl atanf
; CHECK-CVT-SD-NEXT: fmov w8, s0
; CHECK-CVT-SD-NEXT: ldr q0, [sp, #16] // 16-byte Reload
; CHECK-CVT-SD-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-SD-NEXT: add w8, w8, w19
; CHECK-CVT-SD-NEXT: ldp x30, x19, [sp, #32] // 16-byte Folded Reload
; CHECK-CVT-SD-NEXT: add w8, w9, w8
; CHECK-CVT-SD-NEXT: lsr w8, w8, #16
; CHECK-CVT-SD-NEXT: fmov s1, w8
; CHECK-CVT-SD-NEXT: mov v0.h[7], v1.h[0]
; CHECK-CVT-SD-NEXT: add sp, sp, #48
; CHECK-CVT-SD-NEXT: ret
;
; CHECK-BF16-SD-LABEL: test_atan:
; CHECK-BF16-SD: // %bb.0:
; CHECK-BF16-SD-NEXT: sub sp, sp, #48
; CHECK-BF16-SD-NEXT: mov h1, v0.h[1]
; CHECK-BF16-SD-NEXT: str q0, [sp] // 16-byte Spill
; CHECK-BF16-SD-NEXT: str x30, [sp, #32] // 8-byte Spill
; CHECK-BF16-SD-NEXT: shll v0.4s, v1.4h, #16
; CHECK-BF16-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16-SD-NEXT: bl atanf
; CHECK-BF16-SD-NEXT: bfcvt h0, s0
; CHECK-BF16-SD-NEXT: str q0, [sp, #16] // 16-byte Spill
; CHECK-BF16-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-BF16-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16-SD-NEXT: bl atanf
; CHECK-BF16-SD-NEXT: bfcvt h0, s0
; CHECK-BF16-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload
; CHECK-BF16-SD-NEXT: mov v0.h[1], v1.h[0]
; CHECK-BF16-SD-NEXT: str q0, [sp, #16] // 16-byte Spill
; CHECK-BF16-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-BF16-SD-NEXT: mov h0, v0.h[2]
; CHECK-BF16-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16-SD-NEXT: bl atanf
; CHECK-BF16-SD-NEXT: bfcvt h0, s0
; CHECK-BF16-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload
; CHECK-BF16-SD-NEXT: mov v1.h[2], v0.h[0]
; CHECK-BF16-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-BF16-SD-NEXT: mov h0, v0.h[3]
; CHECK-BF16-SD-NEXT: str q1, [sp, #16] // 16-byte Spill
; CHECK-BF16-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16-SD-NEXT: bl atanf
; CHECK-BF16-SD-NEXT: bfcvt h0, s0
; CHECK-BF16-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload
; CHECK-BF16-SD-NEXT: mov v1.h[3], v0.h[0]
; CHECK-BF16-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-BF16-SD-NEXT: mov h0, v0.h[4]
; CHECK-BF16-SD-NEXT: str q1, [sp, #16] // 16-byte Spill
; CHECK-BF16-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16-SD-NEXT: bl atanf
; CHECK-BF16-SD-NEXT: bfcvt h0, s0
; CHECK-BF16-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload
; CHECK-BF16-SD-NEXT: mov v1.h[4], v0.h[0]
; CHECK-BF16-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-BF16-SD-NEXT: mov h0, v0.h[5]
; CHECK-BF16-SD-NEXT: str q1, [sp, #16] // 16-byte Spill
; CHECK-BF16-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16-SD-NEXT: bl atanf
; CHECK-BF16-SD-NEXT: bfcvt h0, s0
; CHECK-BF16-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload
; CHECK-BF16-SD-NEXT: mov v1.h[5], v0.h[0]
; CHECK-BF16-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-BF16-SD-NEXT: mov h0, v0.h[6]
; CHECK-BF16-SD-NEXT: str q1, [sp, #16] // 16-byte Spill
; CHECK-BF16-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16-SD-NEXT: bl atanf
; CHECK-BF16-SD-NEXT: bfcvt h0, s0
; CHECK-BF16-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload
; CHECK-BF16-SD-NEXT: mov v1.h[6], v0.h[0]
; CHECK-BF16-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-BF16-SD-NEXT: mov h0, v0.h[7]
; CHECK-BF16-SD-NEXT: str q1, [sp, #16] // 16-byte Spill
; CHECK-BF16-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16-SD-NEXT: bl atanf
; CHECK-BF16-SD-NEXT: bfcvt h1, s0
; CHECK-BF16-SD-NEXT: ldr q0, [sp, #16] // 16-byte Reload
; CHECK-BF16-SD-NEXT: ldr x30, [sp, #32] // 8-byte Reload
; CHECK-BF16-SD-NEXT: mov v0.h[7], v1.h[0]
; CHECK-BF16-SD-NEXT: add sp, sp, #48
; CHECK-BF16-SD-NEXT: ret
;
; CHECK-BF16SVE-SD-LABEL: test_atan:
; CHECK-BF16SVE-SD: // %bb.0:
; CHECK-BF16SVE-SD-NEXT: sub sp, sp, #48
; CHECK-BF16SVE-SD-NEXT: mov h1, v0.h[1]
; CHECK-BF16SVE-SD-NEXT: str q0, [sp] // 16-byte Spill
; CHECK-BF16SVE-SD-NEXT: str x30, [sp, #32] // 8-byte Spill
; CHECK-BF16SVE-SD-NEXT: shll v0.4s, v1.4h, #16
; CHECK-BF16SVE-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16SVE-SD-NEXT: bl atanf
; CHECK-BF16SVE-SD-NEXT: bfcvt h0, s0
; CHECK-BF16SVE-SD-NEXT: str q0, [sp, #16] // 16-byte Spill
; CHECK-BF16SVE-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-BF16SVE-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16SVE-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16SVE-SD-NEXT: bl atanf
; CHECK-BF16SVE-SD-NEXT: bfcvt h0, s0
; CHECK-BF16SVE-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload
; CHECK-BF16SVE-SD-NEXT: mov v0.h[1], v1.h[0]
; CHECK-BF16SVE-SD-NEXT: str q0, [sp, #16] // 16-byte Spill
; CHECK-BF16SVE-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-BF16SVE-SD-NEXT: mov h0, v0.h[2]
; CHECK-BF16SVE-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16SVE-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16SVE-SD-NEXT: bl atanf
; CHECK-BF16SVE-SD-NEXT: bfcvt h0, s0
; CHECK-BF16SVE-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload
; CHECK-BF16SVE-SD-NEXT: mov v1.h[2], v0.h[0]
; CHECK-BF16SVE-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-BF16SVE-SD-NEXT: mov h0, v0.h[3]
; CHECK-BF16SVE-SD-NEXT: str q1, [sp, #16] // 16-byte Spill
; CHECK-BF16SVE-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16SVE-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16SVE-SD-NEXT: bl atanf
; CHECK-BF16SVE-SD-NEXT: bfcvt h0, s0
; CHECK-BF16SVE-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload
; CHECK-BF16SVE-SD-NEXT: mov v1.h[3], v0.h[0]
; CHECK-BF16SVE-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-BF16SVE-SD-NEXT: mov h0, v0.h[4]
; CHECK-BF16SVE-SD-NEXT: str q1, [sp, #16] // 16-byte Spill
; CHECK-BF16SVE-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16SVE-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16SVE-SD-NEXT: bl atanf
; CHECK-BF16SVE-SD-NEXT: bfcvt h0, s0
; CHECK-BF16SVE-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload
; CHECK-BF16SVE-SD-NEXT: mov v1.h[4], v0.h[0]
; CHECK-BF16SVE-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-BF16SVE-SD-NEXT: mov h0, v0.h[5]
; CHECK-BF16SVE-SD-NEXT: str q1, [sp, #16] // 16-byte Spill
; CHECK-BF16SVE-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16SVE-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16SVE-SD-NEXT: bl atanf
; CHECK-BF16SVE-SD-NEXT: bfcvt h0, s0
; CHECK-BF16SVE-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload
; CHECK-BF16SVE-SD-NEXT: mov v1.h[5], v0.h[0]
; CHECK-BF16SVE-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-BF16SVE-SD-NEXT: mov h0, v0.h[6]
; CHECK-BF16SVE-SD-NEXT: str q1, [sp, #16] // 16-byte Spill
; CHECK-BF16SVE-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16SVE-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16SVE-SD-NEXT: bl atanf
; CHECK-BF16SVE-SD-NEXT: bfcvt h0, s0
; CHECK-BF16SVE-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload
; CHECK-BF16SVE-SD-NEXT: mov v1.h[6], v0.h[0]
; CHECK-BF16SVE-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-BF16SVE-SD-NEXT: mov h0, v0.h[7]
; CHECK-BF16SVE-SD-NEXT: str q1, [sp, #16] // 16-byte Spill
; CHECK-BF16SVE-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16SVE-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16SVE-SD-NEXT: bl atanf
; CHECK-BF16SVE-SD-NEXT: bfcvt h1, s0
; CHECK-BF16SVE-SD-NEXT: ldr q0, [sp, #16] // 16-byte Reload
; CHECK-BF16SVE-SD-NEXT: ldr x30, [sp, #32] // 8-byte Reload
; CHECK-BF16SVE-SD-NEXT: mov v0.h[7], v1.h[0]
; CHECK-BF16SVE-SD-NEXT: add sp, sp, #48
; CHECK-BF16SVE-SD-NEXT: ret
;
; CHECK-CVT-GI-LABEL: test_atan:
; CHECK-CVT-GI: // %bb.0:
; CHECK-CVT-GI-NEXT: str d14, [sp, #-128]! // 8-byte Folded Spill
; CHECK-CVT-GI-NEXT: stp d13, d12, [sp, #8] // 16-byte Folded Spill
; CHECK-CVT-GI-NEXT: mov h12, v0.h[1]
; CHECK-CVT-GI-NEXT: mov h13, v0.h[2]
; CHECK-CVT-GI-NEXT: stp d11, d10, [sp, #24] // 16-byte Folded Spill
; CHECK-CVT-GI-NEXT: mov h14, v0.h[3]
; CHECK-CVT-GI-NEXT: mov h11, v0.h[4]
; CHECK-CVT-GI-NEXT: stp d9, d8, [sp, #40] // 16-byte Folded Spill
; CHECK-CVT-GI-NEXT: mov h10, v0.h[5]
; CHECK-CVT-GI-NEXT: mov h9, v0.h[6]
; CHECK-CVT-GI-NEXT: mov h8, v0.h[7]
; CHECK-CVT-GI-NEXT: shll v0.4s, v0.4h, #16
; CHECK-CVT-GI-NEXT: str x30, [sp, #56] // 8-byte Spill
; CHECK-CVT-GI-NEXT: stp x26, x25, [sp, #64] // 16-byte Folded Spill
; CHECK-CVT-GI-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-CVT-GI-NEXT: stp x24, x23, [sp, #80] // 16-byte Folded Spill
; CHECK-CVT-GI-NEXT: stp x22, x21, [sp, #96] // 16-byte Folded Spill
; CHECK-CVT-GI-NEXT: stp x20, x19, [sp, #112] // 16-byte Folded Spill
; CHECK-CVT-GI-NEXT: bl atanf
; CHECK-CVT-GI-NEXT: fmov w8, s0
; CHECK-CVT-GI-NEXT: mov w19, #32767 // =0x7fff
; CHECK-CVT-GI-NEXT: fcmp s0, #0.0
; CHECK-CVT-GI-NEXT: shll v0.4s, v12.4h, #16
; CHECK-CVT-GI-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-CVT-GI-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-GI-NEXT: add w10, w8, w19
; CHECK-CVT-GI-NEXT: orr w8, w8, #0x400000
; CHECK-CVT-GI-NEXT: add w9, w10, w9
; CHECK-CVT-GI-NEXT: csel w8, w8, w9, vs
; CHECK-CVT-GI-NEXT: lsr w20, w8, #16
; CHECK-CVT-GI-NEXT: bl atanf
; CHECK-CVT-GI-NEXT: shll v1.4s, v13.4h, #16
; CHECK-CVT-GI-NEXT: fmov w8, s0
; CHECK-CVT-GI-NEXT: fcmp s0, #0.0
; CHECK-CVT-GI-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-GI-NEXT: fmov s0, s1
; CHECK-CVT-GI-NEXT: add w10, w8, w19
; CHECK-CVT-GI-NEXT: orr w8, w8, #0x400000
; CHECK-CVT-GI-NEXT: add w9, w10, w9
; CHECK-CVT-GI-NEXT: csel w8, w8, w9, vs
; CHECK-CVT-GI-NEXT: lsr w21, w8, #16
; CHECK-CVT-GI-NEXT: bl atanf
; CHECK-CVT-GI-NEXT: shll v1.4s, v14.4h, #16
; CHECK-CVT-GI-NEXT: fmov w8, s0
; CHECK-CVT-GI-NEXT: fcmp s0, #0.0
; CHECK-CVT-GI-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-GI-NEXT: fmov s0, s1
; CHECK-CVT-GI-NEXT: add w10, w8, w19
; CHECK-CVT-GI-NEXT: orr w8, w8, #0x400000
; CHECK-CVT-GI-NEXT: add w9, w10, w9
; CHECK-CVT-GI-NEXT: csel w8, w8, w9, vs
; CHECK-CVT-GI-NEXT: lsr w22, w8, #16
; CHECK-CVT-GI-NEXT: bl atanf
; CHECK-CVT-GI-NEXT: shll v1.4s, v11.4h, #16
; CHECK-CVT-GI-NEXT: fmov w8, s0
; CHECK-CVT-GI-NEXT: fcmp s0, #0.0
; CHECK-CVT-GI-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-GI-NEXT: fmov s0, s1
; CHECK-CVT-GI-NEXT: add w10, w8, w19
; CHECK-CVT-GI-NEXT: orr w8, w8, #0x400000
; CHECK-CVT-GI-NEXT: add w9, w10, w9
; CHECK-CVT-GI-NEXT: csel w8, w8, w9, vs
; CHECK-CVT-GI-NEXT: lsr w23, w8, #16
; CHECK-CVT-GI-NEXT: bl atanf
; CHECK-CVT-GI-NEXT: shll v1.4s, v10.4h, #16
; CHECK-CVT-GI-NEXT: fmov w8, s0
; CHECK-CVT-GI-NEXT: fcmp s0, #0.0
; CHECK-CVT-GI-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-GI-NEXT: fmov s0, s1
; CHECK-CVT-GI-NEXT: add w10, w8, w19
; CHECK-CVT-GI-NEXT: orr w8, w8, #0x400000
; CHECK-CVT-GI-NEXT: add w9, w10, w9
; CHECK-CVT-GI-NEXT: csel w8, w8, w9, vs
; CHECK-CVT-GI-NEXT: lsr w24, w8, #16
; CHECK-CVT-GI-NEXT: bl atanf
; CHECK-CVT-GI-NEXT: shll v1.4s, v9.4h, #16
; CHECK-CVT-GI-NEXT: fmov w8, s0
; CHECK-CVT-GI-NEXT: fcmp s0, #0.0
; CHECK-CVT-GI-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-GI-NEXT: fmov s0, s1
; CHECK-CVT-GI-NEXT: add w10, w8, w19
; CHECK-CVT-GI-NEXT: orr w8, w8, #0x400000
; CHECK-CVT-GI-NEXT: add w9, w10, w9
; CHECK-CVT-GI-NEXT: csel w8, w8, w9, vs
; CHECK-CVT-GI-NEXT: lsr w25, w8, #16
; CHECK-CVT-GI-NEXT: bl atanf
; CHECK-CVT-GI-NEXT: shll v1.4s, v8.4h, #16
; CHECK-CVT-GI-NEXT: fmov w8, s0
; CHECK-CVT-GI-NEXT: fcmp s0, #0.0
; CHECK-CVT-GI-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-GI-NEXT: fmov s0, s1
; CHECK-CVT-GI-NEXT: add w10, w8, w19
; CHECK-CVT-GI-NEXT: orr w8, w8, #0x400000
; CHECK-CVT-GI-NEXT: add w9, w10, w9
; CHECK-CVT-GI-NEXT: csel w8, w8, w9, vs
; CHECK-CVT-GI-NEXT: lsr w26, w8, #16
; CHECK-CVT-GI-NEXT: bl atanf
; CHECK-CVT-GI-NEXT: fmov s1, w20
; CHECK-CVT-GI-NEXT: fmov w8, s0
; CHECK-CVT-GI-NEXT: ldr x30, [sp, #56] // 8-byte Reload
; CHECK-CVT-GI-NEXT: fcmp s0, #0.0
; CHECK-CVT-GI-NEXT: ldp d9, d8, [sp, #40] // 16-byte Folded Reload
; CHECK-CVT-GI-NEXT: ldp d11, d10, [sp, #24] // 16-byte Folded Reload
; CHECK-CVT-GI-NEXT: mov v1.h[1], w21
; CHECK-CVT-GI-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-GI-NEXT: add w10, w8, w19
; CHECK-CVT-GI-NEXT: orr w8, w8, #0x400000
; CHECK-CVT-GI-NEXT: ldp x20, x19, [sp, #112] // 16-byte Folded Reload
; CHECK-CVT-GI-NEXT: add w9, w10, w9
; CHECK-CVT-GI-NEXT: ldp d13, d12, [sp, #8] // 16-byte Folded Reload
; CHECK-CVT-GI-NEXT: csel w8, w8, w9, vs
; CHECK-CVT-GI-NEXT: mov v1.h[2], w22
; CHECK-CVT-GI-NEXT: lsr w8, w8, #16
; CHECK-CVT-GI-NEXT: ldp x22, x21, [sp, #96] // 16-byte Folded Reload
; CHECK-CVT-GI-NEXT: mov v1.h[3], w23
; CHECK-CVT-GI-NEXT: mov v1.h[4], w24
; CHECK-CVT-GI-NEXT: ldp x24, x23, [sp, #80] // 16-byte Folded Reload
; CHECK-CVT-GI-NEXT: mov v1.h[5], w25
; CHECK-CVT-GI-NEXT: mov v1.h[6], w26
; CHECK-CVT-GI-NEXT: ldp x26, x25, [sp, #64] // 16-byte Folded Reload
; CHECK-CVT-GI-NEXT: mov v1.h[7], w8
; CHECK-CVT-GI-NEXT: mov v0.16b, v1.16b
; CHECK-CVT-GI-NEXT: ldr d14, [sp], #128 // 8-byte Folded Reload
; CHECK-CVT-GI-NEXT: ret
;
; CHECK-BF16-GI-LABEL: test_atan:
; CHECK-BF16-GI: // %bb.0:
; CHECK-BF16-GI-NEXT: sub sp, sp, #176
; CHECK-BF16-GI-NEXT: str d14, [sp, #112] // 8-byte Spill
; CHECK-BF16-GI-NEXT: mov h14, v0.h[6]
; CHECK-BF16-GI-NEXT: stp d13, d12, [sp, #120] // 16-byte Folded Spill
; CHECK-BF16-GI-NEXT: mov h12, v0.h[4]
; CHECK-BF16-GI-NEXT: mov h13, v0.h[5]
; CHECK-BF16-GI-NEXT: stp d11, d10, [sp, #136] // 16-byte Folded Spill
; CHECK-BF16-GI-NEXT: mov h10, v0.h[2]
; CHECK-BF16-GI-NEXT: mov h11, v0.h[3]
; CHECK-BF16-GI-NEXT: stp d9, d8, [sp, #152] // 16-byte Folded Spill
; CHECK-BF16-GI-NEXT: mov h9, v0.h[1]
; CHECK-BF16-GI-NEXT: mov h8, v0.h[7]
; CHECK-BF16-GI-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16-GI-NEXT: str x30, [sp, #168] // 8-byte Spill
; CHECK-BF16-GI-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16-GI-NEXT: bl atanf
; CHECK-BF16-GI-NEXT: bfcvt h0, s0
; CHECK-BF16-GI-NEXT: str q0, [sp, #96] // 16-byte Spill
; CHECK-BF16-GI-NEXT: shll v0.4s, v9.4h, #16
; CHECK-BF16-GI-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16-GI-NEXT: bl atanf
; CHECK-BF16-GI-NEXT: bfcvt h0, s0
; CHECK-BF16-GI-NEXT: str q0, [sp, #80] // 16-byte Spill
; CHECK-BF16-GI-NEXT: shll v0.4s, v10.4h, #16
; CHECK-BF16-GI-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16-GI-NEXT: bl atanf
; CHECK-BF16-GI-NEXT: bfcvt h0, s0
; CHECK-BF16-GI-NEXT: str q0, [sp, #64] // 16-byte Spill
; CHECK-BF16-GI-NEXT: shll v0.4s, v11.4h, #16
; CHECK-BF16-GI-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16-GI-NEXT: bl atanf
; CHECK-BF16-GI-NEXT: bfcvt h0, s0
; CHECK-BF16-GI-NEXT: str q0, [sp, #48] // 16-byte Spill
; CHECK-BF16-GI-NEXT: shll v0.4s, v12.4h, #16
; CHECK-BF16-GI-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16-GI-NEXT: bl atanf
; CHECK-BF16-GI-NEXT: bfcvt h0, s0
; CHECK-BF16-GI-NEXT: str q0, [sp, #32] // 16-byte Spill
; CHECK-BF16-GI-NEXT: shll v0.4s, v13.4h, #16
; CHECK-BF16-GI-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16-GI-NEXT: bl atanf
; CHECK-BF16-GI-NEXT: bfcvt h0, s0
; CHECK-BF16-GI-NEXT: str q0, [sp, #16] // 16-byte Spill
; CHECK-BF16-GI-NEXT: shll v0.4s, v14.4h, #16
; CHECK-BF16-GI-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16-GI-NEXT: bl atanf
; CHECK-BF16-GI-NEXT: bfcvt h0, s0
; CHECK-BF16-GI-NEXT: str q0, [sp] // 16-byte Spill
; CHECK-BF16-GI-NEXT: shll v0.4s, v8.4h, #16
; CHECK-BF16-GI-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16-GI-NEXT: bl atanf
; CHECK-BF16-GI-NEXT: ldp q2, q1, [sp, #80] // 32-byte Folded Reload
; CHECK-BF16-GI-NEXT: bfcvt h0, s0
; CHECK-BF16-GI-NEXT: ldp d9, d8, [sp, #152] // 16-byte Folded Reload
; CHECK-BF16-GI-NEXT: ldr x30, [sp, #168] // 8-byte Reload
; CHECK-BF16-GI-NEXT: ldp d11, d10, [sp, #136] // 16-byte Folded Reload
; CHECK-BF16-GI-NEXT: ldr d14, [sp, #112] // 8-byte Reload
; CHECK-BF16-GI-NEXT: mov v1.h[1], v2.h[0]
; CHECK-BF16-GI-NEXT: ldp q2, q3, [sp, #48] // 32-byte Folded Reload
; CHECK-BF16-GI-NEXT: ldp d13, d12, [sp, #120] // 16-byte Folded Reload
; CHECK-BF16-GI-NEXT: mov v1.h[2], v3.h[0]
; CHECK-BF16-GI-NEXT: mov v1.h[3], v2.h[0]
; CHECK-BF16-GI-NEXT: ldp q2, q3, [sp, #16] // 32-byte Folded Reload
; CHECK-BF16-GI-NEXT: mov v1.h[4], v3.h[0]
; CHECK-BF16-GI-NEXT: mov v1.h[5], v2.h[0]
; CHECK-BF16-GI-NEXT: ldr q2, [sp] // 16-byte Reload
; CHECK-BF16-GI-NEXT: mov v1.h[6], v2.h[0]
; CHECK-BF16-GI-NEXT: mov v1.h[7], v0.h[0]
; CHECK-BF16-GI-NEXT: mov v0.16b, v1.16b
; CHECK-BF16-GI-NEXT: add sp, sp, #176
; CHECK-BF16-GI-NEXT: ret
%r = call <8 x bfloat> @llvm.atan.v8bf16(<8 x bfloat> %a)
ret <8 x bfloat> %r
}
define <8 x bfloat> @test_atan2(<8 x bfloat> %a, <8 x bfloat> %b) #0 {
; CHECK-CVT-SD-LABEL: test_atan2:
; CHECK-CVT-SD: // %bb.0:
; CHECK-CVT-SD-NEXT: sub sp, sp, #64
; CHECK-CVT-SD-NEXT: mov h3, v0.h[1]
; CHECK-CVT-SD-NEXT: mov h2, v1.h[1]
; CHECK-CVT-SD-NEXT: stp q0, q1, [sp] // 32-byte Folded Spill
; CHECK-CVT-SD-NEXT: stp x30, x19, [sp, #48] // 16-byte Folded Spill
; CHECK-CVT-SD-NEXT: shll v0.4s, v3.4h, #16
; CHECK-CVT-SD-NEXT: shll v1.4s, v2.4h, #16
; CHECK-CVT-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-CVT-SD-NEXT: // kill: def $s1 killed $s1 killed $q1
; CHECK-CVT-SD-NEXT: bl atan2f
; CHECK-CVT-SD-NEXT: fmov w8, s0
; CHECK-CVT-SD-NEXT: mov w19, #32767 // =0x7fff
; CHECK-CVT-SD-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-SD-NEXT: add w8, w8, w19
; CHECK-CVT-SD-NEXT: add w8, w9, w8
; CHECK-CVT-SD-NEXT: lsr w8, w8, #16
; CHECK-CVT-SD-NEXT: fmov s0, w8
; CHECK-CVT-SD-NEXT: str q0, [sp, #32] // 16-byte Spill
; CHECK-CVT-SD-NEXT: ldp q0, q1, [sp] // 32-byte Folded Reload
; CHECK-CVT-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-CVT-SD-NEXT: shll v1.4s, v1.4h, #16
; CHECK-CVT-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-CVT-SD-NEXT: // kill: def $s1 killed $s1 killed $q1
; CHECK-CVT-SD-NEXT: bl atan2f
; CHECK-CVT-SD-NEXT: fmov w8, s0
; CHECK-CVT-SD-NEXT: ldp q1, q2, [sp, #16] // 32-byte Folded Reload
; CHECK-CVT-SD-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-SD-NEXT: add w8, w8, w19
; CHECK-CVT-SD-NEXT: mov h1, v1.h[2]
; CHECK-CVT-SD-NEXT: add w8, w9, w8
; CHECK-CVT-SD-NEXT: lsr w8, w8, #16
; CHECK-CVT-SD-NEXT: shll v1.4s, v1.4h, #16
; CHECK-CVT-SD-NEXT: fmov s0, w8
; CHECK-CVT-SD-NEXT: // kill: def $s1 killed $s1 killed $q1
; CHECK-CVT-SD-NEXT: mov v0.h[1], v2.h[0]
; CHECK-CVT-SD-NEXT: str q0, [sp, #32] // 16-byte Spill
; CHECK-CVT-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-CVT-SD-NEXT: mov h0, v0.h[2]
; CHECK-CVT-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-CVT-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-CVT-SD-NEXT: bl atan2f
; CHECK-CVT-SD-NEXT: fmov w8, s0
; CHECK-CVT-SD-NEXT: ldr q1, [sp, #32] // 16-byte Reload
; CHECK-CVT-SD-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-SD-NEXT: add w8, w8, w19
; CHECK-CVT-SD-NEXT: add w8, w9, w8
; CHECK-CVT-SD-NEXT: lsr w8, w8, #16
; CHECK-CVT-SD-NEXT: fmov s0, w8
; CHECK-CVT-SD-NEXT: mov v1.h[2], v0.h[0]
; CHECK-CVT-SD-NEXT: str q1, [sp, #32] // 16-byte Spill
; CHECK-CVT-SD-NEXT: ldp q0, q1, [sp] // 32-byte Folded Reload
; CHECK-CVT-SD-NEXT: mov h0, v0.h[3]
; CHECK-CVT-SD-NEXT: mov h1, v1.h[3]
; CHECK-CVT-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-CVT-SD-NEXT: shll v1.4s, v1.4h, #16
; CHECK-CVT-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-CVT-SD-NEXT: // kill: def $s1 killed $s1 killed $q1
; CHECK-CVT-SD-NEXT: bl atan2f
; CHECK-CVT-SD-NEXT: fmov w8, s0
; CHECK-CVT-SD-NEXT: ldr q1, [sp, #32] // 16-byte Reload
; CHECK-CVT-SD-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-SD-NEXT: add w8, w8, w19
; CHECK-CVT-SD-NEXT: add w8, w9, w8
; CHECK-CVT-SD-NEXT: lsr w8, w8, #16
; CHECK-CVT-SD-NEXT: fmov s0, w8
; CHECK-CVT-SD-NEXT: mov v1.h[3], v0.h[0]
; CHECK-CVT-SD-NEXT: str q1, [sp, #32] // 16-byte Spill
; CHECK-CVT-SD-NEXT: ldp q0, q1, [sp] // 32-byte Folded Reload
; CHECK-CVT-SD-NEXT: mov h0, v0.h[4]
; CHECK-CVT-SD-NEXT: mov h1, v1.h[4]
; CHECK-CVT-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-CVT-SD-NEXT: shll v1.4s, v1.4h, #16
; CHECK-CVT-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-CVT-SD-NEXT: // kill: def $s1 killed $s1 killed $q1
; CHECK-CVT-SD-NEXT: bl atan2f
; CHECK-CVT-SD-NEXT: fmov w8, s0
; CHECK-CVT-SD-NEXT: ldr q1, [sp, #32] // 16-byte Reload
; CHECK-CVT-SD-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-SD-NEXT: add w8, w8, w19
; CHECK-CVT-SD-NEXT: add w8, w9, w8
; CHECK-CVT-SD-NEXT: lsr w8, w8, #16
; CHECK-CVT-SD-NEXT: fmov s0, w8
; CHECK-CVT-SD-NEXT: mov v1.h[4], v0.h[0]
; CHECK-CVT-SD-NEXT: str q1, [sp, #32] // 16-byte Spill
; CHECK-CVT-SD-NEXT: ldp q0, q1, [sp] // 32-byte Folded Reload
; CHECK-CVT-SD-NEXT: mov h0, v0.h[5]
; CHECK-CVT-SD-NEXT: mov h1, v1.h[5]
; CHECK-CVT-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-CVT-SD-NEXT: shll v1.4s, v1.4h, #16
; CHECK-CVT-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-CVT-SD-NEXT: // kill: def $s1 killed $s1 killed $q1
; CHECK-CVT-SD-NEXT: bl atan2f
; CHECK-CVT-SD-NEXT: fmov w8, s0
; CHECK-CVT-SD-NEXT: ldr q1, [sp, #32] // 16-byte Reload
; CHECK-CVT-SD-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-SD-NEXT: add w8, w8, w19
; CHECK-CVT-SD-NEXT: add w8, w9, w8
; CHECK-CVT-SD-NEXT: lsr w8, w8, #16
; CHECK-CVT-SD-NEXT: fmov s0, w8
; CHECK-CVT-SD-NEXT: mov v1.h[5], v0.h[0]
; CHECK-CVT-SD-NEXT: str q1, [sp, #32] // 16-byte Spill
; CHECK-CVT-SD-NEXT: ldp q0, q1, [sp] // 32-byte Folded Reload
; CHECK-CVT-SD-NEXT: mov h0, v0.h[6]
; CHECK-CVT-SD-NEXT: mov h1, v1.h[6]
; CHECK-CVT-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-CVT-SD-NEXT: shll v1.4s, v1.4h, #16
; CHECK-CVT-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-CVT-SD-NEXT: // kill: def $s1 killed $s1 killed $q1
; CHECK-CVT-SD-NEXT: bl atan2f
; CHECK-CVT-SD-NEXT: fmov w8, s0
; CHECK-CVT-SD-NEXT: ldr q1, [sp, #32] // 16-byte Reload
; CHECK-CVT-SD-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-SD-NEXT: add w8, w8, w19
; CHECK-CVT-SD-NEXT: add w8, w9, w8
; CHECK-CVT-SD-NEXT: lsr w8, w8, #16
; CHECK-CVT-SD-NEXT: fmov s0, w8
; CHECK-CVT-SD-NEXT: mov v1.h[6], v0.h[0]
; CHECK-CVT-SD-NEXT: str q1, [sp, #32] // 16-byte Spill
; CHECK-CVT-SD-NEXT: ldp q0, q1, [sp] // 32-byte Folded Reload
; CHECK-CVT-SD-NEXT: mov h0, v0.h[7]
; CHECK-CVT-SD-NEXT: mov h1, v1.h[7]
; CHECK-CVT-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-CVT-SD-NEXT: shll v1.4s, v1.4h, #16
; CHECK-CVT-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-CVT-SD-NEXT: // kill: def $s1 killed $s1 killed $q1
; CHECK-CVT-SD-NEXT: bl atan2f
; CHECK-CVT-SD-NEXT: fmov w8, s0
; CHECK-CVT-SD-NEXT: ldr q0, [sp, #32] // 16-byte Reload
; CHECK-CVT-SD-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-SD-NEXT: add w8, w8, w19
; CHECK-CVT-SD-NEXT: ldp x30, x19, [sp, #48] // 16-byte Folded Reload
; CHECK-CVT-SD-NEXT: add w8, w9, w8
; CHECK-CVT-SD-NEXT: lsr w8, w8, #16
; CHECK-CVT-SD-NEXT: fmov s1, w8
; CHECK-CVT-SD-NEXT: mov v0.h[7], v1.h[0]
; CHECK-CVT-SD-NEXT: add sp, sp, #64
; CHECK-CVT-SD-NEXT: ret
;
; CHECK-BF16-SD-LABEL: test_atan2:
; CHECK-BF16-SD: // %bb.0:
; CHECK-BF16-SD-NEXT: sub sp, sp, #64
; CHECK-BF16-SD-NEXT: mov h3, v0.h[1]
; CHECK-BF16-SD-NEXT: mov h2, v1.h[1]
; CHECK-BF16-SD-NEXT: stp q0, q1, [sp] // 32-byte Folded Spill
; CHECK-BF16-SD-NEXT: str x30, [sp, #48] // 8-byte Spill
; CHECK-BF16-SD-NEXT: shll v0.4s, v3.4h, #16
; CHECK-BF16-SD-NEXT: shll v1.4s, v2.4h, #16
; CHECK-BF16-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16-SD-NEXT: // kill: def $s1 killed $s1 killed $q1
; CHECK-BF16-SD-NEXT: bl atan2f
; CHECK-BF16-SD-NEXT: bfcvt h0, s0
; CHECK-BF16-SD-NEXT: str q0, [sp, #32] // 16-byte Spill
; CHECK-BF16-SD-NEXT: ldp q0, q1, [sp] // 32-byte Folded Reload
; CHECK-BF16-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16-SD-NEXT: shll v1.4s, v1.4h, #16
; CHECK-BF16-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16-SD-NEXT: // kill: def $s1 killed $s1 killed $q1
; CHECK-BF16-SD-NEXT: bl atan2f
; CHECK-BF16-SD-NEXT: bfcvt h0, s0
; CHECK-BF16-SD-NEXT: ldp q1, q2, [sp, #16] // 32-byte Folded Reload
; CHECK-BF16-SD-NEXT: mov h1, v1.h[2]
; CHECK-BF16-SD-NEXT: mov v0.h[1], v2.h[0]
; CHECK-BF16-SD-NEXT: shll v1.4s, v1.4h, #16
; CHECK-BF16-SD-NEXT: str q0, [sp, #32] // 16-byte Spill
; CHECK-BF16-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-BF16-SD-NEXT: // kill: def $s1 killed $s1 killed $q1
; CHECK-BF16-SD-NEXT: mov h0, v0.h[2]
; CHECK-BF16-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16-SD-NEXT: bl atan2f
; CHECK-BF16-SD-NEXT: bfcvt h0, s0
; CHECK-BF16-SD-NEXT: ldr q1, [sp, #32] // 16-byte Reload
; CHECK-BF16-SD-NEXT: mov v1.h[2], v0.h[0]
; CHECK-BF16-SD-NEXT: str q1, [sp, #32] // 16-byte Spill
; CHECK-BF16-SD-NEXT: ldp q0, q1, [sp] // 32-byte Folded Reload
; CHECK-BF16-SD-NEXT: mov h0, v0.h[3]
; CHECK-BF16-SD-NEXT: mov h1, v1.h[3]
; CHECK-BF16-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16-SD-NEXT: shll v1.4s, v1.4h, #16
; CHECK-BF16-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16-SD-NEXT: // kill: def $s1 killed $s1 killed $q1
; CHECK-BF16-SD-NEXT: bl atan2f
; CHECK-BF16-SD-NEXT: bfcvt h0, s0
; CHECK-BF16-SD-NEXT: ldr q1, [sp, #32] // 16-byte Reload
; CHECK-BF16-SD-NEXT: mov v1.h[3], v0.h[0]
; CHECK-BF16-SD-NEXT: str q1, [sp, #32] // 16-byte Spill
; CHECK-BF16-SD-NEXT: ldp q0, q1, [sp] // 32-byte Folded Reload
; CHECK-BF16-SD-NEXT: mov h0, v0.h[4]
; CHECK-BF16-SD-NEXT: mov h1, v1.h[4]
; CHECK-BF16-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16-SD-NEXT: shll v1.4s, v1.4h, #16
; CHECK-BF16-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16-SD-NEXT: // kill: def $s1 killed $s1 killed $q1
; CHECK-BF16-SD-NEXT: bl atan2f
; CHECK-BF16-SD-NEXT: bfcvt h0, s0
; CHECK-BF16-SD-NEXT: ldr q1, [sp, #32] // 16-byte Reload
; CHECK-BF16-SD-NEXT: mov v1.h[4], v0.h[0]
; CHECK-BF16-SD-NEXT: str q1, [sp, #32] // 16-byte Spill
; CHECK-BF16-SD-NEXT: ldp q0, q1, [sp] // 32-byte Folded Reload
; CHECK-BF16-SD-NEXT: mov h0, v0.h[5]
; CHECK-BF16-SD-NEXT: mov h1, v1.h[5]
; CHECK-BF16-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16-SD-NEXT: shll v1.4s, v1.4h, #16
; CHECK-BF16-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16-SD-NEXT: // kill: def $s1 killed $s1 killed $q1
; CHECK-BF16-SD-NEXT: bl atan2f
; CHECK-BF16-SD-NEXT: bfcvt h0, s0
; CHECK-BF16-SD-NEXT: ldr q1, [sp, #32] // 16-byte Reload
; CHECK-BF16-SD-NEXT: mov v1.h[5], v0.h[0]
; CHECK-BF16-SD-NEXT: str q1, [sp, #32] // 16-byte Spill
; CHECK-BF16-SD-NEXT: ldp q0, q1, [sp] // 32-byte Folded Reload
; CHECK-BF16-SD-NEXT: mov h0, v0.h[6]
; CHECK-BF16-SD-NEXT: mov h1, v1.h[6]
; CHECK-BF16-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16-SD-NEXT: shll v1.4s, v1.4h, #16
; CHECK-BF16-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16-SD-NEXT: // kill: def $s1 killed $s1 killed $q1
; CHECK-BF16-SD-NEXT: bl atan2f
; CHECK-BF16-SD-NEXT: bfcvt h0, s0
; CHECK-BF16-SD-NEXT: ldr q1, [sp, #32] // 16-byte Reload
; CHECK-BF16-SD-NEXT: mov v1.h[6], v0.h[0]
; CHECK-BF16-SD-NEXT: str q1, [sp, #32] // 16-byte Spill
; CHECK-BF16-SD-NEXT: ldp q0, q1, [sp] // 32-byte Folded Reload
; CHECK-BF16-SD-NEXT: mov h0, v0.h[7]
; CHECK-BF16-SD-NEXT: mov h1, v1.h[7]
; CHECK-BF16-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16-SD-NEXT: shll v1.4s, v1.4h, #16
; CHECK-BF16-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16-SD-NEXT: // kill: def $s1 killed $s1 killed $q1
; CHECK-BF16-SD-NEXT: bl atan2f
; CHECK-BF16-SD-NEXT: bfcvt h1, s0
; CHECK-BF16-SD-NEXT: ldr q0, [sp, #32] // 16-byte Reload
; CHECK-BF16-SD-NEXT: ldr x30, [sp, #48] // 8-byte Reload
; CHECK-BF16-SD-NEXT: mov v0.h[7], v1.h[0]
; CHECK-BF16-SD-NEXT: add sp, sp, #64
; CHECK-BF16-SD-NEXT: ret
;
; CHECK-BF16SVE-SD-LABEL: test_atan2:
; CHECK-BF16SVE-SD: // %bb.0:
; CHECK-BF16SVE-SD-NEXT: sub sp, sp, #64
; CHECK-BF16SVE-SD-NEXT: mov h3, v0.h[1]
; CHECK-BF16SVE-SD-NEXT: mov h2, v1.h[1]
; CHECK-BF16SVE-SD-NEXT: stp q0, q1, [sp] // 32-byte Folded Spill
; CHECK-BF16SVE-SD-NEXT: str x30, [sp, #48] // 8-byte Spill
; CHECK-BF16SVE-SD-NEXT: shll v0.4s, v3.4h, #16
; CHECK-BF16SVE-SD-NEXT: shll v1.4s, v2.4h, #16
; CHECK-BF16SVE-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16SVE-SD-NEXT: // kill: def $s1 killed $s1 killed $q1
; CHECK-BF16SVE-SD-NEXT: bl atan2f
; CHECK-BF16SVE-SD-NEXT: bfcvt h0, s0
; CHECK-BF16SVE-SD-NEXT: str q0, [sp, #32] // 16-byte Spill
; CHECK-BF16SVE-SD-NEXT: ldp q0, q1, [sp] // 32-byte Folded Reload
; CHECK-BF16SVE-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16SVE-SD-NEXT: shll v1.4s, v1.4h, #16
; CHECK-BF16SVE-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16SVE-SD-NEXT: // kill: def $s1 killed $s1 killed $q1
; CHECK-BF16SVE-SD-NEXT: bl atan2f
; CHECK-BF16SVE-SD-NEXT: bfcvt h0, s0
; CHECK-BF16SVE-SD-NEXT: ldp q1, q2, [sp, #16] // 32-byte Folded Reload
; CHECK-BF16SVE-SD-NEXT: mov h1, v1.h[2]
; CHECK-BF16SVE-SD-NEXT: mov v0.h[1], v2.h[0]
; CHECK-BF16SVE-SD-NEXT: shll v1.4s, v1.4h, #16
; CHECK-BF16SVE-SD-NEXT: str q0, [sp, #32] // 16-byte Spill
; CHECK-BF16SVE-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-BF16SVE-SD-NEXT: // kill: def $s1 killed $s1 killed $q1
; CHECK-BF16SVE-SD-NEXT: mov h0, v0.h[2]
; CHECK-BF16SVE-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16SVE-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16SVE-SD-NEXT: bl atan2f
; CHECK-BF16SVE-SD-NEXT: bfcvt h0, s0
; CHECK-BF16SVE-SD-NEXT: ldr q1, [sp, #32] // 16-byte Reload
; CHECK-BF16SVE-SD-NEXT: mov v1.h[2], v0.h[0]
; CHECK-BF16SVE-SD-NEXT: str q1, [sp, #32] // 16-byte Spill
; CHECK-BF16SVE-SD-NEXT: ldp q0, q1, [sp] // 32-byte Folded Reload
; CHECK-BF16SVE-SD-NEXT: mov h0, v0.h[3]
; CHECK-BF16SVE-SD-NEXT: mov h1, v1.h[3]
; CHECK-BF16SVE-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16SVE-SD-NEXT: shll v1.4s, v1.4h, #16
; CHECK-BF16SVE-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16SVE-SD-NEXT: // kill: def $s1 killed $s1 killed $q1
; CHECK-BF16SVE-SD-NEXT: bl atan2f
; CHECK-BF16SVE-SD-NEXT: bfcvt h0, s0
; CHECK-BF16SVE-SD-NEXT: ldr q1, [sp, #32] // 16-byte Reload
; CHECK-BF16SVE-SD-NEXT: mov v1.h[3], v0.h[0]
; CHECK-BF16SVE-SD-NEXT: str q1, [sp, #32] // 16-byte Spill
; CHECK-BF16SVE-SD-NEXT: ldp q0, q1, [sp] // 32-byte Folded Reload
; CHECK-BF16SVE-SD-NEXT: mov h0, v0.h[4]
; CHECK-BF16SVE-SD-NEXT: mov h1, v1.h[4]
; CHECK-BF16SVE-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16SVE-SD-NEXT: shll v1.4s, v1.4h, #16
; CHECK-BF16SVE-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16SVE-SD-NEXT: // kill: def $s1 killed $s1 killed $q1
; CHECK-BF16SVE-SD-NEXT: bl atan2f
; CHECK-BF16SVE-SD-NEXT: bfcvt h0, s0
; CHECK-BF16SVE-SD-NEXT: ldr q1, [sp, #32] // 16-byte Reload
; CHECK-BF16SVE-SD-NEXT: mov v1.h[4], v0.h[0]
; CHECK-BF16SVE-SD-NEXT: str q1, [sp, #32] // 16-byte Spill
; CHECK-BF16SVE-SD-NEXT: ldp q0, q1, [sp] // 32-byte Folded Reload
; CHECK-BF16SVE-SD-NEXT: mov h0, v0.h[5]
; CHECK-BF16SVE-SD-NEXT: mov h1, v1.h[5]
; CHECK-BF16SVE-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16SVE-SD-NEXT: shll v1.4s, v1.4h, #16
; CHECK-BF16SVE-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16SVE-SD-NEXT: // kill: def $s1 killed $s1 killed $q1
; CHECK-BF16SVE-SD-NEXT: bl atan2f
; CHECK-BF16SVE-SD-NEXT: bfcvt h0, s0
; CHECK-BF16SVE-SD-NEXT: ldr q1, [sp, #32] // 16-byte Reload
; CHECK-BF16SVE-SD-NEXT: mov v1.h[5], v0.h[0]
; CHECK-BF16SVE-SD-NEXT: str q1, [sp, #32] // 16-byte Spill
; CHECK-BF16SVE-SD-NEXT: ldp q0, q1, [sp] // 32-byte Folded Reload
; CHECK-BF16SVE-SD-NEXT: mov h0, v0.h[6]
; CHECK-BF16SVE-SD-NEXT: mov h1, v1.h[6]
; CHECK-BF16SVE-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16SVE-SD-NEXT: shll v1.4s, v1.4h, #16
; CHECK-BF16SVE-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16SVE-SD-NEXT: // kill: def $s1 killed $s1 killed $q1
; CHECK-BF16SVE-SD-NEXT: bl atan2f
; CHECK-BF16SVE-SD-NEXT: bfcvt h0, s0
; CHECK-BF16SVE-SD-NEXT: ldr q1, [sp, #32] // 16-byte Reload
; CHECK-BF16SVE-SD-NEXT: mov v1.h[6], v0.h[0]
; CHECK-BF16SVE-SD-NEXT: str q1, [sp, #32] // 16-byte Spill
; CHECK-BF16SVE-SD-NEXT: ldp q0, q1, [sp] // 32-byte Folded Reload
; CHECK-BF16SVE-SD-NEXT: mov h0, v0.h[7]
; CHECK-BF16SVE-SD-NEXT: mov h1, v1.h[7]
; CHECK-BF16SVE-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16SVE-SD-NEXT: shll v1.4s, v1.4h, #16
; CHECK-BF16SVE-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16SVE-SD-NEXT: // kill: def $s1 killed $s1 killed $q1
; CHECK-BF16SVE-SD-NEXT: bl atan2f
; CHECK-BF16SVE-SD-NEXT: bfcvt h1, s0
; CHECK-BF16SVE-SD-NEXT: ldr q0, [sp, #32] // 16-byte Reload
; CHECK-BF16SVE-SD-NEXT: ldr x30, [sp, #48] // 8-byte Reload
; CHECK-BF16SVE-SD-NEXT: mov v0.h[7], v1.h[0]
; CHECK-BF16SVE-SD-NEXT: add sp, sp, #64
; CHECK-BF16SVE-SD-NEXT: ret
;
; CHECK-CVT-GI-LABEL: test_atan2:
; CHECK-CVT-GI: // %bb.0:
; CHECK-CVT-GI-NEXT: sub sp, sp, #192
; CHECK-CVT-GI-NEXT: mov h2, v0.h[5]
; CHECK-CVT-GI-NEXT: stp d15, d14, [sp, #48] // 16-byte Folded Spill
; CHECK-CVT-GI-NEXT: mov h15, v0.h[4]
; CHECK-CVT-GI-NEXT: stp d13, d12, [sp, #64] // 16-byte Folded Spill
; CHECK-CVT-GI-NEXT: mov h12, v1.h[1]
; CHECK-CVT-GI-NEXT: mov h13, v1.h[2]
; CHECK-CVT-GI-NEXT: stp d11, d10, [sp, #80] // 16-byte Folded Spill
; CHECK-CVT-GI-NEXT: mov h10, v0.h[1]
; CHECK-CVT-GI-NEXT: mov h11, v0.h[2]
; CHECK-CVT-GI-NEXT: stp d9, d8, [sp, #96] // 16-byte Folded Spill
; CHECK-CVT-GI-NEXT: mov h9, v0.h[3]
; CHECK-CVT-GI-NEXT: mov h8, v1.h[3]
; CHECK-CVT-GI-NEXT: str d2, [sp, #8] // 8-byte Spill
; CHECK-CVT-GI-NEXT: mov h2, v0.h[6]
; CHECK-CVT-GI-NEXT: mov h14, v1.h[4]
; CHECK-CVT-GI-NEXT: str x30, [sp, #112] // 8-byte Spill
; CHECK-CVT-GI-NEXT: stp x26, x25, [sp, #128] // 16-byte Folded Spill
; CHECK-CVT-GI-NEXT: stp x24, x23, [sp, #144] // 16-byte Folded Spill
; CHECK-CVT-GI-NEXT: str d2, [sp, #24] // 8-byte Spill
; CHECK-CVT-GI-NEXT: mov h2, v0.h[7]
; CHECK-CVT-GI-NEXT: shll v0.4s, v0.4h, #16
; CHECK-CVT-GI-NEXT: stp x22, x21, [sp, #160] // 16-byte Folded Spill
; CHECK-CVT-GI-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-CVT-GI-NEXT: stp x20, x19, [sp, #176] // 16-byte Folded Spill
; CHECK-CVT-GI-NEXT: str d2, [sp, #40] // 8-byte Spill
; CHECK-CVT-GI-NEXT: mov h2, v1.h[5]
; CHECK-CVT-GI-NEXT: str d2, [sp, #16] // 8-byte Spill
; CHECK-CVT-GI-NEXT: mov h2, v1.h[6]
; CHECK-CVT-GI-NEXT: str d2, [sp, #32] // 8-byte Spill
; CHECK-CVT-GI-NEXT: mov h2, v1.h[7]
; CHECK-CVT-GI-NEXT: shll v1.4s, v1.4h, #16
; CHECK-CVT-GI-NEXT: // kill: def $s1 killed $s1 killed $q1
; CHECK-CVT-GI-NEXT: str d2, [sp, #120] // 8-byte Spill
; CHECK-CVT-GI-NEXT: bl atan2f
; CHECK-CVT-GI-NEXT: fmov w8, s0
; CHECK-CVT-GI-NEXT: mov w19, #32767 // =0x7fff
; CHECK-CVT-GI-NEXT: fcmp s0, #0.0
; CHECK-CVT-GI-NEXT: shll v0.4s, v10.4h, #16
; CHECK-CVT-GI-NEXT: shll v1.4s, v12.4h, #16
; CHECK-CVT-GI-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-CVT-GI-NEXT: // kill: def $s1 killed $s1 killed $q1
; CHECK-CVT-GI-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-GI-NEXT: add w10, w8, w19
; CHECK-CVT-GI-NEXT: orr w8, w8, #0x400000
; CHECK-CVT-GI-NEXT: add w9, w10, w9
; CHECK-CVT-GI-NEXT: csel w8, w8, w9, vs
; CHECK-CVT-GI-NEXT: lsr w20, w8, #16
; CHECK-CVT-GI-NEXT: bl atan2f
; CHECK-CVT-GI-NEXT: shll v2.4s, v11.4h, #16
; CHECK-CVT-GI-NEXT: fmov w8, s0
; CHECK-CVT-GI-NEXT: fcmp s0, #0.0
; CHECK-CVT-GI-NEXT: shll v1.4s, v13.4h, #16
; CHECK-CVT-GI-NEXT: // kill: def $s1 killed $s1 killed $q1
; CHECK-CVT-GI-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-GI-NEXT: fmov s0, s2
; CHECK-CVT-GI-NEXT: add w10, w8, w19
; CHECK-CVT-GI-NEXT: orr w8, w8, #0x400000
; CHECK-CVT-GI-NEXT: add w9, w10, w9
; CHECK-CVT-GI-NEXT: csel w8, w8, w9, vs
; CHECK-CVT-GI-NEXT: lsr w21, w8, #16
; CHECK-CVT-GI-NEXT: bl atan2f
; CHECK-CVT-GI-NEXT: shll v2.4s, v9.4h, #16
; CHECK-CVT-GI-NEXT: fmov w8, s0
; CHECK-CVT-GI-NEXT: fcmp s0, #0.0
; CHECK-CVT-GI-NEXT: shll v1.4s, v8.4h, #16
; CHECK-CVT-GI-NEXT: // kill: def $s1 killed $s1 killed $q1
; CHECK-CVT-GI-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-GI-NEXT: fmov s0, s2
; CHECK-CVT-GI-NEXT: add w10, w8, w19
; CHECK-CVT-GI-NEXT: orr w8, w8, #0x400000
; CHECK-CVT-GI-NEXT: add w9, w10, w9
; CHECK-CVT-GI-NEXT: csel w8, w8, w9, vs
; CHECK-CVT-GI-NEXT: lsr w22, w8, #16
; CHECK-CVT-GI-NEXT: bl atan2f
; CHECK-CVT-GI-NEXT: shll v2.4s, v15.4h, #16
; CHECK-CVT-GI-NEXT: fmov w8, s0
; CHECK-CVT-GI-NEXT: fcmp s0, #0.0
; CHECK-CVT-GI-NEXT: shll v1.4s, v14.4h, #16
; CHECK-CVT-GI-NEXT: // kill: def $s1 killed $s1 killed $q1
; CHECK-CVT-GI-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-GI-NEXT: fmov s0, s2
; CHECK-CVT-GI-NEXT: add w10, w8, w19
; CHECK-CVT-GI-NEXT: orr w8, w8, #0x400000
; CHECK-CVT-GI-NEXT: add w9, w10, w9
; CHECK-CVT-GI-NEXT: csel w8, w8, w9, vs
; CHECK-CVT-GI-NEXT: lsr w23, w8, #16
; CHECK-CVT-GI-NEXT: bl atan2f
; CHECK-CVT-GI-NEXT: ldr d1, [sp, #8] // 8-byte Reload
; CHECK-CVT-GI-NEXT: fmov w8, s0
; CHECK-CVT-GI-NEXT: fcmp s0, #0.0
; CHECK-CVT-GI-NEXT: ldr d0, [sp, #16] // 8-byte Reload
; CHECK-CVT-GI-NEXT: shll v2.4s, v1.4h, #16
; CHECK-CVT-GI-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-GI-NEXT: shll v1.4s, v0.4h, #16
; CHECK-CVT-GI-NEXT: add w10, w8, w19
; CHECK-CVT-GI-NEXT: orr w8, w8, #0x400000
; CHECK-CVT-GI-NEXT: // kill: def $s1 killed $s1 killed $q1
; CHECK-CVT-GI-NEXT: fmov s0, s2
; CHECK-CVT-GI-NEXT: add w9, w10, w9
; CHECK-CVT-GI-NEXT: csel w8, w8, w9, vs
; CHECK-CVT-GI-NEXT: lsr w24, w8, #16
; CHECK-CVT-GI-NEXT: bl atan2f
; CHECK-CVT-GI-NEXT: ldr d1, [sp, #24] // 8-byte Reload
; CHECK-CVT-GI-NEXT: fmov w8, s0
; CHECK-CVT-GI-NEXT: fcmp s0, #0.0
; CHECK-CVT-GI-NEXT: ldr d0, [sp, #32] // 8-byte Reload
; CHECK-CVT-GI-NEXT: shll v2.4s, v1.4h, #16
; CHECK-CVT-GI-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-GI-NEXT: shll v1.4s, v0.4h, #16
; CHECK-CVT-GI-NEXT: add w10, w8, w19
; CHECK-CVT-GI-NEXT: orr w8, w8, #0x400000
; CHECK-CVT-GI-NEXT: // kill: def $s1 killed $s1 killed $q1
; CHECK-CVT-GI-NEXT: fmov s0, s2
; CHECK-CVT-GI-NEXT: add w9, w10, w9
; CHECK-CVT-GI-NEXT: csel w8, w8, w9, vs
; CHECK-CVT-GI-NEXT: lsr w25, w8, #16
; CHECK-CVT-GI-NEXT: bl atan2f
; CHECK-CVT-GI-NEXT: ldr d1, [sp, #40] // 8-byte Reload
; CHECK-CVT-GI-NEXT: fmov w8, s0
; CHECK-CVT-GI-NEXT: fcmp s0, #0.0
; CHECK-CVT-GI-NEXT: ldr d0, [sp, #120] // 8-byte Reload
; CHECK-CVT-GI-NEXT: shll v2.4s, v1.4h, #16
; CHECK-CVT-GI-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-GI-NEXT: shll v1.4s, v0.4h, #16
; CHECK-CVT-GI-NEXT: add w10, w8, w19
; CHECK-CVT-GI-NEXT: orr w8, w8, #0x400000
; CHECK-CVT-GI-NEXT: // kill: def $s1 killed $s1 killed $q1
; CHECK-CVT-GI-NEXT: fmov s0, s2
; CHECK-CVT-GI-NEXT: add w9, w10, w9
; CHECK-CVT-GI-NEXT: csel w8, w8, w9, vs
; CHECK-CVT-GI-NEXT: lsr w26, w8, #16
; CHECK-CVT-GI-NEXT: bl atan2f
; CHECK-CVT-GI-NEXT: fmov s1, w20
; CHECK-CVT-GI-NEXT: fmov w8, s0
; CHECK-CVT-GI-NEXT: ldr x30, [sp, #112] // 8-byte Reload
; CHECK-CVT-GI-NEXT: fcmp s0, #0.0
; CHECK-CVT-GI-NEXT: ldp d9, d8, [sp, #96] // 16-byte Folded Reload
; CHECK-CVT-GI-NEXT: ldp d11, d10, [sp, #80] // 16-byte Folded Reload
; CHECK-CVT-GI-NEXT: mov v1.h[1], w21
; CHECK-CVT-GI-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-GI-NEXT: add w10, w8, w19
; CHECK-CVT-GI-NEXT: orr w8, w8, #0x400000
; CHECK-CVT-GI-NEXT: ldp x20, x19, [sp, #176] // 16-byte Folded Reload
; CHECK-CVT-GI-NEXT: add w9, w10, w9
; CHECK-CVT-GI-NEXT: ldp d13, d12, [sp, #64] // 16-byte Folded Reload
; CHECK-CVT-GI-NEXT: csel w8, w8, w9, vs
; CHECK-CVT-GI-NEXT: ldp d15, d14, [sp, #48] // 16-byte Folded Reload
; CHECK-CVT-GI-NEXT: mov v1.h[2], w22
; CHECK-CVT-GI-NEXT: lsr w8, w8, #16
; CHECK-CVT-GI-NEXT: ldp x22, x21, [sp, #160] // 16-byte Folded Reload
; CHECK-CVT-GI-NEXT: mov v1.h[3], w23
; CHECK-CVT-GI-NEXT: mov v1.h[4], w24
; CHECK-CVT-GI-NEXT: ldp x24, x23, [sp, #144] // 16-byte Folded Reload
; CHECK-CVT-GI-NEXT: mov v1.h[5], w25
; CHECK-CVT-GI-NEXT: mov v1.h[6], w26
; CHECK-CVT-GI-NEXT: ldp x26, x25, [sp, #128] // 16-byte Folded Reload
; CHECK-CVT-GI-NEXT: mov v1.h[7], w8
; CHECK-CVT-GI-NEXT: mov v0.16b, v1.16b
; CHECK-CVT-GI-NEXT: add sp, sp, #192
; CHECK-CVT-GI-NEXT: ret
;
; CHECK-BF16-GI-LABEL: test_atan2:
; CHECK-BF16-GI: // %bb.0:
; CHECK-BF16-GI-NEXT: sub sp, sp, #240
; CHECK-BF16-GI-NEXT: mov h2, v0.h[5]
; CHECK-BF16-GI-NEXT: stp d15, d14, [sp, #160] // 16-byte Folded Spill
; CHECK-BF16-GI-NEXT: mov h15, v0.h[1]
; CHECK-BF16-GI-NEXT: stp d13, d12, [sp, #176] // 16-byte Folded Spill
; CHECK-BF16-GI-NEXT: mov h14, v0.h[4]
; CHECK-BF16-GI-NEXT: mov h12, v1.h[3]
; CHECK-BF16-GI-NEXT: stp d11, d10, [sp, #192] // 16-byte Folded Spill
; CHECK-BF16-GI-NEXT: mov h10, v1.h[1]
; CHECK-BF16-GI-NEXT: mov h11, v1.h[2]
; CHECK-BF16-GI-NEXT: stp d9, d8, [sp, #208] // 16-byte Folded Spill
; CHECK-BF16-GI-NEXT: mov h8, v0.h[2]
; CHECK-BF16-GI-NEXT: mov h9, v0.h[3]
; CHECK-BF16-GI-NEXT: str d2, [sp, #64] // 8-byte Spill
; CHECK-BF16-GI-NEXT: mov h2, v0.h[6]
; CHECK-BF16-GI-NEXT: mov h13, v1.h[4]
; CHECK-BF16-GI-NEXT: str x30, [sp, #224] // 8-byte Spill
; CHECK-BF16-GI-NEXT: str d2, [sp, #112] // 8-byte Spill
; CHECK-BF16-GI-NEXT: mov h2, v0.h[7]
; CHECK-BF16-GI-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16-GI-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16-GI-NEXT: str d2, [sp, #232] // 8-byte Spill
; CHECK-BF16-GI-NEXT: mov h2, v1.h[5]
; CHECK-BF16-GI-NEXT: str d2, [sp, #40] // 8-byte Spill
; CHECK-BF16-GI-NEXT: mov h2, v1.h[6]
; CHECK-BF16-GI-NEXT: str d2, [sp, #104] // 8-byte Spill
; CHECK-BF16-GI-NEXT: mov h2, v1.h[7]
; CHECK-BF16-GI-NEXT: shll v1.4s, v1.4h, #16
; CHECK-BF16-GI-NEXT: // kill: def $s1 killed $s1 killed $q1
; CHECK-BF16-GI-NEXT: str d2, [sp, #152] // 8-byte Spill
; CHECK-BF16-GI-NEXT: bl atan2f
; CHECK-BF16-GI-NEXT: bfcvt h0, s0
; CHECK-BF16-GI-NEXT: shll v1.4s, v10.4h, #16
; CHECK-BF16-GI-NEXT: // kill: def $s1 killed $s1 killed $q1
; CHECK-BF16-GI-NEXT: str q0, [sp, #128] // 16-byte Spill
; CHECK-BF16-GI-NEXT: shll v0.4s, v15.4h, #16
; CHECK-BF16-GI-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16-GI-NEXT: bl atan2f
; CHECK-BF16-GI-NEXT: bfcvt h0, s0
; CHECK-BF16-GI-NEXT: shll v1.4s, v11.4h, #16
; CHECK-BF16-GI-NEXT: // kill: def $s1 killed $s1 killed $q1
; CHECK-BF16-GI-NEXT: str q0, [sp, #80] // 16-byte Spill
; CHECK-BF16-GI-NEXT: shll v0.4s, v8.4h, #16
; CHECK-BF16-GI-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16-GI-NEXT: bl atan2f
; CHECK-BF16-GI-NEXT: bfcvt h0, s0
; CHECK-BF16-GI-NEXT: shll v1.4s, v12.4h, #16
; CHECK-BF16-GI-NEXT: // kill: def $s1 killed $s1 killed $q1
; CHECK-BF16-GI-NEXT: str q0, [sp, #48] // 16-byte Spill
; CHECK-BF16-GI-NEXT: shll v0.4s, v9.4h, #16
; CHECK-BF16-GI-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16-GI-NEXT: bl atan2f
; CHECK-BF16-GI-NEXT: bfcvt h0, s0
; CHECK-BF16-GI-NEXT: shll v1.4s, v13.4h, #16
; CHECK-BF16-GI-NEXT: // kill: def $s1 killed $s1 killed $q1
; CHECK-BF16-GI-NEXT: str q0, [sp, #16] // 16-byte Spill
; CHECK-BF16-GI-NEXT: shll v0.4s, v14.4h, #16
; CHECK-BF16-GI-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16-GI-NEXT: bl atan2f
; CHECK-BF16-GI-NEXT: bfcvt h0, s0
; CHECK-BF16-GI-NEXT: ldr d1, [sp, #40] // 8-byte Reload
; CHECK-BF16-GI-NEXT: shll v1.4s, v1.4h, #16
; CHECK-BF16-GI-NEXT: // kill: def $s1 killed $s1 killed $q1
; CHECK-BF16-GI-NEXT: str q0, [sp] // 16-byte Spill
; CHECK-BF16-GI-NEXT: ldr d0, [sp, #64] // 8-byte Reload
; CHECK-BF16-GI-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16-GI-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16-GI-NEXT: bl atan2f
; CHECK-BF16-GI-NEXT: bfcvt h0, s0
; CHECK-BF16-GI-NEXT: str q0, [sp, #64] // 16-byte Spill
; CHECK-BF16-GI-NEXT: ldp d1, d0, [sp, #104] // 16-byte Folded Reload
; CHECK-BF16-GI-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16-GI-NEXT: shll v1.4s, v1.4h, #16
; CHECK-BF16-GI-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16-GI-NEXT: // kill: def $s1 killed $s1 killed $q1
; CHECK-BF16-GI-NEXT: bl atan2f
; CHECK-BF16-GI-NEXT: bfcvt h0, s0
; CHECK-BF16-GI-NEXT: ldr d1, [sp, #152] // 8-byte Reload
; CHECK-BF16-GI-NEXT: shll v1.4s, v1.4h, #16
; CHECK-BF16-GI-NEXT: // kill: def $s1 killed $s1 killed $q1
; CHECK-BF16-GI-NEXT: str q0, [sp, #112] // 16-byte Spill
; CHECK-BF16-GI-NEXT: ldr d0, [sp, #232] // 8-byte Reload
; CHECK-BF16-GI-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16-GI-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16-GI-NEXT: bl atan2f
; CHECK-BF16-GI-NEXT: ldr q1, [sp, #128] // 16-byte Reload
; CHECK-BF16-GI-NEXT: ldr q2, [sp, #80] // 16-byte Reload
; CHECK-BF16-GI-NEXT: bfcvt h0, s0
; CHECK-BF16-GI-NEXT: ldp d9, d8, [sp, #208] // 16-byte Folded Reload
; CHECK-BF16-GI-NEXT: ldr x30, [sp, #224] // 8-byte Reload
; CHECK-BF16-GI-NEXT: mov v1.h[1], v2.h[0]
; CHECK-BF16-GI-NEXT: ldr q2, [sp, #48] // 16-byte Reload
; CHECK-BF16-GI-NEXT: ldp d11, d10, [sp, #192] // 16-byte Folded Reload
; CHECK-BF16-GI-NEXT: ldp d13, d12, [sp, #176] // 16-byte Folded Reload
; CHECK-BF16-GI-NEXT: ldp d15, d14, [sp, #160] // 16-byte Folded Reload
; CHECK-BF16-GI-NEXT: mov v1.h[2], v2.h[0]
; CHECK-BF16-GI-NEXT: ldp q2, q3, [sp] // 32-byte Folded Reload
; CHECK-BF16-GI-NEXT: mov v1.h[3], v3.h[0]
; CHECK-BF16-GI-NEXT: mov v1.h[4], v2.h[0]
; CHECK-BF16-GI-NEXT: ldr q2, [sp, #64] // 16-byte Reload
; CHECK-BF16-GI-NEXT: mov v1.h[5], v2.h[0]
; CHECK-BF16-GI-NEXT: ldr q2, [sp, #112] // 16-byte Reload
; CHECK-BF16-GI-NEXT: mov v1.h[6], v2.h[0]
; CHECK-BF16-GI-NEXT: mov v1.h[7], v0.h[0]
; CHECK-BF16-GI-NEXT: mov v0.16b, v1.16b
; CHECK-BF16-GI-NEXT: add sp, sp, #240
; CHECK-BF16-GI-NEXT: ret
%r = call <8 x bfloat> @llvm.atan2.v8bf16(<8 x bfloat> %a, <8 x bfloat> %b)
ret <8 x bfloat> %r
}
define <8 x bfloat> @test_cosh(<8 x bfloat> %a) #0 {
; CHECK-CVT-SD-LABEL: test_cosh:
; CHECK-CVT-SD: // %bb.0:
; CHECK-CVT-SD-NEXT: sub sp, sp, #48
; CHECK-CVT-SD-NEXT: mov h1, v0.h[1]
; CHECK-CVT-SD-NEXT: str q0, [sp] // 16-byte Spill
; CHECK-CVT-SD-NEXT: stp x30, x19, [sp, #32] // 16-byte Folded Spill
; CHECK-CVT-SD-NEXT: shll v0.4s, v1.4h, #16
; CHECK-CVT-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-CVT-SD-NEXT: bl coshf
; CHECK-CVT-SD-NEXT: fmov w8, s0
; CHECK-CVT-SD-NEXT: mov w19, #32767 // =0x7fff
; CHECK-CVT-SD-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-SD-NEXT: add w8, w8, w19
; CHECK-CVT-SD-NEXT: add w8, w9, w8
; CHECK-CVT-SD-NEXT: lsr w8, w8, #16
; CHECK-CVT-SD-NEXT: fmov s0, w8
; CHECK-CVT-SD-NEXT: str q0, [sp, #16] // 16-byte Spill
; CHECK-CVT-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-CVT-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-CVT-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-CVT-SD-NEXT: bl coshf
; CHECK-CVT-SD-NEXT: fmov w8, s0
; CHECK-CVT-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload
; CHECK-CVT-SD-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-SD-NEXT: add w8, w8, w19
; CHECK-CVT-SD-NEXT: add w8, w9, w8
; CHECK-CVT-SD-NEXT: lsr w8, w8, #16
; CHECK-CVT-SD-NEXT: fmov s0, w8
; CHECK-CVT-SD-NEXT: mov v0.h[1], v1.h[0]
; CHECK-CVT-SD-NEXT: str q0, [sp, #16] // 16-byte Spill
; CHECK-CVT-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-CVT-SD-NEXT: mov h0, v0.h[2]
; CHECK-CVT-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-CVT-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-CVT-SD-NEXT: bl coshf
; CHECK-CVT-SD-NEXT: fmov w8, s0
; CHECK-CVT-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload
; CHECK-CVT-SD-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-SD-NEXT: add w8, w8, w19
; CHECK-CVT-SD-NEXT: add w8, w9, w8
; CHECK-CVT-SD-NEXT: lsr w8, w8, #16
; CHECK-CVT-SD-NEXT: fmov s0, w8
; CHECK-CVT-SD-NEXT: mov v1.h[2], v0.h[0]
; CHECK-CVT-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-CVT-SD-NEXT: mov h0, v0.h[3]
; CHECK-CVT-SD-NEXT: str q1, [sp, #16] // 16-byte Spill
; CHECK-CVT-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-CVT-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-CVT-SD-NEXT: bl coshf
; CHECK-CVT-SD-NEXT: fmov w8, s0
; CHECK-CVT-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload
; CHECK-CVT-SD-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-SD-NEXT: add w8, w8, w19
; CHECK-CVT-SD-NEXT: add w8, w9, w8
; CHECK-CVT-SD-NEXT: lsr w8, w8, #16
; CHECK-CVT-SD-NEXT: fmov s0, w8
; CHECK-CVT-SD-NEXT: mov v1.h[3], v0.h[0]
; CHECK-CVT-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-CVT-SD-NEXT: mov h0, v0.h[4]
; CHECK-CVT-SD-NEXT: str q1, [sp, #16] // 16-byte Spill
; CHECK-CVT-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-CVT-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-CVT-SD-NEXT: bl coshf
; CHECK-CVT-SD-NEXT: fmov w8, s0
; CHECK-CVT-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload
; CHECK-CVT-SD-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-SD-NEXT: add w8, w8, w19
; CHECK-CVT-SD-NEXT: add w8, w9, w8
; CHECK-CVT-SD-NEXT: lsr w8, w8, #16
; CHECK-CVT-SD-NEXT: fmov s0, w8
; CHECK-CVT-SD-NEXT: mov v1.h[4], v0.h[0]
; CHECK-CVT-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-CVT-SD-NEXT: mov h0, v0.h[5]
; CHECK-CVT-SD-NEXT: str q1, [sp, #16] // 16-byte Spill
; CHECK-CVT-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-CVT-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-CVT-SD-NEXT: bl coshf
; CHECK-CVT-SD-NEXT: fmov w8, s0
; CHECK-CVT-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload
; CHECK-CVT-SD-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-SD-NEXT: add w8, w8, w19
; CHECK-CVT-SD-NEXT: add w8, w9, w8
; CHECK-CVT-SD-NEXT: lsr w8, w8, #16
; CHECK-CVT-SD-NEXT: fmov s0, w8
; CHECK-CVT-SD-NEXT: mov v1.h[5], v0.h[0]
; CHECK-CVT-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-CVT-SD-NEXT: mov h0, v0.h[6]
; CHECK-CVT-SD-NEXT: str q1, [sp, #16] // 16-byte Spill
; CHECK-CVT-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-CVT-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-CVT-SD-NEXT: bl coshf
; CHECK-CVT-SD-NEXT: fmov w8, s0
; CHECK-CVT-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload
; CHECK-CVT-SD-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-SD-NEXT: add w8, w8, w19
; CHECK-CVT-SD-NEXT: add w8, w9, w8
; CHECK-CVT-SD-NEXT: lsr w8, w8, #16
; CHECK-CVT-SD-NEXT: fmov s0, w8
; CHECK-CVT-SD-NEXT: mov v1.h[6], v0.h[0]
; CHECK-CVT-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-CVT-SD-NEXT: mov h0, v0.h[7]
; CHECK-CVT-SD-NEXT: str q1, [sp, #16] // 16-byte Spill
; CHECK-CVT-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-CVT-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-CVT-SD-NEXT: bl coshf
; CHECK-CVT-SD-NEXT: fmov w8, s0
; CHECK-CVT-SD-NEXT: ldr q0, [sp, #16] // 16-byte Reload
; CHECK-CVT-SD-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-SD-NEXT: add w8, w8, w19
; CHECK-CVT-SD-NEXT: ldp x30, x19, [sp, #32] // 16-byte Folded Reload
; CHECK-CVT-SD-NEXT: add w8, w9, w8
; CHECK-CVT-SD-NEXT: lsr w8, w8, #16
; CHECK-CVT-SD-NEXT: fmov s1, w8
; CHECK-CVT-SD-NEXT: mov v0.h[7], v1.h[0]
; CHECK-CVT-SD-NEXT: add sp, sp, #48
; CHECK-CVT-SD-NEXT: ret
;
; CHECK-BF16-SD-LABEL: test_cosh:
; CHECK-BF16-SD: // %bb.0:
; CHECK-BF16-SD-NEXT: sub sp, sp, #48
; CHECK-BF16-SD-NEXT: mov h1, v0.h[1]
; CHECK-BF16-SD-NEXT: str q0, [sp] // 16-byte Spill
; CHECK-BF16-SD-NEXT: str x30, [sp, #32] // 8-byte Spill
; CHECK-BF16-SD-NEXT: shll v0.4s, v1.4h, #16
; CHECK-BF16-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16-SD-NEXT: bl coshf
; CHECK-BF16-SD-NEXT: bfcvt h0, s0
; CHECK-BF16-SD-NEXT: str q0, [sp, #16] // 16-byte Spill
; CHECK-BF16-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-BF16-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16-SD-NEXT: bl coshf
; CHECK-BF16-SD-NEXT: bfcvt h0, s0
; CHECK-BF16-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload
; CHECK-BF16-SD-NEXT: mov v0.h[1], v1.h[0]
; CHECK-BF16-SD-NEXT: str q0, [sp, #16] // 16-byte Spill
; CHECK-BF16-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-BF16-SD-NEXT: mov h0, v0.h[2]
; CHECK-BF16-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16-SD-NEXT: bl coshf
; CHECK-BF16-SD-NEXT: bfcvt h0, s0
; CHECK-BF16-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload
; CHECK-BF16-SD-NEXT: mov v1.h[2], v0.h[0]
; CHECK-BF16-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-BF16-SD-NEXT: mov h0, v0.h[3]
; CHECK-BF16-SD-NEXT: str q1, [sp, #16] // 16-byte Spill
; CHECK-BF16-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16-SD-NEXT: bl coshf
; CHECK-BF16-SD-NEXT: bfcvt h0, s0
; CHECK-BF16-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload
; CHECK-BF16-SD-NEXT: mov v1.h[3], v0.h[0]
; CHECK-BF16-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-BF16-SD-NEXT: mov h0, v0.h[4]
; CHECK-BF16-SD-NEXT: str q1, [sp, #16] // 16-byte Spill
; CHECK-BF16-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16-SD-NEXT: bl coshf
; CHECK-BF16-SD-NEXT: bfcvt h0, s0
; CHECK-BF16-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload
; CHECK-BF16-SD-NEXT: mov v1.h[4], v0.h[0]
; CHECK-BF16-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-BF16-SD-NEXT: mov h0, v0.h[5]
; CHECK-BF16-SD-NEXT: str q1, [sp, #16] // 16-byte Spill
; CHECK-BF16-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16-SD-NEXT: bl coshf
; CHECK-BF16-SD-NEXT: bfcvt h0, s0
; CHECK-BF16-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload
; CHECK-BF16-SD-NEXT: mov v1.h[5], v0.h[0]
; CHECK-BF16-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-BF16-SD-NEXT: mov h0, v0.h[6]
; CHECK-BF16-SD-NEXT: str q1, [sp, #16] // 16-byte Spill
; CHECK-BF16-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16-SD-NEXT: bl coshf
; CHECK-BF16-SD-NEXT: bfcvt h0, s0
; CHECK-BF16-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload
; CHECK-BF16-SD-NEXT: mov v1.h[6], v0.h[0]
; CHECK-BF16-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-BF16-SD-NEXT: mov h0, v0.h[7]
; CHECK-BF16-SD-NEXT: str q1, [sp, #16] // 16-byte Spill
; CHECK-BF16-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16-SD-NEXT: bl coshf
; CHECK-BF16-SD-NEXT: bfcvt h1, s0
; CHECK-BF16-SD-NEXT: ldr q0, [sp, #16] // 16-byte Reload
; CHECK-BF16-SD-NEXT: ldr x30, [sp, #32] // 8-byte Reload
; CHECK-BF16-SD-NEXT: mov v0.h[7], v1.h[0]
; CHECK-BF16-SD-NEXT: add sp, sp, #48
; CHECK-BF16-SD-NEXT: ret
;
; CHECK-BF16SVE-SD-LABEL: test_cosh:
; CHECK-BF16SVE-SD: // %bb.0:
; CHECK-BF16SVE-SD-NEXT: sub sp, sp, #48
; CHECK-BF16SVE-SD-NEXT: mov h1, v0.h[1]
; CHECK-BF16SVE-SD-NEXT: str q0, [sp] // 16-byte Spill
; CHECK-BF16SVE-SD-NEXT: str x30, [sp, #32] // 8-byte Spill
; CHECK-BF16SVE-SD-NEXT: shll v0.4s, v1.4h, #16
; CHECK-BF16SVE-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16SVE-SD-NEXT: bl coshf
; CHECK-BF16SVE-SD-NEXT: bfcvt h0, s0
; CHECK-BF16SVE-SD-NEXT: str q0, [sp, #16] // 16-byte Spill
; CHECK-BF16SVE-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-BF16SVE-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16SVE-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16SVE-SD-NEXT: bl coshf
; CHECK-BF16SVE-SD-NEXT: bfcvt h0, s0
; CHECK-BF16SVE-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload
; CHECK-BF16SVE-SD-NEXT: mov v0.h[1], v1.h[0]
; CHECK-BF16SVE-SD-NEXT: str q0, [sp, #16] // 16-byte Spill
; CHECK-BF16SVE-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-BF16SVE-SD-NEXT: mov h0, v0.h[2]
; CHECK-BF16SVE-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16SVE-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16SVE-SD-NEXT: bl coshf
; CHECK-BF16SVE-SD-NEXT: bfcvt h0, s0
; CHECK-BF16SVE-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload
; CHECK-BF16SVE-SD-NEXT: mov v1.h[2], v0.h[0]
; CHECK-BF16SVE-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-BF16SVE-SD-NEXT: mov h0, v0.h[3]
; CHECK-BF16SVE-SD-NEXT: str q1, [sp, #16] // 16-byte Spill
; CHECK-BF16SVE-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16SVE-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16SVE-SD-NEXT: bl coshf
; CHECK-BF16SVE-SD-NEXT: bfcvt h0, s0
; CHECK-BF16SVE-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload
; CHECK-BF16SVE-SD-NEXT: mov v1.h[3], v0.h[0]
; CHECK-BF16SVE-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-BF16SVE-SD-NEXT: mov h0, v0.h[4]
; CHECK-BF16SVE-SD-NEXT: str q1, [sp, #16] // 16-byte Spill
; CHECK-BF16SVE-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16SVE-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16SVE-SD-NEXT: bl coshf
; CHECK-BF16SVE-SD-NEXT: bfcvt h0, s0
; CHECK-BF16SVE-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload
; CHECK-BF16SVE-SD-NEXT: mov v1.h[4], v0.h[0]
; CHECK-BF16SVE-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-BF16SVE-SD-NEXT: mov h0, v0.h[5]
; CHECK-BF16SVE-SD-NEXT: str q1, [sp, #16] // 16-byte Spill
; CHECK-BF16SVE-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16SVE-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16SVE-SD-NEXT: bl coshf
; CHECK-BF16SVE-SD-NEXT: bfcvt h0, s0
; CHECK-BF16SVE-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload
; CHECK-BF16SVE-SD-NEXT: mov v1.h[5], v0.h[0]
; CHECK-BF16SVE-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-BF16SVE-SD-NEXT: mov h0, v0.h[6]
; CHECK-BF16SVE-SD-NEXT: str q1, [sp, #16] // 16-byte Spill
; CHECK-BF16SVE-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16SVE-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16SVE-SD-NEXT: bl coshf
; CHECK-BF16SVE-SD-NEXT: bfcvt h0, s0
; CHECK-BF16SVE-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload
; CHECK-BF16SVE-SD-NEXT: mov v1.h[6], v0.h[0]
; CHECK-BF16SVE-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-BF16SVE-SD-NEXT: mov h0, v0.h[7]
; CHECK-BF16SVE-SD-NEXT: str q1, [sp, #16] // 16-byte Spill
; CHECK-BF16SVE-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16SVE-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16SVE-SD-NEXT: bl coshf
; CHECK-BF16SVE-SD-NEXT: bfcvt h1, s0
; CHECK-BF16SVE-SD-NEXT: ldr q0, [sp, #16] // 16-byte Reload
; CHECK-BF16SVE-SD-NEXT: ldr x30, [sp, #32] // 8-byte Reload
; CHECK-BF16SVE-SD-NEXT: mov v0.h[7], v1.h[0]
; CHECK-BF16SVE-SD-NEXT: add sp, sp, #48
; CHECK-BF16SVE-SD-NEXT: ret
;
; CHECK-CVT-GI-LABEL: test_cosh:
; CHECK-CVT-GI: // %bb.0:
; CHECK-CVT-GI-NEXT: str d14, [sp, #-128]! // 8-byte Folded Spill
; CHECK-CVT-GI-NEXT: stp d13, d12, [sp, #8] // 16-byte Folded Spill
; CHECK-CVT-GI-NEXT: mov h12, v0.h[1]
; CHECK-CVT-GI-NEXT: mov h13, v0.h[2]
; CHECK-CVT-GI-NEXT: stp d11, d10, [sp, #24] // 16-byte Folded Spill
; CHECK-CVT-GI-NEXT: mov h14, v0.h[3]
; CHECK-CVT-GI-NEXT: mov h11, v0.h[4]
; CHECK-CVT-GI-NEXT: stp d9, d8, [sp, #40] // 16-byte Folded Spill
; CHECK-CVT-GI-NEXT: mov h10, v0.h[5]
; CHECK-CVT-GI-NEXT: mov h9, v0.h[6]
; CHECK-CVT-GI-NEXT: mov h8, v0.h[7]
; CHECK-CVT-GI-NEXT: shll v0.4s, v0.4h, #16
; CHECK-CVT-GI-NEXT: str x30, [sp, #56] // 8-byte Spill
; CHECK-CVT-GI-NEXT: stp x26, x25, [sp, #64] // 16-byte Folded Spill
; CHECK-CVT-GI-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-CVT-GI-NEXT: stp x24, x23, [sp, #80] // 16-byte Folded Spill
; CHECK-CVT-GI-NEXT: stp x22, x21, [sp, #96] // 16-byte Folded Spill
; CHECK-CVT-GI-NEXT: stp x20, x19, [sp, #112] // 16-byte Folded Spill
; CHECK-CVT-GI-NEXT: bl coshf
; CHECK-CVT-GI-NEXT: fmov w8, s0
; CHECK-CVT-GI-NEXT: mov w19, #32767 // =0x7fff
; CHECK-CVT-GI-NEXT: fcmp s0, #0.0
; CHECK-CVT-GI-NEXT: shll v0.4s, v12.4h, #16
; CHECK-CVT-GI-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-CVT-GI-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-GI-NEXT: add w10, w8, w19
; CHECK-CVT-GI-NEXT: orr w8, w8, #0x400000
; CHECK-CVT-GI-NEXT: add w9, w10, w9
; CHECK-CVT-GI-NEXT: csel w8, w8, w9, vs
; CHECK-CVT-GI-NEXT: lsr w20, w8, #16
; CHECK-CVT-GI-NEXT: bl coshf
; CHECK-CVT-GI-NEXT: shll v1.4s, v13.4h, #16
; CHECK-CVT-GI-NEXT: fmov w8, s0
; CHECK-CVT-GI-NEXT: fcmp s0, #0.0
; CHECK-CVT-GI-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-GI-NEXT: fmov s0, s1
; CHECK-CVT-GI-NEXT: add w10, w8, w19
; CHECK-CVT-GI-NEXT: orr w8, w8, #0x400000
; CHECK-CVT-GI-NEXT: add w9, w10, w9
; CHECK-CVT-GI-NEXT: csel w8, w8, w9, vs
; CHECK-CVT-GI-NEXT: lsr w21, w8, #16
; CHECK-CVT-GI-NEXT: bl coshf
; CHECK-CVT-GI-NEXT: shll v1.4s, v14.4h, #16
; CHECK-CVT-GI-NEXT: fmov w8, s0
; CHECK-CVT-GI-NEXT: fcmp s0, #0.0
; CHECK-CVT-GI-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-GI-NEXT: fmov s0, s1
; CHECK-CVT-GI-NEXT: add w10, w8, w19
; CHECK-CVT-GI-NEXT: orr w8, w8, #0x400000
; CHECK-CVT-GI-NEXT: add w9, w10, w9
; CHECK-CVT-GI-NEXT: csel w8, w8, w9, vs
; CHECK-CVT-GI-NEXT: lsr w22, w8, #16
; CHECK-CVT-GI-NEXT: bl coshf
; CHECK-CVT-GI-NEXT: shll v1.4s, v11.4h, #16
; CHECK-CVT-GI-NEXT: fmov w8, s0
; CHECK-CVT-GI-NEXT: fcmp s0, #0.0
; CHECK-CVT-GI-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-GI-NEXT: fmov s0, s1
; CHECK-CVT-GI-NEXT: add w10, w8, w19
; CHECK-CVT-GI-NEXT: orr w8, w8, #0x400000
; CHECK-CVT-GI-NEXT: add w9, w10, w9
; CHECK-CVT-GI-NEXT: csel w8, w8, w9, vs
; CHECK-CVT-GI-NEXT: lsr w23, w8, #16
; CHECK-CVT-GI-NEXT: bl coshf
; CHECK-CVT-GI-NEXT: shll v1.4s, v10.4h, #16
; CHECK-CVT-GI-NEXT: fmov w8, s0
; CHECK-CVT-GI-NEXT: fcmp s0, #0.0
; CHECK-CVT-GI-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-GI-NEXT: fmov s0, s1
; CHECK-CVT-GI-NEXT: add w10, w8, w19
; CHECK-CVT-GI-NEXT: orr w8, w8, #0x400000
; CHECK-CVT-GI-NEXT: add w9, w10, w9
; CHECK-CVT-GI-NEXT: csel w8, w8, w9, vs
; CHECK-CVT-GI-NEXT: lsr w24, w8, #16
; CHECK-CVT-GI-NEXT: bl coshf
; CHECK-CVT-GI-NEXT: shll v1.4s, v9.4h, #16
; CHECK-CVT-GI-NEXT: fmov w8, s0
; CHECK-CVT-GI-NEXT: fcmp s0, #0.0
; CHECK-CVT-GI-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-GI-NEXT: fmov s0, s1
; CHECK-CVT-GI-NEXT: add w10, w8, w19
; CHECK-CVT-GI-NEXT: orr w8, w8, #0x400000
; CHECK-CVT-GI-NEXT: add w9, w10, w9
; CHECK-CVT-GI-NEXT: csel w8, w8, w9, vs
; CHECK-CVT-GI-NEXT: lsr w25, w8, #16
; CHECK-CVT-GI-NEXT: bl coshf
; CHECK-CVT-GI-NEXT: shll v1.4s, v8.4h, #16
; CHECK-CVT-GI-NEXT: fmov w8, s0
; CHECK-CVT-GI-NEXT: fcmp s0, #0.0
; CHECK-CVT-GI-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-GI-NEXT: fmov s0, s1
; CHECK-CVT-GI-NEXT: add w10, w8, w19
; CHECK-CVT-GI-NEXT: orr w8, w8, #0x400000
; CHECK-CVT-GI-NEXT: add w9, w10, w9
; CHECK-CVT-GI-NEXT: csel w8, w8, w9, vs
; CHECK-CVT-GI-NEXT: lsr w26, w8, #16
; CHECK-CVT-GI-NEXT: bl coshf
; CHECK-CVT-GI-NEXT: fmov s1, w20
; CHECK-CVT-GI-NEXT: fmov w8, s0
; CHECK-CVT-GI-NEXT: ldr x30, [sp, #56] // 8-byte Reload
; CHECK-CVT-GI-NEXT: fcmp s0, #0.0
; CHECK-CVT-GI-NEXT: ldp d9, d8, [sp, #40] // 16-byte Folded Reload
; CHECK-CVT-GI-NEXT: ldp d11, d10, [sp, #24] // 16-byte Folded Reload
; CHECK-CVT-GI-NEXT: mov v1.h[1], w21
; CHECK-CVT-GI-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-GI-NEXT: add w10, w8, w19
; CHECK-CVT-GI-NEXT: orr w8, w8, #0x400000
; CHECK-CVT-GI-NEXT: ldp x20, x19, [sp, #112] // 16-byte Folded Reload
; CHECK-CVT-GI-NEXT: add w9, w10, w9
; CHECK-CVT-GI-NEXT: ldp d13, d12, [sp, #8] // 16-byte Folded Reload
; CHECK-CVT-GI-NEXT: csel w8, w8, w9, vs
; CHECK-CVT-GI-NEXT: mov v1.h[2], w22
; CHECK-CVT-GI-NEXT: lsr w8, w8, #16
; CHECK-CVT-GI-NEXT: ldp x22, x21, [sp, #96] // 16-byte Folded Reload
; CHECK-CVT-GI-NEXT: mov v1.h[3], w23
; CHECK-CVT-GI-NEXT: mov v1.h[4], w24
; CHECK-CVT-GI-NEXT: ldp x24, x23, [sp, #80] // 16-byte Folded Reload
; CHECK-CVT-GI-NEXT: mov v1.h[5], w25
; CHECK-CVT-GI-NEXT: mov v1.h[6], w26
; CHECK-CVT-GI-NEXT: ldp x26, x25, [sp, #64] // 16-byte Folded Reload
; CHECK-CVT-GI-NEXT: mov v1.h[7], w8
; CHECK-CVT-GI-NEXT: mov v0.16b, v1.16b
; CHECK-CVT-GI-NEXT: ldr d14, [sp], #128 // 8-byte Folded Reload
; CHECK-CVT-GI-NEXT: ret
;
; CHECK-BF16-GI-LABEL: test_cosh:
; CHECK-BF16-GI: // %bb.0:
; CHECK-BF16-GI-NEXT: sub sp, sp, #176
; CHECK-BF16-GI-NEXT: str d14, [sp, #112] // 8-byte Spill
; CHECK-BF16-GI-NEXT: mov h14, v0.h[6]
; CHECK-BF16-GI-NEXT: stp d13, d12, [sp, #120] // 16-byte Folded Spill
; CHECK-BF16-GI-NEXT: mov h12, v0.h[4]
; CHECK-BF16-GI-NEXT: mov h13, v0.h[5]
; CHECK-BF16-GI-NEXT: stp d11, d10, [sp, #136] // 16-byte Folded Spill
; CHECK-BF16-GI-NEXT: mov h10, v0.h[2]
; CHECK-BF16-GI-NEXT: mov h11, v0.h[3]
; CHECK-BF16-GI-NEXT: stp d9, d8, [sp, #152] // 16-byte Folded Spill
; CHECK-BF16-GI-NEXT: mov h9, v0.h[1]
; CHECK-BF16-GI-NEXT: mov h8, v0.h[7]
; CHECK-BF16-GI-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16-GI-NEXT: str x30, [sp, #168] // 8-byte Spill
; CHECK-BF16-GI-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16-GI-NEXT: bl coshf
; CHECK-BF16-GI-NEXT: bfcvt h0, s0
; CHECK-BF16-GI-NEXT: str q0, [sp, #96] // 16-byte Spill
; CHECK-BF16-GI-NEXT: shll v0.4s, v9.4h, #16
; CHECK-BF16-GI-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16-GI-NEXT: bl coshf
; CHECK-BF16-GI-NEXT: bfcvt h0, s0
; CHECK-BF16-GI-NEXT: str q0, [sp, #80] // 16-byte Spill
; CHECK-BF16-GI-NEXT: shll v0.4s, v10.4h, #16
; CHECK-BF16-GI-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16-GI-NEXT: bl coshf
; CHECK-BF16-GI-NEXT: bfcvt h0, s0
; CHECK-BF16-GI-NEXT: str q0, [sp, #64] // 16-byte Spill
; CHECK-BF16-GI-NEXT: shll v0.4s, v11.4h, #16
; CHECK-BF16-GI-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16-GI-NEXT: bl coshf
; CHECK-BF16-GI-NEXT: bfcvt h0, s0
; CHECK-BF16-GI-NEXT: str q0, [sp, #48] // 16-byte Spill
; CHECK-BF16-GI-NEXT: shll v0.4s, v12.4h, #16
; CHECK-BF16-GI-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16-GI-NEXT: bl coshf
; CHECK-BF16-GI-NEXT: bfcvt h0, s0
; CHECK-BF16-GI-NEXT: str q0, [sp, #32] // 16-byte Spill
; CHECK-BF16-GI-NEXT: shll v0.4s, v13.4h, #16
; CHECK-BF16-GI-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16-GI-NEXT: bl coshf
; CHECK-BF16-GI-NEXT: bfcvt h0, s0
; CHECK-BF16-GI-NEXT: str q0, [sp, #16] // 16-byte Spill
; CHECK-BF16-GI-NEXT: shll v0.4s, v14.4h, #16
; CHECK-BF16-GI-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16-GI-NEXT: bl coshf
; CHECK-BF16-GI-NEXT: bfcvt h0, s0
; CHECK-BF16-GI-NEXT: str q0, [sp] // 16-byte Spill
; CHECK-BF16-GI-NEXT: shll v0.4s, v8.4h, #16
; CHECK-BF16-GI-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16-GI-NEXT: bl coshf
; CHECK-BF16-GI-NEXT: ldp q2, q1, [sp, #80] // 32-byte Folded Reload
; CHECK-BF16-GI-NEXT: bfcvt h0, s0
; CHECK-BF16-GI-NEXT: ldp d9, d8, [sp, #152] // 16-byte Folded Reload
; CHECK-BF16-GI-NEXT: ldr x30, [sp, #168] // 8-byte Reload
; CHECK-BF16-GI-NEXT: ldp d11, d10, [sp, #136] // 16-byte Folded Reload
; CHECK-BF16-GI-NEXT: ldr d14, [sp, #112] // 8-byte Reload
; CHECK-BF16-GI-NEXT: mov v1.h[1], v2.h[0]
; CHECK-BF16-GI-NEXT: ldp q2, q3, [sp, #48] // 32-byte Folded Reload
; CHECK-BF16-GI-NEXT: ldp d13, d12, [sp, #120] // 16-byte Folded Reload
; CHECK-BF16-GI-NEXT: mov v1.h[2], v3.h[0]
; CHECK-BF16-GI-NEXT: mov v1.h[3], v2.h[0]
; CHECK-BF16-GI-NEXT: ldp q2, q3, [sp, #16] // 32-byte Folded Reload
; CHECK-BF16-GI-NEXT: mov v1.h[4], v3.h[0]
; CHECK-BF16-GI-NEXT: mov v1.h[5], v2.h[0]
; CHECK-BF16-GI-NEXT: ldr q2, [sp] // 16-byte Reload
; CHECK-BF16-GI-NEXT: mov v1.h[6], v2.h[0]
; CHECK-BF16-GI-NEXT: mov v1.h[7], v0.h[0]
; CHECK-BF16-GI-NEXT: mov v0.16b, v1.16b
; CHECK-BF16-GI-NEXT: add sp, sp, #176
; CHECK-BF16-GI-NEXT: ret
%r = call <8 x bfloat> @llvm.cosh.v8bf16(<8 x bfloat> %a)
ret <8 x bfloat> %r
}
define <8 x bfloat> @test_sinh(<8 x bfloat> %a) #0 {
; CHECK-CVT-SD-LABEL: test_sinh:
; CHECK-CVT-SD: // %bb.0:
; CHECK-CVT-SD-NEXT: sub sp, sp, #48
; CHECK-CVT-SD-NEXT: mov h1, v0.h[1]
; CHECK-CVT-SD-NEXT: str q0, [sp] // 16-byte Spill
; CHECK-CVT-SD-NEXT: stp x30, x19, [sp, #32] // 16-byte Folded Spill
; CHECK-CVT-SD-NEXT: shll v0.4s, v1.4h, #16
; CHECK-CVT-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-CVT-SD-NEXT: bl sinhf
; CHECK-CVT-SD-NEXT: fmov w8, s0
; CHECK-CVT-SD-NEXT: mov w19, #32767 // =0x7fff
; CHECK-CVT-SD-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-SD-NEXT: add w8, w8, w19
; CHECK-CVT-SD-NEXT: add w8, w9, w8
; CHECK-CVT-SD-NEXT: lsr w8, w8, #16
; CHECK-CVT-SD-NEXT: fmov s0, w8
; CHECK-CVT-SD-NEXT: str q0, [sp, #16] // 16-byte Spill
; CHECK-CVT-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-CVT-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-CVT-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-CVT-SD-NEXT: bl sinhf
; CHECK-CVT-SD-NEXT: fmov w8, s0
; CHECK-CVT-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload
; CHECK-CVT-SD-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-SD-NEXT: add w8, w8, w19
; CHECK-CVT-SD-NEXT: add w8, w9, w8
; CHECK-CVT-SD-NEXT: lsr w8, w8, #16
; CHECK-CVT-SD-NEXT: fmov s0, w8
; CHECK-CVT-SD-NEXT: mov v0.h[1], v1.h[0]
; CHECK-CVT-SD-NEXT: str q0, [sp, #16] // 16-byte Spill
; CHECK-CVT-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-CVT-SD-NEXT: mov h0, v0.h[2]
; CHECK-CVT-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-CVT-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-CVT-SD-NEXT: bl sinhf
; CHECK-CVT-SD-NEXT: fmov w8, s0
; CHECK-CVT-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload
; CHECK-CVT-SD-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-SD-NEXT: add w8, w8, w19
; CHECK-CVT-SD-NEXT: add w8, w9, w8
; CHECK-CVT-SD-NEXT: lsr w8, w8, #16
; CHECK-CVT-SD-NEXT: fmov s0, w8
; CHECK-CVT-SD-NEXT: mov v1.h[2], v0.h[0]
; CHECK-CVT-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-CVT-SD-NEXT: mov h0, v0.h[3]
; CHECK-CVT-SD-NEXT: str q1, [sp, #16] // 16-byte Spill
; CHECK-CVT-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-CVT-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-CVT-SD-NEXT: bl sinhf
; CHECK-CVT-SD-NEXT: fmov w8, s0
; CHECK-CVT-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload
; CHECK-CVT-SD-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-SD-NEXT: add w8, w8, w19
; CHECK-CVT-SD-NEXT: add w8, w9, w8
; CHECK-CVT-SD-NEXT: lsr w8, w8, #16
; CHECK-CVT-SD-NEXT: fmov s0, w8
; CHECK-CVT-SD-NEXT: mov v1.h[3], v0.h[0]
; CHECK-CVT-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-CVT-SD-NEXT: mov h0, v0.h[4]
; CHECK-CVT-SD-NEXT: str q1, [sp, #16] // 16-byte Spill
; CHECK-CVT-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-CVT-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-CVT-SD-NEXT: bl sinhf
; CHECK-CVT-SD-NEXT: fmov w8, s0
; CHECK-CVT-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload
; CHECK-CVT-SD-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-SD-NEXT: add w8, w8, w19
; CHECK-CVT-SD-NEXT: add w8, w9, w8
; CHECK-CVT-SD-NEXT: lsr w8, w8, #16
; CHECK-CVT-SD-NEXT: fmov s0, w8
; CHECK-CVT-SD-NEXT: mov v1.h[4], v0.h[0]
; CHECK-CVT-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-CVT-SD-NEXT: mov h0, v0.h[5]
; CHECK-CVT-SD-NEXT: str q1, [sp, #16] // 16-byte Spill
; CHECK-CVT-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-CVT-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-CVT-SD-NEXT: bl sinhf
; CHECK-CVT-SD-NEXT: fmov w8, s0
; CHECK-CVT-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload
; CHECK-CVT-SD-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-SD-NEXT: add w8, w8, w19
; CHECK-CVT-SD-NEXT: add w8, w9, w8
; CHECK-CVT-SD-NEXT: lsr w8, w8, #16
; CHECK-CVT-SD-NEXT: fmov s0, w8
; CHECK-CVT-SD-NEXT: mov v1.h[5], v0.h[0]
; CHECK-CVT-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-CVT-SD-NEXT: mov h0, v0.h[6]
; CHECK-CVT-SD-NEXT: str q1, [sp, #16] // 16-byte Spill
; CHECK-CVT-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-CVT-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-CVT-SD-NEXT: bl sinhf
; CHECK-CVT-SD-NEXT: fmov w8, s0
; CHECK-CVT-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload
; CHECK-CVT-SD-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-SD-NEXT: add w8, w8, w19
; CHECK-CVT-SD-NEXT: add w8, w9, w8
; CHECK-CVT-SD-NEXT: lsr w8, w8, #16
; CHECK-CVT-SD-NEXT: fmov s0, w8
; CHECK-CVT-SD-NEXT: mov v1.h[6], v0.h[0]
; CHECK-CVT-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-CVT-SD-NEXT: mov h0, v0.h[7]
; CHECK-CVT-SD-NEXT: str q1, [sp, #16] // 16-byte Spill
; CHECK-CVT-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-CVT-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-CVT-SD-NEXT: bl sinhf
; CHECK-CVT-SD-NEXT: fmov w8, s0
; CHECK-CVT-SD-NEXT: ldr q0, [sp, #16] // 16-byte Reload
; CHECK-CVT-SD-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-SD-NEXT: add w8, w8, w19
; CHECK-CVT-SD-NEXT: ldp x30, x19, [sp, #32] // 16-byte Folded Reload
; CHECK-CVT-SD-NEXT: add w8, w9, w8
; CHECK-CVT-SD-NEXT: lsr w8, w8, #16
; CHECK-CVT-SD-NEXT: fmov s1, w8
; CHECK-CVT-SD-NEXT: mov v0.h[7], v1.h[0]
; CHECK-CVT-SD-NEXT: add sp, sp, #48
; CHECK-CVT-SD-NEXT: ret
;
; CHECK-BF16-SD-LABEL: test_sinh:
; CHECK-BF16-SD: // %bb.0:
; CHECK-BF16-SD-NEXT: sub sp, sp, #48
; CHECK-BF16-SD-NEXT: mov h1, v0.h[1]
; CHECK-BF16-SD-NEXT: str q0, [sp] // 16-byte Spill
; CHECK-BF16-SD-NEXT: str x30, [sp, #32] // 8-byte Spill
; CHECK-BF16-SD-NEXT: shll v0.4s, v1.4h, #16
; CHECK-BF16-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16-SD-NEXT: bl sinhf
; CHECK-BF16-SD-NEXT: bfcvt h0, s0
; CHECK-BF16-SD-NEXT: str q0, [sp, #16] // 16-byte Spill
; CHECK-BF16-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-BF16-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16-SD-NEXT: bl sinhf
; CHECK-BF16-SD-NEXT: bfcvt h0, s0
; CHECK-BF16-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload
; CHECK-BF16-SD-NEXT: mov v0.h[1], v1.h[0]
; CHECK-BF16-SD-NEXT: str q0, [sp, #16] // 16-byte Spill
; CHECK-BF16-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-BF16-SD-NEXT: mov h0, v0.h[2]
; CHECK-BF16-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16-SD-NEXT: bl sinhf
; CHECK-BF16-SD-NEXT: bfcvt h0, s0
; CHECK-BF16-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload
; CHECK-BF16-SD-NEXT: mov v1.h[2], v0.h[0]
; CHECK-BF16-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-BF16-SD-NEXT: mov h0, v0.h[3]
; CHECK-BF16-SD-NEXT: str q1, [sp, #16] // 16-byte Spill
; CHECK-BF16-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16-SD-NEXT: bl sinhf
; CHECK-BF16-SD-NEXT: bfcvt h0, s0
; CHECK-BF16-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload
; CHECK-BF16-SD-NEXT: mov v1.h[3], v0.h[0]
; CHECK-BF16-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-BF16-SD-NEXT: mov h0, v0.h[4]
; CHECK-BF16-SD-NEXT: str q1, [sp, #16] // 16-byte Spill
; CHECK-BF16-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16-SD-NEXT: bl sinhf
; CHECK-BF16-SD-NEXT: bfcvt h0, s0
; CHECK-BF16-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload
; CHECK-BF16-SD-NEXT: mov v1.h[4], v0.h[0]
; CHECK-BF16-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-BF16-SD-NEXT: mov h0, v0.h[5]
; CHECK-BF16-SD-NEXT: str q1, [sp, #16] // 16-byte Spill
; CHECK-BF16-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16-SD-NEXT: bl sinhf
; CHECK-BF16-SD-NEXT: bfcvt h0, s0
; CHECK-BF16-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload
; CHECK-BF16-SD-NEXT: mov v1.h[5], v0.h[0]
; CHECK-BF16-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-BF16-SD-NEXT: mov h0, v0.h[6]
; CHECK-BF16-SD-NEXT: str q1, [sp, #16] // 16-byte Spill
; CHECK-BF16-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16-SD-NEXT: bl sinhf
; CHECK-BF16-SD-NEXT: bfcvt h0, s0
; CHECK-BF16-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload
; CHECK-BF16-SD-NEXT: mov v1.h[6], v0.h[0]
; CHECK-BF16-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-BF16-SD-NEXT: mov h0, v0.h[7]
; CHECK-BF16-SD-NEXT: str q1, [sp, #16] // 16-byte Spill
; CHECK-BF16-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16-SD-NEXT: bl sinhf
; CHECK-BF16-SD-NEXT: bfcvt h1, s0
; CHECK-BF16-SD-NEXT: ldr q0, [sp, #16] // 16-byte Reload
; CHECK-BF16-SD-NEXT: ldr x30, [sp, #32] // 8-byte Reload
; CHECK-BF16-SD-NEXT: mov v0.h[7], v1.h[0]
; CHECK-BF16-SD-NEXT: add sp, sp, #48
; CHECK-BF16-SD-NEXT: ret
;
; CHECK-BF16SVE-SD-LABEL: test_sinh:
; CHECK-BF16SVE-SD: // %bb.0:
; CHECK-BF16SVE-SD-NEXT: sub sp, sp, #48
; CHECK-BF16SVE-SD-NEXT: mov h1, v0.h[1]
; CHECK-BF16SVE-SD-NEXT: str q0, [sp] // 16-byte Spill
; CHECK-BF16SVE-SD-NEXT: str x30, [sp, #32] // 8-byte Spill
; CHECK-BF16SVE-SD-NEXT: shll v0.4s, v1.4h, #16
; CHECK-BF16SVE-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16SVE-SD-NEXT: bl sinhf
; CHECK-BF16SVE-SD-NEXT: bfcvt h0, s0
; CHECK-BF16SVE-SD-NEXT: str q0, [sp, #16] // 16-byte Spill
; CHECK-BF16SVE-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-BF16SVE-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16SVE-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16SVE-SD-NEXT: bl sinhf
; CHECK-BF16SVE-SD-NEXT: bfcvt h0, s0
; CHECK-BF16SVE-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload
; CHECK-BF16SVE-SD-NEXT: mov v0.h[1], v1.h[0]
; CHECK-BF16SVE-SD-NEXT: str q0, [sp, #16] // 16-byte Spill
; CHECK-BF16SVE-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-BF16SVE-SD-NEXT: mov h0, v0.h[2]
; CHECK-BF16SVE-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16SVE-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16SVE-SD-NEXT: bl sinhf
; CHECK-BF16SVE-SD-NEXT: bfcvt h0, s0
; CHECK-BF16SVE-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload
; CHECK-BF16SVE-SD-NEXT: mov v1.h[2], v0.h[0]
; CHECK-BF16SVE-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-BF16SVE-SD-NEXT: mov h0, v0.h[3]
; CHECK-BF16SVE-SD-NEXT: str q1, [sp, #16] // 16-byte Spill
; CHECK-BF16SVE-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16SVE-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16SVE-SD-NEXT: bl sinhf
; CHECK-BF16SVE-SD-NEXT: bfcvt h0, s0
; CHECK-BF16SVE-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload
; CHECK-BF16SVE-SD-NEXT: mov v1.h[3], v0.h[0]
; CHECK-BF16SVE-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-BF16SVE-SD-NEXT: mov h0, v0.h[4]
; CHECK-BF16SVE-SD-NEXT: str q1, [sp, #16] // 16-byte Spill
; CHECK-BF16SVE-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16SVE-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16SVE-SD-NEXT: bl sinhf
; CHECK-BF16SVE-SD-NEXT: bfcvt h0, s0
; CHECK-BF16SVE-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload
; CHECK-BF16SVE-SD-NEXT: mov v1.h[4], v0.h[0]
; CHECK-BF16SVE-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-BF16SVE-SD-NEXT: mov h0, v0.h[5]
; CHECK-BF16SVE-SD-NEXT: str q1, [sp, #16] // 16-byte Spill
; CHECK-BF16SVE-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16SVE-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16SVE-SD-NEXT: bl sinhf
; CHECK-BF16SVE-SD-NEXT: bfcvt h0, s0
; CHECK-BF16SVE-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload
; CHECK-BF16SVE-SD-NEXT: mov v1.h[5], v0.h[0]
; CHECK-BF16SVE-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-BF16SVE-SD-NEXT: mov h0, v0.h[6]
; CHECK-BF16SVE-SD-NEXT: str q1, [sp, #16] // 16-byte Spill
; CHECK-BF16SVE-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16SVE-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16SVE-SD-NEXT: bl sinhf
; CHECK-BF16SVE-SD-NEXT: bfcvt h0, s0
; CHECK-BF16SVE-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload
; CHECK-BF16SVE-SD-NEXT: mov v1.h[6], v0.h[0]
; CHECK-BF16SVE-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-BF16SVE-SD-NEXT: mov h0, v0.h[7]
; CHECK-BF16SVE-SD-NEXT: str q1, [sp, #16] // 16-byte Spill
; CHECK-BF16SVE-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16SVE-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16SVE-SD-NEXT: bl sinhf
; CHECK-BF16SVE-SD-NEXT: bfcvt h1, s0
; CHECK-BF16SVE-SD-NEXT: ldr q0, [sp, #16] // 16-byte Reload
; CHECK-BF16SVE-SD-NEXT: ldr x30, [sp, #32] // 8-byte Reload
; CHECK-BF16SVE-SD-NEXT: mov v0.h[7], v1.h[0]
; CHECK-BF16SVE-SD-NEXT: add sp, sp, #48
; CHECK-BF16SVE-SD-NEXT: ret
;
; CHECK-CVT-GI-LABEL: test_sinh:
; CHECK-CVT-GI: // %bb.0:
; CHECK-CVT-GI-NEXT: str d14, [sp, #-128]! // 8-byte Folded Spill
; CHECK-CVT-GI-NEXT: stp d13, d12, [sp, #8] // 16-byte Folded Spill
; CHECK-CVT-GI-NEXT: mov h12, v0.h[1]
; CHECK-CVT-GI-NEXT: mov h13, v0.h[2]
; CHECK-CVT-GI-NEXT: stp d11, d10, [sp, #24] // 16-byte Folded Spill
; CHECK-CVT-GI-NEXT: mov h14, v0.h[3]
; CHECK-CVT-GI-NEXT: mov h11, v0.h[4]
; CHECK-CVT-GI-NEXT: stp d9, d8, [sp, #40] // 16-byte Folded Spill
; CHECK-CVT-GI-NEXT: mov h10, v0.h[5]
; CHECK-CVT-GI-NEXT: mov h9, v0.h[6]
; CHECK-CVT-GI-NEXT: mov h8, v0.h[7]
; CHECK-CVT-GI-NEXT: shll v0.4s, v0.4h, #16
; CHECK-CVT-GI-NEXT: str x30, [sp, #56] // 8-byte Spill
; CHECK-CVT-GI-NEXT: stp x26, x25, [sp, #64] // 16-byte Folded Spill
; CHECK-CVT-GI-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-CVT-GI-NEXT: stp x24, x23, [sp, #80] // 16-byte Folded Spill
; CHECK-CVT-GI-NEXT: stp x22, x21, [sp, #96] // 16-byte Folded Spill
; CHECK-CVT-GI-NEXT: stp x20, x19, [sp, #112] // 16-byte Folded Spill
; CHECK-CVT-GI-NEXT: bl sinhf
; CHECK-CVT-GI-NEXT: fmov w8, s0
; CHECK-CVT-GI-NEXT: mov w19, #32767 // =0x7fff
; CHECK-CVT-GI-NEXT: fcmp s0, #0.0
; CHECK-CVT-GI-NEXT: shll v0.4s, v12.4h, #16
; CHECK-CVT-GI-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-CVT-GI-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-GI-NEXT: add w10, w8, w19
; CHECK-CVT-GI-NEXT: orr w8, w8, #0x400000
; CHECK-CVT-GI-NEXT: add w9, w10, w9
; CHECK-CVT-GI-NEXT: csel w8, w8, w9, vs
; CHECK-CVT-GI-NEXT: lsr w20, w8, #16
; CHECK-CVT-GI-NEXT: bl sinhf
; CHECK-CVT-GI-NEXT: shll v1.4s, v13.4h, #16
; CHECK-CVT-GI-NEXT: fmov w8, s0
; CHECK-CVT-GI-NEXT: fcmp s0, #0.0
; CHECK-CVT-GI-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-GI-NEXT: fmov s0, s1
; CHECK-CVT-GI-NEXT: add w10, w8, w19
; CHECK-CVT-GI-NEXT: orr w8, w8, #0x400000
; CHECK-CVT-GI-NEXT: add w9, w10, w9
; CHECK-CVT-GI-NEXT: csel w8, w8, w9, vs
; CHECK-CVT-GI-NEXT: lsr w21, w8, #16
; CHECK-CVT-GI-NEXT: bl sinhf
; CHECK-CVT-GI-NEXT: shll v1.4s, v14.4h, #16
; CHECK-CVT-GI-NEXT: fmov w8, s0
; CHECK-CVT-GI-NEXT: fcmp s0, #0.0
; CHECK-CVT-GI-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-GI-NEXT: fmov s0, s1
; CHECK-CVT-GI-NEXT: add w10, w8, w19
; CHECK-CVT-GI-NEXT: orr w8, w8, #0x400000
; CHECK-CVT-GI-NEXT: add w9, w10, w9
; CHECK-CVT-GI-NEXT: csel w8, w8, w9, vs
; CHECK-CVT-GI-NEXT: lsr w22, w8, #16
; CHECK-CVT-GI-NEXT: bl sinhf
; CHECK-CVT-GI-NEXT: shll v1.4s, v11.4h, #16
; CHECK-CVT-GI-NEXT: fmov w8, s0
; CHECK-CVT-GI-NEXT: fcmp s0, #0.0
; CHECK-CVT-GI-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-GI-NEXT: fmov s0, s1
; CHECK-CVT-GI-NEXT: add w10, w8, w19
; CHECK-CVT-GI-NEXT: orr w8, w8, #0x400000
; CHECK-CVT-GI-NEXT: add w9, w10, w9
; CHECK-CVT-GI-NEXT: csel w8, w8, w9, vs
; CHECK-CVT-GI-NEXT: lsr w23, w8, #16
; CHECK-CVT-GI-NEXT: bl sinhf
; CHECK-CVT-GI-NEXT: shll v1.4s, v10.4h, #16
; CHECK-CVT-GI-NEXT: fmov w8, s0
; CHECK-CVT-GI-NEXT: fcmp s0, #0.0
; CHECK-CVT-GI-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-GI-NEXT: fmov s0, s1
; CHECK-CVT-GI-NEXT: add w10, w8, w19
; CHECK-CVT-GI-NEXT: orr w8, w8, #0x400000
; CHECK-CVT-GI-NEXT: add w9, w10, w9
; CHECK-CVT-GI-NEXT: csel w8, w8, w9, vs
; CHECK-CVT-GI-NEXT: lsr w24, w8, #16
; CHECK-CVT-GI-NEXT: bl sinhf
; CHECK-CVT-GI-NEXT: shll v1.4s, v9.4h, #16
; CHECK-CVT-GI-NEXT: fmov w8, s0
; CHECK-CVT-GI-NEXT: fcmp s0, #0.0
; CHECK-CVT-GI-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-GI-NEXT: fmov s0, s1
; CHECK-CVT-GI-NEXT: add w10, w8, w19
; CHECK-CVT-GI-NEXT: orr w8, w8, #0x400000
; CHECK-CVT-GI-NEXT: add w9, w10, w9
; CHECK-CVT-GI-NEXT: csel w8, w8, w9, vs
; CHECK-CVT-GI-NEXT: lsr w25, w8, #16
; CHECK-CVT-GI-NEXT: bl sinhf
; CHECK-CVT-GI-NEXT: shll v1.4s, v8.4h, #16
; CHECK-CVT-GI-NEXT: fmov w8, s0
; CHECK-CVT-GI-NEXT: fcmp s0, #0.0
; CHECK-CVT-GI-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-GI-NEXT: fmov s0, s1
; CHECK-CVT-GI-NEXT: add w10, w8, w19
; CHECK-CVT-GI-NEXT: orr w8, w8, #0x400000
; CHECK-CVT-GI-NEXT: add w9, w10, w9
; CHECK-CVT-GI-NEXT: csel w8, w8, w9, vs
; CHECK-CVT-GI-NEXT: lsr w26, w8, #16
; CHECK-CVT-GI-NEXT: bl sinhf
; CHECK-CVT-GI-NEXT: fmov s1, w20
; CHECK-CVT-GI-NEXT: fmov w8, s0
; CHECK-CVT-GI-NEXT: ldr x30, [sp, #56] // 8-byte Reload
; CHECK-CVT-GI-NEXT: fcmp s0, #0.0
; CHECK-CVT-GI-NEXT: ldp d9, d8, [sp, #40] // 16-byte Folded Reload
; CHECK-CVT-GI-NEXT: ldp d11, d10, [sp, #24] // 16-byte Folded Reload
; CHECK-CVT-GI-NEXT: mov v1.h[1], w21
; CHECK-CVT-GI-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-GI-NEXT: add w10, w8, w19
; CHECK-CVT-GI-NEXT: orr w8, w8, #0x400000
; CHECK-CVT-GI-NEXT: ldp x20, x19, [sp, #112] // 16-byte Folded Reload
; CHECK-CVT-GI-NEXT: add w9, w10, w9
; CHECK-CVT-GI-NEXT: ldp d13, d12, [sp, #8] // 16-byte Folded Reload
; CHECK-CVT-GI-NEXT: csel w8, w8, w9, vs
; CHECK-CVT-GI-NEXT: mov v1.h[2], w22
; CHECK-CVT-GI-NEXT: lsr w8, w8, #16
; CHECK-CVT-GI-NEXT: ldp x22, x21, [sp, #96] // 16-byte Folded Reload
; CHECK-CVT-GI-NEXT: mov v1.h[3], w23
; CHECK-CVT-GI-NEXT: mov v1.h[4], w24
; CHECK-CVT-GI-NEXT: ldp x24, x23, [sp, #80] // 16-byte Folded Reload
; CHECK-CVT-GI-NEXT: mov v1.h[5], w25
; CHECK-CVT-GI-NEXT: mov v1.h[6], w26
; CHECK-CVT-GI-NEXT: ldp x26, x25, [sp, #64] // 16-byte Folded Reload
; CHECK-CVT-GI-NEXT: mov v1.h[7], w8
; CHECK-CVT-GI-NEXT: mov v0.16b, v1.16b
; CHECK-CVT-GI-NEXT: ldr d14, [sp], #128 // 8-byte Folded Reload
; CHECK-CVT-GI-NEXT: ret
;
; CHECK-BF16-GI-LABEL: test_sinh:
; CHECK-BF16-GI: // %bb.0:
; CHECK-BF16-GI-NEXT: sub sp, sp, #176
; CHECK-BF16-GI-NEXT: str d14, [sp, #112] // 8-byte Spill
; CHECK-BF16-GI-NEXT: mov h14, v0.h[6]
; CHECK-BF16-GI-NEXT: stp d13, d12, [sp, #120] // 16-byte Folded Spill
; CHECK-BF16-GI-NEXT: mov h12, v0.h[4]
; CHECK-BF16-GI-NEXT: mov h13, v0.h[5]
; CHECK-BF16-GI-NEXT: stp d11, d10, [sp, #136] // 16-byte Folded Spill
; CHECK-BF16-GI-NEXT: mov h10, v0.h[2]
; CHECK-BF16-GI-NEXT: mov h11, v0.h[3]
; CHECK-BF16-GI-NEXT: stp d9, d8, [sp, #152] // 16-byte Folded Spill
; CHECK-BF16-GI-NEXT: mov h9, v0.h[1]
; CHECK-BF16-GI-NEXT: mov h8, v0.h[7]
; CHECK-BF16-GI-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16-GI-NEXT: str x30, [sp, #168] // 8-byte Spill
; CHECK-BF16-GI-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16-GI-NEXT: bl sinhf
; CHECK-BF16-GI-NEXT: bfcvt h0, s0
; CHECK-BF16-GI-NEXT: str q0, [sp, #96] // 16-byte Spill
; CHECK-BF16-GI-NEXT: shll v0.4s, v9.4h, #16
; CHECK-BF16-GI-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16-GI-NEXT: bl sinhf
; CHECK-BF16-GI-NEXT: bfcvt h0, s0
; CHECK-BF16-GI-NEXT: str q0, [sp, #80] // 16-byte Spill
; CHECK-BF16-GI-NEXT: shll v0.4s, v10.4h, #16
; CHECK-BF16-GI-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16-GI-NEXT: bl sinhf
; CHECK-BF16-GI-NEXT: bfcvt h0, s0
; CHECK-BF16-GI-NEXT: str q0, [sp, #64] // 16-byte Spill
; CHECK-BF16-GI-NEXT: shll v0.4s, v11.4h, #16
; CHECK-BF16-GI-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16-GI-NEXT: bl sinhf
; CHECK-BF16-GI-NEXT: bfcvt h0, s0
; CHECK-BF16-GI-NEXT: str q0, [sp, #48] // 16-byte Spill
; CHECK-BF16-GI-NEXT: shll v0.4s, v12.4h, #16
; CHECK-BF16-GI-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16-GI-NEXT: bl sinhf
; CHECK-BF16-GI-NEXT: bfcvt h0, s0
; CHECK-BF16-GI-NEXT: str q0, [sp, #32] // 16-byte Spill
; CHECK-BF16-GI-NEXT: shll v0.4s, v13.4h, #16
; CHECK-BF16-GI-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16-GI-NEXT: bl sinhf
; CHECK-BF16-GI-NEXT: bfcvt h0, s0
; CHECK-BF16-GI-NEXT: str q0, [sp, #16] // 16-byte Spill
; CHECK-BF16-GI-NEXT: shll v0.4s, v14.4h, #16
; CHECK-BF16-GI-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16-GI-NEXT: bl sinhf
; CHECK-BF16-GI-NEXT: bfcvt h0, s0
; CHECK-BF16-GI-NEXT: str q0, [sp] // 16-byte Spill
; CHECK-BF16-GI-NEXT: shll v0.4s, v8.4h, #16
; CHECK-BF16-GI-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16-GI-NEXT: bl sinhf
; CHECK-BF16-GI-NEXT: ldp q2, q1, [sp, #80] // 32-byte Folded Reload
; CHECK-BF16-GI-NEXT: bfcvt h0, s0
; CHECK-BF16-GI-NEXT: ldp d9, d8, [sp, #152] // 16-byte Folded Reload
; CHECK-BF16-GI-NEXT: ldr x30, [sp, #168] // 8-byte Reload
; CHECK-BF16-GI-NEXT: ldp d11, d10, [sp, #136] // 16-byte Folded Reload
; CHECK-BF16-GI-NEXT: ldr d14, [sp, #112] // 8-byte Reload
; CHECK-BF16-GI-NEXT: mov v1.h[1], v2.h[0]
; CHECK-BF16-GI-NEXT: ldp q2, q3, [sp, #48] // 32-byte Folded Reload
; CHECK-BF16-GI-NEXT: ldp d13, d12, [sp, #120] // 16-byte Folded Reload
; CHECK-BF16-GI-NEXT: mov v1.h[2], v3.h[0]
; CHECK-BF16-GI-NEXT: mov v1.h[3], v2.h[0]
; CHECK-BF16-GI-NEXT: ldp q2, q3, [sp, #16] // 32-byte Folded Reload
; CHECK-BF16-GI-NEXT: mov v1.h[4], v3.h[0]
; CHECK-BF16-GI-NEXT: mov v1.h[5], v2.h[0]
; CHECK-BF16-GI-NEXT: ldr q2, [sp] // 16-byte Reload
; CHECK-BF16-GI-NEXT: mov v1.h[6], v2.h[0]
; CHECK-BF16-GI-NEXT: mov v1.h[7], v0.h[0]
; CHECK-BF16-GI-NEXT: mov v0.16b, v1.16b
; CHECK-BF16-GI-NEXT: add sp, sp, #176
; CHECK-BF16-GI-NEXT: ret
%r = call <8 x bfloat> @llvm.sinh.v8bf16(<8 x bfloat> %a)
ret <8 x bfloat> %r
}
define <8 x bfloat> @test_tanh(<8 x bfloat> %a) #0 {
; CHECK-CVT-SD-LABEL: test_tanh:
; CHECK-CVT-SD: // %bb.0:
; CHECK-CVT-SD-NEXT: sub sp, sp, #48
; CHECK-CVT-SD-NEXT: mov h1, v0.h[1]
; CHECK-CVT-SD-NEXT: str q0, [sp] // 16-byte Spill
; CHECK-CVT-SD-NEXT: stp x30, x19, [sp, #32] // 16-byte Folded Spill
; CHECK-CVT-SD-NEXT: shll v0.4s, v1.4h, #16
; CHECK-CVT-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-CVT-SD-NEXT: bl tanhf
; CHECK-CVT-SD-NEXT: fmov w8, s0
; CHECK-CVT-SD-NEXT: mov w19, #32767 // =0x7fff
; CHECK-CVT-SD-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-SD-NEXT: add w8, w8, w19
; CHECK-CVT-SD-NEXT: add w8, w9, w8
; CHECK-CVT-SD-NEXT: lsr w8, w8, #16
; CHECK-CVT-SD-NEXT: fmov s0, w8
; CHECK-CVT-SD-NEXT: str q0, [sp, #16] // 16-byte Spill
; CHECK-CVT-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-CVT-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-CVT-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-CVT-SD-NEXT: bl tanhf
; CHECK-CVT-SD-NEXT: fmov w8, s0
; CHECK-CVT-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload
; CHECK-CVT-SD-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-SD-NEXT: add w8, w8, w19
; CHECK-CVT-SD-NEXT: add w8, w9, w8
; CHECK-CVT-SD-NEXT: lsr w8, w8, #16
; CHECK-CVT-SD-NEXT: fmov s0, w8
; CHECK-CVT-SD-NEXT: mov v0.h[1], v1.h[0]
; CHECK-CVT-SD-NEXT: str q0, [sp, #16] // 16-byte Spill
; CHECK-CVT-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-CVT-SD-NEXT: mov h0, v0.h[2]
; CHECK-CVT-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-CVT-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-CVT-SD-NEXT: bl tanhf
; CHECK-CVT-SD-NEXT: fmov w8, s0
; CHECK-CVT-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload
; CHECK-CVT-SD-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-SD-NEXT: add w8, w8, w19
; CHECK-CVT-SD-NEXT: add w8, w9, w8
; CHECK-CVT-SD-NEXT: lsr w8, w8, #16
; CHECK-CVT-SD-NEXT: fmov s0, w8
; CHECK-CVT-SD-NEXT: mov v1.h[2], v0.h[0]
; CHECK-CVT-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-CVT-SD-NEXT: mov h0, v0.h[3]
; CHECK-CVT-SD-NEXT: str q1, [sp, #16] // 16-byte Spill
; CHECK-CVT-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-CVT-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-CVT-SD-NEXT: bl tanhf
; CHECK-CVT-SD-NEXT: fmov w8, s0
; CHECK-CVT-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload
; CHECK-CVT-SD-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-SD-NEXT: add w8, w8, w19
; CHECK-CVT-SD-NEXT: add w8, w9, w8
; CHECK-CVT-SD-NEXT: lsr w8, w8, #16
; CHECK-CVT-SD-NEXT: fmov s0, w8
; CHECK-CVT-SD-NEXT: mov v1.h[3], v0.h[0]
; CHECK-CVT-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-CVT-SD-NEXT: mov h0, v0.h[4]
; CHECK-CVT-SD-NEXT: str q1, [sp, #16] // 16-byte Spill
; CHECK-CVT-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-CVT-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-CVT-SD-NEXT: bl tanhf
; CHECK-CVT-SD-NEXT: fmov w8, s0
; CHECK-CVT-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload
; CHECK-CVT-SD-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-SD-NEXT: add w8, w8, w19
; CHECK-CVT-SD-NEXT: add w8, w9, w8
; CHECK-CVT-SD-NEXT: lsr w8, w8, #16
; CHECK-CVT-SD-NEXT: fmov s0, w8
; CHECK-CVT-SD-NEXT: mov v1.h[4], v0.h[0]
; CHECK-CVT-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-CVT-SD-NEXT: mov h0, v0.h[5]
; CHECK-CVT-SD-NEXT: str q1, [sp, #16] // 16-byte Spill
; CHECK-CVT-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-CVT-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-CVT-SD-NEXT: bl tanhf
; CHECK-CVT-SD-NEXT: fmov w8, s0
; CHECK-CVT-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload
; CHECK-CVT-SD-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-SD-NEXT: add w8, w8, w19
; CHECK-CVT-SD-NEXT: add w8, w9, w8
; CHECK-CVT-SD-NEXT: lsr w8, w8, #16
; CHECK-CVT-SD-NEXT: fmov s0, w8
; CHECK-CVT-SD-NEXT: mov v1.h[5], v0.h[0]
; CHECK-CVT-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-CVT-SD-NEXT: mov h0, v0.h[6]
; CHECK-CVT-SD-NEXT: str q1, [sp, #16] // 16-byte Spill
; CHECK-CVT-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-CVT-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-CVT-SD-NEXT: bl tanhf
; CHECK-CVT-SD-NEXT: fmov w8, s0
; CHECK-CVT-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload
; CHECK-CVT-SD-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-SD-NEXT: add w8, w8, w19
; CHECK-CVT-SD-NEXT: add w8, w9, w8
; CHECK-CVT-SD-NEXT: lsr w8, w8, #16
; CHECK-CVT-SD-NEXT: fmov s0, w8
; CHECK-CVT-SD-NEXT: mov v1.h[6], v0.h[0]
; CHECK-CVT-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-CVT-SD-NEXT: mov h0, v0.h[7]
; CHECK-CVT-SD-NEXT: str q1, [sp, #16] // 16-byte Spill
; CHECK-CVT-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-CVT-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-CVT-SD-NEXT: bl tanhf
; CHECK-CVT-SD-NEXT: fmov w8, s0
; CHECK-CVT-SD-NEXT: ldr q0, [sp, #16] // 16-byte Reload
; CHECK-CVT-SD-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-SD-NEXT: add w8, w8, w19
; CHECK-CVT-SD-NEXT: ldp x30, x19, [sp, #32] // 16-byte Folded Reload
; CHECK-CVT-SD-NEXT: add w8, w9, w8
; CHECK-CVT-SD-NEXT: lsr w8, w8, #16
; CHECK-CVT-SD-NEXT: fmov s1, w8
; CHECK-CVT-SD-NEXT: mov v0.h[7], v1.h[0]
; CHECK-CVT-SD-NEXT: add sp, sp, #48
; CHECK-CVT-SD-NEXT: ret
;
; CHECK-BF16-SD-LABEL: test_tanh:
; CHECK-BF16-SD: // %bb.0:
; CHECK-BF16-SD-NEXT: sub sp, sp, #48
; CHECK-BF16-SD-NEXT: mov h1, v0.h[1]
; CHECK-BF16-SD-NEXT: str q0, [sp] // 16-byte Spill
; CHECK-BF16-SD-NEXT: str x30, [sp, #32] // 8-byte Spill
; CHECK-BF16-SD-NEXT: shll v0.4s, v1.4h, #16
; CHECK-BF16-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16-SD-NEXT: bl tanhf
; CHECK-BF16-SD-NEXT: bfcvt h0, s0
; CHECK-BF16-SD-NEXT: str q0, [sp, #16] // 16-byte Spill
; CHECK-BF16-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-BF16-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16-SD-NEXT: bl tanhf
; CHECK-BF16-SD-NEXT: bfcvt h0, s0
; CHECK-BF16-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload
; CHECK-BF16-SD-NEXT: mov v0.h[1], v1.h[0]
; CHECK-BF16-SD-NEXT: str q0, [sp, #16] // 16-byte Spill
; CHECK-BF16-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-BF16-SD-NEXT: mov h0, v0.h[2]
; CHECK-BF16-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16-SD-NEXT: bl tanhf
; CHECK-BF16-SD-NEXT: bfcvt h0, s0
; CHECK-BF16-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload
; CHECK-BF16-SD-NEXT: mov v1.h[2], v0.h[0]
; CHECK-BF16-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-BF16-SD-NEXT: mov h0, v0.h[3]
; CHECK-BF16-SD-NEXT: str q1, [sp, #16] // 16-byte Spill
; CHECK-BF16-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16-SD-NEXT: bl tanhf
; CHECK-BF16-SD-NEXT: bfcvt h0, s0
; CHECK-BF16-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload
; CHECK-BF16-SD-NEXT: mov v1.h[3], v0.h[0]
; CHECK-BF16-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-BF16-SD-NEXT: mov h0, v0.h[4]
; CHECK-BF16-SD-NEXT: str q1, [sp, #16] // 16-byte Spill
; CHECK-BF16-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16-SD-NEXT: bl tanhf
; CHECK-BF16-SD-NEXT: bfcvt h0, s0
; CHECK-BF16-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload
; CHECK-BF16-SD-NEXT: mov v1.h[4], v0.h[0]
; CHECK-BF16-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-BF16-SD-NEXT: mov h0, v0.h[5]
; CHECK-BF16-SD-NEXT: str q1, [sp, #16] // 16-byte Spill
; CHECK-BF16-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16-SD-NEXT: bl tanhf
; CHECK-BF16-SD-NEXT: bfcvt h0, s0
; CHECK-BF16-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload
; CHECK-BF16-SD-NEXT: mov v1.h[5], v0.h[0]
; CHECK-BF16-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-BF16-SD-NEXT: mov h0, v0.h[6]
; CHECK-BF16-SD-NEXT: str q1, [sp, #16] // 16-byte Spill
; CHECK-BF16-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16-SD-NEXT: bl tanhf
; CHECK-BF16-SD-NEXT: bfcvt h0, s0
; CHECK-BF16-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload
; CHECK-BF16-SD-NEXT: mov v1.h[6], v0.h[0]
; CHECK-BF16-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-BF16-SD-NEXT: mov h0, v0.h[7]
; CHECK-BF16-SD-NEXT: str q1, [sp, #16] // 16-byte Spill
; CHECK-BF16-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16-SD-NEXT: bl tanhf
; CHECK-BF16-SD-NEXT: bfcvt h1, s0
; CHECK-BF16-SD-NEXT: ldr q0, [sp, #16] // 16-byte Reload
; CHECK-BF16-SD-NEXT: ldr x30, [sp, #32] // 8-byte Reload
; CHECK-BF16-SD-NEXT: mov v0.h[7], v1.h[0]
; CHECK-BF16-SD-NEXT: add sp, sp, #48
; CHECK-BF16-SD-NEXT: ret
;
; CHECK-BF16SVE-SD-LABEL: test_tanh:
; CHECK-BF16SVE-SD: // %bb.0:
; CHECK-BF16SVE-SD-NEXT: sub sp, sp, #48
; CHECK-BF16SVE-SD-NEXT: mov h1, v0.h[1]
; CHECK-BF16SVE-SD-NEXT: str q0, [sp] // 16-byte Spill
; CHECK-BF16SVE-SD-NEXT: str x30, [sp, #32] // 8-byte Spill
; CHECK-BF16SVE-SD-NEXT: shll v0.4s, v1.4h, #16
; CHECK-BF16SVE-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16SVE-SD-NEXT: bl tanhf
; CHECK-BF16SVE-SD-NEXT: bfcvt h0, s0
; CHECK-BF16SVE-SD-NEXT: str q0, [sp, #16] // 16-byte Spill
; CHECK-BF16SVE-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-BF16SVE-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16SVE-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16SVE-SD-NEXT: bl tanhf
; CHECK-BF16SVE-SD-NEXT: bfcvt h0, s0
; CHECK-BF16SVE-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload
; CHECK-BF16SVE-SD-NEXT: mov v0.h[1], v1.h[0]
; CHECK-BF16SVE-SD-NEXT: str q0, [sp, #16] // 16-byte Spill
; CHECK-BF16SVE-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-BF16SVE-SD-NEXT: mov h0, v0.h[2]
; CHECK-BF16SVE-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16SVE-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16SVE-SD-NEXT: bl tanhf
; CHECK-BF16SVE-SD-NEXT: bfcvt h0, s0
; CHECK-BF16SVE-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload
; CHECK-BF16SVE-SD-NEXT: mov v1.h[2], v0.h[0]
; CHECK-BF16SVE-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-BF16SVE-SD-NEXT: mov h0, v0.h[3]
; CHECK-BF16SVE-SD-NEXT: str q1, [sp, #16] // 16-byte Spill
; CHECK-BF16SVE-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16SVE-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16SVE-SD-NEXT: bl tanhf
; CHECK-BF16SVE-SD-NEXT: bfcvt h0, s0
; CHECK-BF16SVE-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload
; CHECK-BF16SVE-SD-NEXT: mov v1.h[3], v0.h[0]
; CHECK-BF16SVE-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-BF16SVE-SD-NEXT: mov h0, v0.h[4]
; CHECK-BF16SVE-SD-NEXT: str q1, [sp, #16] // 16-byte Spill
; CHECK-BF16SVE-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16SVE-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16SVE-SD-NEXT: bl tanhf
; CHECK-BF16SVE-SD-NEXT: bfcvt h0, s0
; CHECK-BF16SVE-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload
; CHECK-BF16SVE-SD-NEXT: mov v1.h[4], v0.h[0]
; CHECK-BF16SVE-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-BF16SVE-SD-NEXT: mov h0, v0.h[5]
; CHECK-BF16SVE-SD-NEXT: str q1, [sp, #16] // 16-byte Spill
; CHECK-BF16SVE-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16SVE-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16SVE-SD-NEXT: bl tanhf
; CHECK-BF16SVE-SD-NEXT: bfcvt h0, s0
; CHECK-BF16SVE-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload
; CHECK-BF16SVE-SD-NEXT: mov v1.h[5], v0.h[0]
; CHECK-BF16SVE-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-BF16SVE-SD-NEXT: mov h0, v0.h[6]
; CHECK-BF16SVE-SD-NEXT: str q1, [sp, #16] // 16-byte Spill
; CHECK-BF16SVE-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16SVE-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16SVE-SD-NEXT: bl tanhf
; CHECK-BF16SVE-SD-NEXT: bfcvt h0, s0
; CHECK-BF16SVE-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload
; CHECK-BF16SVE-SD-NEXT: mov v1.h[6], v0.h[0]
; CHECK-BF16SVE-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-BF16SVE-SD-NEXT: mov h0, v0.h[7]
; CHECK-BF16SVE-SD-NEXT: str q1, [sp, #16] // 16-byte Spill
; CHECK-BF16SVE-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16SVE-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16SVE-SD-NEXT: bl tanhf
; CHECK-BF16SVE-SD-NEXT: bfcvt h1, s0
; CHECK-BF16SVE-SD-NEXT: ldr q0, [sp, #16] // 16-byte Reload
; CHECK-BF16SVE-SD-NEXT: ldr x30, [sp, #32] // 8-byte Reload
; CHECK-BF16SVE-SD-NEXT: mov v0.h[7], v1.h[0]
; CHECK-BF16SVE-SD-NEXT: add sp, sp, #48
; CHECK-BF16SVE-SD-NEXT: ret
;
; CHECK-CVT-GI-LABEL: test_tanh:
; CHECK-CVT-GI: // %bb.0:
; CHECK-CVT-GI-NEXT: str d14, [sp, #-128]! // 8-byte Folded Spill
; CHECK-CVT-GI-NEXT: stp d13, d12, [sp, #8] // 16-byte Folded Spill
; CHECK-CVT-GI-NEXT: mov h12, v0.h[1]
; CHECK-CVT-GI-NEXT: mov h13, v0.h[2]
; CHECK-CVT-GI-NEXT: stp d11, d10, [sp, #24] // 16-byte Folded Spill
; CHECK-CVT-GI-NEXT: mov h14, v0.h[3]
; CHECK-CVT-GI-NEXT: mov h11, v0.h[4]
; CHECK-CVT-GI-NEXT: stp d9, d8, [sp, #40] // 16-byte Folded Spill
; CHECK-CVT-GI-NEXT: mov h10, v0.h[5]
; CHECK-CVT-GI-NEXT: mov h9, v0.h[6]
; CHECK-CVT-GI-NEXT: mov h8, v0.h[7]
; CHECK-CVT-GI-NEXT: shll v0.4s, v0.4h, #16
; CHECK-CVT-GI-NEXT: str x30, [sp, #56] // 8-byte Spill
; CHECK-CVT-GI-NEXT: stp x26, x25, [sp, #64] // 16-byte Folded Spill
; CHECK-CVT-GI-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-CVT-GI-NEXT: stp x24, x23, [sp, #80] // 16-byte Folded Spill
; CHECK-CVT-GI-NEXT: stp x22, x21, [sp, #96] // 16-byte Folded Spill
; CHECK-CVT-GI-NEXT: stp x20, x19, [sp, #112] // 16-byte Folded Spill
; CHECK-CVT-GI-NEXT: bl tanhf
; CHECK-CVT-GI-NEXT: fmov w8, s0
; CHECK-CVT-GI-NEXT: mov w19, #32767 // =0x7fff
; CHECK-CVT-GI-NEXT: fcmp s0, #0.0
; CHECK-CVT-GI-NEXT: shll v0.4s, v12.4h, #16
; CHECK-CVT-GI-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-CVT-GI-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-GI-NEXT: add w10, w8, w19
; CHECK-CVT-GI-NEXT: orr w8, w8, #0x400000
; CHECK-CVT-GI-NEXT: add w9, w10, w9
; CHECK-CVT-GI-NEXT: csel w8, w8, w9, vs
; CHECK-CVT-GI-NEXT: lsr w20, w8, #16
; CHECK-CVT-GI-NEXT: bl tanhf
; CHECK-CVT-GI-NEXT: shll v1.4s, v13.4h, #16
; CHECK-CVT-GI-NEXT: fmov w8, s0
; CHECK-CVT-GI-NEXT: fcmp s0, #0.0
; CHECK-CVT-GI-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-GI-NEXT: fmov s0, s1
; CHECK-CVT-GI-NEXT: add w10, w8, w19
; CHECK-CVT-GI-NEXT: orr w8, w8, #0x400000
; CHECK-CVT-GI-NEXT: add w9, w10, w9
; CHECK-CVT-GI-NEXT: csel w8, w8, w9, vs
; CHECK-CVT-GI-NEXT: lsr w21, w8, #16
; CHECK-CVT-GI-NEXT: bl tanhf
; CHECK-CVT-GI-NEXT: shll v1.4s, v14.4h, #16
; CHECK-CVT-GI-NEXT: fmov w8, s0
; CHECK-CVT-GI-NEXT: fcmp s0, #0.0
; CHECK-CVT-GI-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-GI-NEXT: fmov s0, s1
; CHECK-CVT-GI-NEXT: add w10, w8, w19
; CHECK-CVT-GI-NEXT: orr w8, w8, #0x400000
; CHECK-CVT-GI-NEXT: add w9, w10, w9
; CHECK-CVT-GI-NEXT: csel w8, w8, w9, vs
; CHECK-CVT-GI-NEXT: lsr w22, w8, #16
; CHECK-CVT-GI-NEXT: bl tanhf
; CHECK-CVT-GI-NEXT: shll v1.4s, v11.4h, #16
; CHECK-CVT-GI-NEXT: fmov w8, s0
; CHECK-CVT-GI-NEXT: fcmp s0, #0.0
; CHECK-CVT-GI-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-GI-NEXT: fmov s0, s1
; CHECK-CVT-GI-NEXT: add w10, w8, w19
; CHECK-CVT-GI-NEXT: orr w8, w8, #0x400000
; CHECK-CVT-GI-NEXT: add w9, w10, w9
; CHECK-CVT-GI-NEXT: csel w8, w8, w9, vs
; CHECK-CVT-GI-NEXT: lsr w23, w8, #16
; CHECK-CVT-GI-NEXT: bl tanhf
; CHECK-CVT-GI-NEXT: shll v1.4s, v10.4h, #16
; CHECK-CVT-GI-NEXT: fmov w8, s0
; CHECK-CVT-GI-NEXT: fcmp s0, #0.0
; CHECK-CVT-GI-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-GI-NEXT: fmov s0, s1
; CHECK-CVT-GI-NEXT: add w10, w8, w19
; CHECK-CVT-GI-NEXT: orr w8, w8, #0x400000
; CHECK-CVT-GI-NEXT: add w9, w10, w9
; CHECK-CVT-GI-NEXT: csel w8, w8, w9, vs
; CHECK-CVT-GI-NEXT: lsr w24, w8, #16
; CHECK-CVT-GI-NEXT: bl tanhf
; CHECK-CVT-GI-NEXT: shll v1.4s, v9.4h, #16
; CHECK-CVT-GI-NEXT: fmov w8, s0
; CHECK-CVT-GI-NEXT: fcmp s0, #0.0
; CHECK-CVT-GI-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-GI-NEXT: fmov s0, s1
; CHECK-CVT-GI-NEXT: add w10, w8, w19
; CHECK-CVT-GI-NEXT: orr w8, w8, #0x400000
; CHECK-CVT-GI-NEXT: add w9, w10, w9
; CHECK-CVT-GI-NEXT: csel w8, w8, w9, vs
; CHECK-CVT-GI-NEXT: lsr w25, w8, #16
; CHECK-CVT-GI-NEXT: bl tanhf
; CHECK-CVT-GI-NEXT: shll v1.4s, v8.4h, #16
; CHECK-CVT-GI-NEXT: fmov w8, s0
; CHECK-CVT-GI-NEXT: fcmp s0, #0.0
; CHECK-CVT-GI-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-GI-NEXT: fmov s0, s1
; CHECK-CVT-GI-NEXT: add w10, w8, w19
; CHECK-CVT-GI-NEXT: orr w8, w8, #0x400000
; CHECK-CVT-GI-NEXT: add w9, w10, w9
; CHECK-CVT-GI-NEXT: csel w8, w8, w9, vs
; CHECK-CVT-GI-NEXT: lsr w26, w8, #16
; CHECK-CVT-GI-NEXT: bl tanhf
; CHECK-CVT-GI-NEXT: fmov s1, w20
; CHECK-CVT-GI-NEXT: fmov w8, s0
; CHECK-CVT-GI-NEXT: ldr x30, [sp, #56] // 8-byte Reload
; CHECK-CVT-GI-NEXT: fcmp s0, #0.0
; CHECK-CVT-GI-NEXT: ldp d9, d8, [sp, #40] // 16-byte Folded Reload
; CHECK-CVT-GI-NEXT: ldp d11, d10, [sp, #24] // 16-byte Folded Reload
; CHECK-CVT-GI-NEXT: mov v1.h[1], w21
; CHECK-CVT-GI-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-GI-NEXT: add w10, w8, w19
; CHECK-CVT-GI-NEXT: orr w8, w8, #0x400000
; CHECK-CVT-GI-NEXT: ldp x20, x19, [sp, #112] // 16-byte Folded Reload
; CHECK-CVT-GI-NEXT: add w9, w10, w9
; CHECK-CVT-GI-NEXT: ldp d13, d12, [sp, #8] // 16-byte Folded Reload
; CHECK-CVT-GI-NEXT: csel w8, w8, w9, vs
; CHECK-CVT-GI-NEXT: mov v1.h[2], w22
; CHECK-CVT-GI-NEXT: lsr w8, w8, #16
; CHECK-CVT-GI-NEXT: ldp x22, x21, [sp, #96] // 16-byte Folded Reload
; CHECK-CVT-GI-NEXT: mov v1.h[3], w23
; CHECK-CVT-GI-NEXT: mov v1.h[4], w24
; CHECK-CVT-GI-NEXT: ldp x24, x23, [sp, #80] // 16-byte Folded Reload
; CHECK-CVT-GI-NEXT: mov v1.h[5], w25
; CHECK-CVT-GI-NEXT: mov v1.h[6], w26
; CHECK-CVT-GI-NEXT: ldp x26, x25, [sp, #64] // 16-byte Folded Reload
; CHECK-CVT-GI-NEXT: mov v1.h[7], w8
; CHECK-CVT-GI-NEXT: mov v0.16b, v1.16b
; CHECK-CVT-GI-NEXT: ldr d14, [sp], #128 // 8-byte Folded Reload
; CHECK-CVT-GI-NEXT: ret
;
; CHECK-BF16-GI-LABEL: test_tanh:
; CHECK-BF16-GI: // %bb.0:
; CHECK-BF16-GI-NEXT: sub sp, sp, #176
; CHECK-BF16-GI-NEXT: str d14, [sp, #112] // 8-byte Spill
; CHECK-BF16-GI-NEXT: mov h14, v0.h[6]
; CHECK-BF16-GI-NEXT: stp d13, d12, [sp, #120] // 16-byte Folded Spill
; CHECK-BF16-GI-NEXT: mov h12, v0.h[4]
; CHECK-BF16-GI-NEXT: mov h13, v0.h[5]
; CHECK-BF16-GI-NEXT: stp d11, d10, [sp, #136] // 16-byte Folded Spill
; CHECK-BF16-GI-NEXT: mov h10, v0.h[2]
; CHECK-BF16-GI-NEXT: mov h11, v0.h[3]
; CHECK-BF16-GI-NEXT: stp d9, d8, [sp, #152] // 16-byte Folded Spill
; CHECK-BF16-GI-NEXT: mov h9, v0.h[1]
; CHECK-BF16-GI-NEXT: mov h8, v0.h[7]
; CHECK-BF16-GI-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16-GI-NEXT: str x30, [sp, #168] // 8-byte Spill
; CHECK-BF16-GI-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16-GI-NEXT: bl tanhf
; CHECK-BF16-GI-NEXT: bfcvt h0, s0
; CHECK-BF16-GI-NEXT: str q0, [sp, #96] // 16-byte Spill
; CHECK-BF16-GI-NEXT: shll v0.4s, v9.4h, #16
; CHECK-BF16-GI-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16-GI-NEXT: bl tanhf
; CHECK-BF16-GI-NEXT: bfcvt h0, s0
; CHECK-BF16-GI-NEXT: str q0, [sp, #80] // 16-byte Spill
; CHECK-BF16-GI-NEXT: shll v0.4s, v10.4h, #16
; CHECK-BF16-GI-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16-GI-NEXT: bl tanhf
; CHECK-BF16-GI-NEXT: bfcvt h0, s0
; CHECK-BF16-GI-NEXT: str q0, [sp, #64] // 16-byte Spill
; CHECK-BF16-GI-NEXT: shll v0.4s, v11.4h, #16
; CHECK-BF16-GI-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16-GI-NEXT: bl tanhf
; CHECK-BF16-GI-NEXT: bfcvt h0, s0
; CHECK-BF16-GI-NEXT: str q0, [sp, #48] // 16-byte Spill
; CHECK-BF16-GI-NEXT: shll v0.4s, v12.4h, #16
; CHECK-BF16-GI-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16-GI-NEXT: bl tanhf
; CHECK-BF16-GI-NEXT: bfcvt h0, s0
; CHECK-BF16-GI-NEXT: str q0, [sp, #32] // 16-byte Spill
; CHECK-BF16-GI-NEXT: shll v0.4s, v13.4h, #16
; CHECK-BF16-GI-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16-GI-NEXT: bl tanhf
; CHECK-BF16-GI-NEXT: bfcvt h0, s0
; CHECK-BF16-GI-NEXT: str q0, [sp, #16] // 16-byte Spill
; CHECK-BF16-GI-NEXT: shll v0.4s, v14.4h, #16
; CHECK-BF16-GI-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16-GI-NEXT: bl tanhf
; CHECK-BF16-GI-NEXT: bfcvt h0, s0
; CHECK-BF16-GI-NEXT: str q0, [sp] // 16-byte Spill
; CHECK-BF16-GI-NEXT: shll v0.4s, v8.4h, #16
; CHECK-BF16-GI-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16-GI-NEXT: bl tanhf
; CHECK-BF16-GI-NEXT: ldp q2, q1, [sp, #80] // 32-byte Folded Reload
; CHECK-BF16-GI-NEXT: bfcvt h0, s0
; CHECK-BF16-GI-NEXT: ldp d9, d8, [sp, #152] // 16-byte Folded Reload
; CHECK-BF16-GI-NEXT: ldr x30, [sp, #168] // 8-byte Reload
; CHECK-BF16-GI-NEXT: ldp d11, d10, [sp, #136] // 16-byte Folded Reload
; CHECK-BF16-GI-NEXT: ldr d14, [sp, #112] // 8-byte Reload
; CHECK-BF16-GI-NEXT: mov v1.h[1], v2.h[0]
; CHECK-BF16-GI-NEXT: ldp q2, q3, [sp, #48] // 32-byte Folded Reload
; CHECK-BF16-GI-NEXT: ldp d13, d12, [sp, #120] // 16-byte Folded Reload
; CHECK-BF16-GI-NEXT: mov v1.h[2], v3.h[0]
; CHECK-BF16-GI-NEXT: mov v1.h[3], v2.h[0]
; CHECK-BF16-GI-NEXT: ldp q2, q3, [sp, #16] // 32-byte Folded Reload
; CHECK-BF16-GI-NEXT: mov v1.h[4], v3.h[0]
; CHECK-BF16-GI-NEXT: mov v1.h[5], v2.h[0]
; CHECK-BF16-GI-NEXT: ldr q2, [sp] // 16-byte Reload
; CHECK-BF16-GI-NEXT: mov v1.h[6], v2.h[0]
; CHECK-BF16-GI-NEXT: mov v1.h[7], v0.h[0]
; CHECK-BF16-GI-NEXT: mov v0.16b, v1.16b
; CHECK-BF16-GI-NEXT: add sp, sp, #176
; CHECK-BF16-GI-NEXT: ret
%r = call <8 x bfloat> @llvm.tanh.v8bf16(<8 x bfloat> %a)
ret <8 x bfloat> %r
}
define <8 x bfloat> @test_pow(<8 x bfloat> %a, <8 x bfloat> %b) #0 {
; CHECK-CVT-SD-LABEL: test_pow:
; CHECK-CVT-SD: // %bb.0:
; CHECK-CVT-SD-NEXT: sub sp, sp, #64
; CHECK-CVT-SD-NEXT: mov h3, v0.h[1]
; CHECK-CVT-SD-NEXT: mov h2, v1.h[1]
; CHECK-CVT-SD-NEXT: stp q0, q1, [sp] // 32-byte Folded Spill
; CHECK-CVT-SD-NEXT: stp x30, x19, [sp, #48] // 16-byte Folded Spill
; CHECK-CVT-SD-NEXT: shll v0.4s, v3.4h, #16
; CHECK-CVT-SD-NEXT: shll v1.4s, v2.4h, #16
; CHECK-CVT-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-CVT-SD-NEXT: // kill: def $s1 killed $s1 killed $q1
; CHECK-CVT-SD-NEXT: bl powf
; CHECK-CVT-SD-NEXT: fmov w8, s0
; CHECK-CVT-SD-NEXT: mov w19, #32767 // =0x7fff
; CHECK-CVT-SD-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-SD-NEXT: add w8, w8, w19
; CHECK-CVT-SD-NEXT: add w8, w9, w8
; CHECK-CVT-SD-NEXT: lsr w8, w8, #16
; CHECK-CVT-SD-NEXT: fmov s0, w8
; CHECK-CVT-SD-NEXT: str q0, [sp, #32] // 16-byte Spill
; CHECK-CVT-SD-NEXT: ldp q0, q1, [sp] // 32-byte Folded Reload
; CHECK-CVT-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-CVT-SD-NEXT: shll v1.4s, v1.4h, #16
; CHECK-CVT-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-CVT-SD-NEXT: // kill: def $s1 killed $s1 killed $q1
; CHECK-CVT-SD-NEXT: bl powf
; CHECK-CVT-SD-NEXT: fmov w8, s0
; CHECK-CVT-SD-NEXT: ldp q1, q2, [sp, #16] // 32-byte Folded Reload
; CHECK-CVT-SD-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-SD-NEXT: add w8, w8, w19
; CHECK-CVT-SD-NEXT: mov h1, v1.h[2]
; CHECK-CVT-SD-NEXT: add w8, w9, w8
; CHECK-CVT-SD-NEXT: lsr w8, w8, #16
; CHECK-CVT-SD-NEXT: shll v1.4s, v1.4h, #16
; CHECK-CVT-SD-NEXT: fmov s0, w8
; CHECK-CVT-SD-NEXT: // kill: def $s1 killed $s1 killed $q1
; CHECK-CVT-SD-NEXT: mov v0.h[1], v2.h[0]
; CHECK-CVT-SD-NEXT: str q0, [sp, #32] // 16-byte Spill
; CHECK-CVT-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-CVT-SD-NEXT: mov h0, v0.h[2]
; CHECK-CVT-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-CVT-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-CVT-SD-NEXT: bl powf
; CHECK-CVT-SD-NEXT: fmov w8, s0
; CHECK-CVT-SD-NEXT: ldr q1, [sp, #32] // 16-byte Reload
; CHECK-CVT-SD-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-SD-NEXT: add w8, w8, w19
; CHECK-CVT-SD-NEXT: add w8, w9, w8
; CHECK-CVT-SD-NEXT: lsr w8, w8, #16
; CHECK-CVT-SD-NEXT: fmov s0, w8
; CHECK-CVT-SD-NEXT: mov v1.h[2], v0.h[0]
; CHECK-CVT-SD-NEXT: str q1, [sp, #32] // 16-byte Spill
; CHECK-CVT-SD-NEXT: ldp q0, q1, [sp] // 32-byte Folded Reload
; CHECK-CVT-SD-NEXT: mov h0, v0.h[3]
; CHECK-CVT-SD-NEXT: mov h1, v1.h[3]
; CHECK-CVT-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-CVT-SD-NEXT: shll v1.4s, v1.4h, #16
; CHECK-CVT-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-CVT-SD-NEXT: // kill: def $s1 killed $s1 killed $q1
; CHECK-CVT-SD-NEXT: bl powf
; CHECK-CVT-SD-NEXT: fmov w8, s0
; CHECK-CVT-SD-NEXT: ldr q1, [sp, #32] // 16-byte Reload
; CHECK-CVT-SD-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-SD-NEXT: add w8, w8, w19
; CHECK-CVT-SD-NEXT: add w8, w9, w8
; CHECK-CVT-SD-NEXT: lsr w8, w8, #16
; CHECK-CVT-SD-NEXT: fmov s0, w8
; CHECK-CVT-SD-NEXT: mov v1.h[3], v0.h[0]
; CHECK-CVT-SD-NEXT: str q1, [sp, #32] // 16-byte Spill
; CHECK-CVT-SD-NEXT: ldp q0, q1, [sp] // 32-byte Folded Reload
; CHECK-CVT-SD-NEXT: mov h0, v0.h[4]
; CHECK-CVT-SD-NEXT: mov h1, v1.h[4]
; CHECK-CVT-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-CVT-SD-NEXT: shll v1.4s, v1.4h, #16
; CHECK-CVT-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-CVT-SD-NEXT: // kill: def $s1 killed $s1 killed $q1
; CHECK-CVT-SD-NEXT: bl powf
; CHECK-CVT-SD-NEXT: fmov w8, s0
; CHECK-CVT-SD-NEXT: ldr q1, [sp, #32] // 16-byte Reload
; CHECK-CVT-SD-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-SD-NEXT: add w8, w8, w19
; CHECK-CVT-SD-NEXT: add w8, w9, w8
; CHECK-CVT-SD-NEXT: lsr w8, w8, #16
; CHECK-CVT-SD-NEXT: fmov s0, w8
; CHECK-CVT-SD-NEXT: mov v1.h[4], v0.h[0]
; CHECK-CVT-SD-NEXT: str q1, [sp, #32] // 16-byte Spill
; CHECK-CVT-SD-NEXT: ldp q0, q1, [sp] // 32-byte Folded Reload
; CHECK-CVT-SD-NEXT: mov h0, v0.h[5]
; CHECK-CVT-SD-NEXT: mov h1, v1.h[5]
; CHECK-CVT-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-CVT-SD-NEXT: shll v1.4s, v1.4h, #16
; CHECK-CVT-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-CVT-SD-NEXT: // kill: def $s1 killed $s1 killed $q1
; CHECK-CVT-SD-NEXT: bl powf
; CHECK-CVT-SD-NEXT: fmov w8, s0
; CHECK-CVT-SD-NEXT: ldr q1, [sp, #32] // 16-byte Reload
; CHECK-CVT-SD-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-SD-NEXT: add w8, w8, w19
; CHECK-CVT-SD-NEXT: add w8, w9, w8
; CHECK-CVT-SD-NEXT: lsr w8, w8, #16
; CHECK-CVT-SD-NEXT: fmov s0, w8
; CHECK-CVT-SD-NEXT: mov v1.h[5], v0.h[0]
; CHECK-CVT-SD-NEXT: str q1, [sp, #32] // 16-byte Spill
; CHECK-CVT-SD-NEXT: ldp q0, q1, [sp] // 32-byte Folded Reload
; CHECK-CVT-SD-NEXT: mov h0, v0.h[6]
; CHECK-CVT-SD-NEXT: mov h1, v1.h[6]
; CHECK-CVT-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-CVT-SD-NEXT: shll v1.4s, v1.4h, #16
; CHECK-CVT-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-CVT-SD-NEXT: // kill: def $s1 killed $s1 killed $q1
; CHECK-CVT-SD-NEXT: bl powf
; CHECK-CVT-SD-NEXT: fmov w8, s0
; CHECK-CVT-SD-NEXT: ldr q1, [sp, #32] // 16-byte Reload
; CHECK-CVT-SD-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-SD-NEXT: add w8, w8, w19
; CHECK-CVT-SD-NEXT: add w8, w9, w8
; CHECK-CVT-SD-NEXT: lsr w8, w8, #16
; CHECK-CVT-SD-NEXT: fmov s0, w8
; CHECK-CVT-SD-NEXT: mov v1.h[6], v0.h[0]
; CHECK-CVT-SD-NEXT: str q1, [sp, #32] // 16-byte Spill
; CHECK-CVT-SD-NEXT: ldp q0, q1, [sp] // 32-byte Folded Reload
; CHECK-CVT-SD-NEXT: mov h0, v0.h[7]
; CHECK-CVT-SD-NEXT: mov h1, v1.h[7]
; CHECK-CVT-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-CVT-SD-NEXT: shll v1.4s, v1.4h, #16
; CHECK-CVT-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-CVT-SD-NEXT: // kill: def $s1 killed $s1 killed $q1
; CHECK-CVT-SD-NEXT: bl powf
; CHECK-CVT-SD-NEXT: fmov w8, s0
; CHECK-CVT-SD-NEXT: ldr q0, [sp, #32] // 16-byte Reload
; CHECK-CVT-SD-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-SD-NEXT: add w8, w8, w19
; CHECK-CVT-SD-NEXT: ldp x30, x19, [sp, #48] // 16-byte Folded Reload
; CHECK-CVT-SD-NEXT: add w8, w9, w8
; CHECK-CVT-SD-NEXT: lsr w8, w8, #16
; CHECK-CVT-SD-NEXT: fmov s1, w8
; CHECK-CVT-SD-NEXT: mov v0.h[7], v1.h[0]
; CHECK-CVT-SD-NEXT: add sp, sp, #64
; CHECK-CVT-SD-NEXT: ret
;
; CHECK-BF16-SD-LABEL: test_pow:
; CHECK-BF16-SD: // %bb.0:
; CHECK-BF16-SD-NEXT: sub sp, sp, #64
; CHECK-BF16-SD-NEXT: mov h3, v0.h[1]
; CHECK-BF16-SD-NEXT: mov h2, v1.h[1]
; CHECK-BF16-SD-NEXT: stp q0, q1, [sp] // 32-byte Folded Spill
; CHECK-BF16-SD-NEXT: str x30, [sp, #48] // 8-byte Spill
; CHECK-BF16-SD-NEXT: shll v0.4s, v3.4h, #16
; CHECK-BF16-SD-NEXT: shll v1.4s, v2.4h, #16
; CHECK-BF16-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16-SD-NEXT: // kill: def $s1 killed $s1 killed $q1
; CHECK-BF16-SD-NEXT: bl powf
; CHECK-BF16-SD-NEXT: bfcvt h0, s0
; CHECK-BF16-SD-NEXT: str q0, [sp, #32] // 16-byte Spill
; CHECK-BF16-SD-NEXT: ldp q0, q1, [sp] // 32-byte Folded Reload
; CHECK-BF16-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16-SD-NEXT: shll v1.4s, v1.4h, #16
; CHECK-BF16-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16-SD-NEXT: // kill: def $s1 killed $s1 killed $q1
; CHECK-BF16-SD-NEXT: bl powf
; CHECK-BF16-SD-NEXT: bfcvt h0, s0
; CHECK-BF16-SD-NEXT: ldp q1, q2, [sp, #16] // 32-byte Folded Reload
; CHECK-BF16-SD-NEXT: mov h1, v1.h[2]
; CHECK-BF16-SD-NEXT: mov v0.h[1], v2.h[0]
; CHECK-BF16-SD-NEXT: shll v1.4s, v1.4h, #16
; CHECK-BF16-SD-NEXT: str q0, [sp, #32] // 16-byte Spill
; CHECK-BF16-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-BF16-SD-NEXT: // kill: def $s1 killed $s1 killed $q1
; CHECK-BF16-SD-NEXT: mov h0, v0.h[2]
; CHECK-BF16-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16-SD-NEXT: bl powf
; CHECK-BF16-SD-NEXT: bfcvt h0, s0
; CHECK-BF16-SD-NEXT: ldr q1, [sp, #32] // 16-byte Reload
; CHECK-BF16-SD-NEXT: mov v1.h[2], v0.h[0]
; CHECK-BF16-SD-NEXT: str q1, [sp, #32] // 16-byte Spill
; CHECK-BF16-SD-NEXT: ldp q0, q1, [sp] // 32-byte Folded Reload
; CHECK-BF16-SD-NEXT: mov h0, v0.h[3]
; CHECK-BF16-SD-NEXT: mov h1, v1.h[3]
; CHECK-BF16-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16-SD-NEXT: shll v1.4s, v1.4h, #16
; CHECK-BF16-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16-SD-NEXT: // kill: def $s1 killed $s1 killed $q1
; CHECK-BF16-SD-NEXT: bl powf
; CHECK-BF16-SD-NEXT: bfcvt h0, s0
; CHECK-BF16-SD-NEXT: ldr q1, [sp, #32] // 16-byte Reload
; CHECK-BF16-SD-NEXT: mov v1.h[3], v0.h[0]
; CHECK-BF16-SD-NEXT: str q1, [sp, #32] // 16-byte Spill
; CHECK-BF16-SD-NEXT: ldp q0, q1, [sp] // 32-byte Folded Reload
; CHECK-BF16-SD-NEXT: mov h0, v0.h[4]
; CHECK-BF16-SD-NEXT: mov h1, v1.h[4]
; CHECK-BF16-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16-SD-NEXT: shll v1.4s, v1.4h, #16
; CHECK-BF16-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16-SD-NEXT: // kill: def $s1 killed $s1 killed $q1
; CHECK-BF16-SD-NEXT: bl powf
; CHECK-BF16-SD-NEXT: bfcvt h0, s0
; CHECK-BF16-SD-NEXT: ldr q1, [sp, #32] // 16-byte Reload
; CHECK-BF16-SD-NEXT: mov v1.h[4], v0.h[0]
; CHECK-BF16-SD-NEXT: str q1, [sp, #32] // 16-byte Spill
; CHECK-BF16-SD-NEXT: ldp q0, q1, [sp] // 32-byte Folded Reload
; CHECK-BF16-SD-NEXT: mov h0, v0.h[5]
; CHECK-BF16-SD-NEXT: mov h1, v1.h[5]
; CHECK-BF16-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16-SD-NEXT: shll v1.4s, v1.4h, #16
; CHECK-BF16-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16-SD-NEXT: // kill: def $s1 killed $s1 killed $q1
; CHECK-BF16-SD-NEXT: bl powf
; CHECK-BF16-SD-NEXT: bfcvt h0, s0
; CHECK-BF16-SD-NEXT: ldr q1, [sp, #32] // 16-byte Reload
; CHECK-BF16-SD-NEXT: mov v1.h[5], v0.h[0]
; CHECK-BF16-SD-NEXT: str q1, [sp, #32] // 16-byte Spill
; CHECK-BF16-SD-NEXT: ldp q0, q1, [sp] // 32-byte Folded Reload
; CHECK-BF16-SD-NEXT: mov h0, v0.h[6]
; CHECK-BF16-SD-NEXT: mov h1, v1.h[6]
; CHECK-BF16-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16-SD-NEXT: shll v1.4s, v1.4h, #16
; CHECK-BF16-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16-SD-NEXT: // kill: def $s1 killed $s1 killed $q1
; CHECK-BF16-SD-NEXT: bl powf
; CHECK-BF16-SD-NEXT: bfcvt h0, s0
; CHECK-BF16-SD-NEXT: ldr q1, [sp, #32] // 16-byte Reload
; CHECK-BF16-SD-NEXT: mov v1.h[6], v0.h[0]
; CHECK-BF16-SD-NEXT: str q1, [sp, #32] // 16-byte Spill
; CHECK-BF16-SD-NEXT: ldp q0, q1, [sp] // 32-byte Folded Reload
; CHECK-BF16-SD-NEXT: mov h0, v0.h[7]
; CHECK-BF16-SD-NEXT: mov h1, v1.h[7]
; CHECK-BF16-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16-SD-NEXT: shll v1.4s, v1.4h, #16
; CHECK-BF16-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16-SD-NEXT: // kill: def $s1 killed $s1 killed $q1
; CHECK-BF16-SD-NEXT: bl powf
; CHECK-BF16-SD-NEXT: bfcvt h1, s0
; CHECK-BF16-SD-NEXT: ldr q0, [sp, #32] // 16-byte Reload
; CHECK-BF16-SD-NEXT: ldr x30, [sp, #48] // 8-byte Reload
; CHECK-BF16-SD-NEXT: mov v0.h[7], v1.h[0]
; CHECK-BF16-SD-NEXT: add sp, sp, #64
; CHECK-BF16-SD-NEXT: ret
;
; CHECK-BF16SVE-SD-LABEL: test_pow:
; CHECK-BF16SVE-SD: // %bb.0:
; CHECK-BF16SVE-SD-NEXT: sub sp, sp, #64
; CHECK-BF16SVE-SD-NEXT: mov h3, v0.h[1]
; CHECK-BF16SVE-SD-NEXT: mov h2, v1.h[1]
; CHECK-BF16SVE-SD-NEXT: stp q0, q1, [sp] // 32-byte Folded Spill
; CHECK-BF16SVE-SD-NEXT: str x30, [sp, #48] // 8-byte Spill
; CHECK-BF16SVE-SD-NEXT: shll v0.4s, v3.4h, #16
; CHECK-BF16SVE-SD-NEXT: shll v1.4s, v2.4h, #16
; CHECK-BF16SVE-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16SVE-SD-NEXT: // kill: def $s1 killed $s1 killed $q1
; CHECK-BF16SVE-SD-NEXT: bl powf
; CHECK-BF16SVE-SD-NEXT: bfcvt h0, s0
; CHECK-BF16SVE-SD-NEXT: str q0, [sp, #32] // 16-byte Spill
; CHECK-BF16SVE-SD-NEXT: ldp q0, q1, [sp] // 32-byte Folded Reload
; CHECK-BF16SVE-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16SVE-SD-NEXT: shll v1.4s, v1.4h, #16
; CHECK-BF16SVE-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16SVE-SD-NEXT: // kill: def $s1 killed $s1 killed $q1
; CHECK-BF16SVE-SD-NEXT: bl powf
; CHECK-BF16SVE-SD-NEXT: bfcvt h0, s0
; CHECK-BF16SVE-SD-NEXT: ldp q1, q2, [sp, #16] // 32-byte Folded Reload
; CHECK-BF16SVE-SD-NEXT: mov h1, v1.h[2]
; CHECK-BF16SVE-SD-NEXT: mov v0.h[1], v2.h[0]
; CHECK-BF16SVE-SD-NEXT: shll v1.4s, v1.4h, #16
; CHECK-BF16SVE-SD-NEXT: str q0, [sp, #32] // 16-byte Spill
; CHECK-BF16SVE-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-BF16SVE-SD-NEXT: // kill: def $s1 killed $s1 killed $q1
; CHECK-BF16SVE-SD-NEXT: mov h0, v0.h[2]
; CHECK-BF16SVE-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16SVE-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16SVE-SD-NEXT: bl powf
; CHECK-BF16SVE-SD-NEXT: bfcvt h0, s0
; CHECK-BF16SVE-SD-NEXT: ldr q1, [sp, #32] // 16-byte Reload
; CHECK-BF16SVE-SD-NEXT: mov v1.h[2], v0.h[0]
; CHECK-BF16SVE-SD-NEXT: str q1, [sp, #32] // 16-byte Spill
; CHECK-BF16SVE-SD-NEXT: ldp q0, q1, [sp] // 32-byte Folded Reload
; CHECK-BF16SVE-SD-NEXT: mov h0, v0.h[3]
; CHECK-BF16SVE-SD-NEXT: mov h1, v1.h[3]
; CHECK-BF16SVE-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16SVE-SD-NEXT: shll v1.4s, v1.4h, #16
; CHECK-BF16SVE-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16SVE-SD-NEXT: // kill: def $s1 killed $s1 killed $q1
; CHECK-BF16SVE-SD-NEXT: bl powf
; CHECK-BF16SVE-SD-NEXT: bfcvt h0, s0
; CHECK-BF16SVE-SD-NEXT: ldr q1, [sp, #32] // 16-byte Reload
; CHECK-BF16SVE-SD-NEXT: mov v1.h[3], v0.h[0]
; CHECK-BF16SVE-SD-NEXT: str q1, [sp, #32] // 16-byte Spill
; CHECK-BF16SVE-SD-NEXT: ldp q0, q1, [sp] // 32-byte Folded Reload
; CHECK-BF16SVE-SD-NEXT: mov h0, v0.h[4]
; CHECK-BF16SVE-SD-NEXT: mov h1, v1.h[4]
; CHECK-BF16SVE-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16SVE-SD-NEXT: shll v1.4s, v1.4h, #16
; CHECK-BF16SVE-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16SVE-SD-NEXT: // kill: def $s1 killed $s1 killed $q1
; CHECK-BF16SVE-SD-NEXT: bl powf
; CHECK-BF16SVE-SD-NEXT: bfcvt h0, s0
; CHECK-BF16SVE-SD-NEXT: ldr q1, [sp, #32] // 16-byte Reload
; CHECK-BF16SVE-SD-NEXT: mov v1.h[4], v0.h[0]
; CHECK-BF16SVE-SD-NEXT: str q1, [sp, #32] // 16-byte Spill
; CHECK-BF16SVE-SD-NEXT: ldp q0, q1, [sp] // 32-byte Folded Reload
; CHECK-BF16SVE-SD-NEXT: mov h0, v0.h[5]
; CHECK-BF16SVE-SD-NEXT: mov h1, v1.h[5]
; CHECK-BF16SVE-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16SVE-SD-NEXT: shll v1.4s, v1.4h, #16
; CHECK-BF16SVE-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16SVE-SD-NEXT: // kill: def $s1 killed $s1 killed $q1
; CHECK-BF16SVE-SD-NEXT: bl powf
; CHECK-BF16SVE-SD-NEXT: bfcvt h0, s0
; CHECK-BF16SVE-SD-NEXT: ldr q1, [sp, #32] // 16-byte Reload
; CHECK-BF16SVE-SD-NEXT: mov v1.h[5], v0.h[0]
; CHECK-BF16SVE-SD-NEXT: str q1, [sp, #32] // 16-byte Spill
; CHECK-BF16SVE-SD-NEXT: ldp q0, q1, [sp] // 32-byte Folded Reload
; CHECK-BF16SVE-SD-NEXT: mov h0, v0.h[6]
; CHECK-BF16SVE-SD-NEXT: mov h1, v1.h[6]
; CHECK-BF16SVE-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16SVE-SD-NEXT: shll v1.4s, v1.4h, #16
; CHECK-BF16SVE-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16SVE-SD-NEXT: // kill: def $s1 killed $s1 killed $q1
; CHECK-BF16SVE-SD-NEXT: bl powf
; CHECK-BF16SVE-SD-NEXT: bfcvt h0, s0
; CHECK-BF16SVE-SD-NEXT: ldr q1, [sp, #32] // 16-byte Reload
; CHECK-BF16SVE-SD-NEXT: mov v1.h[6], v0.h[0]
; CHECK-BF16SVE-SD-NEXT: str q1, [sp, #32] // 16-byte Spill
; CHECK-BF16SVE-SD-NEXT: ldp q0, q1, [sp] // 32-byte Folded Reload
; CHECK-BF16SVE-SD-NEXT: mov h0, v0.h[7]
; CHECK-BF16SVE-SD-NEXT: mov h1, v1.h[7]
; CHECK-BF16SVE-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16SVE-SD-NEXT: shll v1.4s, v1.4h, #16
; CHECK-BF16SVE-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16SVE-SD-NEXT: // kill: def $s1 killed $s1 killed $q1
; CHECK-BF16SVE-SD-NEXT: bl powf
; CHECK-BF16SVE-SD-NEXT: bfcvt h1, s0
; CHECK-BF16SVE-SD-NEXT: ldr q0, [sp, #32] // 16-byte Reload
; CHECK-BF16SVE-SD-NEXT: ldr x30, [sp, #48] // 8-byte Reload
; CHECK-BF16SVE-SD-NEXT: mov v0.h[7], v1.h[0]
; CHECK-BF16SVE-SD-NEXT: add sp, sp, #64
; CHECK-BF16SVE-SD-NEXT: ret
;
; CHECK-CVT-GI-LABEL: test_pow:
; CHECK-CVT-GI: // %bb.0:
; CHECK-CVT-GI-NEXT: sub sp, sp, #192
; CHECK-CVT-GI-NEXT: mov h2, v0.h[5]
; CHECK-CVT-GI-NEXT: stp d15, d14, [sp, #48] // 16-byte Folded Spill
; CHECK-CVT-GI-NEXT: mov h15, v0.h[4]
; CHECK-CVT-GI-NEXT: stp d13, d12, [sp, #64] // 16-byte Folded Spill
; CHECK-CVT-GI-NEXT: mov h12, v1.h[1]
; CHECK-CVT-GI-NEXT: mov h13, v1.h[2]
; CHECK-CVT-GI-NEXT: stp d11, d10, [sp, #80] // 16-byte Folded Spill
; CHECK-CVT-GI-NEXT: mov h10, v0.h[1]
; CHECK-CVT-GI-NEXT: mov h11, v0.h[2]
; CHECK-CVT-GI-NEXT: stp d9, d8, [sp, #96] // 16-byte Folded Spill
; CHECK-CVT-GI-NEXT: mov h9, v0.h[3]
; CHECK-CVT-GI-NEXT: mov h8, v1.h[3]
; CHECK-CVT-GI-NEXT: str d2, [sp, #8] // 8-byte Spill
; CHECK-CVT-GI-NEXT: mov h2, v0.h[6]
; CHECK-CVT-GI-NEXT: mov h14, v1.h[4]
; CHECK-CVT-GI-NEXT: str x30, [sp, #112] // 8-byte Spill
; CHECK-CVT-GI-NEXT: stp x26, x25, [sp, #128] // 16-byte Folded Spill
; CHECK-CVT-GI-NEXT: stp x24, x23, [sp, #144] // 16-byte Folded Spill
; CHECK-CVT-GI-NEXT: str d2, [sp, #24] // 8-byte Spill
; CHECK-CVT-GI-NEXT: mov h2, v0.h[7]
; CHECK-CVT-GI-NEXT: shll v0.4s, v0.4h, #16
; CHECK-CVT-GI-NEXT: stp x22, x21, [sp, #160] // 16-byte Folded Spill
; CHECK-CVT-GI-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-CVT-GI-NEXT: stp x20, x19, [sp, #176] // 16-byte Folded Spill
; CHECK-CVT-GI-NEXT: str d2, [sp, #40] // 8-byte Spill
; CHECK-CVT-GI-NEXT: mov h2, v1.h[5]
; CHECK-CVT-GI-NEXT: str d2, [sp, #16] // 8-byte Spill
; CHECK-CVT-GI-NEXT: mov h2, v1.h[6]
; CHECK-CVT-GI-NEXT: str d2, [sp, #32] // 8-byte Spill
; CHECK-CVT-GI-NEXT: mov h2, v1.h[7]
; CHECK-CVT-GI-NEXT: shll v1.4s, v1.4h, #16
; CHECK-CVT-GI-NEXT: // kill: def $s1 killed $s1 killed $q1
; CHECK-CVT-GI-NEXT: str d2, [sp, #120] // 8-byte Spill
; CHECK-CVT-GI-NEXT: bl powf
; CHECK-CVT-GI-NEXT: fmov w8, s0
; CHECK-CVT-GI-NEXT: mov w19, #32767 // =0x7fff
; CHECK-CVT-GI-NEXT: fcmp s0, #0.0
; CHECK-CVT-GI-NEXT: shll v0.4s, v10.4h, #16
; CHECK-CVT-GI-NEXT: shll v1.4s, v12.4h, #16
; CHECK-CVT-GI-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-CVT-GI-NEXT: // kill: def $s1 killed $s1 killed $q1
; CHECK-CVT-GI-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-GI-NEXT: add w10, w8, w19
; CHECK-CVT-GI-NEXT: orr w8, w8, #0x400000
; CHECK-CVT-GI-NEXT: add w9, w10, w9
; CHECK-CVT-GI-NEXT: csel w8, w8, w9, vs
; CHECK-CVT-GI-NEXT: lsr w20, w8, #16
; CHECK-CVT-GI-NEXT: bl powf
; CHECK-CVT-GI-NEXT: shll v2.4s, v11.4h, #16
; CHECK-CVT-GI-NEXT: fmov w8, s0
; CHECK-CVT-GI-NEXT: fcmp s0, #0.0
; CHECK-CVT-GI-NEXT: shll v1.4s, v13.4h, #16
; CHECK-CVT-GI-NEXT: // kill: def $s1 killed $s1 killed $q1
; CHECK-CVT-GI-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-GI-NEXT: fmov s0, s2
; CHECK-CVT-GI-NEXT: add w10, w8, w19
; CHECK-CVT-GI-NEXT: orr w8, w8, #0x400000
; CHECK-CVT-GI-NEXT: add w9, w10, w9
; CHECK-CVT-GI-NEXT: csel w8, w8, w9, vs
; CHECK-CVT-GI-NEXT: lsr w21, w8, #16
; CHECK-CVT-GI-NEXT: bl powf
; CHECK-CVT-GI-NEXT: shll v2.4s, v9.4h, #16
; CHECK-CVT-GI-NEXT: fmov w8, s0
; CHECK-CVT-GI-NEXT: fcmp s0, #0.0
; CHECK-CVT-GI-NEXT: shll v1.4s, v8.4h, #16
; CHECK-CVT-GI-NEXT: // kill: def $s1 killed $s1 killed $q1
; CHECK-CVT-GI-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-GI-NEXT: fmov s0, s2
; CHECK-CVT-GI-NEXT: add w10, w8, w19
; CHECK-CVT-GI-NEXT: orr w8, w8, #0x400000
; CHECK-CVT-GI-NEXT: add w9, w10, w9
; CHECK-CVT-GI-NEXT: csel w8, w8, w9, vs
; CHECK-CVT-GI-NEXT: lsr w22, w8, #16
; CHECK-CVT-GI-NEXT: bl powf
; CHECK-CVT-GI-NEXT: shll v2.4s, v15.4h, #16
; CHECK-CVT-GI-NEXT: fmov w8, s0
; CHECK-CVT-GI-NEXT: fcmp s0, #0.0
; CHECK-CVT-GI-NEXT: shll v1.4s, v14.4h, #16
; CHECK-CVT-GI-NEXT: // kill: def $s1 killed $s1 killed $q1
; CHECK-CVT-GI-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-GI-NEXT: fmov s0, s2
; CHECK-CVT-GI-NEXT: add w10, w8, w19
; CHECK-CVT-GI-NEXT: orr w8, w8, #0x400000
; CHECK-CVT-GI-NEXT: add w9, w10, w9
; CHECK-CVT-GI-NEXT: csel w8, w8, w9, vs
; CHECK-CVT-GI-NEXT: lsr w23, w8, #16
; CHECK-CVT-GI-NEXT: bl powf
; CHECK-CVT-GI-NEXT: ldr d1, [sp, #8] // 8-byte Reload
; CHECK-CVT-GI-NEXT: fmov w8, s0
; CHECK-CVT-GI-NEXT: fcmp s0, #0.0
; CHECK-CVT-GI-NEXT: ldr d0, [sp, #16] // 8-byte Reload
; CHECK-CVT-GI-NEXT: shll v2.4s, v1.4h, #16
; CHECK-CVT-GI-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-GI-NEXT: shll v1.4s, v0.4h, #16
; CHECK-CVT-GI-NEXT: add w10, w8, w19
; CHECK-CVT-GI-NEXT: orr w8, w8, #0x400000
; CHECK-CVT-GI-NEXT: // kill: def $s1 killed $s1 killed $q1
; CHECK-CVT-GI-NEXT: fmov s0, s2
; CHECK-CVT-GI-NEXT: add w9, w10, w9
; CHECK-CVT-GI-NEXT: csel w8, w8, w9, vs
; CHECK-CVT-GI-NEXT: lsr w24, w8, #16
; CHECK-CVT-GI-NEXT: bl powf
; CHECK-CVT-GI-NEXT: ldr d1, [sp, #24] // 8-byte Reload
; CHECK-CVT-GI-NEXT: fmov w8, s0
; CHECK-CVT-GI-NEXT: fcmp s0, #0.0
; CHECK-CVT-GI-NEXT: ldr d0, [sp, #32] // 8-byte Reload
; CHECK-CVT-GI-NEXT: shll v2.4s, v1.4h, #16
; CHECK-CVT-GI-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-GI-NEXT: shll v1.4s, v0.4h, #16
; CHECK-CVT-GI-NEXT: add w10, w8, w19
; CHECK-CVT-GI-NEXT: orr w8, w8, #0x400000
; CHECK-CVT-GI-NEXT: // kill: def $s1 killed $s1 killed $q1
; CHECK-CVT-GI-NEXT: fmov s0, s2
; CHECK-CVT-GI-NEXT: add w9, w10, w9
; CHECK-CVT-GI-NEXT: csel w8, w8, w9, vs
; CHECK-CVT-GI-NEXT: lsr w25, w8, #16
; CHECK-CVT-GI-NEXT: bl powf
; CHECK-CVT-GI-NEXT: ldr d1, [sp, #40] // 8-byte Reload
; CHECK-CVT-GI-NEXT: fmov w8, s0
; CHECK-CVT-GI-NEXT: fcmp s0, #0.0
; CHECK-CVT-GI-NEXT: ldr d0, [sp, #120] // 8-byte Reload
; CHECK-CVT-GI-NEXT: shll v2.4s, v1.4h, #16
; CHECK-CVT-GI-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-GI-NEXT: shll v1.4s, v0.4h, #16
; CHECK-CVT-GI-NEXT: add w10, w8, w19
; CHECK-CVT-GI-NEXT: orr w8, w8, #0x400000
; CHECK-CVT-GI-NEXT: // kill: def $s1 killed $s1 killed $q1
; CHECK-CVT-GI-NEXT: fmov s0, s2
; CHECK-CVT-GI-NEXT: add w9, w10, w9
; CHECK-CVT-GI-NEXT: csel w8, w8, w9, vs
; CHECK-CVT-GI-NEXT: lsr w26, w8, #16
; CHECK-CVT-GI-NEXT: bl powf
; CHECK-CVT-GI-NEXT: fmov s1, w20
; CHECK-CVT-GI-NEXT: fmov w8, s0
; CHECK-CVT-GI-NEXT: ldr x30, [sp, #112] // 8-byte Reload
; CHECK-CVT-GI-NEXT: fcmp s0, #0.0
; CHECK-CVT-GI-NEXT: ldp d9, d8, [sp, #96] // 16-byte Folded Reload
; CHECK-CVT-GI-NEXT: ldp d11, d10, [sp, #80] // 16-byte Folded Reload
; CHECK-CVT-GI-NEXT: mov v1.h[1], w21
; CHECK-CVT-GI-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-GI-NEXT: add w10, w8, w19
; CHECK-CVT-GI-NEXT: orr w8, w8, #0x400000
; CHECK-CVT-GI-NEXT: ldp x20, x19, [sp, #176] // 16-byte Folded Reload
; CHECK-CVT-GI-NEXT: add w9, w10, w9
; CHECK-CVT-GI-NEXT: ldp d13, d12, [sp, #64] // 16-byte Folded Reload
; CHECK-CVT-GI-NEXT: csel w8, w8, w9, vs
; CHECK-CVT-GI-NEXT: ldp d15, d14, [sp, #48] // 16-byte Folded Reload
; CHECK-CVT-GI-NEXT: mov v1.h[2], w22
; CHECK-CVT-GI-NEXT: lsr w8, w8, #16
; CHECK-CVT-GI-NEXT: ldp x22, x21, [sp, #160] // 16-byte Folded Reload
; CHECK-CVT-GI-NEXT: mov v1.h[3], w23
; CHECK-CVT-GI-NEXT: mov v1.h[4], w24
; CHECK-CVT-GI-NEXT: ldp x24, x23, [sp, #144] // 16-byte Folded Reload
; CHECK-CVT-GI-NEXT: mov v1.h[5], w25
; CHECK-CVT-GI-NEXT: mov v1.h[6], w26
; CHECK-CVT-GI-NEXT: ldp x26, x25, [sp, #128] // 16-byte Folded Reload
; CHECK-CVT-GI-NEXT: mov v1.h[7], w8
; CHECK-CVT-GI-NEXT: mov v0.16b, v1.16b
; CHECK-CVT-GI-NEXT: add sp, sp, #192
; CHECK-CVT-GI-NEXT: ret
;
; CHECK-BF16-GI-LABEL: test_pow:
; CHECK-BF16-GI: // %bb.0:
; CHECK-BF16-GI-NEXT: sub sp, sp, #240
; CHECK-BF16-GI-NEXT: mov h2, v0.h[5]
; CHECK-BF16-GI-NEXT: stp d15, d14, [sp, #160] // 16-byte Folded Spill
; CHECK-BF16-GI-NEXT: mov h15, v0.h[1]
; CHECK-BF16-GI-NEXT: stp d13, d12, [sp, #176] // 16-byte Folded Spill
; CHECK-BF16-GI-NEXT: mov h14, v0.h[4]
; CHECK-BF16-GI-NEXT: mov h12, v1.h[3]
; CHECK-BF16-GI-NEXT: stp d11, d10, [sp, #192] // 16-byte Folded Spill
; CHECK-BF16-GI-NEXT: mov h10, v1.h[1]
; CHECK-BF16-GI-NEXT: mov h11, v1.h[2]
; CHECK-BF16-GI-NEXT: stp d9, d8, [sp, #208] // 16-byte Folded Spill
; CHECK-BF16-GI-NEXT: mov h8, v0.h[2]
; CHECK-BF16-GI-NEXT: mov h9, v0.h[3]
; CHECK-BF16-GI-NEXT: str d2, [sp, #64] // 8-byte Spill
; CHECK-BF16-GI-NEXT: mov h2, v0.h[6]
; CHECK-BF16-GI-NEXT: mov h13, v1.h[4]
; CHECK-BF16-GI-NEXT: str x30, [sp, #224] // 8-byte Spill
; CHECK-BF16-GI-NEXT: str d2, [sp, #112] // 8-byte Spill
; CHECK-BF16-GI-NEXT: mov h2, v0.h[7]
; CHECK-BF16-GI-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16-GI-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16-GI-NEXT: str d2, [sp, #232] // 8-byte Spill
; CHECK-BF16-GI-NEXT: mov h2, v1.h[5]
; CHECK-BF16-GI-NEXT: str d2, [sp, #40] // 8-byte Spill
; CHECK-BF16-GI-NEXT: mov h2, v1.h[6]
; CHECK-BF16-GI-NEXT: str d2, [sp, #104] // 8-byte Spill
; CHECK-BF16-GI-NEXT: mov h2, v1.h[7]
; CHECK-BF16-GI-NEXT: shll v1.4s, v1.4h, #16
; CHECK-BF16-GI-NEXT: // kill: def $s1 killed $s1 killed $q1
; CHECK-BF16-GI-NEXT: str d2, [sp, #152] // 8-byte Spill
; CHECK-BF16-GI-NEXT: bl powf
; CHECK-BF16-GI-NEXT: bfcvt h0, s0
; CHECK-BF16-GI-NEXT: shll v1.4s, v10.4h, #16
; CHECK-BF16-GI-NEXT: // kill: def $s1 killed $s1 killed $q1
; CHECK-BF16-GI-NEXT: str q0, [sp, #128] // 16-byte Spill
; CHECK-BF16-GI-NEXT: shll v0.4s, v15.4h, #16
; CHECK-BF16-GI-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16-GI-NEXT: bl powf
; CHECK-BF16-GI-NEXT: bfcvt h0, s0
; CHECK-BF16-GI-NEXT: shll v1.4s, v11.4h, #16
; CHECK-BF16-GI-NEXT: // kill: def $s1 killed $s1 killed $q1
; CHECK-BF16-GI-NEXT: str q0, [sp, #80] // 16-byte Spill
; CHECK-BF16-GI-NEXT: shll v0.4s, v8.4h, #16
; CHECK-BF16-GI-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16-GI-NEXT: bl powf
; CHECK-BF16-GI-NEXT: bfcvt h0, s0
; CHECK-BF16-GI-NEXT: shll v1.4s, v12.4h, #16
; CHECK-BF16-GI-NEXT: // kill: def $s1 killed $s1 killed $q1
; CHECK-BF16-GI-NEXT: str q0, [sp, #48] // 16-byte Spill
; CHECK-BF16-GI-NEXT: shll v0.4s, v9.4h, #16
; CHECK-BF16-GI-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16-GI-NEXT: bl powf
; CHECK-BF16-GI-NEXT: bfcvt h0, s0
; CHECK-BF16-GI-NEXT: shll v1.4s, v13.4h, #16
; CHECK-BF16-GI-NEXT: // kill: def $s1 killed $s1 killed $q1
; CHECK-BF16-GI-NEXT: str q0, [sp, #16] // 16-byte Spill
; CHECK-BF16-GI-NEXT: shll v0.4s, v14.4h, #16
; CHECK-BF16-GI-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16-GI-NEXT: bl powf
; CHECK-BF16-GI-NEXT: bfcvt h0, s0
; CHECK-BF16-GI-NEXT: ldr d1, [sp, #40] // 8-byte Reload
; CHECK-BF16-GI-NEXT: shll v1.4s, v1.4h, #16
; CHECK-BF16-GI-NEXT: // kill: def $s1 killed $s1 killed $q1
; CHECK-BF16-GI-NEXT: str q0, [sp] // 16-byte Spill
; CHECK-BF16-GI-NEXT: ldr d0, [sp, #64] // 8-byte Reload
; CHECK-BF16-GI-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16-GI-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16-GI-NEXT: bl powf
; CHECK-BF16-GI-NEXT: bfcvt h0, s0
; CHECK-BF16-GI-NEXT: str q0, [sp, #64] // 16-byte Spill
; CHECK-BF16-GI-NEXT: ldp d1, d0, [sp, #104] // 16-byte Folded Reload
; CHECK-BF16-GI-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16-GI-NEXT: shll v1.4s, v1.4h, #16
; CHECK-BF16-GI-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16-GI-NEXT: // kill: def $s1 killed $s1 killed $q1
; CHECK-BF16-GI-NEXT: bl powf
; CHECK-BF16-GI-NEXT: bfcvt h0, s0
; CHECK-BF16-GI-NEXT: ldr d1, [sp, #152] // 8-byte Reload
; CHECK-BF16-GI-NEXT: shll v1.4s, v1.4h, #16
; CHECK-BF16-GI-NEXT: // kill: def $s1 killed $s1 killed $q1
; CHECK-BF16-GI-NEXT: str q0, [sp, #112] // 16-byte Spill
; CHECK-BF16-GI-NEXT: ldr d0, [sp, #232] // 8-byte Reload
; CHECK-BF16-GI-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16-GI-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16-GI-NEXT: bl powf
; CHECK-BF16-GI-NEXT: ldr q1, [sp, #128] // 16-byte Reload
; CHECK-BF16-GI-NEXT: ldr q2, [sp, #80] // 16-byte Reload
; CHECK-BF16-GI-NEXT: bfcvt h0, s0
; CHECK-BF16-GI-NEXT: ldp d9, d8, [sp, #208] // 16-byte Folded Reload
; CHECK-BF16-GI-NEXT: ldr x30, [sp, #224] // 8-byte Reload
; CHECK-BF16-GI-NEXT: mov v1.h[1], v2.h[0]
; CHECK-BF16-GI-NEXT: ldr q2, [sp, #48] // 16-byte Reload
; CHECK-BF16-GI-NEXT: ldp d11, d10, [sp, #192] // 16-byte Folded Reload
; CHECK-BF16-GI-NEXT: ldp d13, d12, [sp, #176] // 16-byte Folded Reload
; CHECK-BF16-GI-NEXT: ldp d15, d14, [sp, #160] // 16-byte Folded Reload
; CHECK-BF16-GI-NEXT: mov v1.h[2], v2.h[0]
; CHECK-BF16-GI-NEXT: ldp q2, q3, [sp] // 32-byte Folded Reload
; CHECK-BF16-GI-NEXT: mov v1.h[3], v3.h[0]
; CHECK-BF16-GI-NEXT: mov v1.h[4], v2.h[0]
; CHECK-BF16-GI-NEXT: ldr q2, [sp, #64] // 16-byte Reload
; CHECK-BF16-GI-NEXT: mov v1.h[5], v2.h[0]
; CHECK-BF16-GI-NEXT: ldr q2, [sp, #112] // 16-byte Reload
; CHECK-BF16-GI-NEXT: mov v1.h[6], v2.h[0]
; CHECK-BF16-GI-NEXT: mov v1.h[7], v0.h[0]
; CHECK-BF16-GI-NEXT: mov v0.16b, v1.16b
; CHECK-BF16-GI-NEXT: add sp, sp, #240
; CHECK-BF16-GI-NEXT: ret
%r = call <8 x bfloat> @llvm.pow.v8bf16(<8 x bfloat> %a, <8 x bfloat> %b)
ret <8 x bfloat> %r
}
define <8 x bfloat> @test_exp(<8 x bfloat> %a) #0 {
; CHECK-CVT-SD-LABEL: test_exp:
; CHECK-CVT-SD: // %bb.0:
; CHECK-CVT-SD-NEXT: sub sp, sp, #48
; CHECK-CVT-SD-NEXT: mov h1, v0.h[1]
; CHECK-CVT-SD-NEXT: str q0, [sp] // 16-byte Spill
; CHECK-CVT-SD-NEXT: stp x30, x19, [sp, #32] // 16-byte Folded Spill
; CHECK-CVT-SD-NEXT: shll v0.4s, v1.4h, #16
; CHECK-CVT-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-CVT-SD-NEXT: bl expf
; CHECK-CVT-SD-NEXT: fmov w8, s0
; CHECK-CVT-SD-NEXT: mov w19, #32767 // =0x7fff
; CHECK-CVT-SD-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-SD-NEXT: add w8, w8, w19
; CHECK-CVT-SD-NEXT: add w8, w9, w8
; CHECK-CVT-SD-NEXT: lsr w8, w8, #16
; CHECK-CVT-SD-NEXT: fmov s0, w8
; CHECK-CVT-SD-NEXT: str q0, [sp, #16] // 16-byte Spill
; CHECK-CVT-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-CVT-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-CVT-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-CVT-SD-NEXT: bl expf
; CHECK-CVT-SD-NEXT: fmov w8, s0
; CHECK-CVT-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload
; CHECK-CVT-SD-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-SD-NEXT: add w8, w8, w19
; CHECK-CVT-SD-NEXT: add w8, w9, w8
; CHECK-CVT-SD-NEXT: lsr w8, w8, #16
; CHECK-CVT-SD-NEXT: fmov s0, w8
; CHECK-CVT-SD-NEXT: mov v0.h[1], v1.h[0]
; CHECK-CVT-SD-NEXT: str q0, [sp, #16] // 16-byte Spill
; CHECK-CVT-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-CVT-SD-NEXT: mov h0, v0.h[2]
; CHECK-CVT-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-CVT-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-CVT-SD-NEXT: bl expf
; CHECK-CVT-SD-NEXT: fmov w8, s0
; CHECK-CVT-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload
; CHECK-CVT-SD-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-SD-NEXT: add w8, w8, w19
; CHECK-CVT-SD-NEXT: add w8, w9, w8
; CHECK-CVT-SD-NEXT: lsr w8, w8, #16
; CHECK-CVT-SD-NEXT: fmov s0, w8
; CHECK-CVT-SD-NEXT: mov v1.h[2], v0.h[0]
; CHECK-CVT-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-CVT-SD-NEXT: mov h0, v0.h[3]
; CHECK-CVT-SD-NEXT: str q1, [sp, #16] // 16-byte Spill
; CHECK-CVT-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-CVT-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-CVT-SD-NEXT: bl expf
; CHECK-CVT-SD-NEXT: fmov w8, s0
; CHECK-CVT-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload
; CHECK-CVT-SD-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-SD-NEXT: add w8, w8, w19
; CHECK-CVT-SD-NEXT: add w8, w9, w8
; CHECK-CVT-SD-NEXT: lsr w8, w8, #16
; CHECK-CVT-SD-NEXT: fmov s0, w8
; CHECK-CVT-SD-NEXT: mov v1.h[3], v0.h[0]
; CHECK-CVT-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-CVT-SD-NEXT: mov h0, v0.h[4]
; CHECK-CVT-SD-NEXT: str q1, [sp, #16] // 16-byte Spill
; CHECK-CVT-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-CVT-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-CVT-SD-NEXT: bl expf
; CHECK-CVT-SD-NEXT: fmov w8, s0
; CHECK-CVT-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload
; CHECK-CVT-SD-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-SD-NEXT: add w8, w8, w19
; CHECK-CVT-SD-NEXT: add w8, w9, w8
; CHECK-CVT-SD-NEXT: lsr w8, w8, #16
; CHECK-CVT-SD-NEXT: fmov s0, w8
; CHECK-CVT-SD-NEXT: mov v1.h[4], v0.h[0]
; CHECK-CVT-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-CVT-SD-NEXT: mov h0, v0.h[5]
; CHECK-CVT-SD-NEXT: str q1, [sp, #16] // 16-byte Spill
; CHECK-CVT-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-CVT-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-CVT-SD-NEXT: bl expf
; CHECK-CVT-SD-NEXT: fmov w8, s0
; CHECK-CVT-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload
; CHECK-CVT-SD-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-SD-NEXT: add w8, w8, w19
; CHECK-CVT-SD-NEXT: add w8, w9, w8
; CHECK-CVT-SD-NEXT: lsr w8, w8, #16
; CHECK-CVT-SD-NEXT: fmov s0, w8
; CHECK-CVT-SD-NEXT: mov v1.h[5], v0.h[0]
; CHECK-CVT-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-CVT-SD-NEXT: mov h0, v0.h[6]
; CHECK-CVT-SD-NEXT: str q1, [sp, #16] // 16-byte Spill
; CHECK-CVT-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-CVT-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-CVT-SD-NEXT: bl expf
; CHECK-CVT-SD-NEXT: fmov w8, s0
; CHECK-CVT-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload
; CHECK-CVT-SD-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-SD-NEXT: add w8, w8, w19
; CHECK-CVT-SD-NEXT: add w8, w9, w8
; CHECK-CVT-SD-NEXT: lsr w8, w8, #16
; CHECK-CVT-SD-NEXT: fmov s0, w8
; CHECK-CVT-SD-NEXT: mov v1.h[6], v0.h[0]
; CHECK-CVT-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-CVT-SD-NEXT: mov h0, v0.h[7]
; CHECK-CVT-SD-NEXT: str q1, [sp, #16] // 16-byte Spill
; CHECK-CVT-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-CVT-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-CVT-SD-NEXT: bl expf
; CHECK-CVT-SD-NEXT: fmov w8, s0
; CHECK-CVT-SD-NEXT: ldr q0, [sp, #16] // 16-byte Reload
; CHECK-CVT-SD-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-SD-NEXT: add w8, w8, w19
; CHECK-CVT-SD-NEXT: ldp x30, x19, [sp, #32] // 16-byte Folded Reload
; CHECK-CVT-SD-NEXT: add w8, w9, w8
; CHECK-CVT-SD-NEXT: lsr w8, w8, #16
; CHECK-CVT-SD-NEXT: fmov s1, w8
; CHECK-CVT-SD-NEXT: mov v0.h[7], v1.h[0]
; CHECK-CVT-SD-NEXT: add sp, sp, #48
; CHECK-CVT-SD-NEXT: ret
;
; CHECK-BF16-SD-LABEL: test_exp:
; CHECK-BF16-SD: // %bb.0:
; CHECK-BF16-SD-NEXT: sub sp, sp, #48
; CHECK-BF16-SD-NEXT: mov h1, v0.h[1]
; CHECK-BF16-SD-NEXT: str q0, [sp] // 16-byte Spill
; CHECK-BF16-SD-NEXT: str x30, [sp, #32] // 8-byte Spill
; CHECK-BF16-SD-NEXT: shll v0.4s, v1.4h, #16
; CHECK-BF16-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16-SD-NEXT: bl expf
; CHECK-BF16-SD-NEXT: bfcvt h0, s0
; CHECK-BF16-SD-NEXT: str q0, [sp, #16] // 16-byte Spill
; CHECK-BF16-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-BF16-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16-SD-NEXT: bl expf
; CHECK-BF16-SD-NEXT: bfcvt h0, s0
; CHECK-BF16-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload
; CHECK-BF16-SD-NEXT: mov v0.h[1], v1.h[0]
; CHECK-BF16-SD-NEXT: str q0, [sp, #16] // 16-byte Spill
; CHECK-BF16-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-BF16-SD-NEXT: mov h0, v0.h[2]
; CHECK-BF16-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16-SD-NEXT: bl expf
; CHECK-BF16-SD-NEXT: bfcvt h0, s0
; CHECK-BF16-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload
; CHECK-BF16-SD-NEXT: mov v1.h[2], v0.h[0]
; CHECK-BF16-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-BF16-SD-NEXT: mov h0, v0.h[3]
; CHECK-BF16-SD-NEXT: str q1, [sp, #16] // 16-byte Spill
; CHECK-BF16-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16-SD-NEXT: bl expf
; CHECK-BF16-SD-NEXT: bfcvt h0, s0
; CHECK-BF16-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload
; CHECK-BF16-SD-NEXT: mov v1.h[3], v0.h[0]
; CHECK-BF16-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-BF16-SD-NEXT: mov h0, v0.h[4]
; CHECK-BF16-SD-NEXT: str q1, [sp, #16] // 16-byte Spill
; CHECK-BF16-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16-SD-NEXT: bl expf
; CHECK-BF16-SD-NEXT: bfcvt h0, s0
; CHECK-BF16-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload
; CHECK-BF16-SD-NEXT: mov v1.h[4], v0.h[0]
; CHECK-BF16-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-BF16-SD-NEXT: mov h0, v0.h[5]
; CHECK-BF16-SD-NEXT: str q1, [sp, #16] // 16-byte Spill
; CHECK-BF16-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16-SD-NEXT: bl expf
; CHECK-BF16-SD-NEXT: bfcvt h0, s0
; CHECK-BF16-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload
; CHECK-BF16-SD-NEXT: mov v1.h[5], v0.h[0]
; CHECK-BF16-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-BF16-SD-NEXT: mov h0, v0.h[6]
; CHECK-BF16-SD-NEXT: str q1, [sp, #16] // 16-byte Spill
; CHECK-BF16-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16-SD-NEXT: bl expf
; CHECK-BF16-SD-NEXT: bfcvt h0, s0
; CHECK-BF16-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload
; CHECK-BF16-SD-NEXT: mov v1.h[6], v0.h[0]
; CHECK-BF16-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-BF16-SD-NEXT: mov h0, v0.h[7]
; CHECK-BF16-SD-NEXT: str q1, [sp, #16] // 16-byte Spill
; CHECK-BF16-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16-SD-NEXT: bl expf
; CHECK-BF16-SD-NEXT: bfcvt h1, s0
; CHECK-BF16-SD-NEXT: ldr q0, [sp, #16] // 16-byte Reload
; CHECK-BF16-SD-NEXT: ldr x30, [sp, #32] // 8-byte Reload
; CHECK-BF16-SD-NEXT: mov v0.h[7], v1.h[0]
; CHECK-BF16-SD-NEXT: add sp, sp, #48
; CHECK-BF16-SD-NEXT: ret
;
; CHECK-BF16SVE-SD-LABEL: test_exp:
; CHECK-BF16SVE-SD: // %bb.0:
; CHECK-BF16SVE-SD-NEXT: sub sp, sp, #48
; CHECK-BF16SVE-SD-NEXT: mov h1, v0.h[1]
; CHECK-BF16SVE-SD-NEXT: str q0, [sp] // 16-byte Spill
; CHECK-BF16SVE-SD-NEXT: str x30, [sp, #32] // 8-byte Spill
; CHECK-BF16SVE-SD-NEXT: shll v0.4s, v1.4h, #16
; CHECK-BF16SVE-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16SVE-SD-NEXT: bl expf
; CHECK-BF16SVE-SD-NEXT: bfcvt h0, s0
; CHECK-BF16SVE-SD-NEXT: str q0, [sp, #16] // 16-byte Spill
; CHECK-BF16SVE-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-BF16SVE-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16SVE-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16SVE-SD-NEXT: bl expf
; CHECK-BF16SVE-SD-NEXT: bfcvt h0, s0
; CHECK-BF16SVE-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload
; CHECK-BF16SVE-SD-NEXT: mov v0.h[1], v1.h[0]
; CHECK-BF16SVE-SD-NEXT: str q0, [sp, #16] // 16-byte Spill
; CHECK-BF16SVE-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-BF16SVE-SD-NEXT: mov h0, v0.h[2]
; CHECK-BF16SVE-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16SVE-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16SVE-SD-NEXT: bl expf
; CHECK-BF16SVE-SD-NEXT: bfcvt h0, s0
; CHECK-BF16SVE-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload
; CHECK-BF16SVE-SD-NEXT: mov v1.h[2], v0.h[0]
; CHECK-BF16SVE-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-BF16SVE-SD-NEXT: mov h0, v0.h[3]
; CHECK-BF16SVE-SD-NEXT: str q1, [sp, #16] // 16-byte Spill
; CHECK-BF16SVE-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16SVE-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16SVE-SD-NEXT: bl expf
; CHECK-BF16SVE-SD-NEXT: bfcvt h0, s0
; CHECK-BF16SVE-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload
; CHECK-BF16SVE-SD-NEXT: mov v1.h[3], v0.h[0]
; CHECK-BF16SVE-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-BF16SVE-SD-NEXT: mov h0, v0.h[4]
; CHECK-BF16SVE-SD-NEXT: str q1, [sp, #16] // 16-byte Spill
; CHECK-BF16SVE-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16SVE-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16SVE-SD-NEXT: bl expf
; CHECK-BF16SVE-SD-NEXT: bfcvt h0, s0
; CHECK-BF16SVE-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload
; CHECK-BF16SVE-SD-NEXT: mov v1.h[4], v0.h[0]
; CHECK-BF16SVE-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-BF16SVE-SD-NEXT: mov h0, v0.h[5]
; CHECK-BF16SVE-SD-NEXT: str q1, [sp, #16] // 16-byte Spill
; CHECK-BF16SVE-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16SVE-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16SVE-SD-NEXT: bl expf
; CHECK-BF16SVE-SD-NEXT: bfcvt h0, s0
; CHECK-BF16SVE-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload
; CHECK-BF16SVE-SD-NEXT: mov v1.h[5], v0.h[0]
; CHECK-BF16SVE-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-BF16SVE-SD-NEXT: mov h0, v0.h[6]
; CHECK-BF16SVE-SD-NEXT: str q1, [sp, #16] // 16-byte Spill
; CHECK-BF16SVE-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16SVE-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16SVE-SD-NEXT: bl expf
; CHECK-BF16SVE-SD-NEXT: bfcvt h0, s0
; CHECK-BF16SVE-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload
; CHECK-BF16SVE-SD-NEXT: mov v1.h[6], v0.h[0]
; CHECK-BF16SVE-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-BF16SVE-SD-NEXT: mov h0, v0.h[7]
; CHECK-BF16SVE-SD-NEXT: str q1, [sp, #16] // 16-byte Spill
; CHECK-BF16SVE-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16SVE-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16SVE-SD-NEXT: bl expf
; CHECK-BF16SVE-SD-NEXT: bfcvt h1, s0
; CHECK-BF16SVE-SD-NEXT: ldr q0, [sp, #16] // 16-byte Reload
; CHECK-BF16SVE-SD-NEXT: ldr x30, [sp, #32] // 8-byte Reload
; CHECK-BF16SVE-SD-NEXT: mov v0.h[7], v1.h[0]
; CHECK-BF16SVE-SD-NEXT: add sp, sp, #48
; CHECK-BF16SVE-SD-NEXT: ret
;
; CHECK-CVT-GI-LABEL: test_exp:
; CHECK-CVT-GI: // %bb.0:
; CHECK-CVT-GI-NEXT: str d14, [sp, #-128]! // 8-byte Folded Spill
; CHECK-CVT-GI-NEXT: stp d13, d12, [sp, #8] // 16-byte Folded Spill
; CHECK-CVT-GI-NEXT: mov h12, v0.h[1]
; CHECK-CVT-GI-NEXT: mov h13, v0.h[2]
; CHECK-CVT-GI-NEXT: stp d11, d10, [sp, #24] // 16-byte Folded Spill
; CHECK-CVT-GI-NEXT: mov h14, v0.h[3]
; CHECK-CVT-GI-NEXT: mov h11, v0.h[4]
; CHECK-CVT-GI-NEXT: stp d9, d8, [sp, #40] // 16-byte Folded Spill
; CHECK-CVT-GI-NEXT: mov h10, v0.h[5]
; CHECK-CVT-GI-NEXT: mov h9, v0.h[6]
; CHECK-CVT-GI-NEXT: mov h8, v0.h[7]
; CHECK-CVT-GI-NEXT: shll v0.4s, v0.4h, #16
; CHECK-CVT-GI-NEXT: str x30, [sp, #56] // 8-byte Spill
; CHECK-CVT-GI-NEXT: stp x26, x25, [sp, #64] // 16-byte Folded Spill
; CHECK-CVT-GI-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-CVT-GI-NEXT: stp x24, x23, [sp, #80] // 16-byte Folded Spill
; CHECK-CVT-GI-NEXT: stp x22, x21, [sp, #96] // 16-byte Folded Spill
; CHECK-CVT-GI-NEXT: stp x20, x19, [sp, #112] // 16-byte Folded Spill
; CHECK-CVT-GI-NEXT: bl expf
; CHECK-CVT-GI-NEXT: fmov w8, s0
; CHECK-CVT-GI-NEXT: mov w19, #32767 // =0x7fff
; CHECK-CVT-GI-NEXT: fcmp s0, #0.0
; CHECK-CVT-GI-NEXT: shll v0.4s, v12.4h, #16
; CHECK-CVT-GI-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-CVT-GI-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-GI-NEXT: add w10, w8, w19
; CHECK-CVT-GI-NEXT: orr w8, w8, #0x400000
; CHECK-CVT-GI-NEXT: add w9, w10, w9
; CHECK-CVT-GI-NEXT: csel w8, w8, w9, vs
; CHECK-CVT-GI-NEXT: lsr w20, w8, #16
; CHECK-CVT-GI-NEXT: bl expf
; CHECK-CVT-GI-NEXT: shll v1.4s, v13.4h, #16
; CHECK-CVT-GI-NEXT: fmov w8, s0
; CHECK-CVT-GI-NEXT: fcmp s0, #0.0
; CHECK-CVT-GI-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-GI-NEXT: fmov s0, s1
; CHECK-CVT-GI-NEXT: add w10, w8, w19
; CHECK-CVT-GI-NEXT: orr w8, w8, #0x400000
; CHECK-CVT-GI-NEXT: add w9, w10, w9
; CHECK-CVT-GI-NEXT: csel w8, w8, w9, vs
; CHECK-CVT-GI-NEXT: lsr w21, w8, #16
; CHECK-CVT-GI-NEXT: bl expf
; CHECK-CVT-GI-NEXT: shll v1.4s, v14.4h, #16
; CHECK-CVT-GI-NEXT: fmov w8, s0
; CHECK-CVT-GI-NEXT: fcmp s0, #0.0
; CHECK-CVT-GI-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-GI-NEXT: fmov s0, s1
; CHECK-CVT-GI-NEXT: add w10, w8, w19
; CHECK-CVT-GI-NEXT: orr w8, w8, #0x400000
; CHECK-CVT-GI-NEXT: add w9, w10, w9
; CHECK-CVT-GI-NEXT: csel w8, w8, w9, vs
; CHECK-CVT-GI-NEXT: lsr w22, w8, #16
; CHECK-CVT-GI-NEXT: bl expf
; CHECK-CVT-GI-NEXT: shll v1.4s, v11.4h, #16
; CHECK-CVT-GI-NEXT: fmov w8, s0
; CHECK-CVT-GI-NEXT: fcmp s0, #0.0
; CHECK-CVT-GI-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-GI-NEXT: fmov s0, s1
; CHECK-CVT-GI-NEXT: add w10, w8, w19
; CHECK-CVT-GI-NEXT: orr w8, w8, #0x400000
; CHECK-CVT-GI-NEXT: add w9, w10, w9
; CHECK-CVT-GI-NEXT: csel w8, w8, w9, vs
; CHECK-CVT-GI-NEXT: lsr w23, w8, #16
; CHECK-CVT-GI-NEXT: bl expf
; CHECK-CVT-GI-NEXT: shll v1.4s, v10.4h, #16
; CHECK-CVT-GI-NEXT: fmov w8, s0
; CHECK-CVT-GI-NEXT: fcmp s0, #0.0
; CHECK-CVT-GI-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-GI-NEXT: fmov s0, s1
; CHECK-CVT-GI-NEXT: add w10, w8, w19
; CHECK-CVT-GI-NEXT: orr w8, w8, #0x400000
; CHECK-CVT-GI-NEXT: add w9, w10, w9
; CHECK-CVT-GI-NEXT: csel w8, w8, w9, vs
; CHECK-CVT-GI-NEXT: lsr w24, w8, #16
; CHECK-CVT-GI-NEXT: bl expf
; CHECK-CVT-GI-NEXT: shll v1.4s, v9.4h, #16
; CHECK-CVT-GI-NEXT: fmov w8, s0
; CHECK-CVT-GI-NEXT: fcmp s0, #0.0
; CHECK-CVT-GI-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-GI-NEXT: fmov s0, s1
; CHECK-CVT-GI-NEXT: add w10, w8, w19
; CHECK-CVT-GI-NEXT: orr w8, w8, #0x400000
; CHECK-CVT-GI-NEXT: add w9, w10, w9
; CHECK-CVT-GI-NEXT: csel w8, w8, w9, vs
; CHECK-CVT-GI-NEXT: lsr w25, w8, #16
; CHECK-CVT-GI-NEXT: bl expf
; CHECK-CVT-GI-NEXT: shll v1.4s, v8.4h, #16
; CHECK-CVT-GI-NEXT: fmov w8, s0
; CHECK-CVT-GI-NEXT: fcmp s0, #0.0
; CHECK-CVT-GI-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-GI-NEXT: fmov s0, s1
; CHECK-CVT-GI-NEXT: add w10, w8, w19
; CHECK-CVT-GI-NEXT: orr w8, w8, #0x400000
; CHECK-CVT-GI-NEXT: add w9, w10, w9
; CHECK-CVT-GI-NEXT: csel w8, w8, w9, vs
; CHECK-CVT-GI-NEXT: lsr w26, w8, #16
; CHECK-CVT-GI-NEXT: bl expf
; CHECK-CVT-GI-NEXT: fmov s1, w20
; CHECK-CVT-GI-NEXT: fmov w8, s0
; CHECK-CVT-GI-NEXT: ldr x30, [sp, #56] // 8-byte Reload
; CHECK-CVT-GI-NEXT: fcmp s0, #0.0
; CHECK-CVT-GI-NEXT: ldp d9, d8, [sp, #40] // 16-byte Folded Reload
; CHECK-CVT-GI-NEXT: ldp d11, d10, [sp, #24] // 16-byte Folded Reload
; CHECK-CVT-GI-NEXT: mov v1.h[1], w21
; CHECK-CVT-GI-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-GI-NEXT: add w10, w8, w19
; CHECK-CVT-GI-NEXT: orr w8, w8, #0x400000
; CHECK-CVT-GI-NEXT: ldp x20, x19, [sp, #112] // 16-byte Folded Reload
; CHECK-CVT-GI-NEXT: add w9, w10, w9
; CHECK-CVT-GI-NEXT: ldp d13, d12, [sp, #8] // 16-byte Folded Reload
; CHECK-CVT-GI-NEXT: csel w8, w8, w9, vs
; CHECK-CVT-GI-NEXT: mov v1.h[2], w22
; CHECK-CVT-GI-NEXT: lsr w8, w8, #16
; CHECK-CVT-GI-NEXT: ldp x22, x21, [sp, #96] // 16-byte Folded Reload
; CHECK-CVT-GI-NEXT: mov v1.h[3], w23
; CHECK-CVT-GI-NEXT: mov v1.h[4], w24
; CHECK-CVT-GI-NEXT: ldp x24, x23, [sp, #80] // 16-byte Folded Reload
; CHECK-CVT-GI-NEXT: mov v1.h[5], w25
; CHECK-CVT-GI-NEXT: mov v1.h[6], w26
; CHECK-CVT-GI-NEXT: ldp x26, x25, [sp, #64] // 16-byte Folded Reload
; CHECK-CVT-GI-NEXT: mov v1.h[7], w8
; CHECK-CVT-GI-NEXT: mov v0.16b, v1.16b
; CHECK-CVT-GI-NEXT: ldr d14, [sp], #128 // 8-byte Folded Reload
; CHECK-CVT-GI-NEXT: ret
;
; CHECK-BF16-GI-LABEL: test_exp:
; CHECK-BF16-GI: // %bb.0:
; CHECK-BF16-GI-NEXT: sub sp, sp, #176
; CHECK-BF16-GI-NEXT: str d14, [sp, #112] // 8-byte Spill
; CHECK-BF16-GI-NEXT: mov h14, v0.h[6]
; CHECK-BF16-GI-NEXT: stp d13, d12, [sp, #120] // 16-byte Folded Spill
; CHECK-BF16-GI-NEXT: mov h12, v0.h[4]
; CHECK-BF16-GI-NEXT: mov h13, v0.h[5]
; CHECK-BF16-GI-NEXT: stp d11, d10, [sp, #136] // 16-byte Folded Spill
; CHECK-BF16-GI-NEXT: mov h10, v0.h[2]
; CHECK-BF16-GI-NEXT: mov h11, v0.h[3]
; CHECK-BF16-GI-NEXT: stp d9, d8, [sp, #152] // 16-byte Folded Spill
; CHECK-BF16-GI-NEXT: mov h9, v0.h[1]
; CHECK-BF16-GI-NEXT: mov h8, v0.h[7]
; CHECK-BF16-GI-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16-GI-NEXT: str x30, [sp, #168] // 8-byte Spill
; CHECK-BF16-GI-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16-GI-NEXT: bl expf
; CHECK-BF16-GI-NEXT: bfcvt h0, s0
; CHECK-BF16-GI-NEXT: str q0, [sp, #96] // 16-byte Spill
; CHECK-BF16-GI-NEXT: shll v0.4s, v9.4h, #16
; CHECK-BF16-GI-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16-GI-NEXT: bl expf
; CHECK-BF16-GI-NEXT: bfcvt h0, s0
; CHECK-BF16-GI-NEXT: str q0, [sp, #80] // 16-byte Spill
; CHECK-BF16-GI-NEXT: shll v0.4s, v10.4h, #16
; CHECK-BF16-GI-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16-GI-NEXT: bl expf
; CHECK-BF16-GI-NEXT: bfcvt h0, s0
; CHECK-BF16-GI-NEXT: str q0, [sp, #64] // 16-byte Spill
; CHECK-BF16-GI-NEXT: shll v0.4s, v11.4h, #16
; CHECK-BF16-GI-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16-GI-NEXT: bl expf
; CHECK-BF16-GI-NEXT: bfcvt h0, s0
; CHECK-BF16-GI-NEXT: str q0, [sp, #48] // 16-byte Spill
; CHECK-BF16-GI-NEXT: shll v0.4s, v12.4h, #16
; CHECK-BF16-GI-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16-GI-NEXT: bl expf
; CHECK-BF16-GI-NEXT: bfcvt h0, s0
; CHECK-BF16-GI-NEXT: str q0, [sp, #32] // 16-byte Spill
; CHECK-BF16-GI-NEXT: shll v0.4s, v13.4h, #16
; CHECK-BF16-GI-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16-GI-NEXT: bl expf
; CHECK-BF16-GI-NEXT: bfcvt h0, s0
; CHECK-BF16-GI-NEXT: str q0, [sp, #16] // 16-byte Spill
; CHECK-BF16-GI-NEXT: shll v0.4s, v14.4h, #16
; CHECK-BF16-GI-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16-GI-NEXT: bl expf
; CHECK-BF16-GI-NEXT: bfcvt h0, s0
; CHECK-BF16-GI-NEXT: str q0, [sp] // 16-byte Spill
; CHECK-BF16-GI-NEXT: shll v0.4s, v8.4h, #16
; CHECK-BF16-GI-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16-GI-NEXT: bl expf
; CHECK-BF16-GI-NEXT: ldp q2, q1, [sp, #80] // 32-byte Folded Reload
; CHECK-BF16-GI-NEXT: bfcvt h0, s0
; CHECK-BF16-GI-NEXT: ldp d9, d8, [sp, #152] // 16-byte Folded Reload
; CHECK-BF16-GI-NEXT: ldr x30, [sp, #168] // 8-byte Reload
; CHECK-BF16-GI-NEXT: ldp d11, d10, [sp, #136] // 16-byte Folded Reload
; CHECK-BF16-GI-NEXT: ldr d14, [sp, #112] // 8-byte Reload
; CHECK-BF16-GI-NEXT: mov v1.h[1], v2.h[0]
; CHECK-BF16-GI-NEXT: ldp q2, q3, [sp, #48] // 32-byte Folded Reload
; CHECK-BF16-GI-NEXT: ldp d13, d12, [sp, #120] // 16-byte Folded Reload
; CHECK-BF16-GI-NEXT: mov v1.h[2], v3.h[0]
; CHECK-BF16-GI-NEXT: mov v1.h[3], v2.h[0]
; CHECK-BF16-GI-NEXT: ldp q2, q3, [sp, #16] // 32-byte Folded Reload
; CHECK-BF16-GI-NEXT: mov v1.h[4], v3.h[0]
; CHECK-BF16-GI-NEXT: mov v1.h[5], v2.h[0]
; CHECK-BF16-GI-NEXT: ldr q2, [sp] // 16-byte Reload
; CHECK-BF16-GI-NEXT: mov v1.h[6], v2.h[0]
; CHECK-BF16-GI-NEXT: mov v1.h[7], v0.h[0]
; CHECK-BF16-GI-NEXT: mov v0.16b, v1.16b
; CHECK-BF16-GI-NEXT: add sp, sp, #176
; CHECK-BF16-GI-NEXT: ret
%r = call <8 x bfloat> @llvm.exp.v8bf16(<8 x bfloat> %a)
ret <8 x bfloat> %r
}
define <8 x bfloat> @test_exp2(<8 x bfloat> %a) #0 {
; CHECK-CVT-SD-LABEL: test_exp2:
; CHECK-CVT-SD: // %bb.0:
; CHECK-CVT-SD-NEXT: sub sp, sp, #48
; CHECK-CVT-SD-NEXT: mov h1, v0.h[1]
; CHECK-CVT-SD-NEXT: str q0, [sp] // 16-byte Spill
; CHECK-CVT-SD-NEXT: stp x30, x19, [sp, #32] // 16-byte Folded Spill
; CHECK-CVT-SD-NEXT: shll v0.4s, v1.4h, #16
; CHECK-CVT-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-CVT-SD-NEXT: bl exp2f
; CHECK-CVT-SD-NEXT: fmov w8, s0
; CHECK-CVT-SD-NEXT: mov w19, #32767 // =0x7fff
; CHECK-CVT-SD-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-SD-NEXT: add w8, w8, w19
; CHECK-CVT-SD-NEXT: add w8, w9, w8
; CHECK-CVT-SD-NEXT: lsr w8, w8, #16
; CHECK-CVT-SD-NEXT: fmov s0, w8
; CHECK-CVT-SD-NEXT: str q0, [sp, #16] // 16-byte Spill
; CHECK-CVT-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-CVT-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-CVT-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-CVT-SD-NEXT: bl exp2f
; CHECK-CVT-SD-NEXT: fmov w8, s0
; CHECK-CVT-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload
; CHECK-CVT-SD-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-SD-NEXT: add w8, w8, w19
; CHECK-CVT-SD-NEXT: add w8, w9, w8
; CHECK-CVT-SD-NEXT: lsr w8, w8, #16
; CHECK-CVT-SD-NEXT: fmov s0, w8
; CHECK-CVT-SD-NEXT: mov v0.h[1], v1.h[0]
; CHECK-CVT-SD-NEXT: str q0, [sp, #16] // 16-byte Spill
; CHECK-CVT-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-CVT-SD-NEXT: mov h0, v0.h[2]
; CHECK-CVT-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-CVT-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-CVT-SD-NEXT: bl exp2f
; CHECK-CVT-SD-NEXT: fmov w8, s0
; CHECK-CVT-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload
; CHECK-CVT-SD-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-SD-NEXT: add w8, w8, w19
; CHECK-CVT-SD-NEXT: add w8, w9, w8
; CHECK-CVT-SD-NEXT: lsr w8, w8, #16
; CHECK-CVT-SD-NEXT: fmov s0, w8
; CHECK-CVT-SD-NEXT: mov v1.h[2], v0.h[0]
; CHECK-CVT-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-CVT-SD-NEXT: mov h0, v0.h[3]
; CHECK-CVT-SD-NEXT: str q1, [sp, #16] // 16-byte Spill
; CHECK-CVT-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-CVT-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-CVT-SD-NEXT: bl exp2f
; CHECK-CVT-SD-NEXT: fmov w8, s0
; CHECK-CVT-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload
; CHECK-CVT-SD-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-SD-NEXT: add w8, w8, w19
; CHECK-CVT-SD-NEXT: add w8, w9, w8
; CHECK-CVT-SD-NEXT: lsr w8, w8, #16
; CHECK-CVT-SD-NEXT: fmov s0, w8
; CHECK-CVT-SD-NEXT: mov v1.h[3], v0.h[0]
; CHECK-CVT-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-CVT-SD-NEXT: mov h0, v0.h[4]
; CHECK-CVT-SD-NEXT: str q1, [sp, #16] // 16-byte Spill
; CHECK-CVT-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-CVT-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-CVT-SD-NEXT: bl exp2f
; CHECK-CVT-SD-NEXT: fmov w8, s0
; CHECK-CVT-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload
; CHECK-CVT-SD-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-SD-NEXT: add w8, w8, w19
; CHECK-CVT-SD-NEXT: add w8, w9, w8
; CHECK-CVT-SD-NEXT: lsr w8, w8, #16
; CHECK-CVT-SD-NEXT: fmov s0, w8
; CHECK-CVT-SD-NEXT: mov v1.h[4], v0.h[0]
; CHECK-CVT-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-CVT-SD-NEXT: mov h0, v0.h[5]
; CHECK-CVT-SD-NEXT: str q1, [sp, #16] // 16-byte Spill
; CHECK-CVT-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-CVT-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-CVT-SD-NEXT: bl exp2f
; CHECK-CVT-SD-NEXT: fmov w8, s0
; CHECK-CVT-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload
; CHECK-CVT-SD-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-SD-NEXT: add w8, w8, w19
; CHECK-CVT-SD-NEXT: add w8, w9, w8
; CHECK-CVT-SD-NEXT: lsr w8, w8, #16
; CHECK-CVT-SD-NEXT: fmov s0, w8
; CHECK-CVT-SD-NEXT: mov v1.h[5], v0.h[0]
; CHECK-CVT-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-CVT-SD-NEXT: mov h0, v0.h[6]
; CHECK-CVT-SD-NEXT: str q1, [sp, #16] // 16-byte Spill
; CHECK-CVT-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-CVT-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-CVT-SD-NEXT: bl exp2f
; CHECK-CVT-SD-NEXT: fmov w8, s0
; CHECK-CVT-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload
; CHECK-CVT-SD-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-SD-NEXT: add w8, w8, w19
; CHECK-CVT-SD-NEXT: add w8, w9, w8
; CHECK-CVT-SD-NEXT: lsr w8, w8, #16
; CHECK-CVT-SD-NEXT: fmov s0, w8
; CHECK-CVT-SD-NEXT: mov v1.h[6], v0.h[0]
; CHECK-CVT-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-CVT-SD-NEXT: mov h0, v0.h[7]
; CHECK-CVT-SD-NEXT: str q1, [sp, #16] // 16-byte Spill
; CHECK-CVT-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-CVT-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-CVT-SD-NEXT: bl exp2f
; CHECK-CVT-SD-NEXT: fmov w8, s0
; CHECK-CVT-SD-NEXT: ldr q0, [sp, #16] // 16-byte Reload
; CHECK-CVT-SD-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-SD-NEXT: add w8, w8, w19
; CHECK-CVT-SD-NEXT: ldp x30, x19, [sp, #32] // 16-byte Folded Reload
; CHECK-CVT-SD-NEXT: add w8, w9, w8
; CHECK-CVT-SD-NEXT: lsr w8, w8, #16
; CHECK-CVT-SD-NEXT: fmov s1, w8
; CHECK-CVT-SD-NEXT: mov v0.h[7], v1.h[0]
; CHECK-CVT-SD-NEXT: add sp, sp, #48
; CHECK-CVT-SD-NEXT: ret
;
; CHECK-BF16-SD-LABEL: test_exp2:
; CHECK-BF16-SD: // %bb.0:
; CHECK-BF16-SD-NEXT: sub sp, sp, #48
; CHECK-BF16-SD-NEXT: mov h1, v0.h[1]
; CHECK-BF16-SD-NEXT: str q0, [sp] // 16-byte Spill
; CHECK-BF16-SD-NEXT: str x30, [sp, #32] // 8-byte Spill
; CHECK-BF16-SD-NEXT: shll v0.4s, v1.4h, #16
; CHECK-BF16-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16-SD-NEXT: bl exp2f
; CHECK-BF16-SD-NEXT: bfcvt h0, s0
; CHECK-BF16-SD-NEXT: str q0, [sp, #16] // 16-byte Spill
; CHECK-BF16-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-BF16-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16-SD-NEXT: bl exp2f
; CHECK-BF16-SD-NEXT: bfcvt h0, s0
; CHECK-BF16-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload
; CHECK-BF16-SD-NEXT: mov v0.h[1], v1.h[0]
; CHECK-BF16-SD-NEXT: str q0, [sp, #16] // 16-byte Spill
; CHECK-BF16-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-BF16-SD-NEXT: mov h0, v0.h[2]
; CHECK-BF16-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16-SD-NEXT: bl exp2f
; CHECK-BF16-SD-NEXT: bfcvt h0, s0
; CHECK-BF16-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload
; CHECK-BF16-SD-NEXT: mov v1.h[2], v0.h[0]
; CHECK-BF16-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-BF16-SD-NEXT: mov h0, v0.h[3]
; CHECK-BF16-SD-NEXT: str q1, [sp, #16] // 16-byte Spill
; CHECK-BF16-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16-SD-NEXT: bl exp2f
; CHECK-BF16-SD-NEXT: bfcvt h0, s0
; CHECK-BF16-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload
; CHECK-BF16-SD-NEXT: mov v1.h[3], v0.h[0]
; CHECK-BF16-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-BF16-SD-NEXT: mov h0, v0.h[4]
; CHECK-BF16-SD-NEXT: str q1, [sp, #16] // 16-byte Spill
; CHECK-BF16-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16-SD-NEXT: bl exp2f
; CHECK-BF16-SD-NEXT: bfcvt h0, s0
; CHECK-BF16-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload
; CHECK-BF16-SD-NEXT: mov v1.h[4], v0.h[0]
; CHECK-BF16-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-BF16-SD-NEXT: mov h0, v0.h[5]
; CHECK-BF16-SD-NEXT: str q1, [sp, #16] // 16-byte Spill
; CHECK-BF16-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16-SD-NEXT: bl exp2f
; CHECK-BF16-SD-NEXT: bfcvt h0, s0
; CHECK-BF16-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload
; CHECK-BF16-SD-NEXT: mov v1.h[5], v0.h[0]
; CHECK-BF16-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-BF16-SD-NEXT: mov h0, v0.h[6]
; CHECK-BF16-SD-NEXT: str q1, [sp, #16] // 16-byte Spill
; CHECK-BF16-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16-SD-NEXT: bl exp2f
; CHECK-BF16-SD-NEXT: bfcvt h0, s0
; CHECK-BF16-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload
; CHECK-BF16-SD-NEXT: mov v1.h[6], v0.h[0]
; CHECK-BF16-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-BF16-SD-NEXT: mov h0, v0.h[7]
; CHECK-BF16-SD-NEXT: str q1, [sp, #16] // 16-byte Spill
; CHECK-BF16-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16-SD-NEXT: bl exp2f
; CHECK-BF16-SD-NEXT: bfcvt h1, s0
; CHECK-BF16-SD-NEXT: ldr q0, [sp, #16] // 16-byte Reload
; CHECK-BF16-SD-NEXT: ldr x30, [sp, #32] // 8-byte Reload
; CHECK-BF16-SD-NEXT: mov v0.h[7], v1.h[0]
; CHECK-BF16-SD-NEXT: add sp, sp, #48
; CHECK-BF16-SD-NEXT: ret
;
; CHECK-BF16SVE-SD-LABEL: test_exp2:
; CHECK-BF16SVE-SD: // %bb.0:
; CHECK-BF16SVE-SD-NEXT: sub sp, sp, #48
; CHECK-BF16SVE-SD-NEXT: mov h1, v0.h[1]
; CHECK-BF16SVE-SD-NEXT: str q0, [sp] // 16-byte Spill
; CHECK-BF16SVE-SD-NEXT: str x30, [sp, #32] // 8-byte Spill
; CHECK-BF16SVE-SD-NEXT: shll v0.4s, v1.4h, #16
; CHECK-BF16SVE-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16SVE-SD-NEXT: bl exp2f
; CHECK-BF16SVE-SD-NEXT: bfcvt h0, s0
; CHECK-BF16SVE-SD-NEXT: str q0, [sp, #16] // 16-byte Spill
; CHECK-BF16SVE-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-BF16SVE-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16SVE-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16SVE-SD-NEXT: bl exp2f
; CHECK-BF16SVE-SD-NEXT: bfcvt h0, s0
; CHECK-BF16SVE-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload
; CHECK-BF16SVE-SD-NEXT: mov v0.h[1], v1.h[0]
; CHECK-BF16SVE-SD-NEXT: str q0, [sp, #16] // 16-byte Spill
; CHECK-BF16SVE-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-BF16SVE-SD-NEXT: mov h0, v0.h[2]
; CHECK-BF16SVE-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16SVE-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16SVE-SD-NEXT: bl exp2f
; CHECK-BF16SVE-SD-NEXT: bfcvt h0, s0
; CHECK-BF16SVE-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload
; CHECK-BF16SVE-SD-NEXT: mov v1.h[2], v0.h[0]
; CHECK-BF16SVE-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-BF16SVE-SD-NEXT: mov h0, v0.h[3]
; CHECK-BF16SVE-SD-NEXT: str q1, [sp, #16] // 16-byte Spill
; CHECK-BF16SVE-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16SVE-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16SVE-SD-NEXT: bl exp2f
; CHECK-BF16SVE-SD-NEXT: bfcvt h0, s0
; CHECK-BF16SVE-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload
; CHECK-BF16SVE-SD-NEXT: mov v1.h[3], v0.h[0]
; CHECK-BF16SVE-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-BF16SVE-SD-NEXT: mov h0, v0.h[4]
; CHECK-BF16SVE-SD-NEXT: str q1, [sp, #16] // 16-byte Spill
; CHECK-BF16SVE-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16SVE-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16SVE-SD-NEXT: bl exp2f
; CHECK-BF16SVE-SD-NEXT: bfcvt h0, s0
; CHECK-BF16SVE-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload
; CHECK-BF16SVE-SD-NEXT: mov v1.h[4], v0.h[0]
; CHECK-BF16SVE-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-BF16SVE-SD-NEXT: mov h0, v0.h[5]
; CHECK-BF16SVE-SD-NEXT: str q1, [sp, #16] // 16-byte Spill
; CHECK-BF16SVE-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16SVE-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16SVE-SD-NEXT: bl exp2f
; CHECK-BF16SVE-SD-NEXT: bfcvt h0, s0
; CHECK-BF16SVE-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload
; CHECK-BF16SVE-SD-NEXT: mov v1.h[5], v0.h[0]
; CHECK-BF16SVE-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-BF16SVE-SD-NEXT: mov h0, v0.h[6]
; CHECK-BF16SVE-SD-NEXT: str q1, [sp, #16] // 16-byte Spill
; CHECK-BF16SVE-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16SVE-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16SVE-SD-NEXT: bl exp2f
; CHECK-BF16SVE-SD-NEXT: bfcvt h0, s0
; CHECK-BF16SVE-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload
; CHECK-BF16SVE-SD-NEXT: mov v1.h[6], v0.h[0]
; CHECK-BF16SVE-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-BF16SVE-SD-NEXT: mov h0, v0.h[7]
; CHECK-BF16SVE-SD-NEXT: str q1, [sp, #16] // 16-byte Spill
; CHECK-BF16SVE-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16SVE-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16SVE-SD-NEXT: bl exp2f
; CHECK-BF16SVE-SD-NEXT: bfcvt h1, s0
; CHECK-BF16SVE-SD-NEXT: ldr q0, [sp, #16] // 16-byte Reload
; CHECK-BF16SVE-SD-NEXT: ldr x30, [sp, #32] // 8-byte Reload
; CHECK-BF16SVE-SD-NEXT: mov v0.h[7], v1.h[0]
; CHECK-BF16SVE-SD-NEXT: add sp, sp, #48
; CHECK-BF16SVE-SD-NEXT: ret
;
; CHECK-CVT-GI-LABEL: test_exp2:
; CHECK-CVT-GI: // %bb.0:
; CHECK-CVT-GI-NEXT: str d14, [sp, #-128]! // 8-byte Folded Spill
; CHECK-CVT-GI-NEXT: stp d13, d12, [sp, #8] // 16-byte Folded Spill
; CHECK-CVT-GI-NEXT: mov h12, v0.h[1]
; CHECK-CVT-GI-NEXT: mov h13, v0.h[2]
; CHECK-CVT-GI-NEXT: stp d11, d10, [sp, #24] // 16-byte Folded Spill
; CHECK-CVT-GI-NEXT: mov h14, v0.h[3]
; CHECK-CVT-GI-NEXT: mov h11, v0.h[4]
; CHECK-CVT-GI-NEXT: stp d9, d8, [sp, #40] // 16-byte Folded Spill
; CHECK-CVT-GI-NEXT: mov h10, v0.h[5]
; CHECK-CVT-GI-NEXT: mov h9, v0.h[6]
; CHECK-CVT-GI-NEXT: mov h8, v0.h[7]
; CHECK-CVT-GI-NEXT: shll v0.4s, v0.4h, #16
; CHECK-CVT-GI-NEXT: str x30, [sp, #56] // 8-byte Spill
; CHECK-CVT-GI-NEXT: stp x26, x25, [sp, #64] // 16-byte Folded Spill
; CHECK-CVT-GI-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-CVT-GI-NEXT: stp x24, x23, [sp, #80] // 16-byte Folded Spill
; CHECK-CVT-GI-NEXT: stp x22, x21, [sp, #96] // 16-byte Folded Spill
; CHECK-CVT-GI-NEXT: stp x20, x19, [sp, #112] // 16-byte Folded Spill
; CHECK-CVT-GI-NEXT: bl exp2f
; CHECK-CVT-GI-NEXT: fmov w8, s0
; CHECK-CVT-GI-NEXT: mov w19, #32767 // =0x7fff
; CHECK-CVT-GI-NEXT: fcmp s0, #0.0
; CHECK-CVT-GI-NEXT: shll v0.4s, v12.4h, #16
; CHECK-CVT-GI-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-CVT-GI-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-GI-NEXT: add w10, w8, w19
; CHECK-CVT-GI-NEXT: orr w8, w8, #0x400000
; CHECK-CVT-GI-NEXT: add w9, w10, w9
; CHECK-CVT-GI-NEXT: csel w8, w8, w9, vs
; CHECK-CVT-GI-NEXT: lsr w20, w8, #16
; CHECK-CVT-GI-NEXT: bl exp2f
; CHECK-CVT-GI-NEXT: shll v1.4s, v13.4h, #16
; CHECK-CVT-GI-NEXT: fmov w8, s0
; CHECK-CVT-GI-NEXT: fcmp s0, #0.0
; CHECK-CVT-GI-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-GI-NEXT: fmov s0, s1
; CHECK-CVT-GI-NEXT: add w10, w8, w19
; CHECK-CVT-GI-NEXT: orr w8, w8, #0x400000
; CHECK-CVT-GI-NEXT: add w9, w10, w9
; CHECK-CVT-GI-NEXT: csel w8, w8, w9, vs
; CHECK-CVT-GI-NEXT: lsr w21, w8, #16
; CHECK-CVT-GI-NEXT: bl exp2f
; CHECK-CVT-GI-NEXT: shll v1.4s, v14.4h, #16
; CHECK-CVT-GI-NEXT: fmov w8, s0
; CHECK-CVT-GI-NEXT: fcmp s0, #0.0
; CHECK-CVT-GI-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-GI-NEXT: fmov s0, s1
; CHECK-CVT-GI-NEXT: add w10, w8, w19
; CHECK-CVT-GI-NEXT: orr w8, w8, #0x400000
; CHECK-CVT-GI-NEXT: add w9, w10, w9
; CHECK-CVT-GI-NEXT: csel w8, w8, w9, vs
; CHECK-CVT-GI-NEXT: lsr w22, w8, #16
; CHECK-CVT-GI-NEXT: bl exp2f
; CHECK-CVT-GI-NEXT: shll v1.4s, v11.4h, #16
; CHECK-CVT-GI-NEXT: fmov w8, s0
; CHECK-CVT-GI-NEXT: fcmp s0, #0.0
; CHECK-CVT-GI-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-GI-NEXT: fmov s0, s1
; CHECK-CVT-GI-NEXT: add w10, w8, w19
; CHECK-CVT-GI-NEXT: orr w8, w8, #0x400000
; CHECK-CVT-GI-NEXT: add w9, w10, w9
; CHECK-CVT-GI-NEXT: csel w8, w8, w9, vs
; CHECK-CVT-GI-NEXT: lsr w23, w8, #16
; CHECK-CVT-GI-NEXT: bl exp2f
; CHECK-CVT-GI-NEXT: shll v1.4s, v10.4h, #16
; CHECK-CVT-GI-NEXT: fmov w8, s0
; CHECK-CVT-GI-NEXT: fcmp s0, #0.0
; CHECK-CVT-GI-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-GI-NEXT: fmov s0, s1
; CHECK-CVT-GI-NEXT: add w10, w8, w19
; CHECK-CVT-GI-NEXT: orr w8, w8, #0x400000
; CHECK-CVT-GI-NEXT: add w9, w10, w9
; CHECK-CVT-GI-NEXT: csel w8, w8, w9, vs
; CHECK-CVT-GI-NEXT: lsr w24, w8, #16
; CHECK-CVT-GI-NEXT: bl exp2f
; CHECK-CVT-GI-NEXT: shll v1.4s, v9.4h, #16
; CHECK-CVT-GI-NEXT: fmov w8, s0
; CHECK-CVT-GI-NEXT: fcmp s0, #0.0
; CHECK-CVT-GI-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-GI-NEXT: fmov s0, s1
; CHECK-CVT-GI-NEXT: add w10, w8, w19
; CHECK-CVT-GI-NEXT: orr w8, w8, #0x400000
; CHECK-CVT-GI-NEXT: add w9, w10, w9
; CHECK-CVT-GI-NEXT: csel w8, w8, w9, vs
; CHECK-CVT-GI-NEXT: lsr w25, w8, #16
; CHECK-CVT-GI-NEXT: bl exp2f
; CHECK-CVT-GI-NEXT: shll v1.4s, v8.4h, #16
; CHECK-CVT-GI-NEXT: fmov w8, s0
; CHECK-CVT-GI-NEXT: fcmp s0, #0.0
; CHECK-CVT-GI-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-GI-NEXT: fmov s0, s1
; CHECK-CVT-GI-NEXT: add w10, w8, w19
; CHECK-CVT-GI-NEXT: orr w8, w8, #0x400000
; CHECK-CVT-GI-NEXT: add w9, w10, w9
; CHECK-CVT-GI-NEXT: csel w8, w8, w9, vs
; CHECK-CVT-GI-NEXT: lsr w26, w8, #16
; CHECK-CVT-GI-NEXT: bl exp2f
; CHECK-CVT-GI-NEXT: fmov s1, w20
; CHECK-CVT-GI-NEXT: fmov w8, s0
; CHECK-CVT-GI-NEXT: ldr x30, [sp, #56] // 8-byte Reload
; CHECK-CVT-GI-NEXT: fcmp s0, #0.0
; CHECK-CVT-GI-NEXT: ldp d9, d8, [sp, #40] // 16-byte Folded Reload
; CHECK-CVT-GI-NEXT: ldp d11, d10, [sp, #24] // 16-byte Folded Reload
; CHECK-CVT-GI-NEXT: mov v1.h[1], w21
; CHECK-CVT-GI-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-GI-NEXT: add w10, w8, w19
; CHECK-CVT-GI-NEXT: orr w8, w8, #0x400000
; CHECK-CVT-GI-NEXT: ldp x20, x19, [sp, #112] // 16-byte Folded Reload
; CHECK-CVT-GI-NEXT: add w9, w10, w9
; CHECK-CVT-GI-NEXT: ldp d13, d12, [sp, #8] // 16-byte Folded Reload
; CHECK-CVT-GI-NEXT: csel w8, w8, w9, vs
; CHECK-CVT-GI-NEXT: mov v1.h[2], w22
; CHECK-CVT-GI-NEXT: lsr w8, w8, #16
; CHECK-CVT-GI-NEXT: ldp x22, x21, [sp, #96] // 16-byte Folded Reload
; CHECK-CVT-GI-NEXT: mov v1.h[3], w23
; CHECK-CVT-GI-NEXT: mov v1.h[4], w24
; CHECK-CVT-GI-NEXT: ldp x24, x23, [sp, #80] // 16-byte Folded Reload
; CHECK-CVT-GI-NEXT: mov v1.h[5], w25
; CHECK-CVT-GI-NEXT: mov v1.h[6], w26
; CHECK-CVT-GI-NEXT: ldp x26, x25, [sp, #64] // 16-byte Folded Reload
; CHECK-CVT-GI-NEXT: mov v1.h[7], w8
; CHECK-CVT-GI-NEXT: mov v0.16b, v1.16b
; CHECK-CVT-GI-NEXT: ldr d14, [sp], #128 // 8-byte Folded Reload
; CHECK-CVT-GI-NEXT: ret
;
; CHECK-BF16-GI-LABEL: test_exp2:
; CHECK-BF16-GI: // %bb.0:
; CHECK-BF16-GI-NEXT: sub sp, sp, #176
; CHECK-BF16-GI-NEXT: str d14, [sp, #112] // 8-byte Spill
; CHECK-BF16-GI-NEXT: mov h14, v0.h[6]
; CHECK-BF16-GI-NEXT: stp d13, d12, [sp, #120] // 16-byte Folded Spill
; CHECK-BF16-GI-NEXT: mov h12, v0.h[4]
; CHECK-BF16-GI-NEXT: mov h13, v0.h[5]
; CHECK-BF16-GI-NEXT: stp d11, d10, [sp, #136] // 16-byte Folded Spill
; CHECK-BF16-GI-NEXT: mov h10, v0.h[2]
; CHECK-BF16-GI-NEXT: mov h11, v0.h[3]
; CHECK-BF16-GI-NEXT: stp d9, d8, [sp, #152] // 16-byte Folded Spill
; CHECK-BF16-GI-NEXT: mov h9, v0.h[1]
; CHECK-BF16-GI-NEXT: mov h8, v0.h[7]
; CHECK-BF16-GI-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16-GI-NEXT: str x30, [sp, #168] // 8-byte Spill
; CHECK-BF16-GI-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16-GI-NEXT: bl exp2f
; CHECK-BF16-GI-NEXT: bfcvt h0, s0
; CHECK-BF16-GI-NEXT: str q0, [sp, #96] // 16-byte Spill
; CHECK-BF16-GI-NEXT: shll v0.4s, v9.4h, #16
; CHECK-BF16-GI-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16-GI-NEXT: bl exp2f
; CHECK-BF16-GI-NEXT: bfcvt h0, s0
; CHECK-BF16-GI-NEXT: str q0, [sp, #80] // 16-byte Spill
; CHECK-BF16-GI-NEXT: shll v0.4s, v10.4h, #16
; CHECK-BF16-GI-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16-GI-NEXT: bl exp2f
; CHECK-BF16-GI-NEXT: bfcvt h0, s0
; CHECK-BF16-GI-NEXT: str q0, [sp, #64] // 16-byte Spill
; CHECK-BF16-GI-NEXT: shll v0.4s, v11.4h, #16
; CHECK-BF16-GI-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16-GI-NEXT: bl exp2f
; CHECK-BF16-GI-NEXT: bfcvt h0, s0
; CHECK-BF16-GI-NEXT: str q0, [sp, #48] // 16-byte Spill
; CHECK-BF16-GI-NEXT: shll v0.4s, v12.4h, #16
; CHECK-BF16-GI-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16-GI-NEXT: bl exp2f
; CHECK-BF16-GI-NEXT: bfcvt h0, s0
; CHECK-BF16-GI-NEXT: str q0, [sp, #32] // 16-byte Spill
; CHECK-BF16-GI-NEXT: shll v0.4s, v13.4h, #16
; CHECK-BF16-GI-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16-GI-NEXT: bl exp2f
; CHECK-BF16-GI-NEXT: bfcvt h0, s0
; CHECK-BF16-GI-NEXT: str q0, [sp, #16] // 16-byte Spill
; CHECK-BF16-GI-NEXT: shll v0.4s, v14.4h, #16
; CHECK-BF16-GI-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16-GI-NEXT: bl exp2f
; CHECK-BF16-GI-NEXT: bfcvt h0, s0
; CHECK-BF16-GI-NEXT: str q0, [sp] // 16-byte Spill
; CHECK-BF16-GI-NEXT: shll v0.4s, v8.4h, #16
; CHECK-BF16-GI-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16-GI-NEXT: bl exp2f
; CHECK-BF16-GI-NEXT: ldp q2, q1, [sp, #80] // 32-byte Folded Reload
; CHECK-BF16-GI-NEXT: bfcvt h0, s0
; CHECK-BF16-GI-NEXT: ldp d9, d8, [sp, #152] // 16-byte Folded Reload
; CHECK-BF16-GI-NEXT: ldr x30, [sp, #168] // 8-byte Reload
; CHECK-BF16-GI-NEXT: ldp d11, d10, [sp, #136] // 16-byte Folded Reload
; CHECK-BF16-GI-NEXT: ldr d14, [sp, #112] // 8-byte Reload
; CHECK-BF16-GI-NEXT: mov v1.h[1], v2.h[0]
; CHECK-BF16-GI-NEXT: ldp q2, q3, [sp, #48] // 32-byte Folded Reload
; CHECK-BF16-GI-NEXT: ldp d13, d12, [sp, #120] // 16-byte Folded Reload
; CHECK-BF16-GI-NEXT: mov v1.h[2], v3.h[0]
; CHECK-BF16-GI-NEXT: mov v1.h[3], v2.h[0]
; CHECK-BF16-GI-NEXT: ldp q2, q3, [sp, #16] // 32-byte Folded Reload
; CHECK-BF16-GI-NEXT: mov v1.h[4], v3.h[0]
; CHECK-BF16-GI-NEXT: mov v1.h[5], v2.h[0]
; CHECK-BF16-GI-NEXT: ldr q2, [sp] // 16-byte Reload
; CHECK-BF16-GI-NEXT: mov v1.h[6], v2.h[0]
; CHECK-BF16-GI-NEXT: mov v1.h[7], v0.h[0]
; CHECK-BF16-GI-NEXT: mov v0.16b, v1.16b
; CHECK-BF16-GI-NEXT: add sp, sp, #176
; CHECK-BF16-GI-NEXT: ret
%r = call <8 x bfloat> @llvm.exp2.v8bf16(<8 x bfloat> %a)
ret <8 x bfloat> %r
}
define <8 x bfloat> @test_log(<8 x bfloat> %a) #0 {
; CHECK-CVT-SD-LABEL: test_log:
; CHECK-CVT-SD: // %bb.0:
; CHECK-CVT-SD-NEXT: sub sp, sp, #48
; CHECK-CVT-SD-NEXT: mov h1, v0.h[1]
; CHECK-CVT-SD-NEXT: str q0, [sp] // 16-byte Spill
; CHECK-CVT-SD-NEXT: stp x30, x19, [sp, #32] // 16-byte Folded Spill
; CHECK-CVT-SD-NEXT: shll v0.4s, v1.4h, #16
; CHECK-CVT-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-CVT-SD-NEXT: bl logf
; CHECK-CVT-SD-NEXT: fmov w8, s0
; CHECK-CVT-SD-NEXT: mov w19, #32767 // =0x7fff
; CHECK-CVT-SD-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-SD-NEXT: add w8, w8, w19
; CHECK-CVT-SD-NEXT: add w8, w9, w8
; CHECK-CVT-SD-NEXT: lsr w8, w8, #16
; CHECK-CVT-SD-NEXT: fmov s0, w8
; CHECK-CVT-SD-NEXT: str q0, [sp, #16] // 16-byte Spill
; CHECK-CVT-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-CVT-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-CVT-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-CVT-SD-NEXT: bl logf
; CHECK-CVT-SD-NEXT: fmov w8, s0
; CHECK-CVT-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload
; CHECK-CVT-SD-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-SD-NEXT: add w8, w8, w19
; CHECK-CVT-SD-NEXT: add w8, w9, w8
; CHECK-CVT-SD-NEXT: lsr w8, w8, #16
; CHECK-CVT-SD-NEXT: fmov s0, w8
; CHECK-CVT-SD-NEXT: mov v0.h[1], v1.h[0]
; CHECK-CVT-SD-NEXT: str q0, [sp, #16] // 16-byte Spill
; CHECK-CVT-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-CVT-SD-NEXT: mov h0, v0.h[2]
; CHECK-CVT-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-CVT-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-CVT-SD-NEXT: bl logf
; CHECK-CVT-SD-NEXT: fmov w8, s0
; CHECK-CVT-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload
; CHECK-CVT-SD-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-SD-NEXT: add w8, w8, w19
; CHECK-CVT-SD-NEXT: add w8, w9, w8
; CHECK-CVT-SD-NEXT: lsr w8, w8, #16
; CHECK-CVT-SD-NEXT: fmov s0, w8
; CHECK-CVT-SD-NEXT: mov v1.h[2], v0.h[0]
; CHECK-CVT-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-CVT-SD-NEXT: mov h0, v0.h[3]
; CHECK-CVT-SD-NEXT: str q1, [sp, #16] // 16-byte Spill
; CHECK-CVT-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-CVT-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-CVT-SD-NEXT: bl logf
; CHECK-CVT-SD-NEXT: fmov w8, s0
; CHECK-CVT-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload
; CHECK-CVT-SD-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-SD-NEXT: add w8, w8, w19
; CHECK-CVT-SD-NEXT: add w8, w9, w8
; CHECK-CVT-SD-NEXT: lsr w8, w8, #16
; CHECK-CVT-SD-NEXT: fmov s0, w8
; CHECK-CVT-SD-NEXT: mov v1.h[3], v0.h[0]
; CHECK-CVT-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-CVT-SD-NEXT: mov h0, v0.h[4]
; CHECK-CVT-SD-NEXT: str q1, [sp, #16] // 16-byte Spill
; CHECK-CVT-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-CVT-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-CVT-SD-NEXT: bl logf
; CHECK-CVT-SD-NEXT: fmov w8, s0
; CHECK-CVT-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload
; CHECK-CVT-SD-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-SD-NEXT: add w8, w8, w19
; CHECK-CVT-SD-NEXT: add w8, w9, w8
; CHECK-CVT-SD-NEXT: lsr w8, w8, #16
; CHECK-CVT-SD-NEXT: fmov s0, w8
; CHECK-CVT-SD-NEXT: mov v1.h[4], v0.h[0]
; CHECK-CVT-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-CVT-SD-NEXT: mov h0, v0.h[5]
; CHECK-CVT-SD-NEXT: str q1, [sp, #16] // 16-byte Spill
; CHECK-CVT-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-CVT-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-CVT-SD-NEXT: bl logf
; CHECK-CVT-SD-NEXT: fmov w8, s0
; CHECK-CVT-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload
; CHECK-CVT-SD-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-SD-NEXT: add w8, w8, w19
; CHECK-CVT-SD-NEXT: add w8, w9, w8
; CHECK-CVT-SD-NEXT: lsr w8, w8, #16
; CHECK-CVT-SD-NEXT: fmov s0, w8
; CHECK-CVT-SD-NEXT: mov v1.h[5], v0.h[0]
; CHECK-CVT-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-CVT-SD-NEXT: mov h0, v0.h[6]
; CHECK-CVT-SD-NEXT: str q1, [sp, #16] // 16-byte Spill
; CHECK-CVT-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-CVT-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-CVT-SD-NEXT: bl logf
; CHECK-CVT-SD-NEXT: fmov w8, s0
; CHECK-CVT-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload
; CHECK-CVT-SD-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-SD-NEXT: add w8, w8, w19
; CHECK-CVT-SD-NEXT: add w8, w9, w8
; CHECK-CVT-SD-NEXT: lsr w8, w8, #16
; CHECK-CVT-SD-NEXT: fmov s0, w8
; CHECK-CVT-SD-NEXT: mov v1.h[6], v0.h[0]
; CHECK-CVT-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-CVT-SD-NEXT: mov h0, v0.h[7]
; CHECK-CVT-SD-NEXT: str q1, [sp, #16] // 16-byte Spill
; CHECK-CVT-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-CVT-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-CVT-SD-NEXT: bl logf
; CHECK-CVT-SD-NEXT: fmov w8, s0
; CHECK-CVT-SD-NEXT: ldr q0, [sp, #16] // 16-byte Reload
; CHECK-CVT-SD-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-SD-NEXT: add w8, w8, w19
; CHECK-CVT-SD-NEXT: ldp x30, x19, [sp, #32] // 16-byte Folded Reload
; CHECK-CVT-SD-NEXT: add w8, w9, w8
; CHECK-CVT-SD-NEXT: lsr w8, w8, #16
; CHECK-CVT-SD-NEXT: fmov s1, w8
; CHECK-CVT-SD-NEXT: mov v0.h[7], v1.h[0]
; CHECK-CVT-SD-NEXT: add sp, sp, #48
; CHECK-CVT-SD-NEXT: ret
;
; CHECK-BF16-SD-LABEL: test_log:
; CHECK-BF16-SD: // %bb.0:
; CHECK-BF16-SD-NEXT: sub sp, sp, #48
; CHECK-BF16-SD-NEXT: mov h1, v0.h[1]
; CHECK-BF16-SD-NEXT: str q0, [sp] // 16-byte Spill
; CHECK-BF16-SD-NEXT: str x30, [sp, #32] // 8-byte Spill
; CHECK-BF16-SD-NEXT: shll v0.4s, v1.4h, #16
; CHECK-BF16-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16-SD-NEXT: bl logf
; CHECK-BF16-SD-NEXT: bfcvt h0, s0
; CHECK-BF16-SD-NEXT: str q0, [sp, #16] // 16-byte Spill
; CHECK-BF16-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-BF16-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16-SD-NEXT: bl logf
; CHECK-BF16-SD-NEXT: bfcvt h0, s0
; CHECK-BF16-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload
; CHECK-BF16-SD-NEXT: mov v0.h[1], v1.h[0]
; CHECK-BF16-SD-NEXT: str q0, [sp, #16] // 16-byte Spill
; CHECK-BF16-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-BF16-SD-NEXT: mov h0, v0.h[2]
; CHECK-BF16-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16-SD-NEXT: bl logf
; CHECK-BF16-SD-NEXT: bfcvt h0, s0
; CHECK-BF16-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload
; CHECK-BF16-SD-NEXT: mov v1.h[2], v0.h[0]
; CHECK-BF16-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-BF16-SD-NEXT: mov h0, v0.h[3]
; CHECK-BF16-SD-NEXT: str q1, [sp, #16] // 16-byte Spill
; CHECK-BF16-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16-SD-NEXT: bl logf
; CHECK-BF16-SD-NEXT: bfcvt h0, s0
; CHECK-BF16-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload
; CHECK-BF16-SD-NEXT: mov v1.h[3], v0.h[0]
; CHECK-BF16-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-BF16-SD-NEXT: mov h0, v0.h[4]
; CHECK-BF16-SD-NEXT: str q1, [sp, #16] // 16-byte Spill
; CHECK-BF16-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16-SD-NEXT: bl logf
; CHECK-BF16-SD-NEXT: bfcvt h0, s0
; CHECK-BF16-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload
; CHECK-BF16-SD-NEXT: mov v1.h[4], v0.h[0]
; CHECK-BF16-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-BF16-SD-NEXT: mov h0, v0.h[5]
; CHECK-BF16-SD-NEXT: str q1, [sp, #16] // 16-byte Spill
; CHECK-BF16-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16-SD-NEXT: bl logf
; CHECK-BF16-SD-NEXT: bfcvt h0, s0
; CHECK-BF16-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload
; CHECK-BF16-SD-NEXT: mov v1.h[5], v0.h[0]
; CHECK-BF16-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-BF16-SD-NEXT: mov h0, v0.h[6]
; CHECK-BF16-SD-NEXT: str q1, [sp, #16] // 16-byte Spill
; CHECK-BF16-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16-SD-NEXT: bl logf
; CHECK-BF16-SD-NEXT: bfcvt h0, s0
; CHECK-BF16-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload
; CHECK-BF16-SD-NEXT: mov v1.h[6], v0.h[0]
; CHECK-BF16-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-BF16-SD-NEXT: mov h0, v0.h[7]
; CHECK-BF16-SD-NEXT: str q1, [sp, #16] // 16-byte Spill
; CHECK-BF16-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16-SD-NEXT: bl logf
; CHECK-BF16-SD-NEXT: bfcvt h1, s0
; CHECK-BF16-SD-NEXT: ldr q0, [sp, #16] // 16-byte Reload
; CHECK-BF16-SD-NEXT: ldr x30, [sp, #32] // 8-byte Reload
; CHECK-BF16-SD-NEXT: mov v0.h[7], v1.h[0]
; CHECK-BF16-SD-NEXT: add sp, sp, #48
; CHECK-BF16-SD-NEXT: ret
;
; CHECK-BF16SVE-SD-LABEL: test_log:
; CHECK-BF16SVE-SD: // %bb.0:
; CHECK-BF16SVE-SD-NEXT: sub sp, sp, #48
; CHECK-BF16SVE-SD-NEXT: mov h1, v0.h[1]
; CHECK-BF16SVE-SD-NEXT: str q0, [sp] // 16-byte Spill
; CHECK-BF16SVE-SD-NEXT: str x30, [sp, #32] // 8-byte Spill
; CHECK-BF16SVE-SD-NEXT: shll v0.4s, v1.4h, #16
; CHECK-BF16SVE-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16SVE-SD-NEXT: bl logf
; CHECK-BF16SVE-SD-NEXT: bfcvt h0, s0
; CHECK-BF16SVE-SD-NEXT: str q0, [sp, #16] // 16-byte Spill
; CHECK-BF16SVE-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-BF16SVE-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16SVE-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16SVE-SD-NEXT: bl logf
; CHECK-BF16SVE-SD-NEXT: bfcvt h0, s0
; CHECK-BF16SVE-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload
; CHECK-BF16SVE-SD-NEXT: mov v0.h[1], v1.h[0]
; CHECK-BF16SVE-SD-NEXT: str q0, [sp, #16] // 16-byte Spill
; CHECK-BF16SVE-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-BF16SVE-SD-NEXT: mov h0, v0.h[2]
; CHECK-BF16SVE-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16SVE-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16SVE-SD-NEXT: bl logf
; CHECK-BF16SVE-SD-NEXT: bfcvt h0, s0
; CHECK-BF16SVE-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload
; CHECK-BF16SVE-SD-NEXT: mov v1.h[2], v0.h[0]
; CHECK-BF16SVE-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-BF16SVE-SD-NEXT: mov h0, v0.h[3]
; CHECK-BF16SVE-SD-NEXT: str q1, [sp, #16] // 16-byte Spill
; CHECK-BF16SVE-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16SVE-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16SVE-SD-NEXT: bl logf
; CHECK-BF16SVE-SD-NEXT: bfcvt h0, s0
; CHECK-BF16SVE-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload
; CHECK-BF16SVE-SD-NEXT: mov v1.h[3], v0.h[0]
; CHECK-BF16SVE-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-BF16SVE-SD-NEXT: mov h0, v0.h[4]
; CHECK-BF16SVE-SD-NEXT: str q1, [sp, #16] // 16-byte Spill
; CHECK-BF16SVE-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16SVE-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16SVE-SD-NEXT: bl logf
; CHECK-BF16SVE-SD-NEXT: bfcvt h0, s0
; CHECK-BF16SVE-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload
; CHECK-BF16SVE-SD-NEXT: mov v1.h[4], v0.h[0]
; CHECK-BF16SVE-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-BF16SVE-SD-NEXT: mov h0, v0.h[5]
; CHECK-BF16SVE-SD-NEXT: str q1, [sp, #16] // 16-byte Spill
; CHECK-BF16SVE-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16SVE-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16SVE-SD-NEXT: bl logf
; CHECK-BF16SVE-SD-NEXT: bfcvt h0, s0
; CHECK-BF16SVE-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload
; CHECK-BF16SVE-SD-NEXT: mov v1.h[5], v0.h[0]
; CHECK-BF16SVE-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-BF16SVE-SD-NEXT: mov h0, v0.h[6]
; CHECK-BF16SVE-SD-NEXT: str q1, [sp, #16] // 16-byte Spill
; CHECK-BF16SVE-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16SVE-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16SVE-SD-NEXT: bl logf
; CHECK-BF16SVE-SD-NEXT: bfcvt h0, s0
; CHECK-BF16SVE-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload
; CHECK-BF16SVE-SD-NEXT: mov v1.h[6], v0.h[0]
; CHECK-BF16SVE-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-BF16SVE-SD-NEXT: mov h0, v0.h[7]
; CHECK-BF16SVE-SD-NEXT: str q1, [sp, #16] // 16-byte Spill
; CHECK-BF16SVE-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16SVE-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16SVE-SD-NEXT: bl logf
; CHECK-BF16SVE-SD-NEXT: bfcvt h1, s0
; CHECK-BF16SVE-SD-NEXT: ldr q0, [sp, #16] // 16-byte Reload
; CHECK-BF16SVE-SD-NEXT: ldr x30, [sp, #32] // 8-byte Reload
; CHECK-BF16SVE-SD-NEXT: mov v0.h[7], v1.h[0]
; CHECK-BF16SVE-SD-NEXT: add sp, sp, #48
; CHECK-BF16SVE-SD-NEXT: ret
;
; CHECK-CVT-GI-LABEL: test_log:
; CHECK-CVT-GI: // %bb.0:
; CHECK-CVT-GI-NEXT: str d14, [sp, #-128]! // 8-byte Folded Spill
; CHECK-CVT-GI-NEXT: stp d13, d12, [sp, #8] // 16-byte Folded Spill
; CHECK-CVT-GI-NEXT: mov h12, v0.h[1]
; CHECK-CVT-GI-NEXT: mov h13, v0.h[2]
; CHECK-CVT-GI-NEXT: stp d11, d10, [sp, #24] // 16-byte Folded Spill
; CHECK-CVT-GI-NEXT: mov h14, v0.h[3]
; CHECK-CVT-GI-NEXT: mov h11, v0.h[4]
; CHECK-CVT-GI-NEXT: stp d9, d8, [sp, #40] // 16-byte Folded Spill
; CHECK-CVT-GI-NEXT: mov h10, v0.h[5]
; CHECK-CVT-GI-NEXT: mov h9, v0.h[6]
; CHECK-CVT-GI-NEXT: mov h8, v0.h[7]
; CHECK-CVT-GI-NEXT: shll v0.4s, v0.4h, #16
; CHECK-CVT-GI-NEXT: str x30, [sp, #56] // 8-byte Spill
; CHECK-CVT-GI-NEXT: stp x26, x25, [sp, #64] // 16-byte Folded Spill
; CHECK-CVT-GI-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-CVT-GI-NEXT: stp x24, x23, [sp, #80] // 16-byte Folded Spill
; CHECK-CVT-GI-NEXT: stp x22, x21, [sp, #96] // 16-byte Folded Spill
; CHECK-CVT-GI-NEXT: stp x20, x19, [sp, #112] // 16-byte Folded Spill
; CHECK-CVT-GI-NEXT: bl logf
; CHECK-CVT-GI-NEXT: fmov w8, s0
; CHECK-CVT-GI-NEXT: mov w19, #32767 // =0x7fff
; CHECK-CVT-GI-NEXT: fcmp s0, #0.0
; CHECK-CVT-GI-NEXT: shll v0.4s, v12.4h, #16
; CHECK-CVT-GI-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-CVT-GI-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-GI-NEXT: add w10, w8, w19
; CHECK-CVT-GI-NEXT: orr w8, w8, #0x400000
; CHECK-CVT-GI-NEXT: add w9, w10, w9
; CHECK-CVT-GI-NEXT: csel w8, w8, w9, vs
; CHECK-CVT-GI-NEXT: lsr w20, w8, #16
; CHECK-CVT-GI-NEXT: bl logf
; CHECK-CVT-GI-NEXT: shll v1.4s, v13.4h, #16
; CHECK-CVT-GI-NEXT: fmov w8, s0
; CHECK-CVT-GI-NEXT: fcmp s0, #0.0
; CHECK-CVT-GI-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-GI-NEXT: fmov s0, s1
; CHECK-CVT-GI-NEXT: add w10, w8, w19
; CHECK-CVT-GI-NEXT: orr w8, w8, #0x400000
; CHECK-CVT-GI-NEXT: add w9, w10, w9
; CHECK-CVT-GI-NEXT: csel w8, w8, w9, vs
; CHECK-CVT-GI-NEXT: lsr w21, w8, #16
; CHECK-CVT-GI-NEXT: bl logf
; CHECK-CVT-GI-NEXT: shll v1.4s, v14.4h, #16
; CHECK-CVT-GI-NEXT: fmov w8, s0
; CHECK-CVT-GI-NEXT: fcmp s0, #0.0
; CHECK-CVT-GI-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-GI-NEXT: fmov s0, s1
; CHECK-CVT-GI-NEXT: add w10, w8, w19
; CHECK-CVT-GI-NEXT: orr w8, w8, #0x400000
; CHECK-CVT-GI-NEXT: add w9, w10, w9
; CHECK-CVT-GI-NEXT: csel w8, w8, w9, vs
; CHECK-CVT-GI-NEXT: lsr w22, w8, #16
; CHECK-CVT-GI-NEXT: bl logf
; CHECK-CVT-GI-NEXT: shll v1.4s, v11.4h, #16
; CHECK-CVT-GI-NEXT: fmov w8, s0
; CHECK-CVT-GI-NEXT: fcmp s0, #0.0
; CHECK-CVT-GI-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-GI-NEXT: fmov s0, s1
; CHECK-CVT-GI-NEXT: add w10, w8, w19
; CHECK-CVT-GI-NEXT: orr w8, w8, #0x400000
; CHECK-CVT-GI-NEXT: add w9, w10, w9
; CHECK-CVT-GI-NEXT: csel w8, w8, w9, vs
; CHECK-CVT-GI-NEXT: lsr w23, w8, #16
; CHECK-CVT-GI-NEXT: bl logf
; CHECK-CVT-GI-NEXT: shll v1.4s, v10.4h, #16
; CHECK-CVT-GI-NEXT: fmov w8, s0
; CHECK-CVT-GI-NEXT: fcmp s0, #0.0
; CHECK-CVT-GI-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-GI-NEXT: fmov s0, s1
; CHECK-CVT-GI-NEXT: add w10, w8, w19
; CHECK-CVT-GI-NEXT: orr w8, w8, #0x400000
; CHECK-CVT-GI-NEXT: add w9, w10, w9
; CHECK-CVT-GI-NEXT: csel w8, w8, w9, vs
; CHECK-CVT-GI-NEXT: lsr w24, w8, #16
; CHECK-CVT-GI-NEXT: bl logf
; CHECK-CVT-GI-NEXT: shll v1.4s, v9.4h, #16
; CHECK-CVT-GI-NEXT: fmov w8, s0
; CHECK-CVT-GI-NEXT: fcmp s0, #0.0
; CHECK-CVT-GI-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-GI-NEXT: fmov s0, s1
; CHECK-CVT-GI-NEXT: add w10, w8, w19
; CHECK-CVT-GI-NEXT: orr w8, w8, #0x400000
; CHECK-CVT-GI-NEXT: add w9, w10, w9
; CHECK-CVT-GI-NEXT: csel w8, w8, w9, vs
; CHECK-CVT-GI-NEXT: lsr w25, w8, #16
; CHECK-CVT-GI-NEXT: bl logf
; CHECK-CVT-GI-NEXT: shll v1.4s, v8.4h, #16
; CHECK-CVT-GI-NEXT: fmov w8, s0
; CHECK-CVT-GI-NEXT: fcmp s0, #0.0
; CHECK-CVT-GI-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-GI-NEXT: fmov s0, s1
; CHECK-CVT-GI-NEXT: add w10, w8, w19
; CHECK-CVT-GI-NEXT: orr w8, w8, #0x400000
; CHECK-CVT-GI-NEXT: add w9, w10, w9
; CHECK-CVT-GI-NEXT: csel w8, w8, w9, vs
; CHECK-CVT-GI-NEXT: lsr w26, w8, #16
; CHECK-CVT-GI-NEXT: bl logf
; CHECK-CVT-GI-NEXT: fmov s1, w20
; CHECK-CVT-GI-NEXT: fmov w8, s0
; CHECK-CVT-GI-NEXT: ldr x30, [sp, #56] // 8-byte Reload
; CHECK-CVT-GI-NEXT: fcmp s0, #0.0
; CHECK-CVT-GI-NEXT: ldp d9, d8, [sp, #40] // 16-byte Folded Reload
; CHECK-CVT-GI-NEXT: ldp d11, d10, [sp, #24] // 16-byte Folded Reload
; CHECK-CVT-GI-NEXT: mov v1.h[1], w21
; CHECK-CVT-GI-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-GI-NEXT: add w10, w8, w19
; CHECK-CVT-GI-NEXT: orr w8, w8, #0x400000
; CHECK-CVT-GI-NEXT: ldp x20, x19, [sp, #112] // 16-byte Folded Reload
; CHECK-CVT-GI-NEXT: add w9, w10, w9
; CHECK-CVT-GI-NEXT: ldp d13, d12, [sp, #8] // 16-byte Folded Reload
; CHECK-CVT-GI-NEXT: csel w8, w8, w9, vs
; CHECK-CVT-GI-NEXT: mov v1.h[2], w22
; CHECK-CVT-GI-NEXT: lsr w8, w8, #16
; CHECK-CVT-GI-NEXT: ldp x22, x21, [sp, #96] // 16-byte Folded Reload
; CHECK-CVT-GI-NEXT: mov v1.h[3], w23
; CHECK-CVT-GI-NEXT: mov v1.h[4], w24
; CHECK-CVT-GI-NEXT: ldp x24, x23, [sp, #80] // 16-byte Folded Reload
; CHECK-CVT-GI-NEXT: mov v1.h[5], w25
; CHECK-CVT-GI-NEXT: mov v1.h[6], w26
; CHECK-CVT-GI-NEXT: ldp x26, x25, [sp, #64] // 16-byte Folded Reload
; CHECK-CVT-GI-NEXT: mov v1.h[7], w8
; CHECK-CVT-GI-NEXT: mov v0.16b, v1.16b
; CHECK-CVT-GI-NEXT: ldr d14, [sp], #128 // 8-byte Folded Reload
; CHECK-CVT-GI-NEXT: ret
;
; CHECK-BF16-GI-LABEL: test_log:
; CHECK-BF16-GI: // %bb.0:
; CHECK-BF16-GI-NEXT: sub sp, sp, #176
; CHECK-BF16-GI-NEXT: str d14, [sp, #112] // 8-byte Spill
; CHECK-BF16-GI-NEXT: mov h14, v0.h[6]
; CHECK-BF16-GI-NEXT: stp d13, d12, [sp, #120] // 16-byte Folded Spill
; CHECK-BF16-GI-NEXT: mov h12, v0.h[4]
; CHECK-BF16-GI-NEXT: mov h13, v0.h[5]
; CHECK-BF16-GI-NEXT: stp d11, d10, [sp, #136] // 16-byte Folded Spill
; CHECK-BF16-GI-NEXT: mov h10, v0.h[2]
; CHECK-BF16-GI-NEXT: mov h11, v0.h[3]
; CHECK-BF16-GI-NEXT: stp d9, d8, [sp, #152] // 16-byte Folded Spill
; CHECK-BF16-GI-NEXT: mov h9, v0.h[1]
; CHECK-BF16-GI-NEXT: mov h8, v0.h[7]
; CHECK-BF16-GI-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16-GI-NEXT: str x30, [sp, #168] // 8-byte Spill
; CHECK-BF16-GI-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16-GI-NEXT: bl logf
; CHECK-BF16-GI-NEXT: bfcvt h0, s0
; CHECK-BF16-GI-NEXT: str q0, [sp, #96] // 16-byte Spill
; CHECK-BF16-GI-NEXT: shll v0.4s, v9.4h, #16
; CHECK-BF16-GI-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16-GI-NEXT: bl logf
; CHECK-BF16-GI-NEXT: bfcvt h0, s0
; CHECK-BF16-GI-NEXT: str q0, [sp, #80] // 16-byte Spill
; CHECK-BF16-GI-NEXT: shll v0.4s, v10.4h, #16
; CHECK-BF16-GI-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16-GI-NEXT: bl logf
; CHECK-BF16-GI-NEXT: bfcvt h0, s0
; CHECK-BF16-GI-NEXT: str q0, [sp, #64] // 16-byte Spill
; CHECK-BF16-GI-NEXT: shll v0.4s, v11.4h, #16
; CHECK-BF16-GI-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16-GI-NEXT: bl logf
; CHECK-BF16-GI-NEXT: bfcvt h0, s0
; CHECK-BF16-GI-NEXT: str q0, [sp, #48] // 16-byte Spill
; CHECK-BF16-GI-NEXT: shll v0.4s, v12.4h, #16
; CHECK-BF16-GI-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16-GI-NEXT: bl logf
; CHECK-BF16-GI-NEXT: bfcvt h0, s0
; CHECK-BF16-GI-NEXT: str q0, [sp, #32] // 16-byte Spill
; CHECK-BF16-GI-NEXT: shll v0.4s, v13.4h, #16
; CHECK-BF16-GI-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16-GI-NEXT: bl logf
; CHECK-BF16-GI-NEXT: bfcvt h0, s0
; CHECK-BF16-GI-NEXT: str q0, [sp, #16] // 16-byte Spill
; CHECK-BF16-GI-NEXT: shll v0.4s, v14.4h, #16
; CHECK-BF16-GI-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16-GI-NEXT: bl logf
; CHECK-BF16-GI-NEXT: bfcvt h0, s0
; CHECK-BF16-GI-NEXT: str q0, [sp] // 16-byte Spill
; CHECK-BF16-GI-NEXT: shll v0.4s, v8.4h, #16
; CHECK-BF16-GI-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16-GI-NEXT: bl logf
; CHECK-BF16-GI-NEXT: ldp q2, q1, [sp, #80] // 32-byte Folded Reload
; CHECK-BF16-GI-NEXT: bfcvt h0, s0
; CHECK-BF16-GI-NEXT: ldp d9, d8, [sp, #152] // 16-byte Folded Reload
; CHECK-BF16-GI-NEXT: ldr x30, [sp, #168] // 8-byte Reload
; CHECK-BF16-GI-NEXT: ldp d11, d10, [sp, #136] // 16-byte Folded Reload
; CHECK-BF16-GI-NEXT: ldr d14, [sp, #112] // 8-byte Reload
; CHECK-BF16-GI-NEXT: mov v1.h[1], v2.h[0]
; CHECK-BF16-GI-NEXT: ldp q2, q3, [sp, #48] // 32-byte Folded Reload
; CHECK-BF16-GI-NEXT: ldp d13, d12, [sp, #120] // 16-byte Folded Reload
; CHECK-BF16-GI-NEXT: mov v1.h[2], v3.h[0]
; CHECK-BF16-GI-NEXT: mov v1.h[3], v2.h[0]
; CHECK-BF16-GI-NEXT: ldp q2, q3, [sp, #16] // 32-byte Folded Reload
; CHECK-BF16-GI-NEXT: mov v1.h[4], v3.h[0]
; CHECK-BF16-GI-NEXT: mov v1.h[5], v2.h[0]
; CHECK-BF16-GI-NEXT: ldr q2, [sp] // 16-byte Reload
; CHECK-BF16-GI-NEXT: mov v1.h[6], v2.h[0]
; CHECK-BF16-GI-NEXT: mov v1.h[7], v0.h[0]
; CHECK-BF16-GI-NEXT: mov v0.16b, v1.16b
; CHECK-BF16-GI-NEXT: add sp, sp, #176
; CHECK-BF16-GI-NEXT: ret
%r = call <8 x bfloat> @llvm.log.v8bf16(<8 x bfloat> %a)
ret <8 x bfloat> %r
}
define <8 x bfloat> @test_log10(<8 x bfloat> %a) #0 {
; CHECK-CVT-SD-LABEL: test_log10:
; CHECK-CVT-SD: // %bb.0:
; CHECK-CVT-SD-NEXT: sub sp, sp, #48
; CHECK-CVT-SD-NEXT: mov h1, v0.h[1]
; CHECK-CVT-SD-NEXT: str q0, [sp] // 16-byte Spill
; CHECK-CVT-SD-NEXT: stp x30, x19, [sp, #32] // 16-byte Folded Spill
; CHECK-CVT-SD-NEXT: shll v0.4s, v1.4h, #16
; CHECK-CVT-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-CVT-SD-NEXT: bl log10f
; CHECK-CVT-SD-NEXT: fmov w8, s0
; CHECK-CVT-SD-NEXT: mov w19, #32767 // =0x7fff
; CHECK-CVT-SD-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-SD-NEXT: add w8, w8, w19
; CHECK-CVT-SD-NEXT: add w8, w9, w8
; CHECK-CVT-SD-NEXT: lsr w8, w8, #16
; CHECK-CVT-SD-NEXT: fmov s0, w8
; CHECK-CVT-SD-NEXT: str q0, [sp, #16] // 16-byte Spill
; CHECK-CVT-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-CVT-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-CVT-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-CVT-SD-NEXT: bl log10f
; CHECK-CVT-SD-NEXT: fmov w8, s0
; CHECK-CVT-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload
; CHECK-CVT-SD-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-SD-NEXT: add w8, w8, w19
; CHECK-CVT-SD-NEXT: add w8, w9, w8
; CHECK-CVT-SD-NEXT: lsr w8, w8, #16
; CHECK-CVT-SD-NEXT: fmov s0, w8
; CHECK-CVT-SD-NEXT: mov v0.h[1], v1.h[0]
; CHECK-CVT-SD-NEXT: str q0, [sp, #16] // 16-byte Spill
; CHECK-CVT-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-CVT-SD-NEXT: mov h0, v0.h[2]
; CHECK-CVT-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-CVT-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-CVT-SD-NEXT: bl log10f
; CHECK-CVT-SD-NEXT: fmov w8, s0
; CHECK-CVT-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload
; CHECK-CVT-SD-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-SD-NEXT: add w8, w8, w19
; CHECK-CVT-SD-NEXT: add w8, w9, w8
; CHECK-CVT-SD-NEXT: lsr w8, w8, #16
; CHECK-CVT-SD-NEXT: fmov s0, w8
; CHECK-CVT-SD-NEXT: mov v1.h[2], v0.h[0]
; CHECK-CVT-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-CVT-SD-NEXT: mov h0, v0.h[3]
; CHECK-CVT-SD-NEXT: str q1, [sp, #16] // 16-byte Spill
; CHECK-CVT-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-CVT-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-CVT-SD-NEXT: bl log10f
; CHECK-CVT-SD-NEXT: fmov w8, s0
; CHECK-CVT-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload
; CHECK-CVT-SD-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-SD-NEXT: add w8, w8, w19
; CHECK-CVT-SD-NEXT: add w8, w9, w8
; CHECK-CVT-SD-NEXT: lsr w8, w8, #16
; CHECK-CVT-SD-NEXT: fmov s0, w8
; CHECK-CVT-SD-NEXT: mov v1.h[3], v0.h[0]
; CHECK-CVT-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-CVT-SD-NEXT: mov h0, v0.h[4]
; CHECK-CVT-SD-NEXT: str q1, [sp, #16] // 16-byte Spill
; CHECK-CVT-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-CVT-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-CVT-SD-NEXT: bl log10f
; CHECK-CVT-SD-NEXT: fmov w8, s0
; CHECK-CVT-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload
; CHECK-CVT-SD-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-SD-NEXT: add w8, w8, w19
; CHECK-CVT-SD-NEXT: add w8, w9, w8
; CHECK-CVT-SD-NEXT: lsr w8, w8, #16
; CHECK-CVT-SD-NEXT: fmov s0, w8
; CHECK-CVT-SD-NEXT: mov v1.h[4], v0.h[0]
; CHECK-CVT-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-CVT-SD-NEXT: mov h0, v0.h[5]
; CHECK-CVT-SD-NEXT: str q1, [sp, #16] // 16-byte Spill
; CHECK-CVT-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-CVT-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-CVT-SD-NEXT: bl log10f
; CHECK-CVT-SD-NEXT: fmov w8, s0
; CHECK-CVT-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload
; CHECK-CVT-SD-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-SD-NEXT: add w8, w8, w19
; CHECK-CVT-SD-NEXT: add w8, w9, w8
; CHECK-CVT-SD-NEXT: lsr w8, w8, #16
; CHECK-CVT-SD-NEXT: fmov s0, w8
; CHECK-CVT-SD-NEXT: mov v1.h[5], v0.h[0]
; CHECK-CVT-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-CVT-SD-NEXT: mov h0, v0.h[6]
; CHECK-CVT-SD-NEXT: str q1, [sp, #16] // 16-byte Spill
; CHECK-CVT-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-CVT-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-CVT-SD-NEXT: bl log10f
; CHECK-CVT-SD-NEXT: fmov w8, s0
; CHECK-CVT-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload
; CHECK-CVT-SD-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-SD-NEXT: add w8, w8, w19
; CHECK-CVT-SD-NEXT: add w8, w9, w8
; CHECK-CVT-SD-NEXT: lsr w8, w8, #16
; CHECK-CVT-SD-NEXT: fmov s0, w8
; CHECK-CVT-SD-NEXT: mov v1.h[6], v0.h[0]
; CHECK-CVT-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-CVT-SD-NEXT: mov h0, v0.h[7]
; CHECK-CVT-SD-NEXT: str q1, [sp, #16] // 16-byte Spill
; CHECK-CVT-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-CVT-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-CVT-SD-NEXT: bl log10f
; CHECK-CVT-SD-NEXT: fmov w8, s0
; CHECK-CVT-SD-NEXT: ldr q0, [sp, #16] // 16-byte Reload
; CHECK-CVT-SD-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-SD-NEXT: add w8, w8, w19
; CHECK-CVT-SD-NEXT: ldp x30, x19, [sp, #32] // 16-byte Folded Reload
; CHECK-CVT-SD-NEXT: add w8, w9, w8
; CHECK-CVT-SD-NEXT: lsr w8, w8, #16
; CHECK-CVT-SD-NEXT: fmov s1, w8
; CHECK-CVT-SD-NEXT: mov v0.h[7], v1.h[0]
; CHECK-CVT-SD-NEXT: add sp, sp, #48
; CHECK-CVT-SD-NEXT: ret
;
; CHECK-BF16-SD-LABEL: test_log10:
; CHECK-BF16-SD: // %bb.0:
; CHECK-BF16-SD-NEXT: sub sp, sp, #48
; CHECK-BF16-SD-NEXT: mov h1, v0.h[1]
; CHECK-BF16-SD-NEXT: str q0, [sp] // 16-byte Spill
; CHECK-BF16-SD-NEXT: str x30, [sp, #32] // 8-byte Spill
; CHECK-BF16-SD-NEXT: shll v0.4s, v1.4h, #16
; CHECK-BF16-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16-SD-NEXT: bl log10f
; CHECK-BF16-SD-NEXT: bfcvt h0, s0
; CHECK-BF16-SD-NEXT: str q0, [sp, #16] // 16-byte Spill
; CHECK-BF16-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-BF16-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16-SD-NEXT: bl log10f
; CHECK-BF16-SD-NEXT: bfcvt h0, s0
; CHECK-BF16-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload
; CHECK-BF16-SD-NEXT: mov v0.h[1], v1.h[0]
; CHECK-BF16-SD-NEXT: str q0, [sp, #16] // 16-byte Spill
; CHECK-BF16-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-BF16-SD-NEXT: mov h0, v0.h[2]
; CHECK-BF16-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16-SD-NEXT: bl log10f
; CHECK-BF16-SD-NEXT: bfcvt h0, s0
; CHECK-BF16-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload
; CHECK-BF16-SD-NEXT: mov v1.h[2], v0.h[0]
; CHECK-BF16-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-BF16-SD-NEXT: mov h0, v0.h[3]
; CHECK-BF16-SD-NEXT: str q1, [sp, #16] // 16-byte Spill
; CHECK-BF16-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16-SD-NEXT: bl log10f
; CHECK-BF16-SD-NEXT: bfcvt h0, s0
; CHECK-BF16-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload
; CHECK-BF16-SD-NEXT: mov v1.h[3], v0.h[0]
; CHECK-BF16-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-BF16-SD-NEXT: mov h0, v0.h[4]
; CHECK-BF16-SD-NEXT: str q1, [sp, #16] // 16-byte Spill
; CHECK-BF16-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16-SD-NEXT: bl log10f
; CHECK-BF16-SD-NEXT: bfcvt h0, s0
; CHECK-BF16-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload
; CHECK-BF16-SD-NEXT: mov v1.h[4], v0.h[0]
; CHECK-BF16-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-BF16-SD-NEXT: mov h0, v0.h[5]
; CHECK-BF16-SD-NEXT: str q1, [sp, #16] // 16-byte Spill
; CHECK-BF16-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16-SD-NEXT: bl log10f
; CHECK-BF16-SD-NEXT: bfcvt h0, s0
; CHECK-BF16-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload
; CHECK-BF16-SD-NEXT: mov v1.h[5], v0.h[0]
; CHECK-BF16-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-BF16-SD-NEXT: mov h0, v0.h[6]
; CHECK-BF16-SD-NEXT: str q1, [sp, #16] // 16-byte Spill
; CHECK-BF16-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16-SD-NEXT: bl log10f
; CHECK-BF16-SD-NEXT: bfcvt h0, s0
; CHECK-BF16-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload
; CHECK-BF16-SD-NEXT: mov v1.h[6], v0.h[0]
; CHECK-BF16-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-BF16-SD-NEXT: mov h0, v0.h[7]
; CHECK-BF16-SD-NEXT: str q1, [sp, #16] // 16-byte Spill
; CHECK-BF16-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16-SD-NEXT: bl log10f
; CHECK-BF16-SD-NEXT: bfcvt h1, s0
; CHECK-BF16-SD-NEXT: ldr q0, [sp, #16] // 16-byte Reload
; CHECK-BF16-SD-NEXT: ldr x30, [sp, #32] // 8-byte Reload
; CHECK-BF16-SD-NEXT: mov v0.h[7], v1.h[0]
; CHECK-BF16-SD-NEXT: add sp, sp, #48
; CHECK-BF16-SD-NEXT: ret
;
; CHECK-BF16SVE-SD-LABEL: test_log10:
; CHECK-BF16SVE-SD: // %bb.0:
; CHECK-BF16SVE-SD-NEXT: sub sp, sp, #48
; CHECK-BF16SVE-SD-NEXT: mov h1, v0.h[1]
; CHECK-BF16SVE-SD-NEXT: str q0, [sp] // 16-byte Spill
; CHECK-BF16SVE-SD-NEXT: str x30, [sp, #32] // 8-byte Spill
; CHECK-BF16SVE-SD-NEXT: shll v0.4s, v1.4h, #16
; CHECK-BF16SVE-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16SVE-SD-NEXT: bl log10f
; CHECK-BF16SVE-SD-NEXT: bfcvt h0, s0
; CHECK-BF16SVE-SD-NEXT: str q0, [sp, #16] // 16-byte Spill
; CHECK-BF16SVE-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-BF16SVE-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16SVE-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16SVE-SD-NEXT: bl log10f
; CHECK-BF16SVE-SD-NEXT: bfcvt h0, s0
; CHECK-BF16SVE-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload
; CHECK-BF16SVE-SD-NEXT: mov v0.h[1], v1.h[0]
; CHECK-BF16SVE-SD-NEXT: str q0, [sp, #16] // 16-byte Spill
; CHECK-BF16SVE-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-BF16SVE-SD-NEXT: mov h0, v0.h[2]
; CHECK-BF16SVE-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16SVE-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16SVE-SD-NEXT: bl log10f
; CHECK-BF16SVE-SD-NEXT: bfcvt h0, s0
; CHECK-BF16SVE-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload
; CHECK-BF16SVE-SD-NEXT: mov v1.h[2], v0.h[0]
; CHECK-BF16SVE-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-BF16SVE-SD-NEXT: mov h0, v0.h[3]
; CHECK-BF16SVE-SD-NEXT: str q1, [sp, #16] // 16-byte Spill
; CHECK-BF16SVE-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16SVE-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16SVE-SD-NEXT: bl log10f
; CHECK-BF16SVE-SD-NEXT: bfcvt h0, s0
; CHECK-BF16SVE-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload
; CHECK-BF16SVE-SD-NEXT: mov v1.h[3], v0.h[0]
; CHECK-BF16SVE-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-BF16SVE-SD-NEXT: mov h0, v0.h[4]
; CHECK-BF16SVE-SD-NEXT: str q1, [sp, #16] // 16-byte Spill
; CHECK-BF16SVE-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16SVE-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16SVE-SD-NEXT: bl log10f
; CHECK-BF16SVE-SD-NEXT: bfcvt h0, s0
; CHECK-BF16SVE-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload
; CHECK-BF16SVE-SD-NEXT: mov v1.h[4], v0.h[0]
; CHECK-BF16SVE-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-BF16SVE-SD-NEXT: mov h0, v0.h[5]
; CHECK-BF16SVE-SD-NEXT: str q1, [sp, #16] // 16-byte Spill
; CHECK-BF16SVE-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16SVE-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16SVE-SD-NEXT: bl log10f
; CHECK-BF16SVE-SD-NEXT: bfcvt h0, s0
; CHECK-BF16SVE-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload
; CHECK-BF16SVE-SD-NEXT: mov v1.h[5], v0.h[0]
; CHECK-BF16SVE-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-BF16SVE-SD-NEXT: mov h0, v0.h[6]
; CHECK-BF16SVE-SD-NEXT: str q1, [sp, #16] // 16-byte Spill
; CHECK-BF16SVE-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16SVE-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16SVE-SD-NEXT: bl log10f
; CHECK-BF16SVE-SD-NEXT: bfcvt h0, s0
; CHECK-BF16SVE-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload
; CHECK-BF16SVE-SD-NEXT: mov v1.h[6], v0.h[0]
; CHECK-BF16SVE-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-BF16SVE-SD-NEXT: mov h0, v0.h[7]
; CHECK-BF16SVE-SD-NEXT: str q1, [sp, #16] // 16-byte Spill
; CHECK-BF16SVE-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16SVE-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16SVE-SD-NEXT: bl log10f
; CHECK-BF16SVE-SD-NEXT: bfcvt h1, s0
; CHECK-BF16SVE-SD-NEXT: ldr q0, [sp, #16] // 16-byte Reload
; CHECK-BF16SVE-SD-NEXT: ldr x30, [sp, #32] // 8-byte Reload
; CHECK-BF16SVE-SD-NEXT: mov v0.h[7], v1.h[0]
; CHECK-BF16SVE-SD-NEXT: add sp, sp, #48
; CHECK-BF16SVE-SD-NEXT: ret
;
; CHECK-CVT-GI-LABEL: test_log10:
; CHECK-CVT-GI: // %bb.0:
; CHECK-CVT-GI-NEXT: str d14, [sp, #-128]! // 8-byte Folded Spill
; CHECK-CVT-GI-NEXT: stp d13, d12, [sp, #8] // 16-byte Folded Spill
; CHECK-CVT-GI-NEXT: mov h12, v0.h[1]
; CHECK-CVT-GI-NEXT: mov h13, v0.h[2]
; CHECK-CVT-GI-NEXT: stp d11, d10, [sp, #24] // 16-byte Folded Spill
; CHECK-CVT-GI-NEXT: mov h14, v0.h[3]
; CHECK-CVT-GI-NEXT: mov h11, v0.h[4]
; CHECK-CVT-GI-NEXT: stp d9, d8, [sp, #40] // 16-byte Folded Spill
; CHECK-CVT-GI-NEXT: mov h10, v0.h[5]
; CHECK-CVT-GI-NEXT: mov h9, v0.h[6]
; CHECK-CVT-GI-NEXT: mov h8, v0.h[7]
; CHECK-CVT-GI-NEXT: shll v0.4s, v0.4h, #16
; CHECK-CVT-GI-NEXT: str x30, [sp, #56] // 8-byte Spill
; CHECK-CVT-GI-NEXT: stp x26, x25, [sp, #64] // 16-byte Folded Spill
; CHECK-CVT-GI-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-CVT-GI-NEXT: stp x24, x23, [sp, #80] // 16-byte Folded Spill
; CHECK-CVT-GI-NEXT: stp x22, x21, [sp, #96] // 16-byte Folded Spill
; CHECK-CVT-GI-NEXT: stp x20, x19, [sp, #112] // 16-byte Folded Spill
; CHECK-CVT-GI-NEXT: bl log10f
; CHECK-CVT-GI-NEXT: fmov w8, s0
; CHECK-CVT-GI-NEXT: mov w19, #32767 // =0x7fff
; CHECK-CVT-GI-NEXT: fcmp s0, #0.0
; CHECK-CVT-GI-NEXT: shll v0.4s, v12.4h, #16
; CHECK-CVT-GI-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-CVT-GI-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-GI-NEXT: add w10, w8, w19
; CHECK-CVT-GI-NEXT: orr w8, w8, #0x400000
; CHECK-CVT-GI-NEXT: add w9, w10, w9
; CHECK-CVT-GI-NEXT: csel w8, w8, w9, vs
; CHECK-CVT-GI-NEXT: lsr w20, w8, #16
; CHECK-CVT-GI-NEXT: bl log10f
; CHECK-CVT-GI-NEXT: shll v1.4s, v13.4h, #16
; CHECK-CVT-GI-NEXT: fmov w8, s0
; CHECK-CVT-GI-NEXT: fcmp s0, #0.0
; CHECK-CVT-GI-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-GI-NEXT: fmov s0, s1
; CHECK-CVT-GI-NEXT: add w10, w8, w19
; CHECK-CVT-GI-NEXT: orr w8, w8, #0x400000
; CHECK-CVT-GI-NEXT: add w9, w10, w9
; CHECK-CVT-GI-NEXT: csel w8, w8, w9, vs
; CHECK-CVT-GI-NEXT: lsr w21, w8, #16
; CHECK-CVT-GI-NEXT: bl log10f
; CHECK-CVT-GI-NEXT: shll v1.4s, v14.4h, #16
; CHECK-CVT-GI-NEXT: fmov w8, s0
; CHECK-CVT-GI-NEXT: fcmp s0, #0.0
; CHECK-CVT-GI-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-GI-NEXT: fmov s0, s1
; CHECK-CVT-GI-NEXT: add w10, w8, w19
; CHECK-CVT-GI-NEXT: orr w8, w8, #0x400000
; CHECK-CVT-GI-NEXT: add w9, w10, w9
; CHECK-CVT-GI-NEXT: csel w8, w8, w9, vs
; CHECK-CVT-GI-NEXT: lsr w22, w8, #16
; CHECK-CVT-GI-NEXT: bl log10f
; CHECK-CVT-GI-NEXT: shll v1.4s, v11.4h, #16
; CHECK-CVT-GI-NEXT: fmov w8, s0
; CHECK-CVT-GI-NEXT: fcmp s0, #0.0
; CHECK-CVT-GI-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-GI-NEXT: fmov s0, s1
; CHECK-CVT-GI-NEXT: add w10, w8, w19
; CHECK-CVT-GI-NEXT: orr w8, w8, #0x400000
; CHECK-CVT-GI-NEXT: add w9, w10, w9
; CHECK-CVT-GI-NEXT: csel w8, w8, w9, vs
; CHECK-CVT-GI-NEXT: lsr w23, w8, #16
; CHECK-CVT-GI-NEXT: bl log10f
; CHECK-CVT-GI-NEXT: shll v1.4s, v10.4h, #16
; CHECK-CVT-GI-NEXT: fmov w8, s0
; CHECK-CVT-GI-NEXT: fcmp s0, #0.0
; CHECK-CVT-GI-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-GI-NEXT: fmov s0, s1
; CHECK-CVT-GI-NEXT: add w10, w8, w19
; CHECK-CVT-GI-NEXT: orr w8, w8, #0x400000
; CHECK-CVT-GI-NEXT: add w9, w10, w9
; CHECK-CVT-GI-NEXT: csel w8, w8, w9, vs
; CHECK-CVT-GI-NEXT: lsr w24, w8, #16
; CHECK-CVT-GI-NEXT: bl log10f
; CHECK-CVT-GI-NEXT: shll v1.4s, v9.4h, #16
; CHECK-CVT-GI-NEXT: fmov w8, s0
; CHECK-CVT-GI-NEXT: fcmp s0, #0.0
; CHECK-CVT-GI-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-GI-NEXT: fmov s0, s1
; CHECK-CVT-GI-NEXT: add w10, w8, w19
; CHECK-CVT-GI-NEXT: orr w8, w8, #0x400000
; CHECK-CVT-GI-NEXT: add w9, w10, w9
; CHECK-CVT-GI-NEXT: csel w8, w8, w9, vs
; CHECK-CVT-GI-NEXT: lsr w25, w8, #16
; CHECK-CVT-GI-NEXT: bl log10f
; CHECK-CVT-GI-NEXT: shll v1.4s, v8.4h, #16
; CHECK-CVT-GI-NEXT: fmov w8, s0
; CHECK-CVT-GI-NEXT: fcmp s0, #0.0
; CHECK-CVT-GI-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-GI-NEXT: fmov s0, s1
; CHECK-CVT-GI-NEXT: add w10, w8, w19
; CHECK-CVT-GI-NEXT: orr w8, w8, #0x400000
; CHECK-CVT-GI-NEXT: add w9, w10, w9
; CHECK-CVT-GI-NEXT: csel w8, w8, w9, vs
; CHECK-CVT-GI-NEXT: lsr w26, w8, #16
; CHECK-CVT-GI-NEXT: bl log10f
; CHECK-CVT-GI-NEXT: fmov s1, w20
; CHECK-CVT-GI-NEXT: fmov w8, s0
; CHECK-CVT-GI-NEXT: ldr x30, [sp, #56] // 8-byte Reload
; CHECK-CVT-GI-NEXT: fcmp s0, #0.0
; CHECK-CVT-GI-NEXT: ldp d9, d8, [sp, #40] // 16-byte Folded Reload
; CHECK-CVT-GI-NEXT: ldp d11, d10, [sp, #24] // 16-byte Folded Reload
; CHECK-CVT-GI-NEXT: mov v1.h[1], w21
; CHECK-CVT-GI-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-GI-NEXT: add w10, w8, w19
; CHECK-CVT-GI-NEXT: orr w8, w8, #0x400000
; CHECK-CVT-GI-NEXT: ldp x20, x19, [sp, #112] // 16-byte Folded Reload
; CHECK-CVT-GI-NEXT: add w9, w10, w9
; CHECK-CVT-GI-NEXT: ldp d13, d12, [sp, #8] // 16-byte Folded Reload
; CHECK-CVT-GI-NEXT: csel w8, w8, w9, vs
; CHECK-CVT-GI-NEXT: mov v1.h[2], w22
; CHECK-CVT-GI-NEXT: lsr w8, w8, #16
; CHECK-CVT-GI-NEXT: ldp x22, x21, [sp, #96] // 16-byte Folded Reload
; CHECK-CVT-GI-NEXT: mov v1.h[3], w23
; CHECK-CVT-GI-NEXT: mov v1.h[4], w24
; CHECK-CVT-GI-NEXT: ldp x24, x23, [sp, #80] // 16-byte Folded Reload
; CHECK-CVT-GI-NEXT: mov v1.h[5], w25
; CHECK-CVT-GI-NEXT: mov v1.h[6], w26
; CHECK-CVT-GI-NEXT: ldp x26, x25, [sp, #64] // 16-byte Folded Reload
; CHECK-CVT-GI-NEXT: mov v1.h[7], w8
; CHECK-CVT-GI-NEXT: mov v0.16b, v1.16b
; CHECK-CVT-GI-NEXT: ldr d14, [sp], #128 // 8-byte Folded Reload
; CHECK-CVT-GI-NEXT: ret
;
; CHECK-BF16-GI-LABEL: test_log10:
; CHECK-BF16-GI: // %bb.0:
; CHECK-BF16-GI-NEXT: sub sp, sp, #176
; CHECK-BF16-GI-NEXT: str d14, [sp, #112] // 8-byte Spill
; CHECK-BF16-GI-NEXT: mov h14, v0.h[6]
; CHECK-BF16-GI-NEXT: stp d13, d12, [sp, #120] // 16-byte Folded Spill
; CHECK-BF16-GI-NEXT: mov h12, v0.h[4]
; CHECK-BF16-GI-NEXT: mov h13, v0.h[5]
; CHECK-BF16-GI-NEXT: stp d11, d10, [sp, #136] // 16-byte Folded Spill
; CHECK-BF16-GI-NEXT: mov h10, v0.h[2]
; CHECK-BF16-GI-NEXT: mov h11, v0.h[3]
; CHECK-BF16-GI-NEXT: stp d9, d8, [sp, #152] // 16-byte Folded Spill
; CHECK-BF16-GI-NEXT: mov h9, v0.h[1]
; CHECK-BF16-GI-NEXT: mov h8, v0.h[7]
; CHECK-BF16-GI-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16-GI-NEXT: str x30, [sp, #168] // 8-byte Spill
; CHECK-BF16-GI-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16-GI-NEXT: bl log10f
; CHECK-BF16-GI-NEXT: bfcvt h0, s0
; CHECK-BF16-GI-NEXT: str q0, [sp, #96] // 16-byte Spill
; CHECK-BF16-GI-NEXT: shll v0.4s, v9.4h, #16
; CHECK-BF16-GI-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16-GI-NEXT: bl log10f
; CHECK-BF16-GI-NEXT: bfcvt h0, s0
; CHECK-BF16-GI-NEXT: str q0, [sp, #80] // 16-byte Spill
; CHECK-BF16-GI-NEXT: shll v0.4s, v10.4h, #16
; CHECK-BF16-GI-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16-GI-NEXT: bl log10f
; CHECK-BF16-GI-NEXT: bfcvt h0, s0
; CHECK-BF16-GI-NEXT: str q0, [sp, #64] // 16-byte Spill
; CHECK-BF16-GI-NEXT: shll v0.4s, v11.4h, #16
; CHECK-BF16-GI-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16-GI-NEXT: bl log10f
; CHECK-BF16-GI-NEXT: bfcvt h0, s0
; CHECK-BF16-GI-NEXT: str q0, [sp, #48] // 16-byte Spill
; CHECK-BF16-GI-NEXT: shll v0.4s, v12.4h, #16
; CHECK-BF16-GI-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16-GI-NEXT: bl log10f
; CHECK-BF16-GI-NEXT: bfcvt h0, s0
; CHECK-BF16-GI-NEXT: str q0, [sp, #32] // 16-byte Spill
; CHECK-BF16-GI-NEXT: shll v0.4s, v13.4h, #16
; CHECK-BF16-GI-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16-GI-NEXT: bl log10f
; CHECK-BF16-GI-NEXT: bfcvt h0, s0
; CHECK-BF16-GI-NEXT: str q0, [sp, #16] // 16-byte Spill
; CHECK-BF16-GI-NEXT: shll v0.4s, v14.4h, #16
; CHECK-BF16-GI-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16-GI-NEXT: bl log10f
; CHECK-BF16-GI-NEXT: bfcvt h0, s0
; CHECK-BF16-GI-NEXT: str q0, [sp] // 16-byte Spill
; CHECK-BF16-GI-NEXT: shll v0.4s, v8.4h, #16
; CHECK-BF16-GI-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16-GI-NEXT: bl log10f
; CHECK-BF16-GI-NEXT: ldp q2, q1, [sp, #80] // 32-byte Folded Reload
; CHECK-BF16-GI-NEXT: bfcvt h0, s0
; CHECK-BF16-GI-NEXT: ldp d9, d8, [sp, #152] // 16-byte Folded Reload
; CHECK-BF16-GI-NEXT: ldr x30, [sp, #168] // 8-byte Reload
; CHECK-BF16-GI-NEXT: ldp d11, d10, [sp, #136] // 16-byte Folded Reload
; CHECK-BF16-GI-NEXT: ldr d14, [sp, #112] // 8-byte Reload
; CHECK-BF16-GI-NEXT: mov v1.h[1], v2.h[0]
; CHECK-BF16-GI-NEXT: ldp q2, q3, [sp, #48] // 32-byte Folded Reload
; CHECK-BF16-GI-NEXT: ldp d13, d12, [sp, #120] // 16-byte Folded Reload
; CHECK-BF16-GI-NEXT: mov v1.h[2], v3.h[0]
; CHECK-BF16-GI-NEXT: mov v1.h[3], v2.h[0]
; CHECK-BF16-GI-NEXT: ldp q2, q3, [sp, #16] // 32-byte Folded Reload
; CHECK-BF16-GI-NEXT: mov v1.h[4], v3.h[0]
; CHECK-BF16-GI-NEXT: mov v1.h[5], v2.h[0]
; CHECK-BF16-GI-NEXT: ldr q2, [sp] // 16-byte Reload
; CHECK-BF16-GI-NEXT: mov v1.h[6], v2.h[0]
; CHECK-BF16-GI-NEXT: mov v1.h[7], v0.h[0]
; CHECK-BF16-GI-NEXT: mov v0.16b, v1.16b
; CHECK-BF16-GI-NEXT: add sp, sp, #176
; CHECK-BF16-GI-NEXT: ret
%r = call <8 x bfloat> @llvm.log10.v8bf16(<8 x bfloat> %a)
ret <8 x bfloat> %r
}
define <8 x bfloat> @test_log2(<8 x bfloat> %a) #0 {
; CHECK-CVT-SD-LABEL: test_log2:
; CHECK-CVT-SD: // %bb.0:
; CHECK-CVT-SD-NEXT: sub sp, sp, #48
; CHECK-CVT-SD-NEXT: mov h1, v0.h[1]
; CHECK-CVT-SD-NEXT: str q0, [sp] // 16-byte Spill
; CHECK-CVT-SD-NEXT: stp x30, x19, [sp, #32] // 16-byte Folded Spill
; CHECK-CVT-SD-NEXT: shll v0.4s, v1.4h, #16
; CHECK-CVT-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-CVT-SD-NEXT: bl log2f
; CHECK-CVT-SD-NEXT: fmov w8, s0
; CHECK-CVT-SD-NEXT: mov w19, #32767 // =0x7fff
; CHECK-CVT-SD-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-SD-NEXT: add w8, w8, w19
; CHECK-CVT-SD-NEXT: add w8, w9, w8
; CHECK-CVT-SD-NEXT: lsr w8, w8, #16
; CHECK-CVT-SD-NEXT: fmov s0, w8
; CHECK-CVT-SD-NEXT: str q0, [sp, #16] // 16-byte Spill
; CHECK-CVT-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-CVT-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-CVT-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-CVT-SD-NEXT: bl log2f
; CHECK-CVT-SD-NEXT: fmov w8, s0
; CHECK-CVT-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload
; CHECK-CVT-SD-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-SD-NEXT: add w8, w8, w19
; CHECK-CVT-SD-NEXT: add w8, w9, w8
; CHECK-CVT-SD-NEXT: lsr w8, w8, #16
; CHECK-CVT-SD-NEXT: fmov s0, w8
; CHECK-CVT-SD-NEXT: mov v0.h[1], v1.h[0]
; CHECK-CVT-SD-NEXT: str q0, [sp, #16] // 16-byte Spill
; CHECK-CVT-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-CVT-SD-NEXT: mov h0, v0.h[2]
; CHECK-CVT-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-CVT-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-CVT-SD-NEXT: bl log2f
; CHECK-CVT-SD-NEXT: fmov w8, s0
; CHECK-CVT-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload
; CHECK-CVT-SD-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-SD-NEXT: add w8, w8, w19
; CHECK-CVT-SD-NEXT: add w8, w9, w8
; CHECK-CVT-SD-NEXT: lsr w8, w8, #16
; CHECK-CVT-SD-NEXT: fmov s0, w8
; CHECK-CVT-SD-NEXT: mov v1.h[2], v0.h[0]
; CHECK-CVT-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-CVT-SD-NEXT: mov h0, v0.h[3]
; CHECK-CVT-SD-NEXT: str q1, [sp, #16] // 16-byte Spill
; CHECK-CVT-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-CVT-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-CVT-SD-NEXT: bl log2f
; CHECK-CVT-SD-NEXT: fmov w8, s0
; CHECK-CVT-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload
; CHECK-CVT-SD-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-SD-NEXT: add w8, w8, w19
; CHECK-CVT-SD-NEXT: add w8, w9, w8
; CHECK-CVT-SD-NEXT: lsr w8, w8, #16
; CHECK-CVT-SD-NEXT: fmov s0, w8
; CHECK-CVT-SD-NEXT: mov v1.h[3], v0.h[0]
; CHECK-CVT-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-CVT-SD-NEXT: mov h0, v0.h[4]
; CHECK-CVT-SD-NEXT: str q1, [sp, #16] // 16-byte Spill
; CHECK-CVT-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-CVT-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-CVT-SD-NEXT: bl log2f
; CHECK-CVT-SD-NEXT: fmov w8, s0
; CHECK-CVT-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload
; CHECK-CVT-SD-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-SD-NEXT: add w8, w8, w19
; CHECK-CVT-SD-NEXT: add w8, w9, w8
; CHECK-CVT-SD-NEXT: lsr w8, w8, #16
; CHECK-CVT-SD-NEXT: fmov s0, w8
; CHECK-CVT-SD-NEXT: mov v1.h[4], v0.h[0]
; CHECK-CVT-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-CVT-SD-NEXT: mov h0, v0.h[5]
; CHECK-CVT-SD-NEXT: str q1, [sp, #16] // 16-byte Spill
; CHECK-CVT-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-CVT-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-CVT-SD-NEXT: bl log2f
; CHECK-CVT-SD-NEXT: fmov w8, s0
; CHECK-CVT-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload
; CHECK-CVT-SD-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-SD-NEXT: add w8, w8, w19
; CHECK-CVT-SD-NEXT: add w8, w9, w8
; CHECK-CVT-SD-NEXT: lsr w8, w8, #16
; CHECK-CVT-SD-NEXT: fmov s0, w8
; CHECK-CVT-SD-NEXT: mov v1.h[5], v0.h[0]
; CHECK-CVT-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-CVT-SD-NEXT: mov h0, v0.h[6]
; CHECK-CVT-SD-NEXT: str q1, [sp, #16] // 16-byte Spill
; CHECK-CVT-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-CVT-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-CVT-SD-NEXT: bl log2f
; CHECK-CVT-SD-NEXT: fmov w8, s0
; CHECK-CVT-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload
; CHECK-CVT-SD-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-SD-NEXT: add w8, w8, w19
; CHECK-CVT-SD-NEXT: add w8, w9, w8
; CHECK-CVT-SD-NEXT: lsr w8, w8, #16
; CHECK-CVT-SD-NEXT: fmov s0, w8
; CHECK-CVT-SD-NEXT: mov v1.h[6], v0.h[0]
; CHECK-CVT-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-CVT-SD-NEXT: mov h0, v0.h[7]
; CHECK-CVT-SD-NEXT: str q1, [sp, #16] // 16-byte Spill
; CHECK-CVT-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-CVT-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-CVT-SD-NEXT: bl log2f
; CHECK-CVT-SD-NEXT: fmov w8, s0
; CHECK-CVT-SD-NEXT: ldr q0, [sp, #16] // 16-byte Reload
; CHECK-CVT-SD-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-SD-NEXT: add w8, w8, w19
; CHECK-CVT-SD-NEXT: ldp x30, x19, [sp, #32] // 16-byte Folded Reload
; CHECK-CVT-SD-NEXT: add w8, w9, w8
; CHECK-CVT-SD-NEXT: lsr w8, w8, #16
; CHECK-CVT-SD-NEXT: fmov s1, w8
; CHECK-CVT-SD-NEXT: mov v0.h[7], v1.h[0]
; CHECK-CVT-SD-NEXT: add sp, sp, #48
; CHECK-CVT-SD-NEXT: ret
;
; CHECK-BF16-SD-LABEL: test_log2:
; CHECK-BF16-SD: // %bb.0:
; CHECK-BF16-SD-NEXT: sub sp, sp, #48
; CHECK-BF16-SD-NEXT: mov h1, v0.h[1]
; CHECK-BF16-SD-NEXT: str q0, [sp] // 16-byte Spill
; CHECK-BF16-SD-NEXT: str x30, [sp, #32] // 8-byte Spill
; CHECK-BF16-SD-NEXT: shll v0.4s, v1.4h, #16
; CHECK-BF16-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16-SD-NEXT: bl log2f
; CHECK-BF16-SD-NEXT: bfcvt h0, s0
; CHECK-BF16-SD-NEXT: str q0, [sp, #16] // 16-byte Spill
; CHECK-BF16-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-BF16-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16-SD-NEXT: bl log2f
; CHECK-BF16-SD-NEXT: bfcvt h0, s0
; CHECK-BF16-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload
; CHECK-BF16-SD-NEXT: mov v0.h[1], v1.h[0]
; CHECK-BF16-SD-NEXT: str q0, [sp, #16] // 16-byte Spill
; CHECK-BF16-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-BF16-SD-NEXT: mov h0, v0.h[2]
; CHECK-BF16-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16-SD-NEXT: bl log2f
; CHECK-BF16-SD-NEXT: bfcvt h0, s0
; CHECK-BF16-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload
; CHECK-BF16-SD-NEXT: mov v1.h[2], v0.h[0]
; CHECK-BF16-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-BF16-SD-NEXT: mov h0, v0.h[3]
; CHECK-BF16-SD-NEXT: str q1, [sp, #16] // 16-byte Spill
; CHECK-BF16-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16-SD-NEXT: bl log2f
; CHECK-BF16-SD-NEXT: bfcvt h0, s0
; CHECK-BF16-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload
; CHECK-BF16-SD-NEXT: mov v1.h[3], v0.h[0]
; CHECK-BF16-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-BF16-SD-NEXT: mov h0, v0.h[4]
; CHECK-BF16-SD-NEXT: str q1, [sp, #16] // 16-byte Spill
; CHECK-BF16-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16-SD-NEXT: bl log2f
; CHECK-BF16-SD-NEXT: bfcvt h0, s0
; CHECK-BF16-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload
; CHECK-BF16-SD-NEXT: mov v1.h[4], v0.h[0]
; CHECK-BF16-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-BF16-SD-NEXT: mov h0, v0.h[5]
; CHECK-BF16-SD-NEXT: str q1, [sp, #16] // 16-byte Spill
; CHECK-BF16-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16-SD-NEXT: bl log2f
; CHECK-BF16-SD-NEXT: bfcvt h0, s0
; CHECK-BF16-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload
; CHECK-BF16-SD-NEXT: mov v1.h[5], v0.h[0]
; CHECK-BF16-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-BF16-SD-NEXT: mov h0, v0.h[6]
; CHECK-BF16-SD-NEXT: str q1, [sp, #16] // 16-byte Spill
; CHECK-BF16-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16-SD-NEXT: bl log2f
; CHECK-BF16-SD-NEXT: bfcvt h0, s0
; CHECK-BF16-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload
; CHECK-BF16-SD-NEXT: mov v1.h[6], v0.h[0]
; CHECK-BF16-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-BF16-SD-NEXT: mov h0, v0.h[7]
; CHECK-BF16-SD-NEXT: str q1, [sp, #16] // 16-byte Spill
; CHECK-BF16-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16-SD-NEXT: bl log2f
; CHECK-BF16-SD-NEXT: bfcvt h1, s0
; CHECK-BF16-SD-NEXT: ldr q0, [sp, #16] // 16-byte Reload
; CHECK-BF16-SD-NEXT: ldr x30, [sp, #32] // 8-byte Reload
; CHECK-BF16-SD-NEXT: mov v0.h[7], v1.h[0]
; CHECK-BF16-SD-NEXT: add sp, sp, #48
; CHECK-BF16-SD-NEXT: ret
;
; CHECK-BF16SVE-SD-LABEL: test_log2:
; CHECK-BF16SVE-SD: // %bb.0:
; CHECK-BF16SVE-SD-NEXT: sub sp, sp, #48
; CHECK-BF16SVE-SD-NEXT: mov h1, v0.h[1]
; CHECK-BF16SVE-SD-NEXT: str q0, [sp] // 16-byte Spill
; CHECK-BF16SVE-SD-NEXT: str x30, [sp, #32] // 8-byte Spill
; CHECK-BF16SVE-SD-NEXT: shll v0.4s, v1.4h, #16
; CHECK-BF16SVE-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16SVE-SD-NEXT: bl log2f
; CHECK-BF16SVE-SD-NEXT: bfcvt h0, s0
; CHECK-BF16SVE-SD-NEXT: str q0, [sp, #16] // 16-byte Spill
; CHECK-BF16SVE-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-BF16SVE-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16SVE-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16SVE-SD-NEXT: bl log2f
; CHECK-BF16SVE-SD-NEXT: bfcvt h0, s0
; CHECK-BF16SVE-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload
; CHECK-BF16SVE-SD-NEXT: mov v0.h[1], v1.h[0]
; CHECK-BF16SVE-SD-NEXT: str q0, [sp, #16] // 16-byte Spill
; CHECK-BF16SVE-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-BF16SVE-SD-NEXT: mov h0, v0.h[2]
; CHECK-BF16SVE-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16SVE-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16SVE-SD-NEXT: bl log2f
; CHECK-BF16SVE-SD-NEXT: bfcvt h0, s0
; CHECK-BF16SVE-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload
; CHECK-BF16SVE-SD-NEXT: mov v1.h[2], v0.h[0]
; CHECK-BF16SVE-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-BF16SVE-SD-NEXT: mov h0, v0.h[3]
; CHECK-BF16SVE-SD-NEXT: str q1, [sp, #16] // 16-byte Spill
; CHECK-BF16SVE-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16SVE-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16SVE-SD-NEXT: bl log2f
; CHECK-BF16SVE-SD-NEXT: bfcvt h0, s0
; CHECK-BF16SVE-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload
; CHECK-BF16SVE-SD-NEXT: mov v1.h[3], v0.h[0]
; CHECK-BF16SVE-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-BF16SVE-SD-NEXT: mov h0, v0.h[4]
; CHECK-BF16SVE-SD-NEXT: str q1, [sp, #16] // 16-byte Spill
; CHECK-BF16SVE-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16SVE-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16SVE-SD-NEXT: bl log2f
; CHECK-BF16SVE-SD-NEXT: bfcvt h0, s0
; CHECK-BF16SVE-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload
; CHECK-BF16SVE-SD-NEXT: mov v1.h[4], v0.h[0]
; CHECK-BF16SVE-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-BF16SVE-SD-NEXT: mov h0, v0.h[5]
; CHECK-BF16SVE-SD-NEXT: str q1, [sp, #16] // 16-byte Spill
; CHECK-BF16SVE-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16SVE-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16SVE-SD-NEXT: bl log2f
; CHECK-BF16SVE-SD-NEXT: bfcvt h0, s0
; CHECK-BF16SVE-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload
; CHECK-BF16SVE-SD-NEXT: mov v1.h[5], v0.h[0]
; CHECK-BF16SVE-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-BF16SVE-SD-NEXT: mov h0, v0.h[6]
; CHECK-BF16SVE-SD-NEXT: str q1, [sp, #16] // 16-byte Spill
; CHECK-BF16SVE-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16SVE-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16SVE-SD-NEXT: bl log2f
; CHECK-BF16SVE-SD-NEXT: bfcvt h0, s0
; CHECK-BF16SVE-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload
; CHECK-BF16SVE-SD-NEXT: mov v1.h[6], v0.h[0]
; CHECK-BF16SVE-SD-NEXT: ldr q0, [sp] // 16-byte Reload
; CHECK-BF16SVE-SD-NEXT: mov h0, v0.h[7]
; CHECK-BF16SVE-SD-NEXT: str q1, [sp, #16] // 16-byte Spill
; CHECK-BF16SVE-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16SVE-SD-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16SVE-SD-NEXT: bl log2f
; CHECK-BF16SVE-SD-NEXT: bfcvt h1, s0
; CHECK-BF16SVE-SD-NEXT: ldr q0, [sp, #16] // 16-byte Reload
; CHECK-BF16SVE-SD-NEXT: ldr x30, [sp, #32] // 8-byte Reload
; CHECK-BF16SVE-SD-NEXT: mov v0.h[7], v1.h[0]
; CHECK-BF16SVE-SD-NEXT: add sp, sp, #48
; CHECK-BF16SVE-SD-NEXT: ret
;
; CHECK-CVT-GI-LABEL: test_log2:
; CHECK-CVT-GI: // %bb.0:
; CHECK-CVT-GI-NEXT: str d14, [sp, #-128]! // 8-byte Folded Spill
; CHECK-CVT-GI-NEXT: stp d13, d12, [sp, #8] // 16-byte Folded Spill
; CHECK-CVT-GI-NEXT: mov h12, v0.h[1]
; CHECK-CVT-GI-NEXT: mov h13, v0.h[2]
; CHECK-CVT-GI-NEXT: stp d11, d10, [sp, #24] // 16-byte Folded Spill
; CHECK-CVT-GI-NEXT: mov h14, v0.h[3]
; CHECK-CVT-GI-NEXT: mov h11, v0.h[4]
; CHECK-CVT-GI-NEXT: stp d9, d8, [sp, #40] // 16-byte Folded Spill
; CHECK-CVT-GI-NEXT: mov h10, v0.h[5]
; CHECK-CVT-GI-NEXT: mov h9, v0.h[6]
; CHECK-CVT-GI-NEXT: mov h8, v0.h[7]
; CHECK-CVT-GI-NEXT: shll v0.4s, v0.4h, #16
; CHECK-CVT-GI-NEXT: str x30, [sp, #56] // 8-byte Spill
; CHECK-CVT-GI-NEXT: stp x26, x25, [sp, #64] // 16-byte Folded Spill
; CHECK-CVT-GI-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-CVT-GI-NEXT: stp x24, x23, [sp, #80] // 16-byte Folded Spill
; CHECK-CVT-GI-NEXT: stp x22, x21, [sp, #96] // 16-byte Folded Spill
; CHECK-CVT-GI-NEXT: stp x20, x19, [sp, #112] // 16-byte Folded Spill
; CHECK-CVT-GI-NEXT: bl log2f
; CHECK-CVT-GI-NEXT: fmov w8, s0
; CHECK-CVT-GI-NEXT: mov w19, #32767 // =0x7fff
; CHECK-CVT-GI-NEXT: fcmp s0, #0.0
; CHECK-CVT-GI-NEXT: shll v0.4s, v12.4h, #16
; CHECK-CVT-GI-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-CVT-GI-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-GI-NEXT: add w10, w8, w19
; CHECK-CVT-GI-NEXT: orr w8, w8, #0x400000
; CHECK-CVT-GI-NEXT: add w9, w10, w9
; CHECK-CVT-GI-NEXT: csel w8, w8, w9, vs
; CHECK-CVT-GI-NEXT: lsr w20, w8, #16
; CHECK-CVT-GI-NEXT: bl log2f
; CHECK-CVT-GI-NEXT: shll v1.4s, v13.4h, #16
; CHECK-CVT-GI-NEXT: fmov w8, s0
; CHECK-CVT-GI-NEXT: fcmp s0, #0.0
; CHECK-CVT-GI-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-GI-NEXT: fmov s0, s1
; CHECK-CVT-GI-NEXT: add w10, w8, w19
; CHECK-CVT-GI-NEXT: orr w8, w8, #0x400000
; CHECK-CVT-GI-NEXT: add w9, w10, w9
; CHECK-CVT-GI-NEXT: csel w8, w8, w9, vs
; CHECK-CVT-GI-NEXT: lsr w21, w8, #16
; CHECK-CVT-GI-NEXT: bl log2f
; CHECK-CVT-GI-NEXT: shll v1.4s, v14.4h, #16
; CHECK-CVT-GI-NEXT: fmov w8, s0
; CHECK-CVT-GI-NEXT: fcmp s0, #0.0
; CHECK-CVT-GI-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-GI-NEXT: fmov s0, s1
; CHECK-CVT-GI-NEXT: add w10, w8, w19
; CHECK-CVT-GI-NEXT: orr w8, w8, #0x400000
; CHECK-CVT-GI-NEXT: add w9, w10, w9
; CHECK-CVT-GI-NEXT: csel w8, w8, w9, vs
; CHECK-CVT-GI-NEXT: lsr w22, w8, #16
; CHECK-CVT-GI-NEXT: bl log2f
; CHECK-CVT-GI-NEXT: shll v1.4s, v11.4h, #16
; CHECK-CVT-GI-NEXT: fmov w8, s0
; CHECK-CVT-GI-NEXT: fcmp s0, #0.0
; CHECK-CVT-GI-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-GI-NEXT: fmov s0, s1
; CHECK-CVT-GI-NEXT: add w10, w8, w19
; CHECK-CVT-GI-NEXT: orr w8, w8, #0x400000
; CHECK-CVT-GI-NEXT: add w9, w10, w9
; CHECK-CVT-GI-NEXT: csel w8, w8, w9, vs
; CHECK-CVT-GI-NEXT: lsr w23, w8, #16
; CHECK-CVT-GI-NEXT: bl log2f
; CHECK-CVT-GI-NEXT: shll v1.4s, v10.4h, #16
; CHECK-CVT-GI-NEXT: fmov w8, s0
; CHECK-CVT-GI-NEXT: fcmp s0, #0.0
; CHECK-CVT-GI-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-GI-NEXT: fmov s0, s1
; CHECK-CVT-GI-NEXT: add w10, w8, w19
; CHECK-CVT-GI-NEXT: orr w8, w8, #0x400000
; CHECK-CVT-GI-NEXT: add w9, w10, w9
; CHECK-CVT-GI-NEXT: csel w8, w8, w9, vs
; CHECK-CVT-GI-NEXT: lsr w24, w8, #16
; CHECK-CVT-GI-NEXT: bl log2f
; CHECK-CVT-GI-NEXT: shll v1.4s, v9.4h, #16
; CHECK-CVT-GI-NEXT: fmov w8, s0
; CHECK-CVT-GI-NEXT: fcmp s0, #0.0
; CHECK-CVT-GI-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-GI-NEXT: fmov s0, s1
; CHECK-CVT-GI-NEXT: add w10, w8, w19
; CHECK-CVT-GI-NEXT: orr w8, w8, #0x400000
; CHECK-CVT-GI-NEXT: add w9, w10, w9
; CHECK-CVT-GI-NEXT: csel w8, w8, w9, vs
; CHECK-CVT-GI-NEXT: lsr w25, w8, #16
; CHECK-CVT-GI-NEXT: bl log2f
; CHECK-CVT-GI-NEXT: shll v1.4s, v8.4h, #16
; CHECK-CVT-GI-NEXT: fmov w8, s0
; CHECK-CVT-GI-NEXT: fcmp s0, #0.0
; CHECK-CVT-GI-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-GI-NEXT: fmov s0, s1
; CHECK-CVT-GI-NEXT: add w10, w8, w19
; CHECK-CVT-GI-NEXT: orr w8, w8, #0x400000
; CHECK-CVT-GI-NEXT: add w9, w10, w9
; CHECK-CVT-GI-NEXT: csel w8, w8, w9, vs
; CHECK-CVT-GI-NEXT: lsr w26, w8, #16
; CHECK-CVT-GI-NEXT: bl log2f
; CHECK-CVT-GI-NEXT: fmov s1, w20
; CHECK-CVT-GI-NEXT: fmov w8, s0
; CHECK-CVT-GI-NEXT: ldr x30, [sp, #56] // 8-byte Reload
; CHECK-CVT-GI-NEXT: fcmp s0, #0.0
; CHECK-CVT-GI-NEXT: ldp d9, d8, [sp, #40] // 16-byte Folded Reload
; CHECK-CVT-GI-NEXT: ldp d11, d10, [sp, #24] // 16-byte Folded Reload
; CHECK-CVT-GI-NEXT: mov v1.h[1], w21
; CHECK-CVT-GI-NEXT: ubfx w9, w8, #16, #1
; CHECK-CVT-GI-NEXT: add w10, w8, w19
; CHECK-CVT-GI-NEXT: orr w8, w8, #0x400000
; CHECK-CVT-GI-NEXT: ldp x20, x19, [sp, #112] // 16-byte Folded Reload
; CHECK-CVT-GI-NEXT: add w9, w10, w9
; CHECK-CVT-GI-NEXT: ldp d13, d12, [sp, #8] // 16-byte Folded Reload
; CHECK-CVT-GI-NEXT: csel w8, w8, w9, vs
; CHECK-CVT-GI-NEXT: mov v1.h[2], w22
; CHECK-CVT-GI-NEXT: lsr w8, w8, #16
; CHECK-CVT-GI-NEXT: ldp x22, x21, [sp, #96] // 16-byte Folded Reload
; CHECK-CVT-GI-NEXT: mov v1.h[3], w23
; CHECK-CVT-GI-NEXT: mov v1.h[4], w24
; CHECK-CVT-GI-NEXT: ldp x24, x23, [sp, #80] // 16-byte Folded Reload
; CHECK-CVT-GI-NEXT: mov v1.h[5], w25
; CHECK-CVT-GI-NEXT: mov v1.h[6], w26
; CHECK-CVT-GI-NEXT: ldp x26, x25, [sp, #64] // 16-byte Folded Reload
; CHECK-CVT-GI-NEXT: mov v1.h[7], w8
; CHECK-CVT-GI-NEXT: mov v0.16b, v1.16b
; CHECK-CVT-GI-NEXT: ldr d14, [sp], #128 // 8-byte Folded Reload
; CHECK-CVT-GI-NEXT: ret
;
; CHECK-BF16-GI-LABEL: test_log2:
; CHECK-BF16-GI: // %bb.0:
; CHECK-BF16-GI-NEXT: sub sp, sp, #176
; CHECK-BF16-GI-NEXT: str d14, [sp, #112] // 8-byte Spill
; CHECK-BF16-GI-NEXT: mov h14, v0.h[6]
; CHECK-BF16-GI-NEXT: stp d13, d12, [sp, #120] // 16-byte Folded Spill
; CHECK-BF16-GI-NEXT: mov h12, v0.h[4]
; CHECK-BF16-GI-NEXT: mov h13, v0.h[5]
; CHECK-BF16-GI-NEXT: stp d11, d10, [sp, #136] // 16-byte Folded Spill
; CHECK-BF16-GI-NEXT: mov h10, v0.h[2]
; CHECK-BF16-GI-NEXT: mov h11, v0.h[3]
; CHECK-BF16-GI-NEXT: stp d9, d8, [sp, #152] // 16-byte Folded Spill
; CHECK-BF16-GI-NEXT: mov h9, v0.h[1]
; CHECK-BF16-GI-NEXT: mov h8, v0.h[7]
; CHECK-BF16-GI-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16-GI-NEXT: str x30, [sp, #168] // 8-byte Spill
; CHECK-BF16-GI-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16-GI-NEXT: bl log2f
; CHECK-BF16-GI-NEXT: bfcvt h0, s0
; CHECK-BF16-GI-NEXT: str q0, [sp, #96] // 16-byte Spill
; CHECK-BF16-GI-NEXT: shll v0.4s, v9.4h, #16
; CHECK-BF16-GI-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16-GI-NEXT: bl log2f
; CHECK-BF16-GI-NEXT: bfcvt h0, s0
; CHECK-BF16-GI-NEXT: str q0, [sp, #80] // 16-byte Spill
; CHECK-BF16-GI-NEXT: shll v0.4s, v10.4h, #16
; CHECK-BF16-GI-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16-GI-NEXT: bl log2f
; CHECK-BF16-GI-NEXT: bfcvt h0, s0
; CHECK-BF16-GI-NEXT: str q0, [sp, #64] // 16-byte Spill
; CHECK-BF16-GI-NEXT: shll v0.4s, v11.4h, #16
; CHECK-BF16-GI-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16-GI-NEXT: bl log2f
; CHECK-BF16-GI-NEXT: bfcvt h0, s0
; CHECK-BF16-GI-NEXT: str q0, [sp, #48] // 16-byte Spill
; CHECK-BF16-GI-NEXT: shll v0.4s, v12.4h, #16
; CHECK-BF16-GI-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16-GI-NEXT: bl log2f
; CHECK-BF16-GI-NEXT: bfcvt h0, s0
; CHECK-BF16-GI-NEXT: str q0, [sp, #32] // 16-byte Spill
; CHECK-BF16-GI-NEXT: shll v0.4s, v13.4h, #16
; CHECK-BF16-GI-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16-GI-NEXT: bl log2f
; CHECK-BF16-GI-NEXT: bfcvt h0, s0
; CHECK-BF16-GI-NEXT: str q0, [sp, #16] // 16-byte Spill
; CHECK-BF16-GI-NEXT: shll v0.4s, v14.4h, #16
; CHECK-BF16-GI-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16-GI-NEXT: bl log2f
; CHECK-BF16-GI-NEXT: bfcvt h0, s0
; CHECK-BF16-GI-NEXT: str q0, [sp] // 16-byte Spill
; CHECK-BF16-GI-NEXT: shll v0.4s, v8.4h, #16
; CHECK-BF16-GI-NEXT: // kill: def $s0 killed $s0 killed $q0
; CHECK-BF16-GI-NEXT: bl log2f
; CHECK-BF16-GI-NEXT: ldp q2, q1, [sp, #80] // 32-byte Folded Reload
; CHECK-BF16-GI-NEXT: bfcvt h0, s0
; CHECK-BF16-GI-NEXT: ldp d9, d8, [sp, #152] // 16-byte Folded Reload
; CHECK-BF16-GI-NEXT: ldr x30, [sp, #168] // 8-byte Reload
; CHECK-BF16-GI-NEXT: ldp d11, d10, [sp, #136] // 16-byte Folded Reload
; CHECK-BF16-GI-NEXT: ldr d14, [sp, #112] // 8-byte Reload
; CHECK-BF16-GI-NEXT: mov v1.h[1], v2.h[0]
; CHECK-BF16-GI-NEXT: ldp q2, q3, [sp, #48] // 32-byte Folded Reload
; CHECK-BF16-GI-NEXT: ldp d13, d12, [sp, #120] // 16-byte Folded Reload
; CHECK-BF16-GI-NEXT: mov v1.h[2], v3.h[0]
; CHECK-BF16-GI-NEXT: mov v1.h[3], v2.h[0]
; CHECK-BF16-GI-NEXT: ldp q2, q3, [sp, #16] // 32-byte Folded Reload
; CHECK-BF16-GI-NEXT: mov v1.h[4], v3.h[0]
; CHECK-BF16-GI-NEXT: mov v1.h[5], v2.h[0]
; CHECK-BF16-GI-NEXT: ldr q2, [sp] // 16-byte Reload
; CHECK-BF16-GI-NEXT: mov v1.h[6], v2.h[0]
; CHECK-BF16-GI-NEXT: mov v1.h[7], v0.h[0]
; CHECK-BF16-GI-NEXT: mov v0.16b, v1.16b
; CHECK-BF16-GI-NEXT: add sp, sp, #176
; CHECK-BF16-GI-NEXT: ret
%r = call <8 x bfloat> @llvm.log2.v8bf16(<8 x bfloat> %a)
ret <8 x bfloat> %r
}
define <8 x bfloat> @test_fma(<8 x bfloat> %a, <8 x bfloat> %b, <8 x bfloat> %c) #0 {
; CHECK-CVT-SD-LABEL: test_fma:
; CHECK-CVT-SD: // %bb.0:
; CHECK-CVT-SD-NEXT: mov h3, v2.h[1]
; CHECK-CVT-SD-NEXT: mov h4, v1.h[1]
; CHECK-CVT-SD-NEXT: mov w8, #32767 // =0x7fff
; CHECK-CVT-SD-NEXT: mov h5, v0.h[1]
; CHECK-CVT-SD-NEXT: shll v6.4s, v2.4h, #16
; CHECK-CVT-SD-NEXT: shll v7.4s, v1.4h, #16
; CHECK-CVT-SD-NEXT: shll v16.4s, v0.4h, #16
; CHECK-CVT-SD-NEXT: mov h17, v2.h[2]
; CHECK-CVT-SD-NEXT: mov h18, v1.h[2]
; CHECK-CVT-SD-NEXT: mov h19, v0.h[2]
; CHECK-CVT-SD-NEXT: mov h20, v2.h[3]
; CHECK-CVT-SD-NEXT: mov h21, v1.h[3]
; CHECK-CVT-SD-NEXT: shll v3.4s, v3.4h, #16
; CHECK-CVT-SD-NEXT: shll v4.4s, v4.4h, #16
; CHECK-CVT-SD-NEXT: mov h22, v0.h[3]
; CHECK-CVT-SD-NEXT: fmadd s6, s16, s7, s6
; CHECK-CVT-SD-NEXT: shll v5.4s, v5.4h, #16
; CHECK-CVT-SD-NEXT: shll v7.4s, v17.4h, #16
; CHECK-CVT-SD-NEXT: shll v16.4s, v18.4h, #16
; CHECK-CVT-SD-NEXT: shll v17.4s, v19.4h, #16
; CHECK-CVT-SD-NEXT: shll v18.4s, v20.4h, #16
; CHECK-CVT-SD-NEXT: shll v19.4s, v21.4h, #16
; CHECK-CVT-SD-NEXT: fmadd s3, s5, s4, s3
; CHECK-CVT-SD-NEXT: shll v20.4s, v22.4h, #16
; CHECK-CVT-SD-NEXT: mov h21, v2.h[4]
; CHECK-CVT-SD-NEXT: fmov w9, s6
; CHECK-CVT-SD-NEXT: mov h22, v1.h[4]
; CHECK-CVT-SD-NEXT: mov h6, v0.h[4]
; CHECK-CVT-SD-NEXT: fmadd s4, s17, s16, s7
; CHECK-CVT-SD-NEXT: mov h17, v2.h[5]
; CHECK-CVT-SD-NEXT: fmadd s5, s20, s19, s18
; CHECK-CVT-SD-NEXT: mov h18, v1.h[5]
; CHECK-CVT-SD-NEXT: mov h19, v0.h[5]
; CHECK-CVT-SD-NEXT: ubfx w10, w9, #16, #1
; CHECK-CVT-SD-NEXT: add w9, w9, w8
; CHECK-CVT-SD-NEXT: fmov w11, s3
; CHECK-CVT-SD-NEXT: shll v7.4s, v21.4h, #16
; CHECK-CVT-SD-NEXT: shll v16.4s, v22.4h, #16
; CHECK-CVT-SD-NEXT: shll v3.4s, v6.4h, #16
; CHECK-CVT-SD-NEXT: add w9, w10, w9
; CHECK-CVT-SD-NEXT: shll v6.4s, v17.4h, #16
; CHECK-CVT-SD-NEXT: mov h17, v1.h[6]
; CHECK-CVT-SD-NEXT: ubfx w12, w11, #16, #1
; CHECK-CVT-SD-NEXT: add w10, w11, w8
; CHECK-CVT-SD-NEXT: lsr w9, w9, #16
; CHECK-CVT-SD-NEXT: fmov w11, s4
; CHECK-CVT-SD-NEXT: fmadd s4, s3, s16, s7
; CHECK-CVT-SD-NEXT: shll v7.4s, v18.4h, #16
; CHECK-CVT-SD-NEXT: add w10, w12, w10
; CHECK-CVT-SD-NEXT: fmov s3, w9
; CHECK-CVT-SD-NEXT: fmov w9, s5
; CHECK-CVT-SD-NEXT: lsr w10, w10, #16
; CHECK-CVT-SD-NEXT: shll v16.4s, v19.4h, #16
; CHECK-CVT-SD-NEXT: mov h18, v0.h[6]
; CHECK-CVT-SD-NEXT: ubfx w12, w11, #16, #1
; CHECK-CVT-SD-NEXT: add w11, w11, w8
; CHECK-CVT-SD-NEXT: mov h1, v1.h[7]
; CHECK-CVT-SD-NEXT: fmov s5, w10
; CHECK-CVT-SD-NEXT: mov h0, v0.h[7]
; CHECK-CVT-SD-NEXT: add w11, w12, w11
; CHECK-CVT-SD-NEXT: fmov w12, s4
; CHECK-CVT-SD-NEXT: fmadd s6, s16, s7, s6
; CHECK-CVT-SD-NEXT: lsr w10, w11, #16
; CHECK-CVT-SD-NEXT: ubfx w11, w9, #16, #1
; CHECK-CVT-SD-NEXT: add w9, w9, w8
; CHECK-CVT-SD-NEXT: mov v3.h[1], v5.h[0]
; CHECK-CVT-SD-NEXT: mov h5, v2.h[6]
; CHECK-CVT-SD-NEXT: shll v7.4s, v18.4h, #16
; CHECK-CVT-SD-NEXT: fmov s4, w10
; CHECK-CVT-SD-NEXT: add w9, w11, w9
; CHECK-CVT-SD-NEXT: mov h2, v2.h[7]
; CHECK-CVT-SD-NEXT: lsr w9, w9, #16
; CHECK-CVT-SD-NEXT: ubfx w10, w12, #16, #1
; CHECK-CVT-SD-NEXT: fmov w11, s6
; CHECK-CVT-SD-NEXT: shll v1.4s, v1.4h, #16
; CHECK-CVT-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-CVT-SD-NEXT: mov v3.h[2], v4.h[0]
; CHECK-CVT-SD-NEXT: shll v4.4s, v5.4h, #16
; CHECK-CVT-SD-NEXT: shll v5.4s, v17.4h, #16
; CHECK-CVT-SD-NEXT: fmov s16, w9
; CHECK-CVT-SD-NEXT: add w9, w12, w8
; CHECK-CVT-SD-NEXT: shll v2.4s, v2.4h, #16
; CHECK-CVT-SD-NEXT: add w9, w10, w9
; CHECK-CVT-SD-NEXT: ubfx w10, w11, #16, #1
; CHECK-CVT-SD-NEXT: fmadd s4, s7, s5, s4
; CHECK-CVT-SD-NEXT: lsr w9, w9, #16
; CHECK-CVT-SD-NEXT: mov v3.h[3], v16.h[0]
; CHECK-CVT-SD-NEXT: fmadd s0, s0, s1, s2
; CHECK-CVT-SD-NEXT: fmov s5, w9
; CHECK-CVT-SD-NEXT: add w9, w11, w8
; CHECK-CVT-SD-NEXT: add w9, w10, w9
; CHECK-CVT-SD-NEXT: fmov w10, s4
; CHECK-CVT-SD-NEXT: lsr w9, w9, #16
; CHECK-CVT-SD-NEXT: mov v3.h[4], v5.h[0]
; CHECK-CVT-SD-NEXT: fmov s1, w9
; CHECK-CVT-SD-NEXT: ubfx w11, w10, #16, #1
; CHECK-CVT-SD-NEXT: add w9, w10, w8
; CHECK-CVT-SD-NEXT: fmov w10, s0
; CHECK-CVT-SD-NEXT: add w9, w11, w9
; CHECK-CVT-SD-NEXT: mov v3.h[5], v1.h[0]
; CHECK-CVT-SD-NEXT: lsr w9, w9, #16
; CHECK-CVT-SD-NEXT: ubfx w11, w10, #16, #1
; CHECK-CVT-SD-NEXT: add w8, w10, w8
; CHECK-CVT-SD-NEXT: fmov s0, w9
; CHECK-CVT-SD-NEXT: add w8, w11, w8
; CHECK-CVT-SD-NEXT: lsr w8, w8, #16
; CHECK-CVT-SD-NEXT: mov v3.h[6], v0.h[0]
; CHECK-CVT-SD-NEXT: fmov s0, w8
; CHECK-CVT-SD-NEXT: mov v3.h[7], v0.h[0]
; CHECK-CVT-SD-NEXT: mov v0.16b, v3.16b
; CHECK-CVT-SD-NEXT: ret
;
; CHECK-BF16-SD-LABEL: test_fma:
; CHECK-BF16-SD: // %bb.0:
; CHECK-BF16-SD-NEXT: mov h3, v2.h[1]
; CHECK-BF16-SD-NEXT: mov h4, v1.h[1]
; CHECK-BF16-SD-NEXT: mov h5, v0.h[1]
; CHECK-BF16-SD-NEXT: shll v6.4s, v2.4h, #16
; CHECK-BF16-SD-NEXT: shll v7.4s, v1.4h, #16
; CHECK-BF16-SD-NEXT: shll v16.4s, v0.4h, #16
; CHECK-BF16-SD-NEXT: mov h17, v2.h[2]
; CHECK-BF16-SD-NEXT: mov h18, v1.h[2]
; CHECK-BF16-SD-NEXT: mov h19, v0.h[2]
; CHECK-BF16-SD-NEXT: mov h20, v2.h[3]
; CHECK-BF16-SD-NEXT: mov h21, v1.h[3]
; CHECK-BF16-SD-NEXT: fmadd s6, s16, s7, s6
; CHECK-BF16-SD-NEXT: shll v3.4s, v3.4h, #16
; CHECK-BF16-SD-NEXT: shll v4.4s, v4.4h, #16
; CHECK-BF16-SD-NEXT: shll v5.4s, v5.4h, #16
; CHECK-BF16-SD-NEXT: mov h7, v0.h[3]
; CHECK-BF16-SD-NEXT: shll v16.4s, v19.4h, #16
; CHECK-BF16-SD-NEXT: mov h19, v0.h[4]
; CHECK-BF16-SD-NEXT: fmadd s4, s5, s4, s3
; CHECK-BF16-SD-NEXT: shll v3.4s, v17.4h, #16
; CHECK-BF16-SD-NEXT: shll v5.4s, v18.4h, #16
; CHECK-BF16-SD-NEXT: mov h17, v2.h[4]
; CHECK-BF16-SD-NEXT: mov h18, v1.h[4]
; CHECK-BF16-SD-NEXT: shll v7.4s, v7.4h, #16
; CHECK-BF16-SD-NEXT: shll v19.4s, v19.4h, #16
; CHECK-BF16-SD-NEXT: fmadd s5, s16, s5, s3
; CHECK-BF16-SD-NEXT: bfcvt h3, s6
; CHECK-BF16-SD-NEXT: shll v6.4s, v20.4h, #16
; CHECK-BF16-SD-NEXT: bfcvt h4, s4
; CHECK-BF16-SD-NEXT: shll v16.4s, v21.4h, #16
; CHECK-BF16-SD-NEXT: shll v17.4s, v17.4h, #16
; CHECK-BF16-SD-NEXT: shll v18.4s, v18.4h, #16
; CHECK-BF16-SD-NEXT: fmadd s6, s7, s16, s6
; CHECK-BF16-SD-NEXT: bfcvt h5, s5
; CHECK-BF16-SD-NEXT: mov h7, v1.h[5]
; CHECK-BF16-SD-NEXT: mov v3.h[1], v4.h[0]
; CHECK-BF16-SD-NEXT: mov h4, v2.h[5]
; CHECK-BF16-SD-NEXT: mov h16, v0.h[5]
; CHECK-BF16-SD-NEXT: fmadd s17, s19, s18, s17
; CHECK-BF16-SD-NEXT: mov h18, v2.h[6]
; CHECK-BF16-SD-NEXT: mov h19, v1.h[6]
; CHECK-BF16-SD-NEXT: mov h2, v2.h[7]
; CHECK-BF16-SD-NEXT: mov h1, v1.h[7]
; CHECK-BF16-SD-NEXT: bfcvt h6, s6
; CHECK-BF16-SD-NEXT: shll v7.4s, v7.4h, #16
; CHECK-BF16-SD-NEXT: mov v3.h[2], v5.h[0]
; CHECK-BF16-SD-NEXT: mov h5, v0.h[6]
; CHECK-BF16-SD-NEXT: shll v4.4s, v4.4h, #16
; CHECK-BF16-SD-NEXT: shll v16.4s, v16.4h, #16
; CHECK-BF16-SD-NEXT: mov h0, v0.h[7]
; CHECK-BF16-SD-NEXT: shll v2.4s, v2.4h, #16
; CHECK-BF16-SD-NEXT: shll v1.4s, v1.4h, #16
; CHECK-BF16-SD-NEXT: fmadd s4, s16, s7, s4
; CHECK-BF16-SD-NEXT: mov v3.h[3], v6.h[0]
; CHECK-BF16-SD-NEXT: bfcvt h6, s17
; CHECK-BF16-SD-NEXT: shll v7.4s, v18.4h, #16
; CHECK-BF16-SD-NEXT: shll v16.4s, v19.4h, #16
; CHECK-BF16-SD-NEXT: shll v5.4s, v5.4h, #16
; CHECK-BF16-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16-SD-NEXT: fmadd s5, s5, s16, s7
; CHECK-BF16-SD-NEXT: mov v3.h[4], v6.h[0]
; CHECK-BF16-SD-NEXT: bfcvt h4, s4
; CHECK-BF16-SD-NEXT: fmadd s0, s0, s1, s2
; CHECK-BF16-SD-NEXT: mov v3.h[5], v4.h[0]
; CHECK-BF16-SD-NEXT: bfcvt h4, s5
; CHECK-BF16-SD-NEXT: bfcvt h0, s0
; CHECK-BF16-SD-NEXT: mov v3.h[6], v4.h[0]
; CHECK-BF16-SD-NEXT: mov v3.h[7], v0.h[0]
; CHECK-BF16-SD-NEXT: mov v0.16b, v3.16b
; CHECK-BF16-SD-NEXT: ret
;
; CHECK-BF16SVE-SD-LABEL: test_fma:
; CHECK-BF16SVE-SD: // %bb.0:
; CHECK-BF16SVE-SD-NEXT: mov h3, v2.h[1]
; CHECK-BF16SVE-SD-NEXT: mov h4, v1.h[1]
; CHECK-BF16SVE-SD-NEXT: mov h5, v0.h[1]
; CHECK-BF16SVE-SD-NEXT: shll v6.4s, v2.4h, #16
; CHECK-BF16SVE-SD-NEXT: shll v7.4s, v1.4h, #16
; CHECK-BF16SVE-SD-NEXT: shll v16.4s, v0.4h, #16
; CHECK-BF16SVE-SD-NEXT: mov h17, v2.h[2]
; CHECK-BF16SVE-SD-NEXT: mov h18, v1.h[2]
; CHECK-BF16SVE-SD-NEXT: mov h19, v0.h[2]
; CHECK-BF16SVE-SD-NEXT: mov h20, v2.h[3]
; CHECK-BF16SVE-SD-NEXT: mov h21, v1.h[3]
; CHECK-BF16SVE-SD-NEXT: fmadd s6, s16, s7, s6
; CHECK-BF16SVE-SD-NEXT: shll v3.4s, v3.4h, #16
; CHECK-BF16SVE-SD-NEXT: shll v4.4s, v4.4h, #16
; CHECK-BF16SVE-SD-NEXT: shll v5.4s, v5.4h, #16
; CHECK-BF16SVE-SD-NEXT: mov h7, v0.h[3]
; CHECK-BF16SVE-SD-NEXT: shll v16.4s, v19.4h, #16
; CHECK-BF16SVE-SD-NEXT: mov h19, v0.h[4]
; CHECK-BF16SVE-SD-NEXT: fmadd s4, s5, s4, s3
; CHECK-BF16SVE-SD-NEXT: shll v3.4s, v17.4h, #16
; CHECK-BF16SVE-SD-NEXT: shll v5.4s, v18.4h, #16
; CHECK-BF16SVE-SD-NEXT: mov h17, v2.h[4]
; CHECK-BF16SVE-SD-NEXT: mov h18, v1.h[4]
; CHECK-BF16SVE-SD-NEXT: shll v7.4s, v7.4h, #16
; CHECK-BF16SVE-SD-NEXT: shll v19.4s, v19.4h, #16
; CHECK-BF16SVE-SD-NEXT: fmadd s5, s16, s5, s3
; CHECK-BF16SVE-SD-NEXT: bfcvt h3, s6
; CHECK-BF16SVE-SD-NEXT: shll v6.4s, v20.4h, #16
; CHECK-BF16SVE-SD-NEXT: bfcvt h4, s4
; CHECK-BF16SVE-SD-NEXT: shll v16.4s, v21.4h, #16
; CHECK-BF16SVE-SD-NEXT: shll v17.4s, v17.4h, #16
; CHECK-BF16SVE-SD-NEXT: shll v18.4s, v18.4h, #16
; CHECK-BF16SVE-SD-NEXT: fmadd s6, s7, s16, s6
; CHECK-BF16SVE-SD-NEXT: bfcvt h5, s5
; CHECK-BF16SVE-SD-NEXT: mov h7, v1.h[5]
; CHECK-BF16SVE-SD-NEXT: mov v3.h[1], v4.h[0]
; CHECK-BF16SVE-SD-NEXT: mov h4, v2.h[5]
; CHECK-BF16SVE-SD-NEXT: mov h16, v0.h[5]
; CHECK-BF16SVE-SD-NEXT: fmadd s17, s19, s18, s17
; CHECK-BF16SVE-SD-NEXT: mov h18, v2.h[6]
; CHECK-BF16SVE-SD-NEXT: mov h19, v1.h[6]
; CHECK-BF16SVE-SD-NEXT: mov h2, v2.h[7]
; CHECK-BF16SVE-SD-NEXT: mov h1, v1.h[7]
; CHECK-BF16SVE-SD-NEXT: bfcvt h6, s6
; CHECK-BF16SVE-SD-NEXT: shll v7.4s, v7.4h, #16
; CHECK-BF16SVE-SD-NEXT: mov v3.h[2], v5.h[0]
; CHECK-BF16SVE-SD-NEXT: mov h5, v0.h[6]
; CHECK-BF16SVE-SD-NEXT: shll v4.4s, v4.4h, #16
; CHECK-BF16SVE-SD-NEXT: shll v16.4s, v16.4h, #16
; CHECK-BF16SVE-SD-NEXT: mov h0, v0.h[7]
; CHECK-BF16SVE-SD-NEXT: shll v2.4s, v2.4h, #16
; CHECK-BF16SVE-SD-NEXT: shll v1.4s, v1.4h, #16
; CHECK-BF16SVE-SD-NEXT: fmadd s4, s16, s7, s4
; CHECK-BF16SVE-SD-NEXT: mov v3.h[3], v6.h[0]
; CHECK-BF16SVE-SD-NEXT: bfcvt h6, s17
; CHECK-BF16SVE-SD-NEXT: shll v7.4s, v18.4h, #16
; CHECK-BF16SVE-SD-NEXT: shll v16.4s, v19.4h, #16
; CHECK-BF16SVE-SD-NEXT: shll v5.4s, v5.4h, #16
; CHECK-BF16SVE-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16SVE-SD-NEXT: fmadd s5, s5, s16, s7
; CHECK-BF16SVE-SD-NEXT: mov v3.h[4], v6.h[0]
; CHECK-BF16SVE-SD-NEXT: bfcvt h4, s4
; CHECK-BF16SVE-SD-NEXT: fmadd s0, s0, s1, s2
; CHECK-BF16SVE-SD-NEXT: mov v3.h[5], v4.h[0]
; CHECK-BF16SVE-SD-NEXT: bfcvt h4, s5
; CHECK-BF16SVE-SD-NEXT: bfcvt h0, s0
; CHECK-BF16SVE-SD-NEXT: mov v3.h[6], v4.h[0]
; CHECK-BF16SVE-SD-NEXT: mov v3.h[7], v0.h[0]
; CHECK-BF16SVE-SD-NEXT: mov v0.16b, v3.16b
; CHECK-BF16SVE-SD-NEXT: ret
;
; CHECK-CVT-GI-LABEL: test_fma:
; CHECK-CVT-GI: // %bb.0:
; CHECK-CVT-GI-NEXT: shll v3.4s, v0.4h, #16
; CHECK-CVT-GI-NEXT: shll v4.4s, v1.4h, #16
; CHECK-CVT-GI-NEXT: shll v5.4s, v2.4h, #16
; CHECK-CVT-GI-NEXT: shll2 v0.4s, v0.8h, #16
; CHECK-CVT-GI-NEXT: shll2 v1.4s, v1.8h, #16
; CHECK-CVT-GI-NEXT: shll2 v2.4s, v2.8h, #16
; CHECK-CVT-GI-NEXT: movi v6.4s, #64, lsl #16
; CHECK-CVT-GI-NEXT: fmla v5.4s, v4.4s, v3.4s
; CHECK-CVT-GI-NEXT: fmla v2.4s, v1.4s, v0.4s
; CHECK-CVT-GI-NEXT: movi v0.4s, #1
; CHECK-CVT-GI-NEXT: movi v1.4s, #127, msl #8
; CHECK-CVT-GI-NEXT: fcmeq v7.4s, v5.4s, v5.4s
; CHECK-CVT-GI-NEXT: ushr v3.4s, v5.4s, #16
; CHECK-CVT-GI-NEXT: ushr v4.4s, v2.4s, #16
; CHECK-CVT-GI-NEXT: fcmeq v17.4s, v2.4s, v2.4s
; CHECK-CVT-GI-NEXT: add v16.4s, v5.4s, v1.4s
; CHECK-CVT-GI-NEXT: add v1.4s, v2.4s, v1.4s
; CHECK-CVT-GI-NEXT: orr v2.16b, v2.16b, v6.16b
; CHECK-CVT-GI-NEXT: and v3.16b, v3.16b, v0.16b
; CHECK-CVT-GI-NEXT: and v0.16b, v4.16b, v0.16b
; CHECK-CVT-GI-NEXT: orr v4.16b, v5.16b, v6.16b
; CHECK-CVT-GI-NEXT: mvn v5.16b, v7.16b
; CHECK-CVT-GI-NEXT: mvn v7.16b, v17.16b
; CHECK-CVT-GI-NEXT: add v3.4s, v16.4s, v3.4s
; CHECK-CVT-GI-NEXT: add v0.4s, v1.4s, v0.4s
; CHECK-CVT-GI-NEXT: mov v1.16b, v5.16b
; CHECK-CVT-GI-NEXT: bsl v1.16b, v4.16b, v3.16b
; CHECK-CVT-GI-NEXT: bif v2.16b, v0.16b, v7.16b
; CHECK-CVT-GI-NEXT: shrn v0.4h, v1.4s, #16
; CHECK-CVT-GI-NEXT: shrn v1.4h, v2.4s, #16
; CHECK-CVT-GI-NEXT: mov v0.d[1], v1.d[0]
; CHECK-CVT-GI-NEXT: ret
;
; CHECK-BF16-GI-LABEL: test_fma:
; CHECK-BF16-GI: // %bb.0:
; CHECK-BF16-GI-NEXT: shll v3.4s, v0.4h, #16
; CHECK-BF16-GI-NEXT: shll v4.4s, v1.4h, #16
; CHECK-BF16-GI-NEXT: shll v5.4s, v2.4h, #16
; CHECK-BF16-GI-NEXT: shll2 v0.4s, v0.8h, #16
; CHECK-BF16-GI-NEXT: shll2 v1.4s, v1.8h, #16
; CHECK-BF16-GI-NEXT: shll2 v2.4s, v2.8h, #16
; CHECK-BF16-GI-NEXT: fmla v5.4s, v4.4s, v3.4s
; CHECK-BF16-GI-NEXT: fmla v2.4s, v1.4s, v0.4s
; CHECK-BF16-GI-NEXT: bfcvtn v0.4h, v5.4s
; CHECK-BF16-GI-NEXT: bfcvtn2 v0.8h, v2.4s
; CHECK-BF16-GI-NEXT: ret
%r = call <8 x bfloat> @llvm.fma.v8bf16(<8 x bfloat> %a, <8 x bfloat> %b, <8 x bfloat> %c)
ret <8 x bfloat> %r
}
define <8 x bfloat> @test_fabs(<8 x bfloat> %a) #0 {
; CHECK-CVT-SD-LABEL: test_fabs:
; CHECK-CVT-SD: // %bb.0:
; CHECK-CVT-SD-NEXT: bic v0.8h, #128, lsl #8
; CHECK-CVT-SD-NEXT: ret
;
; CHECK-BF16-SD-LABEL: test_fabs:
; CHECK-BF16-SD: // %bb.0:
; CHECK-BF16-SD-NEXT: bic v0.8h, #128, lsl #8
; CHECK-BF16-SD-NEXT: ret
;
; CHECK-BF16SVE-SD-LABEL: test_fabs:
; CHECK-BF16SVE-SD: // %bb.0:
; CHECK-BF16SVE-SD-NEXT: fabs v0.8h, v0.8h
; CHECK-BF16SVE-SD-NEXT: ret
;
; CHECK-CVT-GI-LABEL: test_fabs:
; CHECK-CVT-GI: // %bb.0:
; CHECK-CVT-GI-NEXT: mvni v1.8h, #128, lsl #8
; CHECK-CVT-GI-NEXT: and v0.16b, v0.16b, v1.16b
; CHECK-CVT-GI-NEXT: ret
;
; CHECK-BF16-GI-LABEL: test_fabs:
; CHECK-BF16-GI: // %bb.0:
; CHECK-BF16-GI-NEXT: mvni v1.8h, #128, lsl #8
; CHECK-BF16-GI-NEXT: and v0.16b, v0.16b, v1.16b
; CHECK-BF16-GI-NEXT: ret
%r = call <8 x bfloat> @llvm.fabs.v8bf16(<8 x bfloat> %a)
ret <8 x bfloat> %r
}
define <8 x bfloat> @test_fneg(<8 x bfloat> %a) #0 {
; CHECK-CVT-LABEL: test_fneg:
; CHECK-CVT: // %bb.0:
; CHECK-CVT-NEXT: movi v1.8h, #128, lsl #8
; CHECK-CVT-NEXT: eor v0.16b, v0.16b, v1.16b
; CHECK-CVT-NEXT: ret
;
; CHECK-BF16-SD-LABEL: test_fneg:
; CHECK-BF16-SD: // %bb.0:
; CHECK-BF16-SD-NEXT: movi v1.8h, #128, lsl #8
; CHECK-BF16-SD-NEXT: eor v0.16b, v0.16b, v1.16b
; CHECK-BF16-SD-NEXT: ret
;
; CHECK-BF16SVE-SD-LABEL: test_fneg:
; CHECK-BF16SVE-SD: // %bb.0:
; CHECK-BF16SVE-SD-NEXT: fneg v0.8h, v0.8h
; CHECK-BF16SVE-SD-NEXT: ret
;
; CHECK-BF16-GI-LABEL: test_fneg:
; CHECK-BF16-GI: // %bb.0:
; CHECK-BF16-GI-NEXT: movi v1.8h, #128, lsl #8
; CHECK-BF16-GI-NEXT: eor v0.16b, v0.16b, v1.16b
; CHECK-BF16-GI-NEXT: ret
%r = fneg <8 x bfloat> %a
ret <8 x bfloat> %r
}
define <8 x bfloat> @test_minnum(<8 x bfloat> %a, <8 x bfloat> %b) #0 {
; CHECK-CVT-SD-LABEL: test_minnum:
; CHECK-CVT-SD: // %bb.0:
; CHECK-CVT-SD-NEXT: mov h2, v1.h[1]
; CHECK-CVT-SD-NEXT: mov h3, v0.h[1]
; CHECK-CVT-SD-NEXT: mov w8, #32767 // =0x7fff
; CHECK-CVT-SD-NEXT: shll v4.4s, v1.4h, #16
; CHECK-CVT-SD-NEXT: shll v5.4s, v0.4h, #16
; CHECK-CVT-SD-NEXT: mov h6, v1.h[2]
; CHECK-CVT-SD-NEXT: mov h7, v0.h[2]
; CHECK-CVT-SD-NEXT: mov h16, v1.h[3]
; CHECK-CVT-SD-NEXT: shll v2.4s, v2.4h, #16
; CHECK-CVT-SD-NEXT: shll v3.4s, v3.4h, #16
; CHECK-CVT-SD-NEXT: fminnm s4, s5, s4
; CHECK-CVT-SD-NEXT: shll v5.4s, v6.4h, #16
; CHECK-CVT-SD-NEXT: shll v6.4s, v7.4h, #16
; CHECK-CVT-SD-NEXT: mov h7, v1.h[4]
; CHECK-CVT-SD-NEXT: shll v16.4s, v16.4h, #16
; CHECK-CVT-SD-NEXT: fminnm s2, s3, s2
; CHECK-CVT-SD-NEXT: mov h3, v0.h[3]
; CHECK-CVT-SD-NEXT: fmov w9, s4
; CHECK-CVT-SD-NEXT: mov h4, v0.h[4]
; CHECK-CVT-SD-NEXT: fminnm s5, s6, s5
; CHECK-CVT-SD-NEXT: shll v6.4s, v7.4h, #16
; CHECK-CVT-SD-NEXT: fmov w11, s2
; CHECK-CVT-SD-NEXT: shll v2.4s, v3.4h, #16
; CHECK-CVT-SD-NEXT: ubfx w10, w9, #16, #1
; CHECK-CVT-SD-NEXT: add w9, w9, w8
; CHECK-CVT-SD-NEXT: mov h3, v1.h[5]
; CHECK-CVT-SD-NEXT: shll v4.4s, v4.4h, #16
; CHECK-CVT-SD-NEXT: add w9, w10, w9
; CHECK-CVT-SD-NEXT: ubfx w12, w11, #16, #1
; CHECK-CVT-SD-NEXT: add w10, w11, w8
; CHECK-CVT-SD-NEXT: fminnm s7, s2, s16
; CHECK-CVT-SD-NEXT: fmov w11, s5
; CHECK-CVT-SD-NEXT: lsr w9, w9, #16
; CHECK-CVT-SD-NEXT: mov h5, v0.h[5]
; CHECK-CVT-SD-NEXT: add w10, w12, w10
; CHECK-CVT-SD-NEXT: fminnm s4, s4, s6
; CHECK-CVT-SD-NEXT: mov h6, v1.h[6]
; CHECK-CVT-SD-NEXT: lsr w10, w10, #16
; CHECK-CVT-SD-NEXT: fmov s2, w9
; CHECK-CVT-SD-NEXT: shll v3.4s, v3.4h, #16
; CHECK-CVT-SD-NEXT: ubfx w9, w11, #16, #1
; CHECK-CVT-SD-NEXT: add w11, w11, w8
; CHECK-CVT-SD-NEXT: mov h1, v1.h[7]
; CHECK-CVT-SD-NEXT: fmov s16, w10
; CHECK-CVT-SD-NEXT: fmov w10, s7
; CHECK-CVT-SD-NEXT: shll v5.4s, v5.4h, #16
; CHECK-CVT-SD-NEXT: add w9, w9, w11
; CHECK-CVT-SD-NEXT: mov h7, v0.h[6]
; CHECK-CVT-SD-NEXT: mov h0, v0.h[7]
; CHECK-CVT-SD-NEXT: lsr w9, w9, #16
; CHECK-CVT-SD-NEXT: ubfx w11, w10, #16, #1
; CHECK-CVT-SD-NEXT: mov v2.h[1], v16.h[0]
; CHECK-CVT-SD-NEXT: add w10, w10, w8
; CHECK-CVT-SD-NEXT: fmov s16, w9
; CHECK-CVT-SD-NEXT: fminnm s3, s5, s3
; CHECK-CVT-SD-NEXT: shll v1.4s, v1.4h, #16
; CHECK-CVT-SD-NEXT: add w9, w11, w10
; CHECK-CVT-SD-NEXT: fmov w10, s4
; CHECK-CVT-SD-NEXT: shll v4.4s, v6.4h, #16
; CHECK-CVT-SD-NEXT: shll v5.4s, v7.4h, #16
; CHECK-CVT-SD-NEXT: lsr w9, w9, #16
; CHECK-CVT-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-CVT-SD-NEXT: mov v2.h[2], v16.h[0]
; CHECK-CVT-SD-NEXT: ubfx w11, w10, #16, #1
; CHECK-CVT-SD-NEXT: fmov s6, w9
; CHECK-CVT-SD-NEXT: add w9, w10, w8
; CHECK-CVT-SD-NEXT: fmov w10, s3
; CHECK-CVT-SD-NEXT: fminnm s3, s5, s4
; CHECK-CVT-SD-NEXT: fminnm s0, s0, s1
; CHECK-CVT-SD-NEXT: add w9, w11, w9
; CHECK-CVT-SD-NEXT: lsr w9, w9, #16
; CHECK-CVT-SD-NEXT: mov v2.h[3], v6.h[0]
; CHECK-CVT-SD-NEXT: ubfx w11, w10, #16, #1
; CHECK-CVT-SD-NEXT: fmov s4, w9
; CHECK-CVT-SD-NEXT: add w9, w10, w8
; CHECK-CVT-SD-NEXT: fmov w10, s3
; CHECK-CVT-SD-NEXT: add w9, w11, w9
; CHECK-CVT-SD-NEXT: lsr w9, w9, #16
; CHECK-CVT-SD-NEXT: mov v2.h[4], v4.h[0]
; CHECK-CVT-SD-NEXT: ubfx w11, w10, #16, #1
; CHECK-CVT-SD-NEXT: fmov s1, w9
; CHECK-CVT-SD-NEXT: add w9, w10, w8
; CHECK-CVT-SD-NEXT: fmov w10, s0
; CHECK-CVT-SD-NEXT: add w9, w11, w9
; CHECK-CVT-SD-NEXT: lsr w9, w9, #16
; CHECK-CVT-SD-NEXT: mov v2.h[5], v1.h[0]
; CHECK-CVT-SD-NEXT: ubfx w11, w10, #16, #1
; CHECK-CVT-SD-NEXT: add w8, w10, w8
; CHECK-CVT-SD-NEXT: fmov s0, w9
; CHECK-CVT-SD-NEXT: add w8, w11, w8
; CHECK-CVT-SD-NEXT: lsr w8, w8, #16
; CHECK-CVT-SD-NEXT: mov v2.h[6], v0.h[0]
; CHECK-CVT-SD-NEXT: fmov s0, w8
; CHECK-CVT-SD-NEXT: mov v2.h[7], v0.h[0]
; CHECK-CVT-SD-NEXT: mov v0.16b, v2.16b
; CHECK-CVT-SD-NEXT: ret
;
; CHECK-BF16-SD-LABEL: test_minnum:
; CHECK-BF16-SD: // %bb.0:
; CHECK-BF16-SD-NEXT: mov h2, v1.h[1]
; CHECK-BF16-SD-NEXT: mov h3, v0.h[1]
; CHECK-BF16-SD-NEXT: shll v4.4s, v1.4h, #16
; CHECK-BF16-SD-NEXT: shll v5.4s, v0.4h, #16
; CHECK-BF16-SD-NEXT: mov h6, v1.h[2]
; CHECK-BF16-SD-NEXT: mov h7, v0.h[2]
; CHECK-BF16-SD-NEXT: mov h16, v1.h[3]
; CHECK-BF16-SD-NEXT: shll v2.4s, v2.4h, #16
; CHECK-BF16-SD-NEXT: shll v3.4s, v3.4h, #16
; CHECK-BF16-SD-NEXT: fminnm s4, s5, s4
; CHECK-BF16-SD-NEXT: mov h5, v0.h[3]
; CHECK-BF16-SD-NEXT: shll v6.4s, v6.4h, #16
; CHECK-BF16-SD-NEXT: shll v7.4s, v7.4h, #16
; CHECK-BF16-SD-NEXT: fminnm s3, s3, s2
; CHECK-BF16-SD-NEXT: bfcvt h2, s4
; CHECK-BF16-SD-NEXT: fminnm s4, s7, s6
; CHECK-BF16-SD-NEXT: shll v6.4s, v16.4h, #16
; CHECK-BF16-SD-NEXT: shll v5.4s, v5.4h, #16
; CHECK-BF16-SD-NEXT: mov h7, v1.h[4]
; CHECK-BF16-SD-NEXT: mov h16, v0.h[4]
; CHECK-BF16-SD-NEXT: bfcvt h3, s3
; CHECK-BF16-SD-NEXT: fminnm s5, s5, s6
; CHECK-BF16-SD-NEXT: bfcvt h4, s4
; CHECK-BF16-SD-NEXT: mov h6, v0.h[5]
; CHECK-BF16-SD-NEXT: shll v7.4s, v7.4h, #16
; CHECK-BF16-SD-NEXT: shll v16.4s, v16.4h, #16
; CHECK-BF16-SD-NEXT: mov v2.h[1], v3.h[0]
; CHECK-BF16-SD-NEXT: mov h3, v1.h[5]
; CHECK-BF16-SD-NEXT: bfcvt h5, s5
; CHECK-BF16-SD-NEXT: fminnm s7, s16, s7
; CHECK-BF16-SD-NEXT: mov h16, v0.h[6]
; CHECK-BF16-SD-NEXT: shll v6.4s, v6.4h, #16
; CHECK-BF16-SD-NEXT: mov h0, v0.h[7]
; CHECK-BF16-SD-NEXT: mov v2.h[2], v4.h[0]
; CHECK-BF16-SD-NEXT: mov h4, v1.h[6]
; CHECK-BF16-SD-NEXT: shll v3.4s, v3.4h, #16
; CHECK-BF16-SD-NEXT: mov h1, v1.h[7]
; CHECK-BF16-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16-SD-NEXT: fminnm s3, s6, s3
; CHECK-BF16-SD-NEXT: shll v6.4s, v16.4h, #16
; CHECK-BF16-SD-NEXT: mov v2.h[3], v5.h[0]
; CHECK-BF16-SD-NEXT: bfcvt h5, s7
; CHECK-BF16-SD-NEXT: shll v4.4s, v4.4h, #16
; CHECK-BF16-SD-NEXT: shll v1.4s, v1.4h, #16
; CHECK-BF16-SD-NEXT: fminnm s4, s6, s4
; CHECK-BF16-SD-NEXT: bfcvt h3, s3
; CHECK-BF16-SD-NEXT: mov v2.h[4], v5.h[0]
; CHECK-BF16-SD-NEXT: fminnm s0, s0, s1
; CHECK-BF16-SD-NEXT: mov v2.h[5], v3.h[0]
; CHECK-BF16-SD-NEXT: bfcvt h3, s4
; CHECK-BF16-SD-NEXT: bfcvt h0, s0
; CHECK-BF16-SD-NEXT: mov v2.h[6], v3.h[0]
; CHECK-BF16-SD-NEXT: mov v2.h[7], v0.h[0]
; CHECK-BF16-SD-NEXT: mov v0.16b, v2.16b
; CHECK-BF16-SD-NEXT: ret
;
; CHECK-BF16SVE-SD-LABEL: test_minnum:
; CHECK-BF16SVE-SD: // %bb.0:
; CHECK-BF16SVE-SD-NEXT: mov h2, v1.h[1]
; CHECK-BF16SVE-SD-NEXT: mov h3, v0.h[1]
; CHECK-BF16SVE-SD-NEXT: shll v4.4s, v1.4h, #16
; CHECK-BF16SVE-SD-NEXT: shll v5.4s, v0.4h, #16
; CHECK-BF16SVE-SD-NEXT: mov h6, v1.h[2]
; CHECK-BF16SVE-SD-NEXT: mov h7, v0.h[2]
; CHECK-BF16SVE-SD-NEXT: mov h16, v1.h[3]
; CHECK-BF16SVE-SD-NEXT: shll v2.4s, v2.4h, #16
; CHECK-BF16SVE-SD-NEXT: shll v3.4s, v3.4h, #16
; CHECK-BF16SVE-SD-NEXT: fminnm s4, s5, s4
; CHECK-BF16SVE-SD-NEXT: mov h5, v0.h[3]
; CHECK-BF16SVE-SD-NEXT: shll v6.4s, v6.4h, #16
; CHECK-BF16SVE-SD-NEXT: shll v7.4s, v7.4h, #16
; CHECK-BF16SVE-SD-NEXT: fminnm s3, s3, s2
; CHECK-BF16SVE-SD-NEXT: bfcvt h2, s4
; CHECK-BF16SVE-SD-NEXT: fminnm s4, s7, s6
; CHECK-BF16SVE-SD-NEXT: shll v6.4s, v16.4h, #16
; CHECK-BF16SVE-SD-NEXT: shll v5.4s, v5.4h, #16
; CHECK-BF16SVE-SD-NEXT: mov h7, v1.h[4]
; CHECK-BF16SVE-SD-NEXT: mov h16, v0.h[4]
; CHECK-BF16SVE-SD-NEXT: bfcvt h3, s3
; CHECK-BF16SVE-SD-NEXT: fminnm s5, s5, s6
; CHECK-BF16SVE-SD-NEXT: bfcvt h4, s4
; CHECK-BF16SVE-SD-NEXT: mov h6, v0.h[5]
; CHECK-BF16SVE-SD-NEXT: shll v7.4s, v7.4h, #16
; CHECK-BF16SVE-SD-NEXT: shll v16.4s, v16.4h, #16
; CHECK-BF16SVE-SD-NEXT: mov v2.h[1], v3.h[0]
; CHECK-BF16SVE-SD-NEXT: mov h3, v1.h[5]
; CHECK-BF16SVE-SD-NEXT: bfcvt h5, s5
; CHECK-BF16SVE-SD-NEXT: fminnm s7, s16, s7
; CHECK-BF16SVE-SD-NEXT: mov h16, v0.h[6]
; CHECK-BF16SVE-SD-NEXT: shll v6.4s, v6.4h, #16
; CHECK-BF16SVE-SD-NEXT: mov h0, v0.h[7]
; CHECK-BF16SVE-SD-NEXT: mov v2.h[2], v4.h[0]
; CHECK-BF16SVE-SD-NEXT: mov h4, v1.h[6]
; CHECK-BF16SVE-SD-NEXT: shll v3.4s, v3.4h, #16
; CHECK-BF16SVE-SD-NEXT: mov h1, v1.h[7]
; CHECK-BF16SVE-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16SVE-SD-NEXT: fminnm s3, s6, s3
; CHECK-BF16SVE-SD-NEXT: shll v6.4s, v16.4h, #16
; CHECK-BF16SVE-SD-NEXT: mov v2.h[3], v5.h[0]
; CHECK-BF16SVE-SD-NEXT: bfcvt h5, s7
; CHECK-BF16SVE-SD-NEXT: shll v4.4s, v4.4h, #16
; CHECK-BF16SVE-SD-NEXT: shll v1.4s, v1.4h, #16
; CHECK-BF16SVE-SD-NEXT: fminnm s4, s6, s4
; CHECK-BF16SVE-SD-NEXT: bfcvt h3, s3
; CHECK-BF16SVE-SD-NEXT: mov v2.h[4], v5.h[0]
; CHECK-BF16SVE-SD-NEXT: fminnm s0, s0, s1
; CHECK-BF16SVE-SD-NEXT: mov v2.h[5], v3.h[0]
; CHECK-BF16SVE-SD-NEXT: bfcvt h3, s4
; CHECK-BF16SVE-SD-NEXT: bfcvt h0, s0
; CHECK-BF16SVE-SD-NEXT: mov v2.h[6], v3.h[0]
; CHECK-BF16SVE-SD-NEXT: mov v2.h[7], v0.h[0]
; CHECK-BF16SVE-SD-NEXT: mov v0.16b, v2.16b
; CHECK-BF16SVE-SD-NEXT: ret
;
; CHECK-CVT-GI-LABEL: test_minnum:
; CHECK-CVT-GI: // %bb.0:
; CHECK-CVT-GI-NEXT: shll v2.4s, v0.4h, #16
; CHECK-CVT-GI-NEXT: shll v3.4s, v1.4h, #16
; CHECK-CVT-GI-NEXT: shll2 v0.4s, v0.8h, #16
; CHECK-CVT-GI-NEXT: shll2 v1.4s, v1.8h, #16
; CHECK-CVT-GI-NEXT: movi v6.4s, #64, lsl #16
; CHECK-CVT-GI-NEXT: fminnm v2.4s, v2.4s, v3.4s
; CHECK-CVT-GI-NEXT: movi v3.4s, #127, msl #8
; CHECK-CVT-GI-NEXT: fminnm v0.4s, v0.4s, v1.4s
; CHECK-CVT-GI-NEXT: movi v1.4s, #1
; CHECK-CVT-GI-NEXT: ushr v4.4s, v2.4s, #16
; CHECK-CVT-GI-NEXT: fcmeq v7.4s, v2.4s, v2.4s
; CHECK-CVT-GI-NEXT: add v16.4s, v2.4s, v3.4s
; CHECK-CVT-GI-NEXT: ushr v5.4s, v0.4s, #16
; CHECK-CVT-GI-NEXT: fcmeq v17.4s, v0.4s, v0.4s
; CHECK-CVT-GI-NEXT: add v3.4s, v0.4s, v3.4s
; CHECK-CVT-GI-NEXT: orr v2.16b, v2.16b, v6.16b
; CHECK-CVT-GI-NEXT: orr v0.16b, v0.16b, v6.16b
; CHECK-CVT-GI-NEXT: and v4.16b, v4.16b, v1.16b
; CHECK-CVT-GI-NEXT: and v1.16b, v5.16b, v1.16b
; CHECK-CVT-GI-NEXT: mvn v5.16b, v7.16b
; CHECK-CVT-GI-NEXT: mvn v7.16b, v17.16b
; CHECK-CVT-GI-NEXT: add v4.4s, v16.4s, v4.4s
; CHECK-CVT-GI-NEXT: add v1.4s, v3.4s, v1.4s
; CHECK-CVT-GI-NEXT: bif v2.16b, v4.16b, v5.16b
; CHECK-CVT-GI-NEXT: bit v1.16b, v0.16b, v7.16b
; CHECK-CVT-GI-NEXT: shrn v0.4h, v2.4s, #16
; CHECK-CVT-GI-NEXT: shrn v1.4h, v1.4s, #16
; CHECK-CVT-GI-NEXT: mov v0.d[1], v1.d[0]
; CHECK-CVT-GI-NEXT: ret
;
; CHECK-BF16-GI-LABEL: test_minnum:
; CHECK-BF16-GI: // %bb.0:
; CHECK-BF16-GI-NEXT: shll v2.4s, v0.4h, #16
; CHECK-BF16-GI-NEXT: shll v3.4s, v1.4h, #16
; CHECK-BF16-GI-NEXT: shll2 v0.4s, v0.8h, #16
; CHECK-BF16-GI-NEXT: shll2 v1.4s, v1.8h, #16
; CHECK-BF16-GI-NEXT: fminnm v2.4s, v2.4s, v3.4s
; CHECK-BF16-GI-NEXT: fminnm v1.4s, v0.4s, v1.4s
; CHECK-BF16-GI-NEXT: bfcvtn v0.4h, v2.4s
; CHECK-BF16-GI-NEXT: bfcvtn2 v0.8h, v1.4s
; CHECK-BF16-GI-NEXT: ret
%r = call <8 x bfloat> @llvm.minnum.v8bf16(<8 x bfloat> %a, <8 x bfloat> %b)
ret <8 x bfloat> %r
}
define <8 x bfloat> @test_maxnum(<8 x bfloat> %a, <8 x bfloat> %b) #0 {
; CHECK-CVT-SD-LABEL: test_maxnum:
; CHECK-CVT-SD: // %bb.0:
; CHECK-CVT-SD-NEXT: mov h2, v1.h[1]
; CHECK-CVT-SD-NEXT: mov h3, v0.h[1]
; CHECK-CVT-SD-NEXT: mov w8, #32767 // =0x7fff
; CHECK-CVT-SD-NEXT: shll v4.4s, v1.4h, #16
; CHECK-CVT-SD-NEXT: shll v5.4s, v0.4h, #16
; CHECK-CVT-SD-NEXT: mov h6, v1.h[2]
; CHECK-CVT-SD-NEXT: mov h7, v0.h[2]
; CHECK-CVT-SD-NEXT: mov h16, v1.h[3]
; CHECK-CVT-SD-NEXT: shll v2.4s, v2.4h, #16
; CHECK-CVT-SD-NEXT: shll v3.4s, v3.4h, #16
; CHECK-CVT-SD-NEXT: fmaxnm s4, s5, s4
; CHECK-CVT-SD-NEXT: shll v5.4s, v6.4h, #16
; CHECK-CVT-SD-NEXT: shll v6.4s, v7.4h, #16
; CHECK-CVT-SD-NEXT: mov h7, v1.h[4]
; CHECK-CVT-SD-NEXT: shll v16.4s, v16.4h, #16
; CHECK-CVT-SD-NEXT: fmaxnm s2, s3, s2
; CHECK-CVT-SD-NEXT: mov h3, v0.h[3]
; CHECK-CVT-SD-NEXT: fmov w9, s4
; CHECK-CVT-SD-NEXT: mov h4, v0.h[4]
; CHECK-CVT-SD-NEXT: fmaxnm s5, s6, s5
; CHECK-CVT-SD-NEXT: shll v6.4s, v7.4h, #16
; CHECK-CVT-SD-NEXT: fmov w11, s2
; CHECK-CVT-SD-NEXT: shll v2.4s, v3.4h, #16
; CHECK-CVT-SD-NEXT: ubfx w10, w9, #16, #1
; CHECK-CVT-SD-NEXT: add w9, w9, w8
; CHECK-CVT-SD-NEXT: mov h3, v1.h[5]
; CHECK-CVT-SD-NEXT: shll v4.4s, v4.4h, #16
; CHECK-CVT-SD-NEXT: add w9, w10, w9
; CHECK-CVT-SD-NEXT: ubfx w12, w11, #16, #1
; CHECK-CVT-SD-NEXT: add w10, w11, w8
; CHECK-CVT-SD-NEXT: fmaxnm s7, s2, s16
; CHECK-CVT-SD-NEXT: fmov w11, s5
; CHECK-CVT-SD-NEXT: lsr w9, w9, #16
; CHECK-CVT-SD-NEXT: mov h5, v0.h[5]
; CHECK-CVT-SD-NEXT: add w10, w12, w10
; CHECK-CVT-SD-NEXT: fmaxnm s4, s4, s6
; CHECK-CVT-SD-NEXT: mov h6, v1.h[6]
; CHECK-CVT-SD-NEXT: lsr w10, w10, #16
; CHECK-CVT-SD-NEXT: fmov s2, w9
; CHECK-CVT-SD-NEXT: shll v3.4s, v3.4h, #16
; CHECK-CVT-SD-NEXT: ubfx w9, w11, #16, #1
; CHECK-CVT-SD-NEXT: add w11, w11, w8
; CHECK-CVT-SD-NEXT: mov h1, v1.h[7]
; CHECK-CVT-SD-NEXT: fmov s16, w10
; CHECK-CVT-SD-NEXT: fmov w10, s7
; CHECK-CVT-SD-NEXT: shll v5.4s, v5.4h, #16
; CHECK-CVT-SD-NEXT: add w9, w9, w11
; CHECK-CVT-SD-NEXT: mov h7, v0.h[6]
; CHECK-CVT-SD-NEXT: mov h0, v0.h[7]
; CHECK-CVT-SD-NEXT: lsr w9, w9, #16
; CHECK-CVT-SD-NEXT: ubfx w11, w10, #16, #1
; CHECK-CVT-SD-NEXT: mov v2.h[1], v16.h[0]
; CHECK-CVT-SD-NEXT: add w10, w10, w8
; CHECK-CVT-SD-NEXT: fmov s16, w9
; CHECK-CVT-SD-NEXT: fmaxnm s3, s5, s3
; CHECK-CVT-SD-NEXT: shll v1.4s, v1.4h, #16
; CHECK-CVT-SD-NEXT: add w9, w11, w10
; CHECK-CVT-SD-NEXT: fmov w10, s4
; CHECK-CVT-SD-NEXT: shll v4.4s, v6.4h, #16
; CHECK-CVT-SD-NEXT: shll v5.4s, v7.4h, #16
; CHECK-CVT-SD-NEXT: lsr w9, w9, #16
; CHECK-CVT-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-CVT-SD-NEXT: mov v2.h[2], v16.h[0]
; CHECK-CVT-SD-NEXT: ubfx w11, w10, #16, #1
; CHECK-CVT-SD-NEXT: fmov s6, w9
; CHECK-CVT-SD-NEXT: add w9, w10, w8
; CHECK-CVT-SD-NEXT: fmov w10, s3
; CHECK-CVT-SD-NEXT: fmaxnm s3, s5, s4
; CHECK-CVT-SD-NEXT: fmaxnm s0, s0, s1
; CHECK-CVT-SD-NEXT: add w9, w11, w9
; CHECK-CVT-SD-NEXT: lsr w9, w9, #16
; CHECK-CVT-SD-NEXT: mov v2.h[3], v6.h[0]
; CHECK-CVT-SD-NEXT: ubfx w11, w10, #16, #1
; CHECK-CVT-SD-NEXT: fmov s4, w9
; CHECK-CVT-SD-NEXT: add w9, w10, w8
; CHECK-CVT-SD-NEXT: fmov w10, s3
; CHECK-CVT-SD-NEXT: add w9, w11, w9
; CHECK-CVT-SD-NEXT: lsr w9, w9, #16
; CHECK-CVT-SD-NEXT: mov v2.h[4], v4.h[0]
; CHECK-CVT-SD-NEXT: ubfx w11, w10, #16, #1
; CHECK-CVT-SD-NEXT: fmov s1, w9
; CHECK-CVT-SD-NEXT: add w9, w10, w8
; CHECK-CVT-SD-NEXT: fmov w10, s0
; CHECK-CVT-SD-NEXT: add w9, w11, w9
; CHECK-CVT-SD-NEXT: lsr w9, w9, #16
; CHECK-CVT-SD-NEXT: mov v2.h[5], v1.h[0]
; CHECK-CVT-SD-NEXT: ubfx w11, w10, #16, #1
; CHECK-CVT-SD-NEXT: add w8, w10, w8
; CHECK-CVT-SD-NEXT: fmov s0, w9
; CHECK-CVT-SD-NEXT: add w8, w11, w8
; CHECK-CVT-SD-NEXT: lsr w8, w8, #16
; CHECK-CVT-SD-NEXT: mov v2.h[6], v0.h[0]
; CHECK-CVT-SD-NEXT: fmov s0, w8
; CHECK-CVT-SD-NEXT: mov v2.h[7], v0.h[0]
; CHECK-CVT-SD-NEXT: mov v0.16b, v2.16b
; CHECK-CVT-SD-NEXT: ret
;
; CHECK-BF16-SD-LABEL: test_maxnum:
; CHECK-BF16-SD: // %bb.0:
; CHECK-BF16-SD-NEXT: mov h2, v1.h[1]
; CHECK-BF16-SD-NEXT: mov h3, v0.h[1]
; CHECK-BF16-SD-NEXT: shll v4.4s, v1.4h, #16
; CHECK-BF16-SD-NEXT: shll v5.4s, v0.4h, #16
; CHECK-BF16-SD-NEXT: mov h6, v1.h[2]
; CHECK-BF16-SD-NEXT: mov h7, v0.h[2]
; CHECK-BF16-SD-NEXT: mov h16, v1.h[3]
; CHECK-BF16-SD-NEXT: shll v2.4s, v2.4h, #16
; CHECK-BF16-SD-NEXT: shll v3.4s, v3.4h, #16
; CHECK-BF16-SD-NEXT: fmaxnm s4, s5, s4
; CHECK-BF16-SD-NEXT: mov h5, v0.h[3]
; CHECK-BF16-SD-NEXT: shll v6.4s, v6.4h, #16
; CHECK-BF16-SD-NEXT: shll v7.4s, v7.4h, #16
; CHECK-BF16-SD-NEXT: fmaxnm s3, s3, s2
; CHECK-BF16-SD-NEXT: bfcvt h2, s4
; CHECK-BF16-SD-NEXT: fmaxnm s4, s7, s6
; CHECK-BF16-SD-NEXT: shll v6.4s, v16.4h, #16
; CHECK-BF16-SD-NEXT: shll v5.4s, v5.4h, #16
; CHECK-BF16-SD-NEXT: mov h7, v1.h[4]
; CHECK-BF16-SD-NEXT: mov h16, v0.h[4]
; CHECK-BF16-SD-NEXT: bfcvt h3, s3
; CHECK-BF16-SD-NEXT: fmaxnm s5, s5, s6
; CHECK-BF16-SD-NEXT: bfcvt h4, s4
; CHECK-BF16-SD-NEXT: mov h6, v0.h[5]
; CHECK-BF16-SD-NEXT: shll v7.4s, v7.4h, #16
; CHECK-BF16-SD-NEXT: shll v16.4s, v16.4h, #16
; CHECK-BF16-SD-NEXT: mov v2.h[1], v3.h[0]
; CHECK-BF16-SD-NEXT: mov h3, v1.h[5]
; CHECK-BF16-SD-NEXT: bfcvt h5, s5
; CHECK-BF16-SD-NEXT: fmaxnm s7, s16, s7
; CHECK-BF16-SD-NEXT: mov h16, v0.h[6]
; CHECK-BF16-SD-NEXT: shll v6.4s, v6.4h, #16
; CHECK-BF16-SD-NEXT: mov h0, v0.h[7]
; CHECK-BF16-SD-NEXT: mov v2.h[2], v4.h[0]
; CHECK-BF16-SD-NEXT: mov h4, v1.h[6]
; CHECK-BF16-SD-NEXT: shll v3.4s, v3.4h, #16
; CHECK-BF16-SD-NEXT: mov h1, v1.h[7]
; CHECK-BF16-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16-SD-NEXT: fmaxnm s3, s6, s3
; CHECK-BF16-SD-NEXT: shll v6.4s, v16.4h, #16
; CHECK-BF16-SD-NEXT: mov v2.h[3], v5.h[0]
; CHECK-BF16-SD-NEXT: bfcvt h5, s7
; CHECK-BF16-SD-NEXT: shll v4.4s, v4.4h, #16
; CHECK-BF16-SD-NEXT: shll v1.4s, v1.4h, #16
; CHECK-BF16-SD-NEXT: fmaxnm s4, s6, s4
; CHECK-BF16-SD-NEXT: bfcvt h3, s3
; CHECK-BF16-SD-NEXT: mov v2.h[4], v5.h[0]
; CHECK-BF16-SD-NEXT: fmaxnm s0, s0, s1
; CHECK-BF16-SD-NEXT: mov v2.h[5], v3.h[0]
; CHECK-BF16-SD-NEXT: bfcvt h3, s4
; CHECK-BF16-SD-NEXT: bfcvt h0, s0
; CHECK-BF16-SD-NEXT: mov v2.h[6], v3.h[0]
; CHECK-BF16-SD-NEXT: mov v2.h[7], v0.h[0]
; CHECK-BF16-SD-NEXT: mov v0.16b, v2.16b
; CHECK-BF16-SD-NEXT: ret
;
; CHECK-BF16SVE-SD-LABEL: test_maxnum:
; CHECK-BF16SVE-SD: // %bb.0:
; CHECK-BF16SVE-SD-NEXT: mov h2, v1.h[1]
; CHECK-BF16SVE-SD-NEXT: mov h3, v0.h[1]
; CHECK-BF16SVE-SD-NEXT: shll v4.4s, v1.4h, #16
; CHECK-BF16SVE-SD-NEXT: shll v5.4s, v0.4h, #16
; CHECK-BF16SVE-SD-NEXT: mov h6, v1.h[2]
; CHECK-BF16SVE-SD-NEXT: mov h7, v0.h[2]
; CHECK-BF16SVE-SD-NEXT: mov h16, v1.h[3]
; CHECK-BF16SVE-SD-NEXT: shll v2.4s, v2.4h, #16
; CHECK-BF16SVE-SD-NEXT: shll v3.4s, v3.4h, #16
; CHECK-BF16SVE-SD-NEXT: fmaxnm s4, s5, s4
; CHECK-BF16SVE-SD-NEXT: mov h5, v0.h[3]
; CHECK-BF16SVE-SD-NEXT: shll v6.4s, v6.4h, #16
; CHECK-BF16SVE-SD-NEXT: shll v7.4s, v7.4h, #16
; CHECK-BF16SVE-SD-NEXT: fmaxnm s3, s3, s2
; CHECK-BF16SVE-SD-NEXT: bfcvt h2, s4
; CHECK-BF16SVE-SD-NEXT: fmaxnm s4, s7, s6
; CHECK-BF16SVE-SD-NEXT: shll v6.4s, v16.4h, #16
; CHECK-BF16SVE-SD-NEXT: shll v5.4s, v5.4h, #16
; CHECK-BF16SVE-SD-NEXT: mov h7, v1.h[4]
; CHECK-BF16SVE-SD-NEXT: mov h16, v0.h[4]
; CHECK-BF16SVE-SD-NEXT: bfcvt h3, s3
; CHECK-BF16SVE-SD-NEXT: fmaxnm s5, s5, s6
; CHECK-BF16SVE-SD-NEXT: bfcvt h4, s4
; CHECK-BF16SVE-SD-NEXT: mov h6, v0.h[5]
; CHECK-BF16SVE-SD-NEXT: shll v7.4s, v7.4h, #16
; CHECK-BF16SVE-SD-NEXT: shll v16.4s, v16.4h, #16
; CHECK-BF16SVE-SD-NEXT: mov v2.h[1], v3.h[0]
; CHECK-BF16SVE-SD-NEXT: mov h3, v1.h[5]
; CHECK-BF16SVE-SD-NEXT: bfcvt h5, s5
; CHECK-BF16SVE-SD-NEXT: fmaxnm s7, s16, s7
; CHECK-BF16SVE-SD-NEXT: mov h16, v0.h[6]
; CHECK-BF16SVE-SD-NEXT: shll v6.4s, v6.4h, #16
; CHECK-BF16SVE-SD-NEXT: mov h0, v0.h[7]
; CHECK-BF16SVE-SD-NEXT: mov v2.h[2], v4.h[0]
; CHECK-BF16SVE-SD-NEXT: mov h4, v1.h[6]
; CHECK-BF16SVE-SD-NEXT: shll v3.4s, v3.4h, #16
; CHECK-BF16SVE-SD-NEXT: mov h1, v1.h[7]
; CHECK-BF16SVE-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16SVE-SD-NEXT: fmaxnm s3, s6, s3
; CHECK-BF16SVE-SD-NEXT: shll v6.4s, v16.4h, #16
; CHECK-BF16SVE-SD-NEXT: mov v2.h[3], v5.h[0]
; CHECK-BF16SVE-SD-NEXT: bfcvt h5, s7
; CHECK-BF16SVE-SD-NEXT: shll v4.4s, v4.4h, #16
; CHECK-BF16SVE-SD-NEXT: shll v1.4s, v1.4h, #16
; CHECK-BF16SVE-SD-NEXT: fmaxnm s4, s6, s4
; CHECK-BF16SVE-SD-NEXT: bfcvt h3, s3
; CHECK-BF16SVE-SD-NEXT: mov v2.h[4], v5.h[0]
; CHECK-BF16SVE-SD-NEXT: fmaxnm s0, s0, s1
; CHECK-BF16SVE-SD-NEXT: mov v2.h[5], v3.h[0]
; CHECK-BF16SVE-SD-NEXT: bfcvt h3, s4
; CHECK-BF16SVE-SD-NEXT: bfcvt h0, s0
; CHECK-BF16SVE-SD-NEXT: mov v2.h[6], v3.h[0]
; CHECK-BF16SVE-SD-NEXT: mov v2.h[7], v0.h[0]
; CHECK-BF16SVE-SD-NEXT: mov v0.16b, v2.16b
; CHECK-BF16SVE-SD-NEXT: ret
;
; CHECK-CVT-GI-LABEL: test_maxnum:
; CHECK-CVT-GI: // %bb.0:
; CHECK-CVT-GI-NEXT: shll v2.4s, v0.4h, #16
; CHECK-CVT-GI-NEXT: shll v3.4s, v1.4h, #16
; CHECK-CVT-GI-NEXT: shll2 v0.4s, v0.8h, #16
; CHECK-CVT-GI-NEXT: shll2 v1.4s, v1.8h, #16
; CHECK-CVT-GI-NEXT: movi v6.4s, #64, lsl #16
; CHECK-CVT-GI-NEXT: fmaxnm v2.4s, v2.4s, v3.4s
; CHECK-CVT-GI-NEXT: movi v3.4s, #127, msl #8
; CHECK-CVT-GI-NEXT: fmaxnm v0.4s, v0.4s, v1.4s
; CHECK-CVT-GI-NEXT: movi v1.4s, #1
; CHECK-CVT-GI-NEXT: ushr v4.4s, v2.4s, #16
; CHECK-CVT-GI-NEXT: fcmeq v7.4s, v2.4s, v2.4s
; CHECK-CVT-GI-NEXT: add v16.4s, v2.4s, v3.4s
; CHECK-CVT-GI-NEXT: ushr v5.4s, v0.4s, #16
; CHECK-CVT-GI-NEXT: fcmeq v17.4s, v0.4s, v0.4s
; CHECK-CVT-GI-NEXT: add v3.4s, v0.4s, v3.4s
; CHECK-CVT-GI-NEXT: orr v2.16b, v2.16b, v6.16b
; CHECK-CVT-GI-NEXT: orr v0.16b, v0.16b, v6.16b
; CHECK-CVT-GI-NEXT: and v4.16b, v4.16b, v1.16b
; CHECK-CVT-GI-NEXT: and v1.16b, v5.16b, v1.16b
; CHECK-CVT-GI-NEXT: mvn v5.16b, v7.16b
; CHECK-CVT-GI-NEXT: mvn v7.16b, v17.16b
; CHECK-CVT-GI-NEXT: add v4.4s, v16.4s, v4.4s
; CHECK-CVT-GI-NEXT: add v1.4s, v3.4s, v1.4s
; CHECK-CVT-GI-NEXT: bif v2.16b, v4.16b, v5.16b
; CHECK-CVT-GI-NEXT: bit v1.16b, v0.16b, v7.16b
; CHECK-CVT-GI-NEXT: shrn v0.4h, v2.4s, #16
; CHECK-CVT-GI-NEXT: shrn v1.4h, v1.4s, #16
; CHECK-CVT-GI-NEXT: mov v0.d[1], v1.d[0]
; CHECK-CVT-GI-NEXT: ret
;
; CHECK-BF16-GI-LABEL: test_maxnum:
; CHECK-BF16-GI: // %bb.0:
; CHECK-BF16-GI-NEXT: shll v2.4s, v0.4h, #16
; CHECK-BF16-GI-NEXT: shll v3.4s, v1.4h, #16
; CHECK-BF16-GI-NEXT: shll2 v0.4s, v0.8h, #16
; CHECK-BF16-GI-NEXT: shll2 v1.4s, v1.8h, #16
; CHECK-BF16-GI-NEXT: fmaxnm v2.4s, v2.4s, v3.4s
; CHECK-BF16-GI-NEXT: fmaxnm v1.4s, v0.4s, v1.4s
; CHECK-BF16-GI-NEXT: bfcvtn v0.4h, v2.4s
; CHECK-BF16-GI-NEXT: bfcvtn2 v0.8h, v1.4s
; CHECK-BF16-GI-NEXT: ret
%r = call <8 x bfloat> @llvm.maxnum.v8bf16(<8 x bfloat> %a, <8 x bfloat> %b)
ret <8 x bfloat> %r
}
define <8 x bfloat> @test_copysign(<8 x bfloat> %a, <8 x bfloat> %b) #0 {
; CHECK-LABEL: test_copysign:
; CHECK: // %bb.0:
; CHECK-NEXT: mvni v2.8h, #128, lsl #8
; CHECK-NEXT: bif v0.16b, v1.16b, v2.16b
; CHECK-NEXT: ret
%r = call <8 x bfloat> @llvm.copysign.v8bf16(<8 x bfloat> %a, <8 x bfloat> %b)
ret <8 x bfloat> %r
}
define <8 x bfloat> @test_copysign_f32(<8 x bfloat> %a, <8 x float> %b) #0 {
; CHECK-CVT-SD-LABEL: test_copysign_f32:
; CHECK-CVT-SD: // %bb.0:
; CHECK-CVT-SD-NEXT: movi v3.4s, #1
; CHECK-CVT-SD-NEXT: movi v4.4s, #127, msl #8
; CHECK-CVT-SD-NEXT: ushr v5.4s, v2.4s, #16
; CHECK-CVT-SD-NEXT: ushr v6.4s, v1.4s, #16
; CHECK-CVT-SD-NEXT: and v5.16b, v5.16b, v3.16b
; CHECK-CVT-SD-NEXT: add v7.4s, v2.4s, v4.4s
; CHECK-CVT-SD-NEXT: and v3.16b, v6.16b, v3.16b
; CHECK-CVT-SD-NEXT: add v4.4s, v1.4s, v4.4s
; CHECK-CVT-SD-NEXT: fcmeq v6.4s, v2.4s, v2.4s
; CHECK-CVT-SD-NEXT: orr v2.4s, #64, lsl #16
; CHECK-CVT-SD-NEXT: add v5.4s, v5.4s, v7.4s
; CHECK-CVT-SD-NEXT: fcmeq v7.4s, v1.4s, v1.4s
; CHECK-CVT-SD-NEXT: orr v1.4s, #64, lsl #16
; CHECK-CVT-SD-NEXT: add v3.4s, v3.4s, v4.4s
; CHECK-CVT-SD-NEXT: bit v2.16b, v5.16b, v6.16b
; CHECK-CVT-SD-NEXT: bit v1.16b, v3.16b, v7.16b
; CHECK-CVT-SD-NEXT: uzp2 v1.8h, v1.8h, v2.8h
; CHECK-CVT-SD-NEXT: mvni v2.8h, #128, lsl #8
; CHECK-CVT-SD-NEXT: bif v0.16b, v1.16b, v2.16b
; CHECK-CVT-SD-NEXT: ret
;
; CHECK-BF16-LABEL: test_copysign_f32:
; CHECK-BF16: // %bb.0:
; CHECK-BF16-NEXT: bfcvtn v1.4h, v1.4s
; CHECK-BF16-NEXT: bfcvtn2 v1.8h, v2.4s
; CHECK-BF16-NEXT: mvni v2.8h, #128, lsl #8
; CHECK-BF16-NEXT: bif v0.16b, v1.16b, v2.16b
; CHECK-BF16-NEXT: ret
;
; CHECK-CVT-GI-LABEL: test_copysign_f32:
; CHECK-CVT-GI: // %bb.0:
; CHECK-CVT-GI-NEXT: movi v3.4s, #1
; CHECK-CVT-GI-NEXT: movi v4.4s, #127, msl #8
; CHECK-CVT-GI-NEXT: ushr v5.4s, v1.4s, #16
; CHECK-CVT-GI-NEXT: ushr v6.4s, v2.4s, #16
; CHECK-CVT-GI-NEXT: movi v7.4s, #64, lsl #16
; CHECK-CVT-GI-NEXT: fcmeq v16.4s, v1.4s, v1.4s
; CHECK-CVT-GI-NEXT: fcmeq v17.4s, v2.4s, v2.4s
; CHECK-CVT-GI-NEXT: and v5.16b, v5.16b, v3.16b
; CHECK-CVT-GI-NEXT: add v18.4s, v1.4s, v4.4s
; CHECK-CVT-GI-NEXT: and v3.16b, v6.16b, v3.16b
; CHECK-CVT-GI-NEXT: add v4.4s, v2.4s, v4.4s
; CHECK-CVT-GI-NEXT: orr v1.16b, v1.16b, v7.16b
; CHECK-CVT-GI-NEXT: mvn v6.16b, v16.16b
; CHECK-CVT-GI-NEXT: mvn v16.16b, v17.16b
; CHECK-CVT-GI-NEXT: orr v2.16b, v2.16b, v7.16b
; CHECK-CVT-GI-NEXT: add v5.4s, v18.4s, v5.4s
; CHECK-CVT-GI-NEXT: add v3.4s, v4.4s, v3.4s
; CHECK-CVT-GI-NEXT: bif v1.16b, v5.16b, v6.16b
; CHECK-CVT-GI-NEXT: bif v2.16b, v3.16b, v16.16b
; CHECK-CVT-GI-NEXT: shrn v1.4h, v1.4s, #16
; CHECK-CVT-GI-NEXT: shrn v2.4h, v2.4s, #16
; CHECK-CVT-GI-NEXT: mov v1.d[1], v2.d[0]
; CHECK-CVT-GI-NEXT: mvni v2.8h, #128, lsl #8
; CHECK-CVT-GI-NEXT: bif v0.16b, v1.16b, v2.16b
; CHECK-CVT-GI-NEXT: ret
%tb = fptrunc <8 x float> %b to <8 x bfloat>
%r = call <8 x bfloat> @llvm.copysign.v8bf16(<8 x bfloat> %a, <8 x bfloat> %tb)
ret <8 x bfloat> %r
}
define <8 x bfloat> @test_floor(<8 x bfloat> %a) #0 {
; CHECK-CVT-SD-LABEL: test_floor:
; CHECK-CVT-SD: // %bb.0:
; CHECK-CVT-SD-NEXT: shll v2.4s, v0.4h, #16
; CHECK-CVT-SD-NEXT: shll2 v0.4s, v0.8h, #16
; CHECK-CVT-SD-NEXT: movi v1.4s, #1
; CHECK-CVT-SD-NEXT: movi v5.4s, #127, msl #8
; CHECK-CVT-SD-NEXT: frintm v2.4s, v2.4s
; CHECK-CVT-SD-NEXT: frintm v3.4s, v0.4s
; CHECK-CVT-SD-NEXT: ushr v0.4s, v2.4s, #16
; CHECK-CVT-SD-NEXT: ushr v4.4s, v3.4s, #16
; CHECK-CVT-SD-NEXT: and v0.16b, v0.16b, v1.16b
; CHECK-CVT-SD-NEXT: and v1.16b, v4.16b, v1.16b
; CHECK-CVT-SD-NEXT: add v0.4s, v0.4s, v2.4s
; CHECK-CVT-SD-NEXT: add v1.4s, v1.4s, v3.4s
; CHECK-CVT-SD-NEXT: addhn v0.4h, v0.4s, v5.4s
; CHECK-CVT-SD-NEXT: addhn2 v0.8h, v1.4s, v5.4s
; CHECK-CVT-SD-NEXT: ret
;
; CHECK-BF16-SD-LABEL: test_floor:
; CHECK-BF16-SD: // %bb.0:
; CHECK-BF16-SD-NEXT: shll v1.4s, v0.4h, #16
; CHECK-BF16-SD-NEXT: shll2 v2.4s, v0.8h, #16
; CHECK-BF16-SD-NEXT: frintm v1.4s, v1.4s
; CHECK-BF16-SD-NEXT: bfcvtn v0.4h, v1.4s
; CHECK-BF16-SD-NEXT: frintm v1.4s, v2.4s
; CHECK-BF16-SD-NEXT: bfcvtn2 v0.8h, v1.4s
; CHECK-BF16-SD-NEXT: ret
;
; CHECK-BF16SVE-SD-LABEL: test_floor:
; CHECK-BF16SVE-SD: // %bb.0:
; CHECK-BF16SVE-SD-NEXT: shll v1.4s, v0.4h, #16
; CHECK-BF16SVE-SD-NEXT: shll2 v2.4s, v0.8h, #16
; CHECK-BF16SVE-SD-NEXT: frintm v1.4s, v1.4s
; CHECK-BF16SVE-SD-NEXT: bfcvtn v0.4h, v1.4s
; CHECK-BF16SVE-SD-NEXT: frintm v1.4s, v2.4s
; CHECK-BF16SVE-SD-NEXT: bfcvtn2 v0.8h, v1.4s
; CHECK-BF16SVE-SD-NEXT: ret
;
; CHECK-CVT-GI-LABEL: test_floor:
; CHECK-CVT-GI: // %bb.0:
; CHECK-CVT-GI-NEXT: shll v1.4s, v0.4h, #16
; CHECK-CVT-GI-NEXT: shll2 v0.4s, v0.8h, #16
; CHECK-CVT-GI-NEXT: movi v2.4s, #1
; CHECK-CVT-GI-NEXT: movi v3.4s, #127, msl #8
; CHECK-CVT-GI-NEXT: movi v6.4s, #64, lsl #16
; CHECK-CVT-GI-NEXT: frintm v1.4s, v1.4s
; CHECK-CVT-GI-NEXT: frintm v0.4s, v0.4s
; CHECK-CVT-GI-NEXT: ushr v4.4s, v1.4s, #16
; CHECK-CVT-GI-NEXT: ushr v5.4s, v0.4s, #16
; CHECK-CVT-GI-NEXT: fcmeq v7.4s, v1.4s, v1.4s
; CHECK-CVT-GI-NEXT: fcmeq v17.4s, v0.4s, v0.4s
; CHECK-CVT-GI-NEXT: add v16.4s, v1.4s, v3.4s
; CHECK-CVT-GI-NEXT: add v3.4s, v0.4s, v3.4s
; CHECK-CVT-GI-NEXT: orr v1.16b, v1.16b, v6.16b
; CHECK-CVT-GI-NEXT: orr v0.16b, v0.16b, v6.16b
; CHECK-CVT-GI-NEXT: and v4.16b, v4.16b, v2.16b
; CHECK-CVT-GI-NEXT: and v2.16b, v5.16b, v2.16b
; CHECK-CVT-GI-NEXT: mvn v5.16b, v7.16b
; CHECK-CVT-GI-NEXT: mvn v7.16b, v17.16b
; CHECK-CVT-GI-NEXT: add v4.4s, v16.4s, v4.4s
; CHECK-CVT-GI-NEXT: add v2.4s, v3.4s, v2.4s
; CHECK-CVT-GI-NEXT: bif v1.16b, v4.16b, v5.16b
; CHECK-CVT-GI-NEXT: bit v2.16b, v0.16b, v7.16b
; CHECK-CVT-GI-NEXT: shrn v0.4h, v1.4s, #16
; CHECK-CVT-GI-NEXT: shrn v1.4h, v2.4s, #16
; CHECK-CVT-GI-NEXT: mov v0.d[1], v1.d[0]
; CHECK-CVT-GI-NEXT: ret
;
; CHECK-BF16-GI-LABEL: test_floor:
; CHECK-BF16-GI: // %bb.0:
; CHECK-BF16-GI-NEXT: shll v1.4s, v0.4h, #16
; CHECK-BF16-GI-NEXT: shll2 v0.4s, v0.8h, #16
; CHECK-BF16-GI-NEXT: frintm v1.4s, v1.4s
; CHECK-BF16-GI-NEXT: frintm v2.4s, v0.4s
; CHECK-BF16-GI-NEXT: bfcvtn v0.4h, v1.4s
; CHECK-BF16-GI-NEXT: bfcvtn2 v0.8h, v2.4s
; CHECK-BF16-GI-NEXT: ret
%r = call <8 x bfloat> @llvm.floor.v8bf16(<8 x bfloat> %a)
ret <8 x bfloat> %r
}
define <8 x bfloat> @test_ceil(<8 x bfloat> %a) #0 {
; CHECK-CVT-SD-LABEL: test_ceil:
; CHECK-CVT-SD: // %bb.0:
; CHECK-CVT-SD-NEXT: shll v2.4s, v0.4h, #16
; CHECK-CVT-SD-NEXT: shll2 v0.4s, v0.8h, #16
; CHECK-CVT-SD-NEXT: movi v1.4s, #1
; CHECK-CVT-SD-NEXT: movi v5.4s, #127, msl #8
; CHECK-CVT-SD-NEXT: frintp v2.4s, v2.4s
; CHECK-CVT-SD-NEXT: frintp v3.4s, v0.4s
; CHECK-CVT-SD-NEXT: ushr v0.4s, v2.4s, #16
; CHECK-CVT-SD-NEXT: ushr v4.4s, v3.4s, #16
; CHECK-CVT-SD-NEXT: and v0.16b, v0.16b, v1.16b
; CHECK-CVT-SD-NEXT: and v1.16b, v4.16b, v1.16b
; CHECK-CVT-SD-NEXT: add v0.4s, v0.4s, v2.4s
; CHECK-CVT-SD-NEXT: add v1.4s, v1.4s, v3.4s
; CHECK-CVT-SD-NEXT: addhn v0.4h, v0.4s, v5.4s
; CHECK-CVT-SD-NEXT: addhn2 v0.8h, v1.4s, v5.4s
; CHECK-CVT-SD-NEXT: ret
;
; CHECK-BF16-SD-LABEL: test_ceil:
; CHECK-BF16-SD: // %bb.0:
; CHECK-BF16-SD-NEXT: shll v1.4s, v0.4h, #16
; CHECK-BF16-SD-NEXT: shll2 v2.4s, v0.8h, #16
; CHECK-BF16-SD-NEXT: frintp v1.4s, v1.4s
; CHECK-BF16-SD-NEXT: bfcvtn v0.4h, v1.4s
; CHECK-BF16-SD-NEXT: frintp v1.4s, v2.4s
; CHECK-BF16-SD-NEXT: bfcvtn2 v0.8h, v1.4s
; CHECK-BF16-SD-NEXT: ret
;
; CHECK-BF16SVE-SD-LABEL: test_ceil:
; CHECK-BF16SVE-SD: // %bb.0:
; CHECK-BF16SVE-SD-NEXT: shll v1.4s, v0.4h, #16
; CHECK-BF16SVE-SD-NEXT: shll2 v2.4s, v0.8h, #16
; CHECK-BF16SVE-SD-NEXT: frintp v1.4s, v1.4s
; CHECK-BF16SVE-SD-NEXT: bfcvtn v0.4h, v1.4s
; CHECK-BF16SVE-SD-NEXT: frintp v1.4s, v2.4s
; CHECK-BF16SVE-SD-NEXT: bfcvtn2 v0.8h, v1.4s
; CHECK-BF16SVE-SD-NEXT: ret
;
; CHECK-CVT-GI-LABEL: test_ceil:
; CHECK-CVT-GI: // %bb.0:
; CHECK-CVT-GI-NEXT: shll v1.4s, v0.4h, #16
; CHECK-CVT-GI-NEXT: shll2 v0.4s, v0.8h, #16
; CHECK-CVT-GI-NEXT: movi v2.4s, #1
; CHECK-CVT-GI-NEXT: movi v3.4s, #127, msl #8
; CHECK-CVT-GI-NEXT: movi v6.4s, #64, lsl #16
; CHECK-CVT-GI-NEXT: frintp v1.4s, v1.4s
; CHECK-CVT-GI-NEXT: frintp v0.4s, v0.4s
; CHECK-CVT-GI-NEXT: ushr v4.4s, v1.4s, #16
; CHECK-CVT-GI-NEXT: ushr v5.4s, v0.4s, #16
; CHECK-CVT-GI-NEXT: fcmeq v7.4s, v1.4s, v1.4s
; CHECK-CVT-GI-NEXT: fcmeq v17.4s, v0.4s, v0.4s
; CHECK-CVT-GI-NEXT: add v16.4s, v1.4s, v3.4s
; CHECK-CVT-GI-NEXT: add v3.4s, v0.4s, v3.4s
; CHECK-CVT-GI-NEXT: orr v1.16b, v1.16b, v6.16b
; CHECK-CVT-GI-NEXT: orr v0.16b, v0.16b, v6.16b
; CHECK-CVT-GI-NEXT: and v4.16b, v4.16b, v2.16b
; CHECK-CVT-GI-NEXT: and v2.16b, v5.16b, v2.16b
; CHECK-CVT-GI-NEXT: mvn v5.16b, v7.16b
; CHECK-CVT-GI-NEXT: mvn v7.16b, v17.16b
; CHECK-CVT-GI-NEXT: add v4.4s, v16.4s, v4.4s
; CHECK-CVT-GI-NEXT: add v2.4s, v3.4s, v2.4s
; CHECK-CVT-GI-NEXT: bif v1.16b, v4.16b, v5.16b
; CHECK-CVT-GI-NEXT: bit v2.16b, v0.16b, v7.16b
; CHECK-CVT-GI-NEXT: shrn v0.4h, v1.4s, #16
; CHECK-CVT-GI-NEXT: shrn v1.4h, v2.4s, #16
; CHECK-CVT-GI-NEXT: mov v0.d[1], v1.d[0]
; CHECK-CVT-GI-NEXT: ret
;
; CHECK-BF16-GI-LABEL: test_ceil:
; CHECK-BF16-GI: // %bb.0:
; CHECK-BF16-GI-NEXT: shll v1.4s, v0.4h, #16
; CHECK-BF16-GI-NEXT: shll2 v0.4s, v0.8h, #16
; CHECK-BF16-GI-NEXT: frintp v1.4s, v1.4s
; CHECK-BF16-GI-NEXT: frintp v2.4s, v0.4s
; CHECK-BF16-GI-NEXT: bfcvtn v0.4h, v1.4s
; CHECK-BF16-GI-NEXT: bfcvtn2 v0.8h, v2.4s
; CHECK-BF16-GI-NEXT: ret
%r = call <8 x bfloat> @llvm.ceil.v8bf16(<8 x bfloat> %a)
ret <8 x bfloat> %r
}
define <8 x bfloat> @test_trunc(<8 x bfloat> %a) #0 {
; CHECK-CVT-SD-LABEL: test_trunc:
; CHECK-CVT-SD: // %bb.0:
; CHECK-CVT-SD-NEXT: shll v2.4s, v0.4h, #16
; CHECK-CVT-SD-NEXT: shll2 v0.4s, v0.8h, #16
; CHECK-CVT-SD-NEXT: movi v1.4s, #1
; CHECK-CVT-SD-NEXT: movi v5.4s, #127, msl #8
; CHECK-CVT-SD-NEXT: frintz v2.4s, v2.4s
; CHECK-CVT-SD-NEXT: frintz v3.4s, v0.4s
; CHECK-CVT-SD-NEXT: ushr v0.4s, v2.4s, #16
; CHECK-CVT-SD-NEXT: ushr v4.4s, v3.4s, #16
; CHECK-CVT-SD-NEXT: and v0.16b, v0.16b, v1.16b
; CHECK-CVT-SD-NEXT: and v1.16b, v4.16b, v1.16b
; CHECK-CVT-SD-NEXT: add v0.4s, v0.4s, v2.4s
; CHECK-CVT-SD-NEXT: add v1.4s, v1.4s, v3.4s
; CHECK-CVT-SD-NEXT: addhn v0.4h, v0.4s, v5.4s
; CHECK-CVT-SD-NEXT: addhn2 v0.8h, v1.4s, v5.4s
; CHECK-CVT-SD-NEXT: ret
;
; CHECK-BF16-SD-LABEL: test_trunc:
; CHECK-BF16-SD: // %bb.0:
; CHECK-BF16-SD-NEXT: shll v1.4s, v0.4h, #16
; CHECK-BF16-SD-NEXT: shll2 v2.4s, v0.8h, #16
; CHECK-BF16-SD-NEXT: frintz v1.4s, v1.4s
; CHECK-BF16-SD-NEXT: bfcvtn v0.4h, v1.4s
; CHECK-BF16-SD-NEXT: frintz v1.4s, v2.4s
; CHECK-BF16-SD-NEXT: bfcvtn2 v0.8h, v1.4s
; CHECK-BF16-SD-NEXT: ret
;
; CHECK-BF16SVE-SD-LABEL: test_trunc:
; CHECK-BF16SVE-SD: // %bb.0:
; CHECK-BF16SVE-SD-NEXT: shll v1.4s, v0.4h, #16
; CHECK-BF16SVE-SD-NEXT: shll2 v2.4s, v0.8h, #16
; CHECK-BF16SVE-SD-NEXT: frintz v1.4s, v1.4s
; CHECK-BF16SVE-SD-NEXT: bfcvtn v0.4h, v1.4s
; CHECK-BF16SVE-SD-NEXT: frintz v1.4s, v2.4s
; CHECK-BF16SVE-SD-NEXT: bfcvtn2 v0.8h, v1.4s
; CHECK-BF16SVE-SD-NEXT: ret
;
; CHECK-CVT-GI-LABEL: test_trunc:
; CHECK-CVT-GI: // %bb.0:
; CHECK-CVT-GI-NEXT: shll v1.4s, v0.4h, #16
; CHECK-CVT-GI-NEXT: shll2 v0.4s, v0.8h, #16
; CHECK-CVT-GI-NEXT: movi v2.4s, #1
; CHECK-CVT-GI-NEXT: movi v3.4s, #127, msl #8
; CHECK-CVT-GI-NEXT: movi v6.4s, #64, lsl #16
; CHECK-CVT-GI-NEXT: frintz v1.4s, v1.4s
; CHECK-CVT-GI-NEXT: frintz v0.4s, v0.4s
; CHECK-CVT-GI-NEXT: ushr v4.4s, v1.4s, #16
; CHECK-CVT-GI-NEXT: ushr v5.4s, v0.4s, #16
; CHECK-CVT-GI-NEXT: fcmeq v7.4s, v1.4s, v1.4s
; CHECK-CVT-GI-NEXT: fcmeq v17.4s, v0.4s, v0.4s
; CHECK-CVT-GI-NEXT: add v16.4s, v1.4s, v3.4s
; CHECK-CVT-GI-NEXT: add v3.4s, v0.4s, v3.4s
; CHECK-CVT-GI-NEXT: orr v1.16b, v1.16b, v6.16b
; CHECK-CVT-GI-NEXT: orr v0.16b, v0.16b, v6.16b
; CHECK-CVT-GI-NEXT: and v4.16b, v4.16b, v2.16b
; CHECK-CVT-GI-NEXT: and v2.16b, v5.16b, v2.16b
; CHECK-CVT-GI-NEXT: mvn v5.16b, v7.16b
; CHECK-CVT-GI-NEXT: mvn v7.16b, v17.16b
; CHECK-CVT-GI-NEXT: add v4.4s, v16.4s, v4.4s
; CHECK-CVT-GI-NEXT: add v2.4s, v3.4s, v2.4s
; CHECK-CVT-GI-NEXT: bif v1.16b, v4.16b, v5.16b
; CHECK-CVT-GI-NEXT: bit v2.16b, v0.16b, v7.16b
; CHECK-CVT-GI-NEXT: shrn v0.4h, v1.4s, #16
; CHECK-CVT-GI-NEXT: shrn v1.4h, v2.4s, #16
; CHECK-CVT-GI-NEXT: mov v0.d[1], v1.d[0]
; CHECK-CVT-GI-NEXT: ret
;
; CHECK-BF16-GI-LABEL: test_trunc:
; CHECK-BF16-GI: // %bb.0:
; CHECK-BF16-GI-NEXT: shll v1.4s, v0.4h, #16
; CHECK-BF16-GI-NEXT: shll2 v0.4s, v0.8h, #16
; CHECK-BF16-GI-NEXT: frintz v1.4s, v1.4s
; CHECK-BF16-GI-NEXT: frintz v2.4s, v0.4s
; CHECK-BF16-GI-NEXT: bfcvtn v0.4h, v1.4s
; CHECK-BF16-GI-NEXT: bfcvtn2 v0.8h, v2.4s
; CHECK-BF16-GI-NEXT: ret
%r = call <8 x bfloat> @llvm.trunc.v8bf16(<8 x bfloat> %a)
ret <8 x bfloat> %r
}
define <8 x bfloat> @test_rint(<8 x bfloat> %a) #0 {
; CHECK-CVT-SD-LABEL: test_rint:
; CHECK-CVT-SD: // %bb.0:
; CHECK-CVT-SD-NEXT: shll v2.4s, v0.4h, #16
; CHECK-CVT-SD-NEXT: shll2 v0.4s, v0.8h, #16
; CHECK-CVT-SD-NEXT: movi v1.4s, #1
; CHECK-CVT-SD-NEXT: movi v5.4s, #127, msl #8
; CHECK-CVT-SD-NEXT: frintx v2.4s, v2.4s
; CHECK-CVT-SD-NEXT: frintx v3.4s, v0.4s
; CHECK-CVT-SD-NEXT: ushr v0.4s, v2.4s, #16
; CHECK-CVT-SD-NEXT: ushr v4.4s, v3.4s, #16
; CHECK-CVT-SD-NEXT: and v0.16b, v0.16b, v1.16b
; CHECK-CVT-SD-NEXT: and v1.16b, v4.16b, v1.16b
; CHECK-CVT-SD-NEXT: add v0.4s, v0.4s, v2.4s
; CHECK-CVT-SD-NEXT: add v1.4s, v1.4s, v3.4s
; CHECK-CVT-SD-NEXT: addhn v0.4h, v0.4s, v5.4s
; CHECK-CVT-SD-NEXT: addhn2 v0.8h, v1.4s, v5.4s
; CHECK-CVT-SD-NEXT: ret
;
; CHECK-BF16-SD-LABEL: test_rint:
; CHECK-BF16-SD: // %bb.0:
; CHECK-BF16-SD-NEXT: shll v1.4s, v0.4h, #16
; CHECK-BF16-SD-NEXT: shll2 v2.4s, v0.8h, #16
; CHECK-BF16-SD-NEXT: frintx v1.4s, v1.4s
; CHECK-BF16-SD-NEXT: bfcvtn v0.4h, v1.4s
; CHECK-BF16-SD-NEXT: frintx v1.4s, v2.4s
; CHECK-BF16-SD-NEXT: bfcvtn2 v0.8h, v1.4s
; CHECK-BF16-SD-NEXT: ret
;
; CHECK-BF16SVE-SD-LABEL: test_rint:
; CHECK-BF16SVE-SD: // %bb.0:
; CHECK-BF16SVE-SD-NEXT: shll v1.4s, v0.4h, #16
; CHECK-BF16SVE-SD-NEXT: shll2 v2.4s, v0.8h, #16
; CHECK-BF16SVE-SD-NEXT: frintx v1.4s, v1.4s
; CHECK-BF16SVE-SD-NEXT: bfcvtn v0.4h, v1.4s
; CHECK-BF16SVE-SD-NEXT: frintx v1.4s, v2.4s
; CHECK-BF16SVE-SD-NEXT: bfcvtn2 v0.8h, v1.4s
; CHECK-BF16SVE-SD-NEXT: ret
;
; CHECK-CVT-GI-LABEL: test_rint:
; CHECK-CVT-GI: // %bb.0:
; CHECK-CVT-GI-NEXT: shll v1.4s, v0.4h, #16
; CHECK-CVT-GI-NEXT: shll2 v0.4s, v0.8h, #16
; CHECK-CVT-GI-NEXT: movi v2.4s, #1
; CHECK-CVT-GI-NEXT: movi v3.4s, #127, msl #8
; CHECK-CVT-GI-NEXT: movi v6.4s, #64, lsl #16
; CHECK-CVT-GI-NEXT: frintx v1.4s, v1.4s
; CHECK-CVT-GI-NEXT: frintx v0.4s, v0.4s
; CHECK-CVT-GI-NEXT: ushr v4.4s, v1.4s, #16
; CHECK-CVT-GI-NEXT: ushr v5.4s, v0.4s, #16
; CHECK-CVT-GI-NEXT: fcmeq v7.4s, v1.4s, v1.4s
; CHECK-CVT-GI-NEXT: fcmeq v17.4s, v0.4s, v0.4s
; CHECK-CVT-GI-NEXT: add v16.4s, v1.4s, v3.4s
; CHECK-CVT-GI-NEXT: add v3.4s, v0.4s, v3.4s
; CHECK-CVT-GI-NEXT: orr v1.16b, v1.16b, v6.16b
; CHECK-CVT-GI-NEXT: orr v0.16b, v0.16b, v6.16b
; CHECK-CVT-GI-NEXT: and v4.16b, v4.16b, v2.16b
; CHECK-CVT-GI-NEXT: and v2.16b, v5.16b, v2.16b
; CHECK-CVT-GI-NEXT: mvn v5.16b, v7.16b
; CHECK-CVT-GI-NEXT: mvn v7.16b, v17.16b
; CHECK-CVT-GI-NEXT: add v4.4s, v16.4s, v4.4s
; CHECK-CVT-GI-NEXT: add v2.4s, v3.4s, v2.4s
; CHECK-CVT-GI-NEXT: bif v1.16b, v4.16b, v5.16b
; CHECK-CVT-GI-NEXT: bit v2.16b, v0.16b, v7.16b
; CHECK-CVT-GI-NEXT: shrn v0.4h, v1.4s, #16
; CHECK-CVT-GI-NEXT: shrn v1.4h, v2.4s, #16
; CHECK-CVT-GI-NEXT: mov v0.d[1], v1.d[0]
; CHECK-CVT-GI-NEXT: ret
;
; CHECK-BF16-GI-LABEL: test_rint:
; CHECK-BF16-GI: // %bb.0:
; CHECK-BF16-GI-NEXT: shll v1.4s, v0.4h, #16
; CHECK-BF16-GI-NEXT: shll2 v0.4s, v0.8h, #16
; CHECK-BF16-GI-NEXT: frintx v1.4s, v1.4s
; CHECK-BF16-GI-NEXT: frintx v2.4s, v0.4s
; CHECK-BF16-GI-NEXT: bfcvtn v0.4h, v1.4s
; CHECK-BF16-GI-NEXT: bfcvtn2 v0.8h, v2.4s
; CHECK-BF16-GI-NEXT: ret
%r = call <8 x bfloat> @llvm.rint.v8bf16(<8 x bfloat> %a)
ret <8 x bfloat> %r
}
define <8 x bfloat> @test_nearbyint(<8 x bfloat> %a) #0 {
; CHECK-CVT-SD-LABEL: test_nearbyint:
; CHECK-CVT-SD: // %bb.0:
; CHECK-CVT-SD-NEXT: shll v2.4s, v0.4h, #16
; CHECK-CVT-SD-NEXT: shll2 v0.4s, v0.8h, #16
; CHECK-CVT-SD-NEXT: movi v1.4s, #1
; CHECK-CVT-SD-NEXT: movi v5.4s, #127, msl #8
; CHECK-CVT-SD-NEXT: frinti v2.4s, v2.4s
; CHECK-CVT-SD-NEXT: frinti v3.4s, v0.4s
; CHECK-CVT-SD-NEXT: ushr v0.4s, v2.4s, #16
; CHECK-CVT-SD-NEXT: ushr v4.4s, v3.4s, #16
; CHECK-CVT-SD-NEXT: and v0.16b, v0.16b, v1.16b
; CHECK-CVT-SD-NEXT: and v1.16b, v4.16b, v1.16b
; CHECK-CVT-SD-NEXT: add v0.4s, v0.4s, v2.4s
; CHECK-CVT-SD-NEXT: add v1.4s, v1.4s, v3.4s
; CHECK-CVT-SD-NEXT: addhn v0.4h, v0.4s, v5.4s
; CHECK-CVT-SD-NEXT: addhn2 v0.8h, v1.4s, v5.4s
; CHECK-CVT-SD-NEXT: ret
;
; CHECK-BF16-SD-LABEL: test_nearbyint:
; CHECK-BF16-SD: // %bb.0:
; CHECK-BF16-SD-NEXT: shll v1.4s, v0.4h, #16
; CHECK-BF16-SD-NEXT: shll2 v2.4s, v0.8h, #16
; CHECK-BF16-SD-NEXT: frinti v1.4s, v1.4s
; CHECK-BF16-SD-NEXT: bfcvtn v0.4h, v1.4s
; CHECK-BF16-SD-NEXT: frinti v1.4s, v2.4s
; CHECK-BF16-SD-NEXT: bfcvtn2 v0.8h, v1.4s
; CHECK-BF16-SD-NEXT: ret
;
; CHECK-BF16SVE-SD-LABEL: test_nearbyint:
; CHECK-BF16SVE-SD: // %bb.0:
; CHECK-BF16SVE-SD-NEXT: shll v1.4s, v0.4h, #16
; CHECK-BF16SVE-SD-NEXT: shll2 v2.4s, v0.8h, #16
; CHECK-BF16SVE-SD-NEXT: frinti v1.4s, v1.4s
; CHECK-BF16SVE-SD-NEXT: bfcvtn v0.4h, v1.4s
; CHECK-BF16SVE-SD-NEXT: frinti v1.4s, v2.4s
; CHECK-BF16SVE-SD-NEXT: bfcvtn2 v0.8h, v1.4s
; CHECK-BF16SVE-SD-NEXT: ret
;
; CHECK-CVT-GI-LABEL: test_nearbyint:
; CHECK-CVT-GI: // %bb.0:
; CHECK-CVT-GI-NEXT: shll v1.4s, v0.4h, #16
; CHECK-CVT-GI-NEXT: shll2 v0.4s, v0.8h, #16
; CHECK-CVT-GI-NEXT: movi v2.4s, #1
; CHECK-CVT-GI-NEXT: movi v3.4s, #127, msl #8
; CHECK-CVT-GI-NEXT: movi v6.4s, #64, lsl #16
; CHECK-CVT-GI-NEXT: frinti v1.4s, v1.4s
; CHECK-CVT-GI-NEXT: frinti v0.4s, v0.4s
; CHECK-CVT-GI-NEXT: ushr v4.4s, v1.4s, #16
; CHECK-CVT-GI-NEXT: ushr v5.4s, v0.4s, #16
; CHECK-CVT-GI-NEXT: fcmeq v7.4s, v1.4s, v1.4s
; CHECK-CVT-GI-NEXT: fcmeq v17.4s, v0.4s, v0.4s
; CHECK-CVT-GI-NEXT: add v16.4s, v1.4s, v3.4s
; CHECK-CVT-GI-NEXT: add v3.4s, v0.4s, v3.4s
; CHECK-CVT-GI-NEXT: orr v1.16b, v1.16b, v6.16b
; CHECK-CVT-GI-NEXT: orr v0.16b, v0.16b, v6.16b
; CHECK-CVT-GI-NEXT: and v4.16b, v4.16b, v2.16b
; CHECK-CVT-GI-NEXT: and v2.16b, v5.16b, v2.16b
; CHECK-CVT-GI-NEXT: mvn v5.16b, v7.16b
; CHECK-CVT-GI-NEXT: mvn v7.16b, v17.16b
; CHECK-CVT-GI-NEXT: add v4.4s, v16.4s, v4.4s
; CHECK-CVT-GI-NEXT: add v2.4s, v3.4s, v2.4s
; CHECK-CVT-GI-NEXT: bif v1.16b, v4.16b, v5.16b
; CHECK-CVT-GI-NEXT: bit v2.16b, v0.16b, v7.16b
; CHECK-CVT-GI-NEXT: shrn v0.4h, v1.4s, #16
; CHECK-CVT-GI-NEXT: shrn v1.4h, v2.4s, #16
; CHECK-CVT-GI-NEXT: mov v0.d[1], v1.d[0]
; CHECK-CVT-GI-NEXT: ret
;
; CHECK-BF16-GI-LABEL: test_nearbyint:
; CHECK-BF16-GI: // %bb.0:
; CHECK-BF16-GI-NEXT: shll v1.4s, v0.4h, #16
; CHECK-BF16-GI-NEXT: shll2 v0.4s, v0.8h, #16
; CHECK-BF16-GI-NEXT: frinti v1.4s, v1.4s
; CHECK-BF16-GI-NEXT: frinti v2.4s, v0.4s
; CHECK-BF16-GI-NEXT: bfcvtn v0.4h, v1.4s
; CHECK-BF16-GI-NEXT: bfcvtn2 v0.8h, v2.4s
; CHECK-BF16-GI-NEXT: ret
%r = call <8 x bfloat> @llvm.nearbyint.v8bf16(<8 x bfloat> %a)
ret <8 x bfloat> %r
}
define <8 x bfloat> @test_round(<8 x bfloat> %a) #0 {
; CHECK-CVT-SD-LABEL: test_round:
; CHECK-CVT-SD: // %bb.0:
; CHECK-CVT-SD-NEXT: shll v2.4s, v0.4h, #16
; CHECK-CVT-SD-NEXT: shll2 v0.4s, v0.8h, #16
; CHECK-CVT-SD-NEXT: movi v1.4s, #1
; CHECK-CVT-SD-NEXT: movi v5.4s, #127, msl #8
; CHECK-CVT-SD-NEXT: frinta v2.4s, v2.4s
; CHECK-CVT-SD-NEXT: frinta v3.4s, v0.4s
; CHECK-CVT-SD-NEXT: ushr v0.4s, v2.4s, #16
; CHECK-CVT-SD-NEXT: ushr v4.4s, v3.4s, #16
; CHECK-CVT-SD-NEXT: and v0.16b, v0.16b, v1.16b
; CHECK-CVT-SD-NEXT: and v1.16b, v4.16b, v1.16b
; CHECK-CVT-SD-NEXT: add v0.4s, v0.4s, v2.4s
; CHECK-CVT-SD-NEXT: add v1.4s, v1.4s, v3.4s
; CHECK-CVT-SD-NEXT: addhn v0.4h, v0.4s, v5.4s
; CHECK-CVT-SD-NEXT: addhn2 v0.8h, v1.4s, v5.4s
; CHECK-CVT-SD-NEXT: ret
;
; CHECK-BF16-SD-LABEL: test_round:
; CHECK-BF16-SD: // %bb.0:
; CHECK-BF16-SD-NEXT: shll v1.4s, v0.4h, #16
; CHECK-BF16-SD-NEXT: shll2 v2.4s, v0.8h, #16
; CHECK-BF16-SD-NEXT: frinta v1.4s, v1.4s
; CHECK-BF16-SD-NEXT: bfcvtn v0.4h, v1.4s
; CHECK-BF16-SD-NEXT: frinta v1.4s, v2.4s
; CHECK-BF16-SD-NEXT: bfcvtn2 v0.8h, v1.4s
; CHECK-BF16-SD-NEXT: ret
;
; CHECK-BF16SVE-SD-LABEL: test_round:
; CHECK-BF16SVE-SD: // %bb.0:
; CHECK-BF16SVE-SD-NEXT: shll v1.4s, v0.4h, #16
; CHECK-BF16SVE-SD-NEXT: shll2 v2.4s, v0.8h, #16
; CHECK-BF16SVE-SD-NEXT: frinta v1.4s, v1.4s
; CHECK-BF16SVE-SD-NEXT: bfcvtn v0.4h, v1.4s
; CHECK-BF16SVE-SD-NEXT: frinta v1.4s, v2.4s
; CHECK-BF16SVE-SD-NEXT: bfcvtn2 v0.8h, v1.4s
; CHECK-BF16SVE-SD-NEXT: ret
;
; CHECK-CVT-GI-LABEL: test_round:
; CHECK-CVT-GI: // %bb.0:
; CHECK-CVT-GI-NEXT: shll v1.4s, v0.4h, #16
; CHECK-CVT-GI-NEXT: shll2 v0.4s, v0.8h, #16
; CHECK-CVT-GI-NEXT: movi v2.4s, #1
; CHECK-CVT-GI-NEXT: movi v3.4s, #127, msl #8
; CHECK-CVT-GI-NEXT: movi v6.4s, #64, lsl #16
; CHECK-CVT-GI-NEXT: frinta v1.4s, v1.4s
; CHECK-CVT-GI-NEXT: frinta v0.4s, v0.4s
; CHECK-CVT-GI-NEXT: ushr v4.4s, v1.4s, #16
; CHECK-CVT-GI-NEXT: ushr v5.4s, v0.4s, #16
; CHECK-CVT-GI-NEXT: fcmeq v7.4s, v1.4s, v1.4s
; CHECK-CVT-GI-NEXT: fcmeq v17.4s, v0.4s, v0.4s
; CHECK-CVT-GI-NEXT: add v16.4s, v1.4s, v3.4s
; CHECK-CVT-GI-NEXT: add v3.4s, v0.4s, v3.4s
; CHECK-CVT-GI-NEXT: orr v1.16b, v1.16b, v6.16b
; CHECK-CVT-GI-NEXT: orr v0.16b, v0.16b, v6.16b
; CHECK-CVT-GI-NEXT: and v4.16b, v4.16b, v2.16b
; CHECK-CVT-GI-NEXT: and v2.16b, v5.16b, v2.16b
; CHECK-CVT-GI-NEXT: mvn v5.16b, v7.16b
; CHECK-CVT-GI-NEXT: mvn v7.16b, v17.16b
; CHECK-CVT-GI-NEXT: add v4.4s, v16.4s, v4.4s
; CHECK-CVT-GI-NEXT: add v2.4s, v3.4s, v2.4s
; CHECK-CVT-GI-NEXT: bif v1.16b, v4.16b, v5.16b
; CHECK-CVT-GI-NEXT: bit v2.16b, v0.16b, v7.16b
; CHECK-CVT-GI-NEXT: shrn v0.4h, v1.4s, #16
; CHECK-CVT-GI-NEXT: shrn v1.4h, v2.4s, #16
; CHECK-CVT-GI-NEXT: mov v0.d[1], v1.d[0]
; CHECK-CVT-GI-NEXT: ret
;
; CHECK-BF16-GI-LABEL: test_round:
; CHECK-BF16-GI: // %bb.0:
; CHECK-BF16-GI-NEXT: shll v1.4s, v0.4h, #16
; CHECK-BF16-GI-NEXT: shll2 v0.4s, v0.8h, #16
; CHECK-BF16-GI-NEXT: frinta v1.4s, v1.4s
; CHECK-BF16-GI-NEXT: frinta v2.4s, v0.4s
; CHECK-BF16-GI-NEXT: bfcvtn v0.4h, v1.4s
; CHECK-BF16-GI-NEXT: bfcvtn2 v0.8h, v2.4s
; CHECK-BF16-GI-NEXT: ret
%r = call <8 x bfloat> @llvm.round.v8bf16(<8 x bfloat> %a)
ret <8 x bfloat> %r
}
define <8 x bfloat> @test_roundeven(<8 x bfloat> %a) #0 {
; CHECK-CVT-SD-LABEL: test_roundeven:
; CHECK-CVT-SD: // %bb.0:
; CHECK-CVT-SD-NEXT: shll v2.4s, v0.4h, #16
; CHECK-CVT-SD-NEXT: shll2 v0.4s, v0.8h, #16
; CHECK-CVT-SD-NEXT: movi v1.4s, #1
; CHECK-CVT-SD-NEXT: movi v5.4s, #127, msl #8
; CHECK-CVT-SD-NEXT: frintn v2.4s, v2.4s
; CHECK-CVT-SD-NEXT: frintn v3.4s, v0.4s
; CHECK-CVT-SD-NEXT: ushr v0.4s, v2.4s, #16
; CHECK-CVT-SD-NEXT: ushr v4.4s, v3.4s, #16
; CHECK-CVT-SD-NEXT: and v0.16b, v0.16b, v1.16b
; CHECK-CVT-SD-NEXT: and v1.16b, v4.16b, v1.16b
; CHECK-CVT-SD-NEXT: add v0.4s, v0.4s, v2.4s
; CHECK-CVT-SD-NEXT: add v1.4s, v1.4s, v3.4s
; CHECK-CVT-SD-NEXT: addhn v0.4h, v0.4s, v5.4s
; CHECK-CVT-SD-NEXT: addhn2 v0.8h, v1.4s, v5.4s
; CHECK-CVT-SD-NEXT: ret
;
; CHECK-BF16-SD-LABEL: test_roundeven:
; CHECK-BF16-SD: // %bb.0:
; CHECK-BF16-SD-NEXT: shll v1.4s, v0.4h, #16
; CHECK-BF16-SD-NEXT: shll2 v2.4s, v0.8h, #16
; CHECK-BF16-SD-NEXT: frintn v1.4s, v1.4s
; CHECK-BF16-SD-NEXT: bfcvtn v0.4h, v1.4s
; CHECK-BF16-SD-NEXT: frintn v1.4s, v2.4s
; CHECK-BF16-SD-NEXT: bfcvtn2 v0.8h, v1.4s
; CHECK-BF16-SD-NEXT: ret
;
; CHECK-BF16SVE-SD-LABEL: test_roundeven:
; CHECK-BF16SVE-SD: // %bb.0:
; CHECK-BF16SVE-SD-NEXT: shll v1.4s, v0.4h, #16
; CHECK-BF16SVE-SD-NEXT: shll2 v2.4s, v0.8h, #16
; CHECK-BF16SVE-SD-NEXT: frintn v1.4s, v1.4s
; CHECK-BF16SVE-SD-NEXT: bfcvtn v0.4h, v1.4s
; CHECK-BF16SVE-SD-NEXT: frintn v1.4s, v2.4s
; CHECK-BF16SVE-SD-NEXT: bfcvtn2 v0.8h, v1.4s
; CHECK-BF16SVE-SD-NEXT: ret
;
; CHECK-CVT-GI-LABEL: test_roundeven:
; CHECK-CVT-GI: // %bb.0:
; CHECK-CVT-GI-NEXT: shll v1.4s, v0.4h, #16
; CHECK-CVT-GI-NEXT: shll2 v0.4s, v0.8h, #16
; CHECK-CVT-GI-NEXT: movi v2.4s, #1
; CHECK-CVT-GI-NEXT: movi v3.4s, #127, msl #8
; CHECK-CVT-GI-NEXT: movi v6.4s, #64, lsl #16
; CHECK-CVT-GI-NEXT: frintn v1.4s, v1.4s
; CHECK-CVT-GI-NEXT: frintn v0.4s, v0.4s
; CHECK-CVT-GI-NEXT: ushr v4.4s, v1.4s, #16
; CHECK-CVT-GI-NEXT: ushr v5.4s, v0.4s, #16
; CHECK-CVT-GI-NEXT: fcmeq v7.4s, v1.4s, v1.4s
; CHECK-CVT-GI-NEXT: fcmeq v17.4s, v0.4s, v0.4s
; CHECK-CVT-GI-NEXT: add v16.4s, v1.4s, v3.4s
; CHECK-CVT-GI-NEXT: add v3.4s, v0.4s, v3.4s
; CHECK-CVT-GI-NEXT: orr v1.16b, v1.16b, v6.16b
; CHECK-CVT-GI-NEXT: orr v0.16b, v0.16b, v6.16b
; CHECK-CVT-GI-NEXT: and v4.16b, v4.16b, v2.16b
; CHECK-CVT-GI-NEXT: and v2.16b, v5.16b, v2.16b
; CHECK-CVT-GI-NEXT: mvn v5.16b, v7.16b
; CHECK-CVT-GI-NEXT: mvn v7.16b, v17.16b
; CHECK-CVT-GI-NEXT: add v4.4s, v16.4s, v4.4s
; CHECK-CVT-GI-NEXT: add v2.4s, v3.4s, v2.4s
; CHECK-CVT-GI-NEXT: bif v1.16b, v4.16b, v5.16b
; CHECK-CVT-GI-NEXT: bit v2.16b, v0.16b, v7.16b
; CHECK-CVT-GI-NEXT: shrn v0.4h, v1.4s, #16
; CHECK-CVT-GI-NEXT: shrn v1.4h, v2.4s, #16
; CHECK-CVT-GI-NEXT: mov v0.d[1], v1.d[0]
; CHECK-CVT-GI-NEXT: ret
;
; CHECK-BF16-GI-LABEL: test_roundeven:
; CHECK-BF16-GI: // %bb.0:
; CHECK-BF16-GI-NEXT: shll v1.4s, v0.4h, #16
; CHECK-BF16-GI-NEXT: shll2 v0.4s, v0.8h, #16
; CHECK-BF16-GI-NEXT: frintn v1.4s, v1.4s
; CHECK-BF16-GI-NEXT: frintn v2.4s, v0.4s
; CHECK-BF16-GI-NEXT: bfcvtn v0.4h, v1.4s
; CHECK-BF16-GI-NEXT: bfcvtn2 v0.8h, v2.4s
; CHECK-BF16-GI-NEXT: ret
%r = call <8 x bfloat> @llvm.roundeven.v8bf16(<8 x bfloat> %a)
ret <8 x bfloat> %r
}
define <8 x bfloat> @test_fmuladd(<8 x bfloat> %a, <8 x bfloat> %b, <8 x bfloat> %c) #0 {
; CHECK-CVT-SD-LABEL: test_fmuladd:
; CHECK-CVT-SD: // %bb.0:
; CHECK-CVT-SD-NEXT: shll v3.4s, v1.4h, #16
; CHECK-CVT-SD-NEXT: shll v4.4s, v0.4h, #16
; CHECK-CVT-SD-NEXT: shll2 v1.4s, v1.8h, #16
; CHECK-CVT-SD-NEXT: shll2 v0.4s, v0.8h, #16
; CHECK-CVT-SD-NEXT: movi v6.4s, #127, msl #8
; CHECK-CVT-SD-NEXT: fmul v3.4s, v4.4s, v3.4s
; CHECK-CVT-SD-NEXT: movi v4.4s, #1
; CHECK-CVT-SD-NEXT: fmul v0.4s, v0.4s, v1.4s
; CHECK-CVT-SD-NEXT: ushr v1.4s, v3.4s, #16
; CHECK-CVT-SD-NEXT: ushr v5.4s, v0.4s, #16
; CHECK-CVT-SD-NEXT: and v1.16b, v1.16b, v4.16b
; CHECK-CVT-SD-NEXT: add v1.4s, v1.4s, v3.4s
; CHECK-CVT-SD-NEXT: and v3.16b, v5.16b, v4.16b
; CHECK-CVT-SD-NEXT: addhn v1.4h, v1.4s, v6.4s
; CHECK-CVT-SD-NEXT: add v0.4s, v3.4s, v0.4s
; CHECK-CVT-SD-NEXT: shll v3.4s, v2.4h, #16
; CHECK-CVT-SD-NEXT: shll2 v2.4s, v2.8h, #16
; CHECK-CVT-SD-NEXT: addhn v0.4h, v0.4s, v6.4s
; CHECK-CVT-SD-NEXT: shll v1.4s, v1.4h, #16
; CHECK-CVT-SD-NEXT: fadd v1.4s, v1.4s, v3.4s
; CHECK-CVT-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-CVT-SD-NEXT: fadd v2.4s, v0.4s, v2.4s
; CHECK-CVT-SD-NEXT: ushr v0.4s, v1.4s, #16
; CHECK-CVT-SD-NEXT: and v0.16b, v0.16b, v4.16b
; CHECK-CVT-SD-NEXT: ushr v3.4s, v2.4s, #16
; CHECK-CVT-SD-NEXT: add v0.4s, v0.4s, v1.4s
; CHECK-CVT-SD-NEXT: and v1.16b, v3.16b, v4.16b
; CHECK-CVT-SD-NEXT: addhn v0.4h, v0.4s, v6.4s
; CHECK-CVT-SD-NEXT: add v1.4s, v1.4s, v2.4s
; CHECK-CVT-SD-NEXT: addhn2 v0.8h, v1.4s, v6.4s
; CHECK-CVT-SD-NEXT: ret
;
; CHECK-BF16-SD-LABEL: test_fmuladd:
; CHECK-BF16-SD: // %bb.0:
; CHECK-BF16-SD-NEXT: shll v3.4s, v1.4h, #16
; CHECK-BF16-SD-NEXT: shll v4.4s, v0.4h, #16
; CHECK-BF16-SD-NEXT: shll2 v1.4s, v1.8h, #16
; CHECK-BF16-SD-NEXT: shll2 v0.4s, v0.8h, #16
; CHECK-BF16-SD-NEXT: fmul v3.4s, v4.4s, v3.4s
; CHECK-BF16-SD-NEXT: fmul v0.4s, v0.4s, v1.4s
; CHECK-BF16-SD-NEXT: bfcvtn v1.4h, v3.4s
; CHECK-BF16-SD-NEXT: shll v3.4s, v2.4h, #16
; CHECK-BF16-SD-NEXT: shll2 v2.4s, v2.8h, #16
; CHECK-BF16-SD-NEXT: bfcvtn v0.4h, v0.4s
; CHECK-BF16-SD-NEXT: shll v1.4s, v1.4h, #16
; CHECK-BF16-SD-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16-SD-NEXT: fadd v1.4s, v1.4s, v3.4s
; CHECK-BF16-SD-NEXT: fadd v2.4s, v0.4s, v2.4s
; CHECK-BF16-SD-NEXT: bfcvtn v0.4h, v1.4s
; CHECK-BF16-SD-NEXT: bfcvtn2 v0.8h, v2.4s
; CHECK-BF16-SD-NEXT: ret
;
; CHECK-BF16SVE-SD-LABEL: test_fmuladd:
; CHECK-BF16SVE-SD: // %bb.0:
; CHECK-BF16SVE-SD-NEXT: movi v3.4s, #128, lsl #24
; CHECK-BF16SVE-SD-NEXT: movi v4.4s, #128, lsl #24
; CHECK-BF16SVE-SD-NEXT: ptrue p0.s, vl4
; CHECK-BF16SVE-SD-NEXT: bfmlalb v3.4s, v0.8h, v1.8h
; CHECK-BF16SVE-SD-NEXT: bfmlalt v4.4s, v0.8h, v1.8h
; CHECK-BF16SVE-SD-NEXT: shll v1.4s, v2.4h, #16
; CHECK-BF16SVE-SD-NEXT: shll2 v2.4s, v2.8h, #16
; CHECK-BF16SVE-SD-NEXT: bfcvt z3.h, p0/m, z3.s
; CHECK-BF16SVE-SD-NEXT: bfcvtnt z3.h, p0/m, z4.s
; CHECK-BF16SVE-SD-NEXT: shll v0.4s, v3.4h, #16
; CHECK-BF16SVE-SD-NEXT: fadd v0.4s, v0.4s, v1.4s
; CHECK-BF16SVE-SD-NEXT: shll2 v1.4s, v3.8h, #16
; CHECK-BF16SVE-SD-NEXT: fadd v1.4s, v1.4s, v2.4s
; CHECK-BF16SVE-SD-NEXT: bfcvtn v0.4h, v0.4s
; CHECK-BF16SVE-SD-NEXT: bfcvtn2 v0.8h, v1.4s
; CHECK-BF16SVE-SD-NEXT: ret
;
; CHECK-CVT-GI-LABEL: test_fmuladd:
; CHECK-CVT-GI: // %bb.0:
; CHECK-CVT-GI-NEXT: shll v3.4s, v0.4h, #16
; CHECK-CVT-GI-NEXT: shll v4.4s, v1.4h, #16
; CHECK-CVT-GI-NEXT: shll2 v0.4s, v0.8h, #16
; CHECK-CVT-GI-NEXT: shll2 v1.4s, v1.8h, #16
; CHECK-CVT-GI-NEXT: movi v7.4s, #64, lsl #16
; CHECK-CVT-GI-NEXT: fmul v3.4s, v3.4s, v4.4s
; CHECK-CVT-GI-NEXT: movi v4.4s, #127, msl #8
; CHECK-CVT-GI-NEXT: fmul v0.4s, v0.4s, v1.4s
; CHECK-CVT-GI-NEXT: movi v1.4s, #1
; CHECK-CVT-GI-NEXT: ushr v5.4s, v3.4s, #16
; CHECK-CVT-GI-NEXT: fcmeq v16.4s, v3.4s, v3.4s
; CHECK-CVT-GI-NEXT: add v17.4s, v3.4s, v4.4s
; CHECK-CVT-GI-NEXT: ushr v6.4s, v0.4s, #16
; CHECK-CVT-GI-NEXT: fcmeq v18.4s, v0.4s, v0.4s
; CHECK-CVT-GI-NEXT: add v19.4s, v0.4s, v4.4s
; CHECK-CVT-GI-NEXT: orr v3.16b, v3.16b, v7.16b
; CHECK-CVT-GI-NEXT: orr v0.16b, v0.16b, v7.16b
; CHECK-CVT-GI-NEXT: and v5.16b, v5.16b, v1.16b
; CHECK-CVT-GI-NEXT: and v6.16b, v6.16b, v1.16b
; CHECK-CVT-GI-NEXT: mvn v16.16b, v16.16b
; CHECK-CVT-GI-NEXT: add v5.4s, v17.4s, v5.4s
; CHECK-CVT-GI-NEXT: mvn v17.16b, v18.16b
; CHECK-CVT-GI-NEXT: add v6.4s, v19.4s, v6.4s
; CHECK-CVT-GI-NEXT: bif v3.16b, v5.16b, v16.16b
; CHECK-CVT-GI-NEXT: shll v5.4s, v2.4h, #16
; CHECK-CVT-GI-NEXT: shll2 v2.4s, v2.8h, #16
; CHECK-CVT-GI-NEXT: bif v0.16b, v6.16b, v17.16b
; CHECK-CVT-GI-NEXT: shrn v3.4h, v3.4s, #16
; CHECK-CVT-GI-NEXT: shrn v0.4h, v0.4s, #16
; CHECK-CVT-GI-NEXT: shll v3.4s, v3.4h, #16
; CHECK-CVT-GI-NEXT: shll v0.4s, v0.4h, #16
; CHECK-CVT-GI-NEXT: fadd v3.4s, v3.4s, v5.4s
; CHECK-CVT-GI-NEXT: fadd v0.4s, v0.4s, v2.4s
; CHECK-CVT-GI-NEXT: ushr v2.4s, v3.4s, #16
; CHECK-CVT-GI-NEXT: fcmeq v6.4s, v3.4s, v3.4s
; CHECK-CVT-GI-NEXT: add v16.4s, v3.4s, v4.4s
; CHECK-CVT-GI-NEXT: ushr v5.4s, v0.4s, #16
; CHECK-CVT-GI-NEXT: fcmeq v17.4s, v0.4s, v0.4s
; CHECK-CVT-GI-NEXT: add v4.4s, v0.4s, v4.4s
; CHECK-CVT-GI-NEXT: orr v3.16b, v3.16b, v7.16b
; CHECK-CVT-GI-NEXT: orr v0.16b, v0.16b, v7.16b
; CHECK-CVT-GI-NEXT: and v2.16b, v2.16b, v1.16b
; CHECK-CVT-GI-NEXT: and v1.16b, v5.16b, v1.16b
; CHECK-CVT-GI-NEXT: mvn v5.16b, v6.16b
; CHECK-CVT-GI-NEXT: mvn v6.16b, v17.16b
; CHECK-CVT-GI-NEXT: add v2.4s, v16.4s, v2.4s
; CHECK-CVT-GI-NEXT: add v1.4s, v4.4s, v1.4s
; CHECK-CVT-GI-NEXT: bit v2.16b, v3.16b, v5.16b
; CHECK-CVT-GI-NEXT: bit v1.16b, v0.16b, v6.16b
; CHECK-CVT-GI-NEXT: shrn v0.4h, v2.4s, #16
; CHECK-CVT-GI-NEXT: shrn v1.4h, v1.4s, #16
; CHECK-CVT-GI-NEXT: mov v0.d[1], v1.d[0]
; CHECK-CVT-GI-NEXT: ret
;
; CHECK-BF16-GI-LABEL: test_fmuladd:
; CHECK-BF16-GI: // %bb.0:
; CHECK-BF16-GI-NEXT: shll v3.4s, v0.4h, #16
; CHECK-BF16-GI-NEXT: shll v4.4s, v1.4h, #16
; CHECK-BF16-GI-NEXT: shll2 v0.4s, v0.8h, #16
; CHECK-BF16-GI-NEXT: shll2 v1.4s, v1.8h, #16
; CHECK-BF16-GI-NEXT: fmul v3.4s, v3.4s, v4.4s
; CHECK-BF16-GI-NEXT: fmul v0.4s, v0.4s, v1.4s
; CHECK-BF16-GI-NEXT: bfcvtn v1.4h, v3.4s
; CHECK-BF16-GI-NEXT: shll v3.4s, v2.4h, #16
; CHECK-BF16-GI-NEXT: shll2 v2.4s, v2.8h, #16
; CHECK-BF16-GI-NEXT: bfcvtn v0.4h, v0.4s
; CHECK-BF16-GI-NEXT: shll v1.4s, v1.4h, #16
; CHECK-BF16-GI-NEXT: shll v0.4s, v0.4h, #16
; CHECK-BF16-GI-NEXT: fadd v1.4s, v1.4s, v3.4s
; CHECK-BF16-GI-NEXT: fadd v2.4s, v0.4s, v2.4s
; CHECK-BF16-GI-NEXT: bfcvtn v0.4h, v1.4s
; CHECK-BF16-GI-NEXT: bfcvtn2 v0.8h, v2.4s
; CHECK-BF16-GI-NEXT: ret
%r = call <8 x bfloat> @llvm.fmuladd.v8bf16(<8 x bfloat> %a, <8 x bfloat> %b, <8 x bfloat> %c)
ret <8 x bfloat> %r
}
attributes #0 = { nounwind }