| ; 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 } |