blob: 98d6b7681bbf6fa3cd9436855043b758462385da [file] [edit]
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
; RUN: llc -mtriple=aarch64 -mattr=+sve2 -aarch64-sve-vector-bits-min=256 < %s | FileCheck %s -check-prefixes=CHECK,VBITS_GE_256
; RUN: llc -mtriple=aarch64 -mattr=+sve2 -aarch64-sve-vector-bits-min=512 < %s | FileCheck %s -check-prefixes=CHECK,VBITS_GE_512
; RUN: llc -mtriple=aarch64 -mattr=+sve2 -aarch64-sve-vector-bits-min=2048 < %s | FileCheck %s -check-prefixes=CHECK,VBITS_GE_2048
; RUN: llc -mtriple=aarch64 -mattr=+sve2,+bf16 -aarch64-sve-vector-bits-min=256 < %s | FileCheck %s -check-prefixes=CHECK,VBITS_GE_256
; RUN: llc -mtriple=aarch64 -mattr=+sve2,+bf16 -aarch64-sve-vector-bits-min=512 < %s | FileCheck %s -check-prefixes=CHECK,VBITS_GE_512
; RUN: llc -mtriple=aarch64 -mattr=+sve2,+bf16 -aarch64-sve-vector-bits-min=2048 < %s | FileCheck %s -check-prefixes=CHECK,VBITS_GE_2048
define void @fcvt_v2bf16_v2f32(ptr %a, ptr %b) vscale_range(2,0) {
; CHECK-LABEL: fcvt_v2bf16_v2f32:
; CHECK: // %bb.0:
; CHECK-NEXT: ldr s0, [x0]
; CHECK-NEXT: shll v0.4s, v0.4h, #16
; CHECK-NEXT: str d0, [x1]
; CHECK-NEXT: ret
%op1 = load <2 x bfloat>, ptr %a
%res = fpext <2 x bfloat> %op1 to <2 x float>
store <2 x float> %res, ptr %b
ret void
}
define void @fcvt_v4bf16_v4f32(ptr %a, ptr %b) vscale_range(2,0) {
; CHECK-LABEL: fcvt_v4bf16_v4f32:
; CHECK: // %bb.0:
; CHECK-NEXT: ldr d0, [x0]
; CHECK-NEXT: shll v0.4s, v0.4h, #16
; CHECK-NEXT: str q0, [x1]
; CHECK-NEXT: ret
%op1 = load <4 x bfloat>, ptr %a
%res = fpext <4 x bfloat> %op1 to <4 x float>
store <4 x float> %res, ptr %b
ret void
}
define void @fcvt_v8bf16_v8f32(ptr %a, ptr %b) vscale_range(2,0) {
; CHECK-LABEL: fcvt_v8bf16_v8f32:
; CHECK: // %bb.0:
; CHECK-NEXT: stp x29, x30, [sp, #-16]! // 16-byte Folded Spill
; CHECK-NEXT: sub x9, sp, #48
; CHECK-NEXT: mov x29, sp
; CHECK-NEXT: and sp, x9, #0xffffffffffffffe0
; CHECK-NEXT: .cfi_def_cfa w29, 16
; CHECK-NEXT: .cfi_offset w30, -8
; CHECK-NEXT: .cfi_offset w29, -16
; CHECK-NEXT: ldr h0, [x0, #14]
; CHECK-NEXT: ptrue p0.s, vl8
; CHECK-NEXT: mov x8, sp
; CHECK-NEXT: shll v0.4s, v0.4h, #16
; CHECK-NEXT: str s0, [sp, #28]
; CHECK-NEXT: ldr h0, [x0, #12]
; CHECK-NEXT: shll v0.4s, v0.4h, #16
; CHECK-NEXT: str s0, [sp, #24]
; CHECK-NEXT: ldr h0, [x0, #10]
; CHECK-NEXT: shll v0.4s, v0.4h, #16
; CHECK-NEXT: str s0, [sp, #20]
; CHECK-NEXT: ldr h0, [x0, #8]
; CHECK-NEXT: shll v0.4s, v0.4h, #16
; CHECK-NEXT: str s0, [sp, #16]
; CHECK-NEXT: ldr h0, [x0, #6]
; CHECK-NEXT: shll v0.4s, v0.4h, #16
; CHECK-NEXT: str s0, [sp, #12]
; CHECK-NEXT: ldr h0, [x0, #4]
; CHECK-NEXT: shll v0.4s, v0.4h, #16
; CHECK-NEXT: str s0, [sp, #8]
; CHECK-NEXT: ldr h0, [x0, #2]
; CHECK-NEXT: shll v0.4s, v0.4h, #16
; CHECK-NEXT: str s0, [sp, #4]
; CHECK-NEXT: ldr h0, [x0]
; CHECK-NEXT: shll v0.4s, v0.4h, #16
; CHECK-NEXT: str s0, [sp]
; CHECK-NEXT: ld1w { z0.s }, p0/z, [x8]
; CHECK-NEXT: st1w { z0.s }, p0, [x1]
; CHECK-NEXT: mov sp, x29
; CHECK-NEXT: ldp x29, x30, [sp], #16 // 16-byte Folded Reload
; CHECK-NEXT: ret
%op1 = load <8 x bfloat>, ptr %a
%res = fpext <8 x bfloat> %op1 to <8 x float>
store <8 x float> %res, ptr %b
ret void
}
define void @fcvt_v16bf16_v16f32(ptr %a, ptr %b) {
; VBITS_GE_256-LABEL: fcvt_v16bf16_v16f32:
; VBITS_GE_256: // %bb.0:
; VBITS_GE_256-NEXT: stp x29, x30, [sp, #-16]! // 16-byte Folded Spill
; VBITS_GE_256-NEXT: sub x9, sp, #80
; VBITS_GE_256-NEXT: mov x29, sp
; VBITS_GE_256-NEXT: and sp, x9, #0xffffffffffffffe0
; VBITS_GE_256-NEXT: .cfi_def_cfa w29, 16
; VBITS_GE_256-NEXT: .cfi_offset w30, -8
; VBITS_GE_256-NEXT: .cfi_offset w29, -16
; VBITS_GE_256-NEXT: ldr h0, [x0, #14]
; VBITS_GE_256-NEXT: ptrue p0.s, vl8
; VBITS_GE_256-NEXT: add x8, sp, #32
; VBITS_GE_256-NEXT: shll v0.4s, v0.4h, #16
; VBITS_GE_256-NEXT: str s0, [sp, #28]
; VBITS_GE_256-NEXT: ldr h0, [x0, #12]
; VBITS_GE_256-NEXT: shll v0.4s, v0.4h, #16
; VBITS_GE_256-NEXT: str s0, [sp, #24]
; VBITS_GE_256-NEXT: ldr h0, [x0, #10]
; VBITS_GE_256-NEXT: shll v0.4s, v0.4h, #16
; VBITS_GE_256-NEXT: str s0, [sp, #20]
; VBITS_GE_256-NEXT: ldr h0, [x0, #8]
; VBITS_GE_256-NEXT: shll v0.4s, v0.4h, #16
; VBITS_GE_256-NEXT: str s0, [sp, #16]
; VBITS_GE_256-NEXT: ldr h0, [x0, #6]
; VBITS_GE_256-NEXT: shll v0.4s, v0.4h, #16
; VBITS_GE_256-NEXT: str s0, [sp, #12]
; VBITS_GE_256-NEXT: ldr h0, [x0, #4]
; VBITS_GE_256-NEXT: shll v0.4s, v0.4h, #16
; VBITS_GE_256-NEXT: str s0, [sp, #8]
; VBITS_GE_256-NEXT: ldr h0, [x0, #2]
; VBITS_GE_256-NEXT: shll v0.4s, v0.4h, #16
; VBITS_GE_256-NEXT: str s0, [sp, #4]
; VBITS_GE_256-NEXT: ldr h0, [x0]
; VBITS_GE_256-NEXT: shll v0.4s, v0.4h, #16
; VBITS_GE_256-NEXT: str s0, [sp]
; VBITS_GE_256-NEXT: ldr h0, [x0, #30]
; VBITS_GE_256-NEXT: shll v0.4s, v0.4h, #16
; VBITS_GE_256-NEXT: str s0, [sp, #60]
; VBITS_GE_256-NEXT: ldr h0, [x0, #28]
; VBITS_GE_256-NEXT: shll v0.4s, v0.4h, #16
; VBITS_GE_256-NEXT: str s0, [sp, #56]
; VBITS_GE_256-NEXT: ldr h0, [x0, #26]
; VBITS_GE_256-NEXT: shll v0.4s, v0.4h, #16
; VBITS_GE_256-NEXT: str s0, [sp, #52]
; VBITS_GE_256-NEXT: ldr h0, [x0, #24]
; VBITS_GE_256-NEXT: shll v0.4s, v0.4h, #16
; VBITS_GE_256-NEXT: str s0, [sp, #48]
; VBITS_GE_256-NEXT: ldr h0, [x0, #22]
; VBITS_GE_256-NEXT: shll v0.4s, v0.4h, #16
; VBITS_GE_256-NEXT: str s0, [sp, #44]
; VBITS_GE_256-NEXT: ldr h0, [x0, #20]
; VBITS_GE_256-NEXT: shll v0.4s, v0.4h, #16
; VBITS_GE_256-NEXT: str s0, [sp, #40]
; VBITS_GE_256-NEXT: ldr h0, [x0, #18]
; VBITS_GE_256-NEXT: shll v0.4s, v0.4h, #16
; VBITS_GE_256-NEXT: str s0, [sp, #36]
; VBITS_GE_256-NEXT: ldr h0, [x0, #16]
; VBITS_GE_256-NEXT: shll v0.4s, v0.4h, #16
; VBITS_GE_256-NEXT: str s0, [sp, #32]
; VBITS_GE_256-NEXT: ld1w { z0.s }, p0/z, [x8]
; VBITS_GE_256-NEXT: mov x8, sp
; VBITS_GE_256-NEXT: ld1w { z1.s }, p0/z, [x8]
; VBITS_GE_256-NEXT: mov x8, #8 // =0x8
; VBITS_GE_256-NEXT: st1w { z0.s }, p0, [x1, x8, lsl #2]
; VBITS_GE_256-NEXT: st1w { z1.s }, p0, [x1]
; VBITS_GE_256-NEXT: mov sp, x29
; VBITS_GE_256-NEXT: ldp x29, x30, [sp], #16 // 16-byte Folded Reload
; VBITS_GE_256-NEXT: ret
;
; VBITS_GE_512-LABEL: fcvt_v16bf16_v16f32:
; VBITS_GE_512: // %bb.0:
; VBITS_GE_512-NEXT: stp x29, x30, [sp, #-16]! // 16-byte Folded Spill
; VBITS_GE_512-NEXT: sub x9, sp, #112
; VBITS_GE_512-NEXT: mov x29, sp
; VBITS_GE_512-NEXT: and sp, x9, #0xffffffffffffffc0
; VBITS_GE_512-NEXT: .cfi_def_cfa w29, 16
; VBITS_GE_512-NEXT: .cfi_offset w30, -8
; VBITS_GE_512-NEXT: .cfi_offset w29, -16
; VBITS_GE_512-NEXT: ldr h0, [x0, #30]
; VBITS_GE_512-NEXT: ptrue p0.s, vl16
; VBITS_GE_512-NEXT: mov x8, sp
; VBITS_GE_512-NEXT: shll v0.4s, v0.4h, #16
; VBITS_GE_512-NEXT: str s0, [sp, #60]
; VBITS_GE_512-NEXT: ldr h0, [x0, #28]
; VBITS_GE_512-NEXT: shll v0.4s, v0.4h, #16
; VBITS_GE_512-NEXT: str s0, [sp, #56]
; VBITS_GE_512-NEXT: ldr h0, [x0, #26]
; VBITS_GE_512-NEXT: shll v0.4s, v0.4h, #16
; VBITS_GE_512-NEXT: str s0, [sp, #52]
; VBITS_GE_512-NEXT: ldr h0, [x0, #24]
; VBITS_GE_512-NEXT: shll v0.4s, v0.4h, #16
; VBITS_GE_512-NEXT: str s0, [sp, #48]
; VBITS_GE_512-NEXT: ldr h0, [x0, #22]
; VBITS_GE_512-NEXT: shll v0.4s, v0.4h, #16
; VBITS_GE_512-NEXT: str s0, [sp, #44]
; VBITS_GE_512-NEXT: ldr h0, [x0, #20]
; VBITS_GE_512-NEXT: shll v0.4s, v0.4h, #16
; VBITS_GE_512-NEXT: str s0, [sp, #40]
; VBITS_GE_512-NEXT: ldr h0, [x0, #18]
; VBITS_GE_512-NEXT: shll v0.4s, v0.4h, #16
; VBITS_GE_512-NEXT: str s0, [sp, #36]
; VBITS_GE_512-NEXT: ldr h0, [x0, #16]
; VBITS_GE_512-NEXT: shll v0.4s, v0.4h, #16
; VBITS_GE_512-NEXT: str s0, [sp, #32]
; VBITS_GE_512-NEXT: ldr h0, [x0, #14]
; VBITS_GE_512-NEXT: shll v0.4s, v0.4h, #16
; VBITS_GE_512-NEXT: str s0, [sp, #28]
; VBITS_GE_512-NEXT: ldr h0, [x0, #12]
; VBITS_GE_512-NEXT: shll v0.4s, v0.4h, #16
; VBITS_GE_512-NEXT: str s0, [sp, #24]
; VBITS_GE_512-NEXT: ldr h0, [x0, #10]
; VBITS_GE_512-NEXT: shll v0.4s, v0.4h, #16
; VBITS_GE_512-NEXT: str s0, [sp, #20]
; VBITS_GE_512-NEXT: ldr h0, [x0, #8]
; VBITS_GE_512-NEXT: shll v0.4s, v0.4h, #16
; VBITS_GE_512-NEXT: str s0, [sp, #16]
; VBITS_GE_512-NEXT: ldr h0, [x0, #6]
; VBITS_GE_512-NEXT: shll v0.4s, v0.4h, #16
; VBITS_GE_512-NEXT: str s0, [sp, #12]
; VBITS_GE_512-NEXT: ldr h0, [x0, #4]
; VBITS_GE_512-NEXT: shll v0.4s, v0.4h, #16
; VBITS_GE_512-NEXT: str s0, [sp, #8]
; VBITS_GE_512-NEXT: ldr h0, [x0, #2]
; VBITS_GE_512-NEXT: shll v0.4s, v0.4h, #16
; VBITS_GE_512-NEXT: str s0, [sp, #4]
; VBITS_GE_512-NEXT: ldr h0, [x0]
; VBITS_GE_512-NEXT: shll v0.4s, v0.4h, #16
; VBITS_GE_512-NEXT: str s0, [sp]
; VBITS_GE_512-NEXT: ld1w { z0.s }, p0/z, [x8]
; VBITS_GE_512-NEXT: st1w { z0.s }, p0, [x1]
; VBITS_GE_512-NEXT: mov sp, x29
; VBITS_GE_512-NEXT: ldp x29, x30, [sp], #16 // 16-byte Folded Reload
; VBITS_GE_512-NEXT: ret
;
; VBITS_GE_2048-LABEL: fcvt_v16bf16_v16f32:
; VBITS_GE_2048: // %bb.0:
; VBITS_GE_2048-NEXT: ldp q1, q0, [x0]
; VBITS_GE_2048-NEXT: ptrue p0.s, vl8
; VBITS_GE_2048-NEXT: uunpklo z0.s, z0.h
; VBITS_GE_2048-NEXT: uunpklo z1.s, z1.h
; VBITS_GE_2048-NEXT: lsl z3.s, z0.s, #16
; VBITS_GE_2048-NEXT: lsl z2.s, z1.s, #16
; VBITS_GE_2048-NEXT: splice z0.s, p0, { z2.s, z3.s }
; VBITS_GE_2048-NEXT: ptrue p0.s, vl16
; VBITS_GE_2048-NEXT: st1w { z0.s }, p0, [x1]
; VBITS_GE_2048-NEXT: ret
%op1 = load <16 x bfloat>, ptr %a
%res = fpext <16 x bfloat> %op1 to <16 x float>
store <16 x float> %res, ptr %b
ret void
}
define void @fcvt_v32bf16_v32f32(ptr %a, ptr %b) vscale_range(8,0) {
; CHECK-LABEL: fcvt_v32bf16_v32f32:
; CHECK: // %bb.0:
; CHECK-NEXT: stp x29, x30, [sp, #-16]! // 16-byte Folded Spill
; CHECK-NEXT: sub x9, sp, #240
; CHECK-NEXT: mov x29, sp
; CHECK-NEXT: and sp, x9, #0xffffffffffffff80
; CHECK-NEXT: .cfi_def_cfa w29, 16
; CHECK-NEXT: .cfi_offset w30, -8
; CHECK-NEXT: .cfi_offset w29, -16
; CHECK-NEXT: ldr h0, [x0, #62]
; CHECK-NEXT: ptrue p0.s, vl32
; CHECK-NEXT: mov x8, sp
; CHECK-NEXT: shll v0.4s, v0.4h, #16
; CHECK-NEXT: str s0, [sp, #124]
; CHECK-NEXT: ldr h0, [x0, #60]
; CHECK-NEXT: shll v0.4s, v0.4h, #16
; CHECK-NEXT: str s0, [sp, #120]
; CHECK-NEXT: ldr h0, [x0, #58]
; CHECK-NEXT: shll v0.4s, v0.4h, #16
; CHECK-NEXT: str s0, [sp, #116]
; CHECK-NEXT: ldr h0, [x0, #56]
; CHECK-NEXT: shll v0.4s, v0.4h, #16
; CHECK-NEXT: str s0, [sp, #112]
; CHECK-NEXT: ldr h0, [x0, #54]
; CHECK-NEXT: shll v0.4s, v0.4h, #16
; CHECK-NEXT: str s0, [sp, #108]
; CHECK-NEXT: ldr h0, [x0, #52]
; CHECK-NEXT: shll v0.4s, v0.4h, #16
; CHECK-NEXT: str s0, [sp, #104]
; CHECK-NEXT: ldr h0, [x0, #50]
; CHECK-NEXT: shll v0.4s, v0.4h, #16
; CHECK-NEXT: str s0, [sp, #100]
; CHECK-NEXT: ldr h0, [x0, #48]
; CHECK-NEXT: shll v0.4s, v0.4h, #16
; CHECK-NEXT: str s0, [sp, #96]
; CHECK-NEXT: ldr h0, [x0, #46]
; CHECK-NEXT: shll v0.4s, v0.4h, #16
; CHECK-NEXT: str s0, [sp, #92]
; CHECK-NEXT: ldr h0, [x0, #44]
; CHECK-NEXT: shll v0.4s, v0.4h, #16
; CHECK-NEXT: str s0, [sp, #88]
; CHECK-NEXT: ldr h0, [x0, #42]
; CHECK-NEXT: shll v0.4s, v0.4h, #16
; CHECK-NEXT: str s0, [sp, #84]
; CHECK-NEXT: ldr h0, [x0, #40]
; CHECK-NEXT: shll v0.4s, v0.4h, #16
; CHECK-NEXT: str s0, [sp, #80]
; CHECK-NEXT: ldr h0, [x0, #38]
; CHECK-NEXT: shll v0.4s, v0.4h, #16
; CHECK-NEXT: str s0, [sp, #76]
; CHECK-NEXT: ldr h0, [x0, #36]
; CHECK-NEXT: shll v0.4s, v0.4h, #16
; CHECK-NEXT: str s0, [sp, #72]
; CHECK-NEXT: ldr h0, [x0, #34]
; CHECK-NEXT: shll v0.4s, v0.4h, #16
; CHECK-NEXT: str s0, [sp, #68]
; CHECK-NEXT: ldr h0, [x0, #32]
; CHECK-NEXT: shll v0.4s, v0.4h, #16
; CHECK-NEXT: str s0, [sp, #64]
; CHECK-NEXT: ldr h0, [x0, #30]
; CHECK-NEXT: shll v0.4s, v0.4h, #16
; CHECK-NEXT: str s0, [sp, #60]
; CHECK-NEXT: ldr h0, [x0, #28]
; CHECK-NEXT: shll v0.4s, v0.4h, #16
; CHECK-NEXT: str s0, [sp, #56]
; CHECK-NEXT: ldr h0, [x0, #26]
; CHECK-NEXT: shll v0.4s, v0.4h, #16
; CHECK-NEXT: str s0, [sp, #52]
; CHECK-NEXT: ldr h0, [x0, #24]
; CHECK-NEXT: shll v0.4s, v0.4h, #16
; CHECK-NEXT: str s0, [sp, #48]
; CHECK-NEXT: ldr h0, [x0, #22]
; CHECK-NEXT: shll v0.4s, v0.4h, #16
; CHECK-NEXT: str s0, [sp, #44]
; CHECK-NEXT: ldr h0, [x0, #20]
; CHECK-NEXT: shll v0.4s, v0.4h, #16
; CHECK-NEXT: str s0, [sp, #40]
; CHECK-NEXT: ldr h0, [x0, #18]
; CHECK-NEXT: shll v0.4s, v0.4h, #16
; CHECK-NEXT: str s0, [sp, #36]
; CHECK-NEXT: ldr h0, [x0, #16]
; CHECK-NEXT: shll v0.4s, v0.4h, #16
; CHECK-NEXT: str s0, [sp, #32]
; CHECK-NEXT: ldr h0, [x0, #14]
; CHECK-NEXT: shll v0.4s, v0.4h, #16
; CHECK-NEXT: str s0, [sp, #28]
; CHECK-NEXT: ldr h0, [x0, #12]
; CHECK-NEXT: shll v0.4s, v0.4h, #16
; CHECK-NEXT: str s0, [sp, #24]
; CHECK-NEXT: ldr h0, [x0, #10]
; CHECK-NEXT: shll v0.4s, v0.4h, #16
; CHECK-NEXT: str s0, [sp, #20]
; CHECK-NEXT: ldr h0, [x0, #8]
; CHECK-NEXT: shll v0.4s, v0.4h, #16
; CHECK-NEXT: str s0, [sp, #16]
; CHECK-NEXT: ldr h0, [x0, #6]
; CHECK-NEXT: shll v0.4s, v0.4h, #16
; CHECK-NEXT: str s0, [sp, #12]
; CHECK-NEXT: ldr h0, [x0, #4]
; CHECK-NEXT: shll v0.4s, v0.4h, #16
; CHECK-NEXT: str s0, [sp, #8]
; CHECK-NEXT: ldr h0, [x0, #2]
; CHECK-NEXT: shll v0.4s, v0.4h, #16
; CHECK-NEXT: str s0, [sp, #4]
; CHECK-NEXT: ldr h0, [x0]
; CHECK-NEXT: shll v0.4s, v0.4h, #16
; CHECK-NEXT: str s0, [sp]
; CHECK-NEXT: ld1w { z0.s }, p0/z, [x8]
; CHECK-NEXT: st1w { z0.s }, p0, [x1]
; CHECK-NEXT: mov sp, x29
; CHECK-NEXT: ldp x29, x30, [sp], #16 // 16-byte Folded Reload
; CHECK-NEXT: ret
%op1 = load <32 x bfloat>, ptr %a
%res = fpext <32 x bfloat> %op1 to <32 x float>
store <32 x float> %res, ptr %b
ret void
}
define void @fcvt_v64bf16_v64f32(ptr %a, ptr %b) vscale_range(16,0) {
; CHECK-LABEL: fcvt_v64bf16_v64f32:
; CHECK: // %bb.0:
; CHECK-NEXT: stp x29, x30, [sp, #-16]! // 16-byte Folded Spill
; CHECK-NEXT: sub x9, sp, #496
; CHECK-NEXT: mov x29, sp
; CHECK-NEXT: and sp, x9, #0xffffffffffffff00
; CHECK-NEXT: .cfi_def_cfa w29, 16
; CHECK-NEXT: .cfi_offset w30, -8
; CHECK-NEXT: .cfi_offset w29, -16
; CHECK-NEXT: ldr h0, [x0, #126]
; CHECK-NEXT: ptrue p0.s, vl64
; CHECK-NEXT: mov x8, sp
; CHECK-NEXT: shll v0.4s, v0.4h, #16
; CHECK-NEXT: str s0, [sp, #252]
; CHECK-NEXT: ldr h0, [x0, #124]
; CHECK-NEXT: shll v0.4s, v0.4h, #16
; CHECK-NEXT: str s0, [sp, #248]
; CHECK-NEXT: ldr h0, [x0, #122]
; CHECK-NEXT: shll v0.4s, v0.4h, #16
; CHECK-NEXT: str s0, [sp, #244]
; CHECK-NEXT: ldr h0, [x0, #120]
; CHECK-NEXT: shll v0.4s, v0.4h, #16
; CHECK-NEXT: str s0, [sp, #240]
; CHECK-NEXT: ldr h0, [x0, #118]
; CHECK-NEXT: shll v0.4s, v0.4h, #16
; CHECK-NEXT: str s0, [sp, #236]
; CHECK-NEXT: ldr h0, [x0, #116]
; CHECK-NEXT: shll v0.4s, v0.4h, #16
; CHECK-NEXT: str s0, [sp, #232]
; CHECK-NEXT: ldr h0, [x0, #114]
; CHECK-NEXT: shll v0.4s, v0.4h, #16
; CHECK-NEXT: str s0, [sp, #228]
; CHECK-NEXT: ldr h0, [x0, #112]
; CHECK-NEXT: shll v0.4s, v0.4h, #16
; CHECK-NEXT: str s0, [sp, #224]
; CHECK-NEXT: ldr h0, [x0, #110]
; CHECK-NEXT: shll v0.4s, v0.4h, #16
; CHECK-NEXT: str s0, [sp, #220]
; CHECK-NEXT: ldr h0, [x0, #108]
; CHECK-NEXT: shll v0.4s, v0.4h, #16
; CHECK-NEXT: str s0, [sp, #216]
; CHECK-NEXT: ldr h0, [x0, #106]
; CHECK-NEXT: shll v0.4s, v0.4h, #16
; CHECK-NEXT: str s0, [sp, #212]
; CHECK-NEXT: ldr h0, [x0, #104]
; CHECK-NEXT: shll v0.4s, v0.4h, #16
; CHECK-NEXT: str s0, [sp, #208]
; CHECK-NEXT: ldr h0, [x0, #102]
; CHECK-NEXT: shll v0.4s, v0.4h, #16
; CHECK-NEXT: str s0, [sp, #204]
; CHECK-NEXT: ldr h0, [x0, #100]
; CHECK-NEXT: shll v0.4s, v0.4h, #16
; CHECK-NEXT: str s0, [sp, #200]
; CHECK-NEXT: ldr h0, [x0, #98]
; CHECK-NEXT: shll v0.4s, v0.4h, #16
; CHECK-NEXT: str s0, [sp, #196]
; CHECK-NEXT: ldr h0, [x0, #96]
; CHECK-NEXT: shll v0.4s, v0.4h, #16
; CHECK-NEXT: str s0, [sp, #192]
; CHECK-NEXT: ldr h0, [x0, #94]
; CHECK-NEXT: shll v0.4s, v0.4h, #16
; CHECK-NEXT: str s0, [sp, #188]
; CHECK-NEXT: ldr h0, [x0, #92]
; CHECK-NEXT: shll v0.4s, v0.4h, #16
; CHECK-NEXT: str s0, [sp, #184]
; CHECK-NEXT: ldr h0, [x0, #90]
; CHECK-NEXT: shll v0.4s, v0.4h, #16
; CHECK-NEXT: str s0, [sp, #180]
; CHECK-NEXT: ldr h0, [x0, #88]
; CHECK-NEXT: shll v0.4s, v0.4h, #16
; CHECK-NEXT: str s0, [sp, #176]
; CHECK-NEXT: ldr h0, [x0, #86]
; CHECK-NEXT: shll v0.4s, v0.4h, #16
; CHECK-NEXT: str s0, [sp, #172]
; CHECK-NEXT: ldr h0, [x0, #84]
; CHECK-NEXT: shll v0.4s, v0.4h, #16
; CHECK-NEXT: str s0, [sp, #168]
; CHECK-NEXT: ldr h0, [x0, #82]
; CHECK-NEXT: shll v0.4s, v0.4h, #16
; CHECK-NEXT: str s0, [sp, #164]
; CHECK-NEXT: ldr h0, [x0, #80]
; CHECK-NEXT: shll v0.4s, v0.4h, #16
; CHECK-NEXT: str s0, [sp, #160]
; CHECK-NEXT: ldr h0, [x0, #78]
; CHECK-NEXT: shll v0.4s, v0.4h, #16
; CHECK-NEXT: str s0, [sp, #156]
; CHECK-NEXT: ldr h0, [x0, #76]
; CHECK-NEXT: shll v0.4s, v0.4h, #16
; CHECK-NEXT: str s0, [sp, #152]
; CHECK-NEXT: ldr h0, [x0, #74]
; CHECK-NEXT: shll v0.4s, v0.4h, #16
; CHECK-NEXT: str s0, [sp, #148]
; CHECK-NEXT: ldr h0, [x0, #72]
; CHECK-NEXT: shll v0.4s, v0.4h, #16
; CHECK-NEXT: str s0, [sp, #144]
; CHECK-NEXT: ldr h0, [x0, #70]
; CHECK-NEXT: shll v0.4s, v0.4h, #16
; CHECK-NEXT: str s0, [sp, #140]
; CHECK-NEXT: ldr h0, [x0, #68]
; CHECK-NEXT: shll v0.4s, v0.4h, #16
; CHECK-NEXT: str s0, [sp, #136]
; CHECK-NEXT: ldr h0, [x0, #66]
; CHECK-NEXT: shll v0.4s, v0.4h, #16
; CHECK-NEXT: str s0, [sp, #132]
; CHECK-NEXT: ldr h0, [x0, #64]
; CHECK-NEXT: shll v0.4s, v0.4h, #16
; CHECK-NEXT: str s0, [sp, #128]
; CHECK-NEXT: ldr h0, [x0, #62]
; CHECK-NEXT: shll v0.4s, v0.4h, #16
; CHECK-NEXT: str s0, [sp, #124]
; CHECK-NEXT: ldr h0, [x0, #60]
; CHECK-NEXT: shll v0.4s, v0.4h, #16
; CHECK-NEXT: str s0, [sp, #120]
; CHECK-NEXT: ldr h0, [x0, #58]
; CHECK-NEXT: shll v0.4s, v0.4h, #16
; CHECK-NEXT: str s0, [sp, #116]
; CHECK-NEXT: ldr h0, [x0, #56]
; CHECK-NEXT: shll v0.4s, v0.4h, #16
; CHECK-NEXT: str s0, [sp, #112]
; CHECK-NEXT: ldr h0, [x0, #54]
; CHECK-NEXT: shll v0.4s, v0.4h, #16
; CHECK-NEXT: str s0, [sp, #108]
; CHECK-NEXT: ldr h0, [x0, #52]
; CHECK-NEXT: shll v0.4s, v0.4h, #16
; CHECK-NEXT: str s0, [sp, #104]
; CHECK-NEXT: ldr h0, [x0, #50]
; CHECK-NEXT: shll v0.4s, v0.4h, #16
; CHECK-NEXT: str s0, [sp, #100]
; CHECK-NEXT: ldr h0, [x0, #48]
; CHECK-NEXT: shll v0.4s, v0.4h, #16
; CHECK-NEXT: str s0, [sp, #96]
; CHECK-NEXT: ldr h0, [x0, #46]
; CHECK-NEXT: shll v0.4s, v0.4h, #16
; CHECK-NEXT: str s0, [sp, #92]
; CHECK-NEXT: ldr h0, [x0, #44]
; CHECK-NEXT: shll v0.4s, v0.4h, #16
; CHECK-NEXT: str s0, [sp, #88]
; CHECK-NEXT: ldr h0, [x0, #42]
; CHECK-NEXT: shll v0.4s, v0.4h, #16
; CHECK-NEXT: str s0, [sp, #84]
; CHECK-NEXT: ldr h0, [x0, #40]
; CHECK-NEXT: shll v0.4s, v0.4h, #16
; CHECK-NEXT: str s0, [sp, #80]
; CHECK-NEXT: ldr h0, [x0, #38]
; CHECK-NEXT: shll v0.4s, v0.4h, #16
; CHECK-NEXT: str s0, [sp, #76]
; CHECK-NEXT: ldr h0, [x0, #36]
; CHECK-NEXT: shll v0.4s, v0.4h, #16
; CHECK-NEXT: str s0, [sp, #72]
; CHECK-NEXT: ldr h0, [x0, #34]
; CHECK-NEXT: shll v0.4s, v0.4h, #16
; CHECK-NEXT: str s0, [sp, #68]
; CHECK-NEXT: ldr h0, [x0, #32]
; CHECK-NEXT: shll v0.4s, v0.4h, #16
; CHECK-NEXT: str s0, [sp, #64]
; CHECK-NEXT: ldr h0, [x0, #30]
; CHECK-NEXT: shll v0.4s, v0.4h, #16
; CHECK-NEXT: str s0, [sp, #60]
; CHECK-NEXT: ldr h0, [x0, #28]
; CHECK-NEXT: shll v0.4s, v0.4h, #16
; CHECK-NEXT: str s0, [sp, #56]
; CHECK-NEXT: ldr h0, [x0, #26]
; CHECK-NEXT: shll v0.4s, v0.4h, #16
; CHECK-NEXT: str s0, [sp, #52]
; CHECK-NEXT: ldr h0, [x0, #24]
; CHECK-NEXT: shll v0.4s, v0.4h, #16
; CHECK-NEXT: str s0, [sp, #48]
; CHECK-NEXT: ldr h0, [x0, #22]
; CHECK-NEXT: shll v0.4s, v0.4h, #16
; CHECK-NEXT: str s0, [sp, #44]
; CHECK-NEXT: ldr h0, [x0, #20]
; CHECK-NEXT: shll v0.4s, v0.4h, #16
; CHECK-NEXT: str s0, [sp, #40]
; CHECK-NEXT: ldr h0, [x0, #18]
; CHECK-NEXT: shll v0.4s, v0.4h, #16
; CHECK-NEXT: str s0, [sp, #36]
; CHECK-NEXT: ldr h0, [x0, #16]
; CHECK-NEXT: shll v0.4s, v0.4h, #16
; CHECK-NEXT: str s0, [sp, #32]
; CHECK-NEXT: ldr h0, [x0, #14]
; CHECK-NEXT: shll v0.4s, v0.4h, #16
; CHECK-NEXT: str s0, [sp, #28]
; CHECK-NEXT: ldr h0, [x0, #12]
; CHECK-NEXT: shll v0.4s, v0.4h, #16
; CHECK-NEXT: str s0, [sp, #24]
; CHECK-NEXT: ldr h0, [x0, #10]
; CHECK-NEXT: shll v0.4s, v0.4h, #16
; CHECK-NEXT: str s0, [sp, #20]
; CHECK-NEXT: ldr h0, [x0, #8]
; CHECK-NEXT: shll v0.4s, v0.4h, #16
; CHECK-NEXT: str s0, [sp, #16]
; CHECK-NEXT: ldr h0, [x0, #6]
; CHECK-NEXT: shll v0.4s, v0.4h, #16
; CHECK-NEXT: str s0, [sp, #12]
; CHECK-NEXT: ldr h0, [x0, #4]
; CHECK-NEXT: shll v0.4s, v0.4h, #16
; CHECK-NEXT: str s0, [sp, #8]
; CHECK-NEXT: ldr h0, [x0, #2]
; CHECK-NEXT: shll v0.4s, v0.4h, #16
; CHECK-NEXT: str s0, [sp, #4]
; CHECK-NEXT: ldr h0, [x0]
; CHECK-NEXT: shll v0.4s, v0.4h, #16
; CHECK-NEXT: str s0, [sp]
; CHECK-NEXT: ld1w { z0.s }, p0/z, [x8]
; CHECK-NEXT: st1w { z0.s }, p0, [x1]
; CHECK-NEXT: mov sp, x29
; CHECK-NEXT: ldp x29, x30, [sp], #16 // 16-byte Folded Reload
; CHECK-NEXT: ret
%op1 = load <64 x bfloat>, ptr %a
%res = fpext <64 x bfloat> %op1 to <64 x float>
store <64 x float> %res, ptr %b
ret void
}
define void @fcvt_v1bf16_v1f64(ptr %a, ptr %b) vscale_range(2,0) {
; CHECK-LABEL: fcvt_v1bf16_v1f64:
; CHECK: // %bb.0:
; CHECK-NEXT: ldr h0, [x0]
; CHECK-NEXT: shll v0.4s, v0.4h, #16
; CHECK-NEXT: fcvt d0, s0
; CHECK-NEXT: str d0, [x1]
; CHECK-NEXT: ret
%op1 = load <1 x bfloat>, ptr %a
%res = fpext <1 x bfloat> %op1 to <1 x double>
store <1 x double> %res, ptr %b
ret void
}
define void @fcvt_v2bf16_v2f64(ptr %a, ptr %b) vscale_range(2,0) {
; CHECK-LABEL: fcvt_v2bf16_v2f64:
; CHECK: // %bb.0:
; CHECK-NEXT: ldr s0, [x0]
; CHECK-NEXT: ptrue p0.d, vl4
; CHECK-NEXT: shll v0.4s, v0.4h, #16
; CHECK-NEXT: uunpklo z0.d, z0.s
; CHECK-NEXT: fcvt z0.d, p0/m, z0.s
; CHECK-NEXT: str q0, [x1]
; CHECK-NEXT: ret
%op1 = load <2 x bfloat>, ptr %a
%res = fpext <2 x bfloat> %op1 to <2 x double>
store <2 x double> %res, ptr %b
ret void
}
define void @fcvt_v4bf16_v4f64(ptr %a, ptr %b) vscale_range(2,0) {
; CHECK-LABEL: fcvt_v4bf16_v4f64:
; CHECK: // %bb.0:
; CHECK-NEXT: stp x29, x30, [sp, #-16]! // 16-byte Folded Spill
; CHECK-NEXT: sub x9, sp, #48
; CHECK-NEXT: mov x29, sp
; CHECK-NEXT: and sp, x9, #0xffffffffffffffe0
; CHECK-NEXT: .cfi_def_cfa w29, 16
; CHECK-NEXT: .cfi_offset w30, -8
; CHECK-NEXT: .cfi_offset w29, -16
; CHECK-NEXT: ldr h0, [x0, #6]
; CHECK-NEXT: ptrue p0.d, vl4
; CHECK-NEXT: mov x8, sp
; CHECK-NEXT: shll v0.4s, v0.4h, #16
; CHECK-NEXT: fcvt d0, s0
; CHECK-NEXT: str d0, [sp, #24]
; CHECK-NEXT: ldr h0, [x0, #4]
; CHECK-NEXT: shll v0.4s, v0.4h, #16
; CHECK-NEXT: fcvt d0, s0
; CHECK-NEXT: str d0, [sp, #16]
; CHECK-NEXT: ldr h0, [x0, #2]
; CHECK-NEXT: shll v0.4s, v0.4h, #16
; CHECK-NEXT: fcvt d0, s0
; CHECK-NEXT: str d0, [sp, #8]
; CHECK-NEXT: ldr h0, [x0]
; CHECK-NEXT: shll v0.4s, v0.4h, #16
; CHECK-NEXT: fcvt d0, s0
; CHECK-NEXT: str d0, [sp]
; CHECK-NEXT: ld1d { z0.d }, p0/z, [x8]
; CHECK-NEXT: st1d { z0.d }, p0, [x1]
; CHECK-NEXT: mov sp, x29
; CHECK-NEXT: ldp x29, x30, [sp], #16 // 16-byte Folded Reload
; CHECK-NEXT: ret
%op1 = load <4 x bfloat>, ptr %a
%res = fpext <4 x bfloat> %op1 to <4 x double>
store <4 x double> %res, ptr %b
ret void
}
define void @fcvt_v8bf16_v8f64(ptr %a, ptr %b) {
; VBITS_GE_256-LABEL: fcvt_v8bf16_v8f64:
; VBITS_GE_256: // %bb.0:
; VBITS_GE_256-NEXT: stp x29, x30, [sp, #-16]! // 16-byte Folded Spill
; VBITS_GE_256-NEXT: sub x9, sp, #80
; VBITS_GE_256-NEXT: mov x29, sp
; VBITS_GE_256-NEXT: and sp, x9, #0xffffffffffffffe0
; VBITS_GE_256-NEXT: .cfi_def_cfa w29, 16
; VBITS_GE_256-NEXT: .cfi_offset w30, -8
; VBITS_GE_256-NEXT: .cfi_offset w29, -16
; VBITS_GE_256-NEXT: ldr h0, [x0, #6]
; VBITS_GE_256-NEXT: ptrue p0.d, vl4
; VBITS_GE_256-NEXT: add x8, sp, #32
; VBITS_GE_256-NEXT: shll v0.4s, v0.4h, #16
; VBITS_GE_256-NEXT: fcvt d0, s0
; VBITS_GE_256-NEXT: str d0, [sp, #24]
; VBITS_GE_256-NEXT: ldr h0, [x0, #4]
; VBITS_GE_256-NEXT: shll v0.4s, v0.4h, #16
; VBITS_GE_256-NEXT: fcvt d0, s0
; VBITS_GE_256-NEXT: str d0, [sp, #16]
; VBITS_GE_256-NEXT: ldr h0, [x0, #2]
; VBITS_GE_256-NEXT: shll v0.4s, v0.4h, #16
; VBITS_GE_256-NEXT: fcvt d0, s0
; VBITS_GE_256-NEXT: str d0, [sp, #8]
; VBITS_GE_256-NEXT: ldr h0, [x0]
; VBITS_GE_256-NEXT: shll v0.4s, v0.4h, #16
; VBITS_GE_256-NEXT: fcvt d0, s0
; VBITS_GE_256-NEXT: str d0, [sp]
; VBITS_GE_256-NEXT: ldr h0, [x0, #14]
; VBITS_GE_256-NEXT: shll v0.4s, v0.4h, #16
; VBITS_GE_256-NEXT: fcvt d0, s0
; VBITS_GE_256-NEXT: str d0, [sp, #56]
; VBITS_GE_256-NEXT: ldr h0, [x0, #12]
; VBITS_GE_256-NEXT: shll v0.4s, v0.4h, #16
; VBITS_GE_256-NEXT: fcvt d0, s0
; VBITS_GE_256-NEXT: str d0, [sp, #48]
; VBITS_GE_256-NEXT: ldr h0, [x0, #10]
; VBITS_GE_256-NEXT: shll v0.4s, v0.4h, #16
; VBITS_GE_256-NEXT: fcvt d0, s0
; VBITS_GE_256-NEXT: str d0, [sp, #40]
; VBITS_GE_256-NEXT: ldr h0, [x0, #8]
; VBITS_GE_256-NEXT: shll v0.4s, v0.4h, #16
; VBITS_GE_256-NEXT: fcvt d0, s0
; VBITS_GE_256-NEXT: str d0, [sp, #32]
; VBITS_GE_256-NEXT: ld1d { z0.d }, p0/z, [x8]
; VBITS_GE_256-NEXT: mov x8, sp
; VBITS_GE_256-NEXT: ld1d { z1.d }, p0/z, [x8]
; VBITS_GE_256-NEXT: mov x8, #4 // =0x4
; VBITS_GE_256-NEXT: st1d { z0.d }, p0, [x1, x8, lsl #3]
; VBITS_GE_256-NEXT: st1d { z1.d }, p0, [x1]
; VBITS_GE_256-NEXT: mov sp, x29
; VBITS_GE_256-NEXT: ldp x29, x30, [sp], #16 // 16-byte Folded Reload
; VBITS_GE_256-NEXT: ret
;
; VBITS_GE_512-LABEL: fcvt_v8bf16_v8f64:
; VBITS_GE_512: // %bb.0:
; VBITS_GE_512-NEXT: stp x29, x30, [sp, #-16]! // 16-byte Folded Spill
; VBITS_GE_512-NEXT: sub x9, sp, #112
; VBITS_GE_512-NEXT: mov x29, sp
; VBITS_GE_512-NEXT: and sp, x9, #0xffffffffffffffc0
; VBITS_GE_512-NEXT: .cfi_def_cfa w29, 16
; VBITS_GE_512-NEXT: .cfi_offset w30, -8
; VBITS_GE_512-NEXT: .cfi_offset w29, -16
; VBITS_GE_512-NEXT: ldr h0, [x0, #14]
; VBITS_GE_512-NEXT: ptrue p0.d, vl8
; VBITS_GE_512-NEXT: mov x8, sp
; VBITS_GE_512-NEXT: shll v0.4s, v0.4h, #16
; VBITS_GE_512-NEXT: fcvt d0, s0
; VBITS_GE_512-NEXT: str d0, [sp, #56]
; VBITS_GE_512-NEXT: ldr h0, [x0, #12]
; VBITS_GE_512-NEXT: shll v0.4s, v0.4h, #16
; VBITS_GE_512-NEXT: fcvt d0, s0
; VBITS_GE_512-NEXT: str d0, [sp, #48]
; VBITS_GE_512-NEXT: ldr h0, [x0, #10]
; VBITS_GE_512-NEXT: shll v0.4s, v0.4h, #16
; VBITS_GE_512-NEXT: fcvt d0, s0
; VBITS_GE_512-NEXT: str d0, [sp, #40]
; VBITS_GE_512-NEXT: ldr h0, [x0, #8]
; VBITS_GE_512-NEXT: shll v0.4s, v0.4h, #16
; VBITS_GE_512-NEXT: fcvt d0, s0
; VBITS_GE_512-NEXT: str d0, [sp, #32]
; VBITS_GE_512-NEXT: ldr h0, [x0, #6]
; VBITS_GE_512-NEXT: shll v0.4s, v0.4h, #16
; VBITS_GE_512-NEXT: fcvt d0, s0
; VBITS_GE_512-NEXT: str d0, [sp, #24]
; VBITS_GE_512-NEXT: ldr h0, [x0, #4]
; VBITS_GE_512-NEXT: shll v0.4s, v0.4h, #16
; VBITS_GE_512-NEXT: fcvt d0, s0
; VBITS_GE_512-NEXT: str d0, [sp, #16]
; VBITS_GE_512-NEXT: ldr h0, [x0, #2]
; VBITS_GE_512-NEXT: shll v0.4s, v0.4h, #16
; VBITS_GE_512-NEXT: fcvt d0, s0
; VBITS_GE_512-NEXT: str d0, [sp, #8]
; VBITS_GE_512-NEXT: ldr h0, [x0]
; VBITS_GE_512-NEXT: shll v0.4s, v0.4h, #16
; VBITS_GE_512-NEXT: fcvt d0, s0
; VBITS_GE_512-NEXT: str d0, [sp]
; VBITS_GE_512-NEXT: ld1d { z0.d }, p0/z, [x8]
; VBITS_GE_512-NEXT: st1d { z0.d }, p0, [x1]
; VBITS_GE_512-NEXT: mov sp, x29
; VBITS_GE_512-NEXT: ldp x29, x30, [sp], #16 // 16-byte Folded Reload
; VBITS_GE_512-NEXT: ret
;
; VBITS_GE_2048-LABEL: fcvt_v8bf16_v8f64:
; VBITS_GE_2048: // %bb.0:
; VBITS_GE_2048-NEXT: ldr q0, [x0]
; VBITS_GE_2048-NEXT: ptrue p0.d, vl8
; VBITS_GE_2048-NEXT: uunpklo z0.s, z0.h
; VBITS_GE_2048-NEXT: lsl z0.s, z0.s, #16
; VBITS_GE_2048-NEXT: uunpklo z0.d, z0.s
; VBITS_GE_2048-NEXT: fcvt z0.d, p0/m, z0.s
; VBITS_GE_2048-NEXT: st1d { z0.d }, p0, [x1]
; VBITS_GE_2048-NEXT: ret
%op1 = load <8 x bfloat>, ptr %a
%res = fpext <8 x bfloat> %op1 to <8 x double>
store <8 x double> %res, ptr %b
ret void
}
define void @fcvt_v16bf16_v16f64(ptr %a, ptr %b) vscale_range(8,0) {
; CHECK-LABEL: fcvt_v16bf16_v16f64:
; CHECK: // %bb.0:
; CHECK-NEXT: stp x29, x30, [sp, #-16]! // 16-byte Folded Spill
; CHECK-NEXT: sub x9, sp, #240
; CHECK-NEXT: mov x29, sp
; CHECK-NEXT: and sp, x9, #0xffffffffffffff80
; CHECK-NEXT: .cfi_def_cfa w29, 16
; CHECK-NEXT: .cfi_offset w30, -8
; CHECK-NEXT: .cfi_offset w29, -16
; CHECK-NEXT: ldr h0, [x0, #30]
; CHECK-NEXT: ptrue p0.d, vl16
; CHECK-NEXT: mov x8, sp
; CHECK-NEXT: shll v0.4s, v0.4h, #16
; CHECK-NEXT: fcvt d0, s0
; CHECK-NEXT: str d0, [sp, #120]
; CHECK-NEXT: ldr h0, [x0, #28]
; CHECK-NEXT: shll v0.4s, v0.4h, #16
; CHECK-NEXT: fcvt d0, s0
; CHECK-NEXT: str d0, [sp, #112]
; CHECK-NEXT: ldr h0, [x0, #26]
; CHECK-NEXT: shll v0.4s, v0.4h, #16
; CHECK-NEXT: fcvt d0, s0
; CHECK-NEXT: str d0, [sp, #104]
; CHECK-NEXT: ldr h0, [x0, #24]
; CHECK-NEXT: shll v0.4s, v0.4h, #16
; CHECK-NEXT: fcvt d0, s0
; CHECK-NEXT: str d0, [sp, #96]
; CHECK-NEXT: ldr h0, [x0, #22]
; CHECK-NEXT: shll v0.4s, v0.4h, #16
; CHECK-NEXT: fcvt d0, s0
; CHECK-NEXT: str d0, [sp, #88]
; CHECK-NEXT: ldr h0, [x0, #20]
; CHECK-NEXT: shll v0.4s, v0.4h, #16
; CHECK-NEXT: fcvt d0, s0
; CHECK-NEXT: str d0, [sp, #80]
; CHECK-NEXT: ldr h0, [x0, #18]
; CHECK-NEXT: shll v0.4s, v0.4h, #16
; CHECK-NEXT: fcvt d0, s0
; CHECK-NEXT: str d0, [sp, #72]
; CHECK-NEXT: ldr h0, [x0, #16]
; CHECK-NEXT: shll v0.4s, v0.4h, #16
; CHECK-NEXT: fcvt d0, s0
; CHECK-NEXT: str d0, [sp, #64]
; CHECK-NEXT: ldr h0, [x0, #14]
; CHECK-NEXT: shll v0.4s, v0.4h, #16
; CHECK-NEXT: fcvt d0, s0
; CHECK-NEXT: str d0, [sp, #56]
; CHECK-NEXT: ldr h0, [x0, #12]
; CHECK-NEXT: shll v0.4s, v0.4h, #16
; CHECK-NEXT: fcvt d0, s0
; CHECK-NEXT: str d0, [sp, #48]
; CHECK-NEXT: ldr h0, [x0, #10]
; CHECK-NEXT: shll v0.4s, v0.4h, #16
; CHECK-NEXT: fcvt d0, s0
; CHECK-NEXT: str d0, [sp, #40]
; CHECK-NEXT: ldr h0, [x0, #8]
; CHECK-NEXT: shll v0.4s, v0.4h, #16
; CHECK-NEXT: fcvt d0, s0
; CHECK-NEXT: str d0, [sp, #32]
; CHECK-NEXT: ldr h0, [x0, #6]
; CHECK-NEXT: shll v0.4s, v0.4h, #16
; CHECK-NEXT: fcvt d0, s0
; CHECK-NEXT: str d0, [sp, #24]
; CHECK-NEXT: ldr h0, [x0, #4]
; CHECK-NEXT: shll v0.4s, v0.4h, #16
; CHECK-NEXT: fcvt d0, s0
; CHECK-NEXT: str d0, [sp, #16]
; CHECK-NEXT: ldr h0, [x0, #2]
; CHECK-NEXT: shll v0.4s, v0.4h, #16
; CHECK-NEXT: fcvt d0, s0
; CHECK-NEXT: str d0, [sp, #8]
; CHECK-NEXT: ldr h0, [x0]
; CHECK-NEXT: shll v0.4s, v0.4h, #16
; CHECK-NEXT: fcvt d0, s0
; CHECK-NEXT: str d0, [sp]
; CHECK-NEXT: ld1d { z0.d }, p0/z, [x8]
; CHECK-NEXT: st1d { z0.d }, p0, [x1]
; CHECK-NEXT: mov sp, x29
; CHECK-NEXT: ldp x29, x30, [sp], #16 // 16-byte Folded Reload
; CHECK-NEXT: ret
%op1 = load <16 x bfloat>, ptr %a
%res = fpext <16 x bfloat> %op1 to <16 x double>
store <16 x double> %res, ptr %b
ret void
}
define void @fcvt_v32bf16_v32f64(ptr %a, ptr %b) vscale_range(16,0) {
; CHECK-LABEL: fcvt_v32bf16_v32f64:
; CHECK: // %bb.0:
; CHECK-NEXT: stp x29, x30, [sp, #-16]! // 16-byte Folded Spill
; CHECK-NEXT: sub x9, sp, #496
; CHECK-NEXT: mov x29, sp
; CHECK-NEXT: and sp, x9, #0xffffffffffffff00
; CHECK-NEXT: .cfi_def_cfa w29, 16
; CHECK-NEXT: .cfi_offset w30, -8
; CHECK-NEXT: .cfi_offset w29, -16
; CHECK-NEXT: ldr h0, [x0, #62]
; CHECK-NEXT: ptrue p0.d, vl32
; CHECK-NEXT: mov x8, sp
; CHECK-NEXT: shll v0.4s, v0.4h, #16
; CHECK-NEXT: fcvt d0, s0
; CHECK-NEXT: str d0, [sp, #248]
; CHECK-NEXT: ldr h0, [x0, #60]
; CHECK-NEXT: shll v0.4s, v0.4h, #16
; CHECK-NEXT: fcvt d0, s0
; CHECK-NEXT: str d0, [sp, #240]
; CHECK-NEXT: ldr h0, [x0, #58]
; CHECK-NEXT: shll v0.4s, v0.4h, #16
; CHECK-NEXT: fcvt d0, s0
; CHECK-NEXT: str d0, [sp, #232]
; CHECK-NEXT: ldr h0, [x0, #56]
; CHECK-NEXT: shll v0.4s, v0.4h, #16
; CHECK-NEXT: fcvt d0, s0
; CHECK-NEXT: str d0, [sp, #224]
; CHECK-NEXT: ldr h0, [x0, #54]
; CHECK-NEXT: shll v0.4s, v0.4h, #16
; CHECK-NEXT: fcvt d0, s0
; CHECK-NEXT: str d0, [sp, #216]
; CHECK-NEXT: ldr h0, [x0, #52]
; CHECK-NEXT: shll v0.4s, v0.4h, #16
; CHECK-NEXT: fcvt d0, s0
; CHECK-NEXT: str d0, [sp, #208]
; CHECK-NEXT: ldr h0, [x0, #50]
; CHECK-NEXT: shll v0.4s, v0.4h, #16
; CHECK-NEXT: fcvt d0, s0
; CHECK-NEXT: str d0, [sp, #200]
; CHECK-NEXT: ldr h0, [x0, #48]
; CHECK-NEXT: shll v0.4s, v0.4h, #16
; CHECK-NEXT: fcvt d0, s0
; CHECK-NEXT: str d0, [sp, #192]
; CHECK-NEXT: ldr h0, [x0, #46]
; CHECK-NEXT: shll v0.4s, v0.4h, #16
; CHECK-NEXT: fcvt d0, s0
; CHECK-NEXT: str d0, [sp, #184]
; CHECK-NEXT: ldr h0, [x0, #44]
; CHECK-NEXT: shll v0.4s, v0.4h, #16
; CHECK-NEXT: fcvt d0, s0
; CHECK-NEXT: str d0, [sp, #176]
; CHECK-NEXT: ldr h0, [x0, #42]
; CHECK-NEXT: shll v0.4s, v0.4h, #16
; CHECK-NEXT: fcvt d0, s0
; CHECK-NEXT: str d0, [sp, #168]
; CHECK-NEXT: ldr h0, [x0, #40]
; CHECK-NEXT: shll v0.4s, v0.4h, #16
; CHECK-NEXT: fcvt d0, s0
; CHECK-NEXT: str d0, [sp, #160]
; CHECK-NEXT: ldr h0, [x0, #38]
; CHECK-NEXT: shll v0.4s, v0.4h, #16
; CHECK-NEXT: fcvt d0, s0
; CHECK-NEXT: str d0, [sp, #152]
; CHECK-NEXT: ldr h0, [x0, #36]
; CHECK-NEXT: shll v0.4s, v0.4h, #16
; CHECK-NEXT: fcvt d0, s0
; CHECK-NEXT: str d0, [sp, #144]
; CHECK-NEXT: ldr h0, [x0, #34]
; CHECK-NEXT: shll v0.4s, v0.4h, #16
; CHECK-NEXT: fcvt d0, s0
; CHECK-NEXT: str d0, [sp, #136]
; CHECK-NEXT: ldr h0, [x0, #32]
; CHECK-NEXT: shll v0.4s, v0.4h, #16
; CHECK-NEXT: fcvt d0, s0
; CHECK-NEXT: str d0, [sp, #128]
; CHECK-NEXT: ldr h0, [x0, #30]
; CHECK-NEXT: shll v0.4s, v0.4h, #16
; CHECK-NEXT: fcvt d0, s0
; CHECK-NEXT: str d0, [sp, #120]
; CHECK-NEXT: ldr h0, [x0, #28]
; CHECK-NEXT: shll v0.4s, v0.4h, #16
; CHECK-NEXT: fcvt d0, s0
; CHECK-NEXT: str d0, [sp, #112]
; CHECK-NEXT: ldr h0, [x0, #26]
; CHECK-NEXT: shll v0.4s, v0.4h, #16
; CHECK-NEXT: fcvt d0, s0
; CHECK-NEXT: str d0, [sp, #104]
; CHECK-NEXT: ldr h0, [x0, #24]
; CHECK-NEXT: shll v0.4s, v0.4h, #16
; CHECK-NEXT: fcvt d0, s0
; CHECK-NEXT: str d0, [sp, #96]
; CHECK-NEXT: ldr h0, [x0, #22]
; CHECK-NEXT: shll v0.4s, v0.4h, #16
; CHECK-NEXT: fcvt d0, s0
; CHECK-NEXT: str d0, [sp, #88]
; CHECK-NEXT: ldr h0, [x0, #20]
; CHECK-NEXT: shll v0.4s, v0.4h, #16
; CHECK-NEXT: fcvt d0, s0
; CHECK-NEXT: str d0, [sp, #80]
; CHECK-NEXT: ldr h0, [x0, #18]
; CHECK-NEXT: shll v0.4s, v0.4h, #16
; CHECK-NEXT: fcvt d0, s0
; CHECK-NEXT: str d0, [sp, #72]
; CHECK-NEXT: ldr h0, [x0, #16]
; CHECK-NEXT: shll v0.4s, v0.4h, #16
; CHECK-NEXT: fcvt d0, s0
; CHECK-NEXT: str d0, [sp, #64]
; CHECK-NEXT: ldr h0, [x0, #14]
; CHECK-NEXT: shll v0.4s, v0.4h, #16
; CHECK-NEXT: fcvt d0, s0
; CHECK-NEXT: str d0, [sp, #56]
; CHECK-NEXT: ldr h0, [x0, #12]
; CHECK-NEXT: shll v0.4s, v0.4h, #16
; CHECK-NEXT: fcvt d0, s0
; CHECK-NEXT: str d0, [sp, #48]
; CHECK-NEXT: ldr h0, [x0, #10]
; CHECK-NEXT: shll v0.4s, v0.4h, #16
; CHECK-NEXT: fcvt d0, s0
; CHECK-NEXT: str d0, [sp, #40]
; CHECK-NEXT: ldr h0, [x0, #8]
; CHECK-NEXT: shll v0.4s, v0.4h, #16
; CHECK-NEXT: fcvt d0, s0
; CHECK-NEXT: str d0, [sp, #32]
; CHECK-NEXT: ldr h0, [x0, #6]
; CHECK-NEXT: shll v0.4s, v0.4h, #16
; CHECK-NEXT: fcvt d0, s0
; CHECK-NEXT: str d0, [sp, #24]
; CHECK-NEXT: ldr h0, [x0, #4]
; CHECK-NEXT: shll v0.4s, v0.4h, #16
; CHECK-NEXT: fcvt d0, s0
; CHECK-NEXT: str d0, [sp, #16]
; CHECK-NEXT: ldr h0, [x0, #2]
; CHECK-NEXT: shll v0.4s, v0.4h, #16
; CHECK-NEXT: fcvt d0, s0
; CHECK-NEXT: str d0, [sp, #8]
; CHECK-NEXT: ldr h0, [x0]
; CHECK-NEXT: shll v0.4s, v0.4h, #16
; CHECK-NEXT: fcvt d0, s0
; CHECK-NEXT: str d0, [sp]
; CHECK-NEXT: ld1d { z0.d }, p0/z, [x8]
; CHECK-NEXT: st1d { z0.d }, p0, [x1]
; CHECK-NEXT: mov sp, x29
; CHECK-NEXT: ldp x29, x30, [sp], #16 // 16-byte Folded Reload
; CHECK-NEXT: ret
%op1 = load <32 x bfloat>, ptr %a
%res = fpext <32 x bfloat> %op1 to <32 x double>
store <32 x double> %res, ptr %b
ret void
}