
This updates the fp<->int tests to include some store(fptoi) and itofp(load) test cases. It also cuts down on the number of large vector cases which are not testing anything new.
8326 lines
324 KiB
LLVM
8326 lines
324 KiB
LLVM
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5
|
|
; RUN: llc -mtriple=aarch64 -verify-machineinstrs %s -o - | FileCheck %s --check-prefixes=CHECK,CHECK-NOFP16,CHECK-NOFP16-SD
|
|
; RUN: llc -mtriple=aarch64 -mattr=+fullfp16 -verify-machineinstrs %s -o - | FileCheck %s --check-prefixes=CHECK,CHECK-FP16,CHECK-FP16-SD
|
|
; RUN: llc -mtriple=aarch64 -global-isel -global-isel-abort=2 -verify-machineinstrs %s -o - 2>&1 | FileCheck %s --check-prefixes=CHECK,CHECK-NOFP16,CHECK-NOFP16-GI
|
|
; RUN: llc -mtriple=aarch64 -mattr=+fullfp16 -global-isel -global-isel-abort=2 -verify-machineinstrs %s -o - 2>&1 | FileCheck %s --check-prefixes=CHECK,CHECK-FP16,CHECK-FP16-GI
|
|
|
|
; CHECK-FP16-GI: warning: Instruction selection used fallback path for stofp_load_i64_f16
|
|
; CHECK-FP16-GI-NEXT: warning: Instruction selection used fallback path for utofp_load_i64_f16
|
|
; CHECK-FP16-GI-NEXT: warning: Instruction selection used fallback path for stofp_load_i32_f16
|
|
; CHECK-FP16-GI-NEXT: warning: Instruction selection used fallback path for utofp_load_i32_f16
|
|
|
|
define double @stofp_i64_f64(i64 %a) {
|
|
; CHECK-LABEL: stofp_i64_f64:
|
|
; CHECK: // %bb.0: // %entry
|
|
; CHECK-NEXT: scvtf d0, x0
|
|
; CHECK-NEXT: ret
|
|
entry:
|
|
%c = sitofp i64 %a to double
|
|
ret double %c
|
|
}
|
|
|
|
define double @utofp_i64_f64(i64 %a) {
|
|
; CHECK-LABEL: utofp_i64_f64:
|
|
; CHECK: // %bb.0: // %entry
|
|
; CHECK-NEXT: ucvtf d0, x0
|
|
; CHECK-NEXT: ret
|
|
entry:
|
|
%c = uitofp i64 %a to double
|
|
ret double %c
|
|
}
|
|
|
|
define double @stofp_i32_f64(i32 %a) {
|
|
; CHECK-LABEL: stofp_i32_f64:
|
|
; CHECK: // %bb.0: // %entry
|
|
; CHECK-NEXT: scvtf d0, w0
|
|
; CHECK-NEXT: ret
|
|
entry:
|
|
%c = sitofp i32 %a to double
|
|
ret double %c
|
|
}
|
|
|
|
define double @utofp_i32_f64(i32 %a) {
|
|
; CHECK-LABEL: utofp_i32_f64:
|
|
; CHECK: // %bb.0: // %entry
|
|
; CHECK-NEXT: ucvtf d0, w0
|
|
; CHECK-NEXT: ret
|
|
entry:
|
|
%c = uitofp i32 %a to double
|
|
ret double %c
|
|
}
|
|
|
|
define double @stofp_i16_f64(i16 %a) {
|
|
; CHECK-LABEL: stofp_i16_f64:
|
|
; CHECK: // %bb.0: // %entry
|
|
; CHECK-NEXT: sxth w8, w0
|
|
; CHECK-NEXT: scvtf d0, w8
|
|
; CHECK-NEXT: ret
|
|
entry:
|
|
%c = sitofp i16 %a to double
|
|
ret double %c
|
|
}
|
|
|
|
define double @utofp_i16_f64(i16 %a) {
|
|
; CHECK-LABEL: utofp_i16_f64:
|
|
; CHECK: // %bb.0: // %entry
|
|
; CHECK-NEXT: and w8, w0, #0xffff
|
|
; CHECK-NEXT: ucvtf d0, w8
|
|
; CHECK-NEXT: ret
|
|
entry:
|
|
%c = uitofp i16 %a to double
|
|
ret double %c
|
|
}
|
|
|
|
define double @stofp_i8_f64(i8 %a) {
|
|
; CHECK-LABEL: stofp_i8_f64:
|
|
; CHECK: // %bb.0: // %entry
|
|
; CHECK-NEXT: sxtb w8, w0
|
|
; CHECK-NEXT: scvtf d0, w8
|
|
; CHECK-NEXT: ret
|
|
entry:
|
|
%c = sitofp i8 %a to double
|
|
ret double %c
|
|
}
|
|
|
|
define double @utofp_i8_f64(i8 %a) {
|
|
; CHECK-LABEL: utofp_i8_f64:
|
|
; CHECK: // %bb.0: // %entry
|
|
; CHECK-NEXT: and w8, w0, #0xff
|
|
; CHECK-NEXT: ucvtf d0, w8
|
|
; CHECK-NEXT: ret
|
|
entry:
|
|
%c = uitofp i8 %a to double
|
|
ret double %c
|
|
}
|
|
|
|
define double @stofp_i128_f64(i128 %a) {
|
|
; CHECK-NOFP16-SD-LABEL: stofp_i128_f64:
|
|
; CHECK-NOFP16-SD: // %bb.0: // %entry
|
|
; CHECK-NOFP16-SD-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill
|
|
; CHECK-NOFP16-SD-NEXT: .cfi_def_cfa_offset 16
|
|
; CHECK-NOFP16-SD-NEXT: .cfi_offset w30, -16
|
|
; CHECK-NOFP16-SD-NEXT: bl __floattidf
|
|
; CHECK-NOFP16-SD-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload
|
|
; CHECK-NOFP16-SD-NEXT: ret
|
|
;
|
|
; CHECK-FP16-SD-LABEL: stofp_i128_f64:
|
|
; CHECK-FP16-SD: // %bb.0: // %entry
|
|
; CHECK-FP16-SD-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill
|
|
; CHECK-FP16-SD-NEXT: .cfi_def_cfa_offset 16
|
|
; CHECK-FP16-SD-NEXT: .cfi_offset w30, -16
|
|
; CHECK-FP16-SD-NEXT: bl __floattidf
|
|
; CHECK-FP16-SD-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload
|
|
; CHECK-FP16-SD-NEXT: ret
|
|
;
|
|
; CHECK-NOFP16-GI-LABEL: stofp_i128_f64:
|
|
; CHECK-NOFP16-GI: // %bb.0: // %entry
|
|
; CHECK-NOFP16-GI-NEXT: b __floattidf
|
|
;
|
|
; CHECK-FP16-GI-LABEL: stofp_i128_f64:
|
|
; CHECK-FP16-GI: // %bb.0: // %entry
|
|
; CHECK-FP16-GI-NEXT: b __floattidf
|
|
entry:
|
|
%c = sitofp i128 %a to double
|
|
ret double %c
|
|
}
|
|
|
|
define double @utofp_i128_f64(i128 %a) {
|
|
; CHECK-NOFP16-SD-LABEL: utofp_i128_f64:
|
|
; CHECK-NOFP16-SD: // %bb.0: // %entry
|
|
; CHECK-NOFP16-SD-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill
|
|
; CHECK-NOFP16-SD-NEXT: .cfi_def_cfa_offset 16
|
|
; CHECK-NOFP16-SD-NEXT: .cfi_offset w30, -16
|
|
; CHECK-NOFP16-SD-NEXT: bl __floatuntidf
|
|
; CHECK-NOFP16-SD-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload
|
|
; CHECK-NOFP16-SD-NEXT: ret
|
|
;
|
|
; CHECK-FP16-SD-LABEL: utofp_i128_f64:
|
|
; CHECK-FP16-SD: // %bb.0: // %entry
|
|
; CHECK-FP16-SD-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill
|
|
; CHECK-FP16-SD-NEXT: .cfi_def_cfa_offset 16
|
|
; CHECK-FP16-SD-NEXT: .cfi_offset w30, -16
|
|
; CHECK-FP16-SD-NEXT: bl __floatuntidf
|
|
; CHECK-FP16-SD-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload
|
|
; CHECK-FP16-SD-NEXT: ret
|
|
;
|
|
; CHECK-NOFP16-GI-LABEL: utofp_i128_f64:
|
|
; CHECK-NOFP16-GI: // %bb.0: // %entry
|
|
; CHECK-NOFP16-GI-NEXT: b __floatuntidf
|
|
;
|
|
; CHECK-FP16-GI-LABEL: utofp_i128_f64:
|
|
; CHECK-FP16-GI: // %bb.0: // %entry
|
|
; CHECK-FP16-GI-NEXT: b __floatuntidf
|
|
entry:
|
|
%c = uitofp i128 %a to double
|
|
ret double %c
|
|
}
|
|
|
|
define float @stofp_i64_f32(i64 %a) {
|
|
; CHECK-LABEL: stofp_i64_f32:
|
|
; CHECK: // %bb.0: // %entry
|
|
; CHECK-NEXT: scvtf s0, x0
|
|
; CHECK-NEXT: ret
|
|
entry:
|
|
%c = sitofp i64 %a to float
|
|
ret float %c
|
|
}
|
|
|
|
define float @utofp_i64_f32(i64 %a) {
|
|
; CHECK-LABEL: utofp_i64_f32:
|
|
; CHECK: // %bb.0: // %entry
|
|
; CHECK-NEXT: ucvtf s0, x0
|
|
; CHECK-NEXT: ret
|
|
entry:
|
|
%c = uitofp i64 %a to float
|
|
ret float %c
|
|
}
|
|
|
|
define float @stofp_i32_f32(i32 %a) {
|
|
; CHECK-LABEL: stofp_i32_f32:
|
|
; CHECK: // %bb.0: // %entry
|
|
; CHECK-NEXT: scvtf s0, w0
|
|
; CHECK-NEXT: ret
|
|
entry:
|
|
%c = sitofp i32 %a to float
|
|
ret float %c
|
|
}
|
|
|
|
define float @utofp_i32_f32(i32 %a) {
|
|
; CHECK-LABEL: utofp_i32_f32:
|
|
; CHECK: // %bb.0: // %entry
|
|
; CHECK-NEXT: ucvtf s0, w0
|
|
; CHECK-NEXT: ret
|
|
entry:
|
|
%c = uitofp i32 %a to float
|
|
ret float %c
|
|
}
|
|
|
|
define float @stofp_i16_f32(i16 %a) {
|
|
; CHECK-LABEL: stofp_i16_f32:
|
|
; CHECK: // %bb.0: // %entry
|
|
; CHECK-NEXT: sxth w8, w0
|
|
; CHECK-NEXT: scvtf s0, w8
|
|
; CHECK-NEXT: ret
|
|
entry:
|
|
%c = sitofp i16 %a to float
|
|
ret float %c
|
|
}
|
|
|
|
define float @utofp_i16_f32(i16 %a) {
|
|
; CHECK-LABEL: utofp_i16_f32:
|
|
; CHECK: // %bb.0: // %entry
|
|
; CHECK-NEXT: and w8, w0, #0xffff
|
|
; CHECK-NEXT: ucvtf s0, w8
|
|
; CHECK-NEXT: ret
|
|
entry:
|
|
%c = uitofp i16 %a to float
|
|
ret float %c
|
|
}
|
|
|
|
define float @stofp_i8_f32(i8 %a) {
|
|
; CHECK-LABEL: stofp_i8_f32:
|
|
; CHECK: // %bb.0: // %entry
|
|
; CHECK-NEXT: sxtb w8, w0
|
|
; CHECK-NEXT: scvtf s0, w8
|
|
; CHECK-NEXT: ret
|
|
entry:
|
|
%c = sitofp i8 %a to float
|
|
ret float %c
|
|
}
|
|
|
|
define float @utofp_i8_f32(i8 %a) {
|
|
; CHECK-LABEL: utofp_i8_f32:
|
|
; CHECK: // %bb.0: // %entry
|
|
; CHECK-NEXT: and w8, w0, #0xff
|
|
; CHECK-NEXT: ucvtf s0, w8
|
|
; CHECK-NEXT: ret
|
|
entry:
|
|
%c = uitofp i8 %a to float
|
|
ret float %c
|
|
}
|
|
|
|
define float @stofp_i128_f32(i128 %a) {
|
|
; CHECK-NOFP16-SD-LABEL: stofp_i128_f32:
|
|
; CHECK-NOFP16-SD: // %bb.0: // %entry
|
|
; CHECK-NOFP16-SD-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill
|
|
; CHECK-NOFP16-SD-NEXT: .cfi_def_cfa_offset 16
|
|
; CHECK-NOFP16-SD-NEXT: .cfi_offset w30, -16
|
|
; CHECK-NOFP16-SD-NEXT: bl __floattisf
|
|
; CHECK-NOFP16-SD-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload
|
|
; CHECK-NOFP16-SD-NEXT: ret
|
|
;
|
|
; CHECK-FP16-SD-LABEL: stofp_i128_f32:
|
|
; CHECK-FP16-SD: // %bb.0: // %entry
|
|
; CHECK-FP16-SD-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill
|
|
; CHECK-FP16-SD-NEXT: .cfi_def_cfa_offset 16
|
|
; CHECK-FP16-SD-NEXT: .cfi_offset w30, -16
|
|
; CHECK-FP16-SD-NEXT: bl __floattisf
|
|
; CHECK-FP16-SD-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload
|
|
; CHECK-FP16-SD-NEXT: ret
|
|
;
|
|
; CHECK-NOFP16-GI-LABEL: stofp_i128_f32:
|
|
; CHECK-NOFP16-GI: // %bb.0: // %entry
|
|
; CHECK-NOFP16-GI-NEXT: b __floattisf
|
|
;
|
|
; CHECK-FP16-GI-LABEL: stofp_i128_f32:
|
|
; CHECK-FP16-GI: // %bb.0: // %entry
|
|
; CHECK-FP16-GI-NEXT: b __floattisf
|
|
entry:
|
|
%c = sitofp i128 %a to float
|
|
ret float %c
|
|
}
|
|
|
|
define float @utofp_i128_f32(i128 %a) {
|
|
; CHECK-NOFP16-SD-LABEL: utofp_i128_f32:
|
|
; CHECK-NOFP16-SD: // %bb.0: // %entry
|
|
; CHECK-NOFP16-SD-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill
|
|
; CHECK-NOFP16-SD-NEXT: .cfi_def_cfa_offset 16
|
|
; CHECK-NOFP16-SD-NEXT: .cfi_offset w30, -16
|
|
; CHECK-NOFP16-SD-NEXT: bl __floatuntisf
|
|
; CHECK-NOFP16-SD-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload
|
|
; CHECK-NOFP16-SD-NEXT: ret
|
|
;
|
|
; CHECK-FP16-SD-LABEL: utofp_i128_f32:
|
|
; CHECK-FP16-SD: // %bb.0: // %entry
|
|
; CHECK-FP16-SD-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill
|
|
; CHECK-FP16-SD-NEXT: .cfi_def_cfa_offset 16
|
|
; CHECK-FP16-SD-NEXT: .cfi_offset w30, -16
|
|
; CHECK-FP16-SD-NEXT: bl __floatuntisf
|
|
; CHECK-FP16-SD-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload
|
|
; CHECK-FP16-SD-NEXT: ret
|
|
;
|
|
; CHECK-NOFP16-GI-LABEL: utofp_i128_f32:
|
|
; CHECK-NOFP16-GI: // %bb.0: // %entry
|
|
; CHECK-NOFP16-GI-NEXT: b __floatuntisf
|
|
;
|
|
; CHECK-FP16-GI-LABEL: utofp_i128_f32:
|
|
; CHECK-FP16-GI: // %bb.0: // %entry
|
|
; CHECK-FP16-GI-NEXT: b __floatuntisf
|
|
entry:
|
|
%c = uitofp i128 %a to float
|
|
ret float %c
|
|
}
|
|
|
|
define half @stofp_i64_f16(i64 %a) {
|
|
; CHECK-NOFP16-LABEL: stofp_i64_f16:
|
|
; CHECK-NOFP16: // %bb.0: // %entry
|
|
; CHECK-NOFP16-NEXT: scvtf s0, x0
|
|
; CHECK-NOFP16-NEXT: fcvt h0, s0
|
|
; CHECK-NOFP16-NEXT: ret
|
|
;
|
|
; CHECK-FP16-LABEL: stofp_i64_f16:
|
|
; CHECK-FP16: // %bb.0: // %entry
|
|
; CHECK-FP16-NEXT: scvtf h0, x0
|
|
; CHECK-FP16-NEXT: ret
|
|
entry:
|
|
%c = sitofp i64 %a to half
|
|
ret half %c
|
|
}
|
|
|
|
define half @utofp_i64_f16(i64 %a) {
|
|
; CHECK-NOFP16-LABEL: utofp_i64_f16:
|
|
; CHECK-NOFP16: // %bb.0: // %entry
|
|
; CHECK-NOFP16-NEXT: ucvtf s0, x0
|
|
; CHECK-NOFP16-NEXT: fcvt h0, s0
|
|
; CHECK-NOFP16-NEXT: ret
|
|
;
|
|
; CHECK-FP16-LABEL: utofp_i64_f16:
|
|
; CHECK-FP16: // %bb.0: // %entry
|
|
; CHECK-FP16-NEXT: ucvtf h0, x0
|
|
; CHECK-FP16-NEXT: ret
|
|
entry:
|
|
%c = uitofp i64 %a to half
|
|
ret half %c
|
|
}
|
|
|
|
define half @stofp_i32_f16(i32 %a) {
|
|
; CHECK-NOFP16-LABEL: stofp_i32_f16:
|
|
; CHECK-NOFP16: // %bb.0: // %entry
|
|
; CHECK-NOFP16-NEXT: scvtf s0, w0
|
|
; CHECK-NOFP16-NEXT: fcvt h0, s0
|
|
; CHECK-NOFP16-NEXT: ret
|
|
;
|
|
; CHECK-FP16-LABEL: stofp_i32_f16:
|
|
; CHECK-FP16: // %bb.0: // %entry
|
|
; CHECK-FP16-NEXT: scvtf h0, w0
|
|
; CHECK-FP16-NEXT: ret
|
|
entry:
|
|
%c = sitofp i32 %a to half
|
|
ret half %c
|
|
}
|
|
|
|
define half @utofp_i32_f16(i32 %a) {
|
|
; CHECK-NOFP16-LABEL: utofp_i32_f16:
|
|
; CHECK-NOFP16: // %bb.0: // %entry
|
|
; CHECK-NOFP16-NEXT: ucvtf s0, w0
|
|
; CHECK-NOFP16-NEXT: fcvt h0, s0
|
|
; CHECK-NOFP16-NEXT: ret
|
|
;
|
|
; CHECK-FP16-LABEL: utofp_i32_f16:
|
|
; CHECK-FP16: // %bb.0: // %entry
|
|
; CHECK-FP16-NEXT: ucvtf h0, w0
|
|
; CHECK-FP16-NEXT: ret
|
|
entry:
|
|
%c = uitofp i32 %a to half
|
|
ret half %c
|
|
}
|
|
|
|
define half @stofp_i16_f16(i16 %a) {
|
|
; CHECK-NOFP16-LABEL: stofp_i16_f16:
|
|
; CHECK-NOFP16: // %bb.0: // %entry
|
|
; CHECK-NOFP16-NEXT: sxth w8, w0
|
|
; CHECK-NOFP16-NEXT: scvtf s0, w8
|
|
; CHECK-NOFP16-NEXT: fcvt h0, s0
|
|
; CHECK-NOFP16-NEXT: ret
|
|
;
|
|
; CHECK-FP16-LABEL: stofp_i16_f16:
|
|
; CHECK-FP16: // %bb.0: // %entry
|
|
; CHECK-FP16-NEXT: sxth w8, w0
|
|
; CHECK-FP16-NEXT: scvtf h0, w8
|
|
; CHECK-FP16-NEXT: ret
|
|
entry:
|
|
%c = sitofp i16 %a to half
|
|
ret half %c
|
|
}
|
|
|
|
define half @utofp_i16_f16(i16 %a) {
|
|
; CHECK-NOFP16-LABEL: utofp_i16_f16:
|
|
; CHECK-NOFP16: // %bb.0: // %entry
|
|
; CHECK-NOFP16-NEXT: and w8, w0, #0xffff
|
|
; CHECK-NOFP16-NEXT: ucvtf s0, w8
|
|
; CHECK-NOFP16-NEXT: fcvt h0, s0
|
|
; CHECK-NOFP16-NEXT: ret
|
|
;
|
|
; CHECK-FP16-LABEL: utofp_i16_f16:
|
|
; CHECK-FP16: // %bb.0: // %entry
|
|
; CHECK-FP16-NEXT: and w8, w0, #0xffff
|
|
; CHECK-FP16-NEXT: ucvtf h0, w8
|
|
; CHECK-FP16-NEXT: ret
|
|
entry:
|
|
%c = uitofp i16 %a to half
|
|
ret half %c
|
|
}
|
|
|
|
define half @stofp_i8_f16(i8 %a) {
|
|
; CHECK-NOFP16-LABEL: stofp_i8_f16:
|
|
; CHECK-NOFP16: // %bb.0: // %entry
|
|
; CHECK-NOFP16-NEXT: sxtb w8, w0
|
|
; CHECK-NOFP16-NEXT: scvtf s0, w8
|
|
; CHECK-NOFP16-NEXT: fcvt h0, s0
|
|
; CHECK-NOFP16-NEXT: ret
|
|
;
|
|
; CHECK-FP16-LABEL: stofp_i8_f16:
|
|
; CHECK-FP16: // %bb.0: // %entry
|
|
; CHECK-FP16-NEXT: sxtb w8, w0
|
|
; CHECK-FP16-NEXT: scvtf h0, w8
|
|
; CHECK-FP16-NEXT: ret
|
|
entry:
|
|
%c = sitofp i8 %a to half
|
|
ret half %c
|
|
}
|
|
|
|
define half @utofp_i8_f16(i8 %a) {
|
|
; CHECK-NOFP16-LABEL: utofp_i8_f16:
|
|
; CHECK-NOFP16: // %bb.0: // %entry
|
|
; CHECK-NOFP16-NEXT: and w8, w0, #0xff
|
|
; CHECK-NOFP16-NEXT: ucvtf s0, w8
|
|
; CHECK-NOFP16-NEXT: fcvt h0, s0
|
|
; CHECK-NOFP16-NEXT: ret
|
|
;
|
|
; CHECK-FP16-LABEL: utofp_i8_f16:
|
|
; CHECK-FP16: // %bb.0: // %entry
|
|
; CHECK-FP16-NEXT: and w8, w0, #0xff
|
|
; CHECK-FP16-NEXT: ucvtf h0, w8
|
|
; CHECK-FP16-NEXT: ret
|
|
entry:
|
|
%c = uitofp i8 %a to half
|
|
ret half %c
|
|
}
|
|
|
|
define half @stofp_i128_f16(i128 %a) {
|
|
; CHECK-NOFP16-LABEL: stofp_i128_f16:
|
|
; CHECK-NOFP16: // %bb.0: // %entry
|
|
; CHECK-NOFP16-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill
|
|
; CHECK-NOFP16-NEXT: .cfi_def_cfa_offset 16
|
|
; CHECK-NOFP16-NEXT: .cfi_offset w30, -16
|
|
; CHECK-NOFP16-NEXT: bl __floattisf
|
|
; CHECK-NOFP16-NEXT: fcvt h0, s0
|
|
; CHECK-NOFP16-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload
|
|
; CHECK-NOFP16-NEXT: ret
|
|
;
|
|
; CHECK-FP16-SD-LABEL: stofp_i128_f16:
|
|
; CHECK-FP16-SD: // %bb.0: // %entry
|
|
; CHECK-FP16-SD-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill
|
|
; CHECK-FP16-SD-NEXT: .cfi_def_cfa_offset 16
|
|
; CHECK-FP16-SD-NEXT: .cfi_offset w30, -16
|
|
; CHECK-FP16-SD-NEXT: bl __floattihf
|
|
; CHECK-FP16-SD-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload
|
|
; CHECK-FP16-SD-NEXT: ret
|
|
;
|
|
; CHECK-FP16-GI-LABEL: stofp_i128_f16:
|
|
; CHECK-FP16-GI: // %bb.0: // %entry
|
|
; CHECK-FP16-GI-NEXT: b __floattihf
|
|
entry:
|
|
%c = sitofp i128 %a to half
|
|
ret half %c
|
|
}
|
|
|
|
define half @utofp_i128_f16(i128 %a) {
|
|
; CHECK-NOFP16-LABEL: utofp_i128_f16:
|
|
; CHECK-NOFP16: // %bb.0: // %entry
|
|
; CHECK-NOFP16-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill
|
|
; CHECK-NOFP16-NEXT: .cfi_def_cfa_offset 16
|
|
; CHECK-NOFP16-NEXT: .cfi_offset w30, -16
|
|
; CHECK-NOFP16-NEXT: bl __floatuntisf
|
|
; CHECK-NOFP16-NEXT: fcvt h0, s0
|
|
; CHECK-NOFP16-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload
|
|
; CHECK-NOFP16-NEXT: ret
|
|
;
|
|
; CHECK-FP16-SD-LABEL: utofp_i128_f16:
|
|
; CHECK-FP16-SD: // %bb.0: // %entry
|
|
; CHECK-FP16-SD-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill
|
|
; CHECK-FP16-SD-NEXT: .cfi_def_cfa_offset 16
|
|
; CHECK-FP16-SD-NEXT: .cfi_offset w30, -16
|
|
; CHECK-FP16-SD-NEXT: bl __floatuntihf
|
|
; CHECK-FP16-SD-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload
|
|
; CHECK-FP16-SD-NEXT: ret
|
|
;
|
|
; CHECK-FP16-GI-LABEL: utofp_i128_f16:
|
|
; CHECK-FP16-GI: // %bb.0: // %entry
|
|
; CHECK-FP16-GI-NEXT: b __floatuntihf
|
|
entry:
|
|
%c = uitofp i128 %a to half
|
|
ret half %c
|
|
}
|
|
|
|
define fp128 @stofp_i64_f128(i64 %a) {
|
|
; CHECK-NOFP16-SD-LABEL: stofp_i64_f128:
|
|
; CHECK-NOFP16-SD: // %bb.0: // %entry
|
|
; CHECK-NOFP16-SD-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill
|
|
; CHECK-NOFP16-SD-NEXT: .cfi_def_cfa_offset 16
|
|
; CHECK-NOFP16-SD-NEXT: .cfi_offset w30, -16
|
|
; CHECK-NOFP16-SD-NEXT: bl __floatditf
|
|
; CHECK-NOFP16-SD-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload
|
|
; CHECK-NOFP16-SD-NEXT: ret
|
|
;
|
|
; CHECK-FP16-SD-LABEL: stofp_i64_f128:
|
|
; CHECK-FP16-SD: // %bb.0: // %entry
|
|
; CHECK-FP16-SD-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill
|
|
; CHECK-FP16-SD-NEXT: .cfi_def_cfa_offset 16
|
|
; CHECK-FP16-SD-NEXT: .cfi_offset w30, -16
|
|
; CHECK-FP16-SD-NEXT: bl __floatditf
|
|
; CHECK-FP16-SD-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload
|
|
; CHECK-FP16-SD-NEXT: ret
|
|
;
|
|
; CHECK-NOFP16-GI-LABEL: stofp_i64_f128:
|
|
; CHECK-NOFP16-GI: // %bb.0: // %entry
|
|
; CHECK-NOFP16-GI-NEXT: b __floatditf
|
|
;
|
|
; CHECK-FP16-GI-LABEL: stofp_i64_f128:
|
|
; CHECK-FP16-GI: // %bb.0: // %entry
|
|
; CHECK-FP16-GI-NEXT: b __floatditf
|
|
entry:
|
|
%c = sitofp i64 %a to fp128
|
|
ret fp128 %c
|
|
}
|
|
|
|
define fp128 @utofp_i64_f128(i64 %a) {
|
|
; CHECK-NOFP16-SD-LABEL: utofp_i64_f128:
|
|
; CHECK-NOFP16-SD: // %bb.0: // %entry
|
|
; CHECK-NOFP16-SD-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill
|
|
; CHECK-NOFP16-SD-NEXT: .cfi_def_cfa_offset 16
|
|
; CHECK-NOFP16-SD-NEXT: .cfi_offset w30, -16
|
|
; CHECK-NOFP16-SD-NEXT: bl __floatunditf
|
|
; CHECK-NOFP16-SD-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload
|
|
; CHECK-NOFP16-SD-NEXT: ret
|
|
;
|
|
; CHECK-FP16-SD-LABEL: utofp_i64_f128:
|
|
; CHECK-FP16-SD: // %bb.0: // %entry
|
|
; CHECK-FP16-SD-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill
|
|
; CHECK-FP16-SD-NEXT: .cfi_def_cfa_offset 16
|
|
; CHECK-FP16-SD-NEXT: .cfi_offset w30, -16
|
|
; CHECK-FP16-SD-NEXT: bl __floatunditf
|
|
; CHECK-FP16-SD-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload
|
|
; CHECK-FP16-SD-NEXT: ret
|
|
;
|
|
; CHECK-NOFP16-GI-LABEL: utofp_i64_f128:
|
|
; CHECK-NOFP16-GI: // %bb.0: // %entry
|
|
; CHECK-NOFP16-GI-NEXT: b __floatunditf
|
|
;
|
|
; CHECK-FP16-GI-LABEL: utofp_i64_f128:
|
|
; CHECK-FP16-GI: // %bb.0: // %entry
|
|
; CHECK-FP16-GI-NEXT: b __floatunditf
|
|
entry:
|
|
%c = uitofp i64 %a to fp128
|
|
ret fp128 %c
|
|
}
|
|
|
|
define fp128 @stofp_i32_f128(i32 %a) {
|
|
; CHECK-NOFP16-SD-LABEL: stofp_i32_f128:
|
|
; CHECK-NOFP16-SD: // %bb.0: // %entry
|
|
; CHECK-NOFP16-SD-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill
|
|
; CHECK-NOFP16-SD-NEXT: .cfi_def_cfa_offset 16
|
|
; CHECK-NOFP16-SD-NEXT: .cfi_offset w30, -16
|
|
; CHECK-NOFP16-SD-NEXT: bl __floatsitf
|
|
; CHECK-NOFP16-SD-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload
|
|
; CHECK-NOFP16-SD-NEXT: ret
|
|
;
|
|
; CHECK-FP16-SD-LABEL: stofp_i32_f128:
|
|
; CHECK-FP16-SD: // %bb.0: // %entry
|
|
; CHECK-FP16-SD-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill
|
|
; CHECK-FP16-SD-NEXT: .cfi_def_cfa_offset 16
|
|
; CHECK-FP16-SD-NEXT: .cfi_offset w30, -16
|
|
; CHECK-FP16-SD-NEXT: bl __floatsitf
|
|
; CHECK-FP16-SD-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload
|
|
; CHECK-FP16-SD-NEXT: ret
|
|
;
|
|
; CHECK-NOFP16-GI-LABEL: stofp_i32_f128:
|
|
; CHECK-NOFP16-GI: // %bb.0: // %entry
|
|
; CHECK-NOFP16-GI-NEXT: b __floatsitf
|
|
;
|
|
; CHECK-FP16-GI-LABEL: stofp_i32_f128:
|
|
; CHECK-FP16-GI: // %bb.0: // %entry
|
|
; CHECK-FP16-GI-NEXT: b __floatsitf
|
|
entry:
|
|
%c = sitofp i32 %a to fp128
|
|
ret fp128 %c
|
|
}
|
|
|
|
define fp128 @utofp_i32_f128(i32 %a) {
|
|
; CHECK-NOFP16-SD-LABEL: utofp_i32_f128:
|
|
; CHECK-NOFP16-SD: // %bb.0: // %entry
|
|
; CHECK-NOFP16-SD-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill
|
|
; CHECK-NOFP16-SD-NEXT: .cfi_def_cfa_offset 16
|
|
; CHECK-NOFP16-SD-NEXT: .cfi_offset w30, -16
|
|
; CHECK-NOFP16-SD-NEXT: bl __floatunsitf
|
|
; CHECK-NOFP16-SD-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload
|
|
; CHECK-NOFP16-SD-NEXT: ret
|
|
;
|
|
; CHECK-FP16-SD-LABEL: utofp_i32_f128:
|
|
; CHECK-FP16-SD: // %bb.0: // %entry
|
|
; CHECK-FP16-SD-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill
|
|
; CHECK-FP16-SD-NEXT: .cfi_def_cfa_offset 16
|
|
; CHECK-FP16-SD-NEXT: .cfi_offset w30, -16
|
|
; CHECK-FP16-SD-NEXT: bl __floatunsitf
|
|
; CHECK-FP16-SD-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload
|
|
; CHECK-FP16-SD-NEXT: ret
|
|
;
|
|
; CHECK-NOFP16-GI-LABEL: utofp_i32_f128:
|
|
; CHECK-NOFP16-GI: // %bb.0: // %entry
|
|
; CHECK-NOFP16-GI-NEXT: b __floatunsitf
|
|
;
|
|
; CHECK-FP16-GI-LABEL: utofp_i32_f128:
|
|
; CHECK-FP16-GI: // %bb.0: // %entry
|
|
; CHECK-FP16-GI-NEXT: b __floatunsitf
|
|
entry:
|
|
%c = uitofp i32 %a to fp128
|
|
ret fp128 %c
|
|
}
|
|
|
|
define fp128 @stofp_i16_f128(i16 %a) {
|
|
; CHECK-NOFP16-SD-LABEL: stofp_i16_f128:
|
|
; CHECK-NOFP16-SD: // %bb.0: // %entry
|
|
; CHECK-NOFP16-SD-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill
|
|
; CHECK-NOFP16-SD-NEXT: .cfi_def_cfa_offset 16
|
|
; CHECK-NOFP16-SD-NEXT: .cfi_offset w30, -16
|
|
; CHECK-NOFP16-SD-NEXT: sxth w0, w0
|
|
; CHECK-NOFP16-SD-NEXT: bl __floatsitf
|
|
; CHECK-NOFP16-SD-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload
|
|
; CHECK-NOFP16-SD-NEXT: ret
|
|
;
|
|
; CHECK-FP16-SD-LABEL: stofp_i16_f128:
|
|
; CHECK-FP16-SD: // %bb.0: // %entry
|
|
; CHECK-FP16-SD-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill
|
|
; CHECK-FP16-SD-NEXT: .cfi_def_cfa_offset 16
|
|
; CHECK-FP16-SD-NEXT: .cfi_offset w30, -16
|
|
; CHECK-FP16-SD-NEXT: sxth w0, w0
|
|
; CHECK-FP16-SD-NEXT: bl __floatsitf
|
|
; CHECK-FP16-SD-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload
|
|
; CHECK-FP16-SD-NEXT: ret
|
|
;
|
|
; CHECK-NOFP16-GI-LABEL: stofp_i16_f128:
|
|
; CHECK-NOFP16-GI: // %bb.0: // %entry
|
|
; CHECK-NOFP16-GI-NEXT: sxth w0, w0
|
|
; CHECK-NOFP16-GI-NEXT: b __floatsitf
|
|
;
|
|
; CHECK-FP16-GI-LABEL: stofp_i16_f128:
|
|
; CHECK-FP16-GI: // %bb.0: // %entry
|
|
; CHECK-FP16-GI-NEXT: sxth w0, w0
|
|
; CHECK-FP16-GI-NEXT: b __floatsitf
|
|
entry:
|
|
%c = sitofp i16 %a to fp128
|
|
ret fp128 %c
|
|
}
|
|
|
|
define fp128 @utofp_i16_f128(i16 %a) {
|
|
; CHECK-NOFP16-SD-LABEL: utofp_i16_f128:
|
|
; CHECK-NOFP16-SD: // %bb.0: // %entry
|
|
; CHECK-NOFP16-SD-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill
|
|
; CHECK-NOFP16-SD-NEXT: .cfi_def_cfa_offset 16
|
|
; CHECK-NOFP16-SD-NEXT: .cfi_offset w30, -16
|
|
; CHECK-NOFP16-SD-NEXT: and w0, w0, #0xffff
|
|
; CHECK-NOFP16-SD-NEXT: bl __floatunsitf
|
|
; CHECK-NOFP16-SD-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload
|
|
; CHECK-NOFP16-SD-NEXT: ret
|
|
;
|
|
; CHECK-FP16-SD-LABEL: utofp_i16_f128:
|
|
; CHECK-FP16-SD: // %bb.0: // %entry
|
|
; CHECK-FP16-SD-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill
|
|
; CHECK-FP16-SD-NEXT: .cfi_def_cfa_offset 16
|
|
; CHECK-FP16-SD-NEXT: .cfi_offset w30, -16
|
|
; CHECK-FP16-SD-NEXT: and w0, w0, #0xffff
|
|
; CHECK-FP16-SD-NEXT: bl __floatunsitf
|
|
; CHECK-FP16-SD-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload
|
|
; CHECK-FP16-SD-NEXT: ret
|
|
;
|
|
; CHECK-NOFP16-GI-LABEL: utofp_i16_f128:
|
|
; CHECK-NOFP16-GI: // %bb.0: // %entry
|
|
; CHECK-NOFP16-GI-NEXT: and w0, w0, #0xffff
|
|
; CHECK-NOFP16-GI-NEXT: b __floatunsitf
|
|
;
|
|
; CHECK-FP16-GI-LABEL: utofp_i16_f128:
|
|
; CHECK-FP16-GI: // %bb.0: // %entry
|
|
; CHECK-FP16-GI-NEXT: and w0, w0, #0xffff
|
|
; CHECK-FP16-GI-NEXT: b __floatunsitf
|
|
entry:
|
|
%c = uitofp i16 %a to fp128
|
|
ret fp128 %c
|
|
}
|
|
|
|
define fp128 @stofp_i8_f128(i8 %a) {
|
|
; CHECK-NOFP16-SD-LABEL: stofp_i8_f128:
|
|
; CHECK-NOFP16-SD: // %bb.0: // %entry
|
|
; CHECK-NOFP16-SD-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill
|
|
; CHECK-NOFP16-SD-NEXT: .cfi_def_cfa_offset 16
|
|
; CHECK-NOFP16-SD-NEXT: .cfi_offset w30, -16
|
|
; CHECK-NOFP16-SD-NEXT: sxtb w0, w0
|
|
; CHECK-NOFP16-SD-NEXT: bl __floatsitf
|
|
; CHECK-NOFP16-SD-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload
|
|
; CHECK-NOFP16-SD-NEXT: ret
|
|
;
|
|
; CHECK-FP16-SD-LABEL: stofp_i8_f128:
|
|
; CHECK-FP16-SD: // %bb.0: // %entry
|
|
; CHECK-FP16-SD-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill
|
|
; CHECK-FP16-SD-NEXT: .cfi_def_cfa_offset 16
|
|
; CHECK-FP16-SD-NEXT: .cfi_offset w30, -16
|
|
; CHECK-FP16-SD-NEXT: sxtb w0, w0
|
|
; CHECK-FP16-SD-NEXT: bl __floatsitf
|
|
; CHECK-FP16-SD-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload
|
|
; CHECK-FP16-SD-NEXT: ret
|
|
;
|
|
; CHECK-NOFP16-GI-LABEL: stofp_i8_f128:
|
|
; CHECK-NOFP16-GI: // %bb.0: // %entry
|
|
; CHECK-NOFP16-GI-NEXT: sxtb w0, w0
|
|
; CHECK-NOFP16-GI-NEXT: b __floatsitf
|
|
;
|
|
; CHECK-FP16-GI-LABEL: stofp_i8_f128:
|
|
; CHECK-FP16-GI: // %bb.0: // %entry
|
|
; CHECK-FP16-GI-NEXT: sxtb w0, w0
|
|
; CHECK-FP16-GI-NEXT: b __floatsitf
|
|
entry:
|
|
%c = sitofp i8 %a to fp128
|
|
ret fp128 %c
|
|
}
|
|
|
|
define fp128 @utofp_i8_f128(i8 %a) {
|
|
; CHECK-NOFP16-SD-LABEL: utofp_i8_f128:
|
|
; CHECK-NOFP16-SD: // %bb.0: // %entry
|
|
; CHECK-NOFP16-SD-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill
|
|
; CHECK-NOFP16-SD-NEXT: .cfi_def_cfa_offset 16
|
|
; CHECK-NOFP16-SD-NEXT: .cfi_offset w30, -16
|
|
; CHECK-NOFP16-SD-NEXT: and w0, w0, #0xff
|
|
; CHECK-NOFP16-SD-NEXT: bl __floatunsitf
|
|
; CHECK-NOFP16-SD-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload
|
|
; CHECK-NOFP16-SD-NEXT: ret
|
|
;
|
|
; CHECK-FP16-SD-LABEL: utofp_i8_f128:
|
|
; CHECK-FP16-SD: // %bb.0: // %entry
|
|
; CHECK-FP16-SD-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill
|
|
; CHECK-FP16-SD-NEXT: .cfi_def_cfa_offset 16
|
|
; CHECK-FP16-SD-NEXT: .cfi_offset w30, -16
|
|
; CHECK-FP16-SD-NEXT: and w0, w0, #0xff
|
|
; CHECK-FP16-SD-NEXT: bl __floatunsitf
|
|
; CHECK-FP16-SD-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload
|
|
; CHECK-FP16-SD-NEXT: ret
|
|
;
|
|
; CHECK-NOFP16-GI-LABEL: utofp_i8_f128:
|
|
; CHECK-NOFP16-GI: // %bb.0: // %entry
|
|
; CHECK-NOFP16-GI-NEXT: and w0, w0, #0xff
|
|
; CHECK-NOFP16-GI-NEXT: b __floatunsitf
|
|
;
|
|
; CHECK-FP16-GI-LABEL: utofp_i8_f128:
|
|
; CHECK-FP16-GI: // %bb.0: // %entry
|
|
; CHECK-FP16-GI-NEXT: and w0, w0, #0xff
|
|
; CHECK-FP16-GI-NEXT: b __floatunsitf
|
|
entry:
|
|
%c = uitofp i8 %a to fp128
|
|
ret fp128 %c
|
|
}
|
|
|
|
define fp128 @stofp_i128_f128(i128 %a) {
|
|
; CHECK-NOFP16-SD-LABEL: stofp_i128_f128:
|
|
; CHECK-NOFP16-SD: // %bb.0: // %entry
|
|
; CHECK-NOFP16-SD-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill
|
|
; CHECK-NOFP16-SD-NEXT: .cfi_def_cfa_offset 16
|
|
; CHECK-NOFP16-SD-NEXT: .cfi_offset w30, -16
|
|
; CHECK-NOFP16-SD-NEXT: bl __floattitf
|
|
; CHECK-NOFP16-SD-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload
|
|
; CHECK-NOFP16-SD-NEXT: ret
|
|
;
|
|
; CHECK-FP16-SD-LABEL: stofp_i128_f128:
|
|
; CHECK-FP16-SD: // %bb.0: // %entry
|
|
; CHECK-FP16-SD-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill
|
|
; CHECK-FP16-SD-NEXT: .cfi_def_cfa_offset 16
|
|
; CHECK-FP16-SD-NEXT: .cfi_offset w30, -16
|
|
; CHECK-FP16-SD-NEXT: bl __floattitf
|
|
; CHECK-FP16-SD-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload
|
|
; CHECK-FP16-SD-NEXT: ret
|
|
;
|
|
; CHECK-NOFP16-GI-LABEL: stofp_i128_f128:
|
|
; CHECK-NOFP16-GI: // %bb.0: // %entry
|
|
; CHECK-NOFP16-GI-NEXT: b __floattitf
|
|
;
|
|
; CHECK-FP16-GI-LABEL: stofp_i128_f128:
|
|
; CHECK-FP16-GI: // %bb.0: // %entry
|
|
; CHECK-FP16-GI-NEXT: b __floattitf
|
|
entry:
|
|
%c = sitofp i128 %a to fp128
|
|
ret fp128 %c
|
|
}
|
|
|
|
define fp128 @utofp_i128_f128(i128 %a) {
|
|
; CHECK-NOFP16-SD-LABEL: utofp_i128_f128:
|
|
; CHECK-NOFP16-SD: // %bb.0: // %entry
|
|
; CHECK-NOFP16-SD-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill
|
|
; CHECK-NOFP16-SD-NEXT: .cfi_def_cfa_offset 16
|
|
; CHECK-NOFP16-SD-NEXT: .cfi_offset w30, -16
|
|
; CHECK-NOFP16-SD-NEXT: bl __floatuntitf
|
|
; CHECK-NOFP16-SD-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload
|
|
; CHECK-NOFP16-SD-NEXT: ret
|
|
;
|
|
; CHECK-FP16-SD-LABEL: utofp_i128_f128:
|
|
; CHECK-FP16-SD: // %bb.0: // %entry
|
|
; CHECK-FP16-SD-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill
|
|
; CHECK-FP16-SD-NEXT: .cfi_def_cfa_offset 16
|
|
; CHECK-FP16-SD-NEXT: .cfi_offset w30, -16
|
|
; CHECK-FP16-SD-NEXT: bl __floatuntitf
|
|
; CHECK-FP16-SD-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload
|
|
; CHECK-FP16-SD-NEXT: ret
|
|
;
|
|
; CHECK-NOFP16-GI-LABEL: utofp_i128_f128:
|
|
; CHECK-NOFP16-GI: // %bb.0: // %entry
|
|
; CHECK-NOFP16-GI-NEXT: b __floatuntitf
|
|
;
|
|
; CHECK-FP16-GI-LABEL: utofp_i128_f128:
|
|
; CHECK-FP16-GI: // %bb.0: // %entry
|
|
; CHECK-FP16-GI-NEXT: b __floatuntitf
|
|
entry:
|
|
%c = uitofp i128 %a to fp128
|
|
ret fp128 %c
|
|
}
|
|
|
|
define double @stofp_load_i64_f64(ptr %p) {
|
|
; CHECK-LABEL: stofp_load_i64_f64:
|
|
; CHECK: // %bb.0: // %entry
|
|
; CHECK-NEXT: ldr d0, [x0]
|
|
; CHECK-NEXT: scvtf d0, d0
|
|
; CHECK-NEXT: ret
|
|
entry:
|
|
%a = load i64, ptr %p
|
|
%c = sitofp i64 %a to double
|
|
ret double %c
|
|
}
|
|
|
|
define double @utofp_load_i64_f64(ptr %p) {
|
|
; CHECK-LABEL: utofp_load_i64_f64:
|
|
; CHECK: // %bb.0: // %entry
|
|
; CHECK-NEXT: ldr d0, [x0]
|
|
; CHECK-NEXT: ucvtf d0, d0
|
|
; CHECK-NEXT: ret
|
|
entry:
|
|
%a = load i64, ptr %p
|
|
%c = uitofp i64 %a to double
|
|
ret double %c
|
|
}
|
|
|
|
define double @stofp_load_i32_f64(ptr %p) {
|
|
; CHECK-NOFP16-SD-LABEL: stofp_load_i32_f64:
|
|
; CHECK-NOFP16-SD: // %bb.0: // %entry
|
|
; CHECK-NOFP16-SD-NEXT: ldr w8, [x0]
|
|
; CHECK-NOFP16-SD-NEXT: scvtf d0, w8
|
|
; CHECK-NOFP16-SD-NEXT: ret
|
|
;
|
|
; CHECK-FP16-SD-LABEL: stofp_load_i32_f64:
|
|
; CHECK-FP16-SD: // %bb.0: // %entry
|
|
; CHECK-FP16-SD-NEXT: ldr w8, [x0]
|
|
; CHECK-FP16-SD-NEXT: scvtf d0, w8
|
|
; CHECK-FP16-SD-NEXT: ret
|
|
;
|
|
; CHECK-NOFP16-GI-LABEL: stofp_load_i32_f64:
|
|
; CHECK-NOFP16-GI: // %bb.0: // %entry
|
|
; CHECK-NOFP16-GI-NEXT: ldr s0, [x0]
|
|
; CHECK-NOFP16-GI-NEXT: fmov w8, s0
|
|
; CHECK-NOFP16-GI-NEXT: scvtf d0, w8
|
|
; CHECK-NOFP16-GI-NEXT: ret
|
|
;
|
|
; CHECK-FP16-GI-LABEL: stofp_load_i32_f64:
|
|
; CHECK-FP16-GI: // %bb.0: // %entry
|
|
; CHECK-FP16-GI-NEXT: ldr s0, [x0]
|
|
; CHECK-FP16-GI-NEXT: fmov w8, s0
|
|
; CHECK-FP16-GI-NEXT: scvtf d0, w8
|
|
; CHECK-FP16-GI-NEXT: ret
|
|
entry:
|
|
%a = load i32, ptr %p
|
|
%c = sitofp i32 %a to double
|
|
ret double %c
|
|
}
|
|
|
|
define double @utofp_load_i32_f64(ptr %p) {
|
|
; CHECK-LABEL: utofp_load_i32_f64:
|
|
; CHECK: // %bb.0: // %entry
|
|
; CHECK-NEXT: ldr s0, [x0]
|
|
; CHECK-NEXT: ucvtf d0, d0
|
|
; CHECK-NEXT: ret
|
|
entry:
|
|
%a = load i32, ptr %p
|
|
%c = uitofp i32 %a to double
|
|
ret double %c
|
|
}
|
|
|
|
define double @stofp_load_i16_f64(ptr %p) {
|
|
; CHECK-LABEL: stofp_load_i16_f64:
|
|
; CHECK: // %bb.0: // %entry
|
|
; CHECK-NEXT: ldrsh w8, [x0]
|
|
; CHECK-NEXT: scvtf d0, w8
|
|
; CHECK-NEXT: ret
|
|
entry:
|
|
%a = load i16, ptr %p
|
|
%c = sitofp i16 %a to double
|
|
ret double %c
|
|
}
|
|
|
|
define double @utofp_load_i16_f64(ptr %p) {
|
|
; CHECK-LABEL: utofp_load_i16_f64:
|
|
; CHECK: // %bb.0: // %entry
|
|
; CHECK-NEXT: ldr h0, [x0]
|
|
; CHECK-NEXT: ucvtf d0, d0
|
|
; CHECK-NEXT: ret
|
|
entry:
|
|
%a = load i16, ptr %p
|
|
%c = uitofp i16 %a to double
|
|
ret double %c
|
|
}
|
|
|
|
define double @stofp_load_i8_f64(ptr %p) {
|
|
; CHECK-LABEL: stofp_load_i8_f64:
|
|
; CHECK: // %bb.0: // %entry
|
|
; CHECK-NEXT: ldrsb w8, [x0]
|
|
; CHECK-NEXT: scvtf d0, w8
|
|
; CHECK-NEXT: ret
|
|
entry:
|
|
%a = load i8, ptr %p
|
|
%c = sitofp i8 %a to double
|
|
ret double %c
|
|
}
|
|
|
|
define double @utofp_load_i8_f64(ptr %p) {
|
|
; CHECK-LABEL: utofp_load_i8_f64:
|
|
; CHECK: // %bb.0: // %entry
|
|
; CHECK-NEXT: ldr b0, [x0]
|
|
; CHECK-NEXT: ucvtf d0, d0
|
|
; CHECK-NEXT: ret
|
|
entry:
|
|
%a = load i8, ptr %p
|
|
%c = uitofp i8 %a to double
|
|
ret double %c
|
|
}
|
|
|
|
define float @stofp_load_i64_f32(ptr %p) {
|
|
; CHECK-NOFP16-SD-LABEL: stofp_load_i64_f32:
|
|
; CHECK-NOFP16-SD: // %bb.0: // %entry
|
|
; CHECK-NOFP16-SD-NEXT: ldr x8, [x0]
|
|
; CHECK-NOFP16-SD-NEXT: scvtf s0, x8
|
|
; CHECK-NOFP16-SD-NEXT: ret
|
|
;
|
|
; CHECK-FP16-SD-LABEL: stofp_load_i64_f32:
|
|
; CHECK-FP16-SD: // %bb.0: // %entry
|
|
; CHECK-FP16-SD-NEXT: ldr x8, [x0]
|
|
; CHECK-FP16-SD-NEXT: scvtf s0, x8
|
|
; CHECK-FP16-SD-NEXT: ret
|
|
;
|
|
; CHECK-NOFP16-GI-LABEL: stofp_load_i64_f32:
|
|
; CHECK-NOFP16-GI: // %bb.0: // %entry
|
|
; CHECK-NOFP16-GI-NEXT: ldr d0, [x0]
|
|
; CHECK-NOFP16-GI-NEXT: fmov x8, d0
|
|
; CHECK-NOFP16-GI-NEXT: scvtf s0, x8
|
|
; CHECK-NOFP16-GI-NEXT: ret
|
|
;
|
|
; CHECK-FP16-GI-LABEL: stofp_load_i64_f32:
|
|
; CHECK-FP16-GI: // %bb.0: // %entry
|
|
; CHECK-FP16-GI-NEXT: ldr d0, [x0]
|
|
; CHECK-FP16-GI-NEXT: fmov x8, d0
|
|
; CHECK-FP16-GI-NEXT: scvtf s0, x8
|
|
; CHECK-FP16-GI-NEXT: ret
|
|
entry:
|
|
%a = load i64, ptr %p
|
|
%c = sitofp i64 %a to float
|
|
ret float %c
|
|
}
|
|
|
|
define float @utofp_load_i64_f32(ptr %p) {
|
|
; CHECK-NOFP16-SD-LABEL: utofp_load_i64_f32:
|
|
; CHECK-NOFP16-SD: // %bb.0: // %entry
|
|
; CHECK-NOFP16-SD-NEXT: ldr x8, [x0]
|
|
; CHECK-NOFP16-SD-NEXT: ucvtf s0, x8
|
|
; CHECK-NOFP16-SD-NEXT: ret
|
|
;
|
|
; CHECK-FP16-SD-LABEL: utofp_load_i64_f32:
|
|
; CHECK-FP16-SD: // %bb.0: // %entry
|
|
; CHECK-FP16-SD-NEXT: ldr x8, [x0]
|
|
; CHECK-FP16-SD-NEXT: ucvtf s0, x8
|
|
; CHECK-FP16-SD-NEXT: ret
|
|
;
|
|
; CHECK-NOFP16-GI-LABEL: utofp_load_i64_f32:
|
|
; CHECK-NOFP16-GI: // %bb.0: // %entry
|
|
; CHECK-NOFP16-GI-NEXT: ldr d0, [x0]
|
|
; CHECK-NOFP16-GI-NEXT: fmov x8, d0
|
|
; CHECK-NOFP16-GI-NEXT: ucvtf s0, x8
|
|
; CHECK-NOFP16-GI-NEXT: ret
|
|
;
|
|
; CHECK-FP16-GI-LABEL: utofp_load_i64_f32:
|
|
; CHECK-FP16-GI: // %bb.0: // %entry
|
|
; CHECK-FP16-GI-NEXT: ldr d0, [x0]
|
|
; CHECK-FP16-GI-NEXT: fmov x8, d0
|
|
; CHECK-FP16-GI-NEXT: ucvtf s0, x8
|
|
; CHECK-FP16-GI-NEXT: ret
|
|
entry:
|
|
%a = load i64, ptr %p
|
|
%c = uitofp i64 %a to float
|
|
ret float %c
|
|
}
|
|
|
|
define float @stofp_load_i32_f32(ptr %p) {
|
|
; CHECK-LABEL: stofp_load_i32_f32:
|
|
; CHECK: // %bb.0: // %entry
|
|
; CHECK-NEXT: ldr s0, [x0]
|
|
; CHECK-NEXT: scvtf s0, s0
|
|
; CHECK-NEXT: ret
|
|
entry:
|
|
%a = load i32, ptr %p
|
|
%c = sitofp i32 %a to float
|
|
ret float %c
|
|
}
|
|
|
|
define float @utofp_load_i32_f32(ptr %p) {
|
|
; CHECK-LABEL: utofp_load_i32_f32:
|
|
; CHECK: // %bb.0: // %entry
|
|
; CHECK-NEXT: ldr s0, [x0]
|
|
; CHECK-NEXT: ucvtf s0, s0
|
|
; CHECK-NEXT: ret
|
|
entry:
|
|
%a = load i32, ptr %p
|
|
%c = uitofp i32 %a to float
|
|
ret float %c
|
|
}
|
|
|
|
define float @stofp_load_i16_f32(ptr %p) {
|
|
; CHECK-LABEL: stofp_load_i16_f32:
|
|
; CHECK: // %bb.0: // %entry
|
|
; CHECK-NEXT: ldrsh w8, [x0]
|
|
; CHECK-NEXT: scvtf s0, w8
|
|
; CHECK-NEXT: ret
|
|
entry:
|
|
%a = load i16, ptr %p
|
|
%c = sitofp i16 %a to float
|
|
ret float %c
|
|
}
|
|
|
|
define float @utofp_load_i16_f32(ptr %p) {
|
|
; CHECK-LABEL: utofp_load_i16_f32:
|
|
; CHECK: // %bb.0: // %entry
|
|
; CHECK-NEXT: ldr h0, [x0]
|
|
; CHECK-NEXT: ucvtf s0, s0
|
|
; CHECK-NEXT: ret
|
|
entry:
|
|
%a = load i16, ptr %p
|
|
%c = uitofp i16 %a to float
|
|
ret float %c
|
|
}
|
|
|
|
define float @stofp_load_i8_f32(ptr %p) {
|
|
; CHECK-LABEL: stofp_load_i8_f32:
|
|
; CHECK: // %bb.0: // %entry
|
|
; CHECK-NEXT: ldrsb w8, [x0]
|
|
; CHECK-NEXT: scvtf s0, w8
|
|
; CHECK-NEXT: ret
|
|
entry:
|
|
%a = load i8, ptr %p
|
|
%c = sitofp i8 %a to float
|
|
ret float %c
|
|
}
|
|
|
|
define float @utofp_load_i8_f32(ptr %p) {
|
|
; CHECK-LABEL: utofp_load_i8_f32:
|
|
; CHECK: // %bb.0: // %entry
|
|
; CHECK-NEXT: ldr b0, [x0]
|
|
; CHECK-NEXT: ucvtf s0, s0
|
|
; CHECK-NEXT: ret
|
|
entry:
|
|
%a = load i8, ptr %p
|
|
%c = uitofp i8 %a to float
|
|
ret float %c
|
|
}
|
|
|
|
define half @stofp_load_i64_f16(ptr %p) {
|
|
; CHECK-NOFP16-SD-LABEL: stofp_load_i64_f16:
|
|
; CHECK-NOFP16-SD: // %bb.0: // %entry
|
|
; CHECK-NOFP16-SD-NEXT: ldr x8, [x0]
|
|
; CHECK-NOFP16-SD-NEXT: scvtf s0, x8
|
|
; CHECK-NOFP16-SD-NEXT: fcvt h0, s0
|
|
; CHECK-NOFP16-SD-NEXT: ret
|
|
;
|
|
; CHECK-FP16-LABEL: stofp_load_i64_f16:
|
|
; CHECK-FP16: // %bb.0: // %entry
|
|
; CHECK-FP16-NEXT: ldr x8, [x0]
|
|
; CHECK-FP16-NEXT: scvtf h0, x8
|
|
; CHECK-FP16-NEXT: ret
|
|
;
|
|
; CHECK-NOFP16-GI-LABEL: stofp_load_i64_f16:
|
|
; CHECK-NOFP16-GI: // %bb.0: // %entry
|
|
; CHECK-NOFP16-GI-NEXT: ldr d0, [x0]
|
|
; CHECK-NOFP16-GI-NEXT: fmov x8, d0
|
|
; CHECK-NOFP16-GI-NEXT: scvtf s0, x8
|
|
; CHECK-NOFP16-GI-NEXT: fcvt h0, s0
|
|
; CHECK-NOFP16-GI-NEXT: ret
|
|
entry:
|
|
%a = load i64, ptr %p
|
|
%c = sitofp i64 %a to half
|
|
ret half %c
|
|
}
|
|
|
|
define half @utofp_load_i64_f16(ptr %p) {
|
|
; CHECK-NOFP16-SD-LABEL: utofp_load_i64_f16:
|
|
; CHECK-NOFP16-SD: // %bb.0: // %entry
|
|
; CHECK-NOFP16-SD-NEXT: ldr x8, [x0]
|
|
; CHECK-NOFP16-SD-NEXT: ucvtf s0, x8
|
|
; CHECK-NOFP16-SD-NEXT: fcvt h0, s0
|
|
; CHECK-NOFP16-SD-NEXT: ret
|
|
;
|
|
; CHECK-FP16-LABEL: utofp_load_i64_f16:
|
|
; CHECK-FP16: // %bb.0: // %entry
|
|
; CHECK-FP16-NEXT: ldr x8, [x0]
|
|
; CHECK-FP16-NEXT: ucvtf h0, x8
|
|
; CHECK-FP16-NEXT: ret
|
|
;
|
|
; CHECK-NOFP16-GI-LABEL: utofp_load_i64_f16:
|
|
; CHECK-NOFP16-GI: // %bb.0: // %entry
|
|
; CHECK-NOFP16-GI-NEXT: ldr d0, [x0]
|
|
; CHECK-NOFP16-GI-NEXT: fmov x8, d0
|
|
; CHECK-NOFP16-GI-NEXT: ucvtf s0, x8
|
|
; CHECK-NOFP16-GI-NEXT: fcvt h0, s0
|
|
; CHECK-NOFP16-GI-NEXT: ret
|
|
entry:
|
|
%a = load i64, ptr %p
|
|
%c = uitofp i64 %a to half
|
|
ret half %c
|
|
}
|
|
|
|
define half @stofp_load_i32_f16(ptr %p) {
|
|
; CHECK-NOFP16-LABEL: stofp_load_i32_f16:
|
|
; CHECK-NOFP16: // %bb.0: // %entry
|
|
; CHECK-NOFP16-NEXT: ldr s0, [x0]
|
|
; CHECK-NOFP16-NEXT: scvtf s0, s0
|
|
; CHECK-NOFP16-NEXT: fcvt h0, s0
|
|
; CHECK-NOFP16-NEXT: ret
|
|
;
|
|
; CHECK-FP16-LABEL: stofp_load_i32_f16:
|
|
; CHECK-FP16: // %bb.0: // %entry
|
|
; CHECK-FP16-NEXT: ldr w8, [x0]
|
|
; CHECK-FP16-NEXT: scvtf h0, w8
|
|
; CHECK-FP16-NEXT: ret
|
|
entry:
|
|
%a = load i32, ptr %p
|
|
%c = sitofp i32 %a to half
|
|
ret half %c
|
|
}
|
|
|
|
define half @utofp_load_i32_f16(ptr %p) {
|
|
; CHECK-NOFP16-LABEL: utofp_load_i32_f16:
|
|
; CHECK-NOFP16: // %bb.0: // %entry
|
|
; CHECK-NOFP16-NEXT: ldr s0, [x0]
|
|
; CHECK-NOFP16-NEXT: ucvtf s0, s0
|
|
; CHECK-NOFP16-NEXT: fcvt h0, s0
|
|
; CHECK-NOFP16-NEXT: ret
|
|
;
|
|
; CHECK-FP16-LABEL: utofp_load_i32_f16:
|
|
; CHECK-FP16: // %bb.0: // %entry
|
|
; CHECK-FP16-NEXT: ldr w8, [x0]
|
|
; CHECK-FP16-NEXT: ucvtf h0, w8
|
|
; CHECK-FP16-NEXT: ret
|
|
entry:
|
|
%a = load i32, ptr %p
|
|
%c = uitofp i32 %a to half
|
|
ret half %c
|
|
}
|
|
|
|
define half @stofp_load_i16_f16(ptr %p) {
|
|
; CHECK-NOFP16-LABEL: stofp_load_i16_f16:
|
|
; CHECK-NOFP16: // %bb.0: // %entry
|
|
; CHECK-NOFP16-NEXT: ldrsh w8, [x0]
|
|
; CHECK-NOFP16-NEXT: scvtf s0, w8
|
|
; CHECK-NOFP16-NEXT: fcvt h0, s0
|
|
; CHECK-NOFP16-NEXT: ret
|
|
;
|
|
; CHECK-FP16-LABEL: stofp_load_i16_f16:
|
|
; CHECK-FP16: // %bb.0: // %entry
|
|
; CHECK-FP16-NEXT: ldrsh w8, [x0]
|
|
; CHECK-FP16-NEXT: scvtf h0, w8
|
|
; CHECK-FP16-NEXT: ret
|
|
entry:
|
|
%a = load i16, ptr %p
|
|
%c = sitofp i16 %a to half
|
|
ret half %c
|
|
}
|
|
|
|
define half @utofp_load_i16_f16(ptr %p) {
|
|
; CHECK-NOFP16-LABEL: utofp_load_i16_f16:
|
|
; CHECK-NOFP16: // %bb.0: // %entry
|
|
; CHECK-NOFP16-NEXT: ldr h0, [x0]
|
|
; CHECK-NOFP16-NEXT: ucvtf s0, s0
|
|
; CHECK-NOFP16-NEXT: fcvt h0, s0
|
|
; CHECK-NOFP16-NEXT: ret
|
|
;
|
|
; CHECK-FP16-LABEL: utofp_load_i16_f16:
|
|
; CHECK-FP16: // %bb.0: // %entry
|
|
; CHECK-FP16-NEXT: ldrh w8, [x0]
|
|
; CHECK-FP16-NEXT: ucvtf h0, w8
|
|
; CHECK-FP16-NEXT: ret
|
|
entry:
|
|
%a = load i16, ptr %p
|
|
%c = uitofp i16 %a to half
|
|
ret half %c
|
|
}
|
|
|
|
define half @stofp_load_i8_f16(ptr %p) {
|
|
; CHECK-NOFP16-LABEL: stofp_load_i8_f16:
|
|
; CHECK-NOFP16: // %bb.0: // %entry
|
|
; CHECK-NOFP16-NEXT: ldrsb w8, [x0]
|
|
; CHECK-NOFP16-NEXT: scvtf s0, w8
|
|
; CHECK-NOFP16-NEXT: fcvt h0, s0
|
|
; CHECK-NOFP16-NEXT: ret
|
|
;
|
|
; CHECK-FP16-LABEL: stofp_load_i8_f16:
|
|
; CHECK-FP16: // %bb.0: // %entry
|
|
; CHECK-FP16-NEXT: ldrsb w8, [x0]
|
|
; CHECK-FP16-NEXT: scvtf h0, w8
|
|
; CHECK-FP16-NEXT: ret
|
|
entry:
|
|
%a = load i8, ptr %p
|
|
%c = sitofp i8 %a to half
|
|
ret half %c
|
|
}
|
|
|
|
define half @utofp_load_i8_f16(ptr %p) {
|
|
; CHECK-NOFP16-LABEL: utofp_load_i8_f16:
|
|
; CHECK-NOFP16: // %bb.0: // %entry
|
|
; CHECK-NOFP16-NEXT: ldr b0, [x0]
|
|
; CHECK-NOFP16-NEXT: ucvtf s0, s0
|
|
; CHECK-NOFP16-NEXT: fcvt h0, s0
|
|
; CHECK-NOFP16-NEXT: ret
|
|
;
|
|
; CHECK-FP16-LABEL: utofp_load_i8_f16:
|
|
; CHECK-FP16: // %bb.0: // %entry
|
|
; CHECK-FP16-NEXT: ldrb w8, [x0]
|
|
; CHECK-FP16-NEXT: ucvtf h0, w8
|
|
; CHECK-FP16-NEXT: ret
|
|
entry:
|
|
%a = load i8, ptr %p
|
|
%c = uitofp i8 %a to half
|
|
ret half %c
|
|
}
|
|
|
|
define <2 x double> @stofp_v2i64_v2f64(<2 x i64> %a) {
|
|
; CHECK-LABEL: stofp_v2i64_v2f64:
|
|
; CHECK: // %bb.0: // %entry
|
|
; CHECK-NEXT: scvtf v0.2d, v0.2d
|
|
; CHECK-NEXT: ret
|
|
entry:
|
|
%c = sitofp <2 x i64> %a to <2 x double>
|
|
ret <2 x double> %c
|
|
}
|
|
|
|
define <2 x double> @utofp_v2i64_v2f64(<2 x i64> %a) {
|
|
; CHECK-LABEL: utofp_v2i64_v2f64:
|
|
; CHECK: // %bb.0: // %entry
|
|
; CHECK-NEXT: ucvtf v0.2d, v0.2d
|
|
; CHECK-NEXT: ret
|
|
entry:
|
|
%c = uitofp <2 x i64> %a to <2 x double>
|
|
ret <2 x double> %c
|
|
}
|
|
|
|
define <3 x double> @stofp_v3i64_v3f64(<3 x i64> %a) {
|
|
; CHECK-NOFP16-SD-LABEL: stofp_v3i64_v3f64:
|
|
; CHECK-NOFP16-SD: // %bb.0: // %entry
|
|
; CHECK-NOFP16-SD-NEXT: // kill: def $d0 killed $d0 def $q0
|
|
; CHECK-NOFP16-SD-NEXT: // kill: def $d1 killed $d1 def $q1
|
|
; CHECK-NOFP16-SD-NEXT: // kill: def $d2 killed $d2 def $q2
|
|
; CHECK-NOFP16-SD-NEXT: mov v0.d[1], v1.d[0]
|
|
; CHECK-NOFP16-SD-NEXT: scvtf v2.2d, v2.2d
|
|
; CHECK-NOFP16-SD-NEXT: // kill: def $d2 killed $d2 killed $q2
|
|
; CHECK-NOFP16-SD-NEXT: scvtf v0.2d, v0.2d
|
|
; CHECK-NOFP16-SD-NEXT: ext v1.16b, v0.16b, v0.16b, #8
|
|
; CHECK-NOFP16-SD-NEXT: // kill: def $d0 killed $d0 killed $q0
|
|
; CHECK-NOFP16-SD-NEXT: // kill: def $d1 killed $d1 killed $q1
|
|
; CHECK-NOFP16-SD-NEXT: ret
|
|
;
|
|
; CHECK-FP16-SD-LABEL: stofp_v3i64_v3f64:
|
|
; CHECK-FP16-SD: // %bb.0: // %entry
|
|
; CHECK-FP16-SD-NEXT: // kill: def $d0 killed $d0 def $q0
|
|
; CHECK-FP16-SD-NEXT: // kill: def $d1 killed $d1 def $q1
|
|
; CHECK-FP16-SD-NEXT: // kill: def $d2 killed $d2 def $q2
|
|
; CHECK-FP16-SD-NEXT: mov v0.d[1], v1.d[0]
|
|
; CHECK-FP16-SD-NEXT: scvtf v2.2d, v2.2d
|
|
; CHECK-FP16-SD-NEXT: // kill: def $d2 killed $d2 killed $q2
|
|
; CHECK-FP16-SD-NEXT: scvtf v0.2d, v0.2d
|
|
; CHECK-FP16-SD-NEXT: ext v1.16b, v0.16b, v0.16b, #8
|
|
; CHECK-FP16-SD-NEXT: // kill: def $d0 killed $d0 killed $q0
|
|
; CHECK-FP16-SD-NEXT: // kill: def $d1 killed $d1 killed $q1
|
|
; CHECK-FP16-SD-NEXT: ret
|
|
;
|
|
; CHECK-NOFP16-GI-LABEL: stofp_v3i64_v3f64:
|
|
; CHECK-NOFP16-GI: // %bb.0: // %entry
|
|
; CHECK-NOFP16-GI-NEXT: // kill: def $d0 killed $d0 def $q0
|
|
; CHECK-NOFP16-GI-NEXT: // kill: def $d1 killed $d1 def $q1
|
|
; CHECK-NOFP16-GI-NEXT: // kill: def $d2 killed $d2 def $q2
|
|
; CHECK-NOFP16-GI-NEXT: mov v0.d[1], v1.d[0]
|
|
; CHECK-NOFP16-GI-NEXT: scvtf v2.2d, v2.2d
|
|
; CHECK-NOFP16-GI-NEXT: // kill: def $d2 killed $d2 killed $q2
|
|
; CHECK-NOFP16-GI-NEXT: scvtf v0.2d, v0.2d
|
|
; CHECK-NOFP16-GI-NEXT: mov d1, v0.d[1]
|
|
; CHECK-NOFP16-GI-NEXT: // kill: def $d0 killed $d0 killed $q0
|
|
; CHECK-NOFP16-GI-NEXT: ret
|
|
;
|
|
; CHECK-FP16-GI-LABEL: stofp_v3i64_v3f64:
|
|
; CHECK-FP16-GI: // %bb.0: // %entry
|
|
; CHECK-FP16-GI-NEXT: // kill: def $d0 killed $d0 def $q0
|
|
; CHECK-FP16-GI-NEXT: // kill: def $d1 killed $d1 def $q1
|
|
; CHECK-FP16-GI-NEXT: // kill: def $d2 killed $d2 def $q2
|
|
; CHECK-FP16-GI-NEXT: mov v0.d[1], v1.d[0]
|
|
; CHECK-FP16-GI-NEXT: scvtf v2.2d, v2.2d
|
|
; CHECK-FP16-GI-NEXT: // kill: def $d2 killed $d2 killed $q2
|
|
; CHECK-FP16-GI-NEXT: scvtf v0.2d, v0.2d
|
|
; CHECK-FP16-GI-NEXT: mov d1, v0.d[1]
|
|
; CHECK-FP16-GI-NEXT: // kill: def $d0 killed $d0 killed $q0
|
|
; CHECK-FP16-GI-NEXT: ret
|
|
entry:
|
|
%c = sitofp <3 x i64> %a to <3 x double>
|
|
ret <3 x double> %c
|
|
}
|
|
|
|
define <3 x double> @utofp_v3i64_v3f64(<3 x i64> %a) {
|
|
; CHECK-NOFP16-SD-LABEL: utofp_v3i64_v3f64:
|
|
; CHECK-NOFP16-SD: // %bb.0: // %entry
|
|
; CHECK-NOFP16-SD-NEXT: // kill: def $d0 killed $d0 def $q0
|
|
; CHECK-NOFP16-SD-NEXT: // kill: def $d1 killed $d1 def $q1
|
|
; CHECK-NOFP16-SD-NEXT: // kill: def $d2 killed $d2 def $q2
|
|
; CHECK-NOFP16-SD-NEXT: mov v0.d[1], v1.d[0]
|
|
; CHECK-NOFP16-SD-NEXT: ucvtf v2.2d, v2.2d
|
|
; CHECK-NOFP16-SD-NEXT: // kill: def $d2 killed $d2 killed $q2
|
|
; CHECK-NOFP16-SD-NEXT: ucvtf v0.2d, v0.2d
|
|
; CHECK-NOFP16-SD-NEXT: ext v1.16b, v0.16b, v0.16b, #8
|
|
; CHECK-NOFP16-SD-NEXT: // kill: def $d0 killed $d0 killed $q0
|
|
; CHECK-NOFP16-SD-NEXT: // kill: def $d1 killed $d1 killed $q1
|
|
; CHECK-NOFP16-SD-NEXT: ret
|
|
;
|
|
; CHECK-FP16-SD-LABEL: utofp_v3i64_v3f64:
|
|
; CHECK-FP16-SD: // %bb.0: // %entry
|
|
; CHECK-FP16-SD-NEXT: // kill: def $d0 killed $d0 def $q0
|
|
; CHECK-FP16-SD-NEXT: // kill: def $d1 killed $d1 def $q1
|
|
; CHECK-FP16-SD-NEXT: // kill: def $d2 killed $d2 def $q2
|
|
; CHECK-FP16-SD-NEXT: mov v0.d[1], v1.d[0]
|
|
; CHECK-FP16-SD-NEXT: ucvtf v2.2d, v2.2d
|
|
; CHECK-FP16-SD-NEXT: // kill: def $d2 killed $d2 killed $q2
|
|
; CHECK-FP16-SD-NEXT: ucvtf v0.2d, v0.2d
|
|
; CHECK-FP16-SD-NEXT: ext v1.16b, v0.16b, v0.16b, #8
|
|
; CHECK-FP16-SD-NEXT: // kill: def $d0 killed $d0 killed $q0
|
|
; CHECK-FP16-SD-NEXT: // kill: def $d1 killed $d1 killed $q1
|
|
; CHECK-FP16-SD-NEXT: ret
|
|
;
|
|
; CHECK-NOFP16-GI-LABEL: utofp_v3i64_v3f64:
|
|
; CHECK-NOFP16-GI: // %bb.0: // %entry
|
|
; CHECK-NOFP16-GI-NEXT: // kill: def $d0 killed $d0 def $q0
|
|
; CHECK-NOFP16-GI-NEXT: // kill: def $d1 killed $d1 def $q1
|
|
; CHECK-NOFP16-GI-NEXT: // kill: def $d2 killed $d2 def $q2
|
|
; CHECK-NOFP16-GI-NEXT: mov v0.d[1], v1.d[0]
|
|
; CHECK-NOFP16-GI-NEXT: ucvtf v2.2d, v2.2d
|
|
; CHECK-NOFP16-GI-NEXT: // kill: def $d2 killed $d2 killed $q2
|
|
; CHECK-NOFP16-GI-NEXT: ucvtf v0.2d, v0.2d
|
|
; CHECK-NOFP16-GI-NEXT: mov d1, v0.d[1]
|
|
; CHECK-NOFP16-GI-NEXT: // kill: def $d0 killed $d0 killed $q0
|
|
; CHECK-NOFP16-GI-NEXT: ret
|
|
;
|
|
; CHECK-FP16-GI-LABEL: utofp_v3i64_v3f64:
|
|
; CHECK-FP16-GI: // %bb.0: // %entry
|
|
; CHECK-FP16-GI-NEXT: // kill: def $d0 killed $d0 def $q0
|
|
; CHECK-FP16-GI-NEXT: // kill: def $d1 killed $d1 def $q1
|
|
; CHECK-FP16-GI-NEXT: // kill: def $d2 killed $d2 def $q2
|
|
; CHECK-FP16-GI-NEXT: mov v0.d[1], v1.d[0]
|
|
; CHECK-FP16-GI-NEXT: ucvtf v2.2d, v2.2d
|
|
; CHECK-FP16-GI-NEXT: // kill: def $d2 killed $d2 killed $q2
|
|
; CHECK-FP16-GI-NEXT: ucvtf v0.2d, v0.2d
|
|
; CHECK-FP16-GI-NEXT: mov d1, v0.d[1]
|
|
; CHECK-FP16-GI-NEXT: // kill: def $d0 killed $d0 killed $q0
|
|
; CHECK-FP16-GI-NEXT: ret
|
|
entry:
|
|
%c = uitofp <3 x i64> %a to <3 x double>
|
|
ret <3 x double> %c
|
|
}
|
|
|
|
define <4 x double> @stofp_v4i64_v4f64(<4 x i64> %a) {
|
|
; CHECK-LABEL: stofp_v4i64_v4f64:
|
|
; CHECK: // %bb.0: // %entry
|
|
; CHECK-NEXT: scvtf v0.2d, v0.2d
|
|
; CHECK-NEXT: scvtf v1.2d, v1.2d
|
|
; CHECK-NEXT: ret
|
|
entry:
|
|
%c = sitofp <4 x i64> %a to <4 x double>
|
|
ret <4 x double> %c
|
|
}
|
|
|
|
define <4 x double> @utofp_v4i64_v4f64(<4 x i64> %a) {
|
|
; CHECK-LABEL: utofp_v4i64_v4f64:
|
|
; CHECK: // %bb.0: // %entry
|
|
; CHECK-NEXT: ucvtf v0.2d, v0.2d
|
|
; CHECK-NEXT: ucvtf v1.2d, v1.2d
|
|
; CHECK-NEXT: ret
|
|
entry:
|
|
%c = uitofp <4 x i64> %a to <4 x double>
|
|
ret <4 x double> %c
|
|
}
|
|
|
|
define <2 x double> @stofp_v2i32_v2f64(<2 x i32> %a) {
|
|
; CHECK-LABEL: stofp_v2i32_v2f64:
|
|
; CHECK: // %bb.0: // %entry
|
|
; CHECK-NEXT: sshll v0.2d, v0.2s, #0
|
|
; CHECK-NEXT: scvtf v0.2d, v0.2d
|
|
; CHECK-NEXT: ret
|
|
entry:
|
|
%c = sitofp <2 x i32> %a to <2 x double>
|
|
ret <2 x double> %c
|
|
}
|
|
|
|
define <2 x double> @utofp_v2i32_v2f64(<2 x i32> %a) {
|
|
; CHECK-LABEL: utofp_v2i32_v2f64:
|
|
; CHECK: // %bb.0: // %entry
|
|
; CHECK-NEXT: ushll v0.2d, v0.2s, #0
|
|
; CHECK-NEXT: ucvtf v0.2d, v0.2d
|
|
; CHECK-NEXT: ret
|
|
entry:
|
|
%c = uitofp <2 x i32> %a to <2 x double>
|
|
ret <2 x double> %c
|
|
}
|
|
|
|
define <3 x double> @stofp_v3i32_v3f64(<3 x i32> %a) {
|
|
; CHECK-NOFP16-SD-LABEL: stofp_v3i32_v3f64:
|
|
; CHECK-NOFP16-SD: // %bb.0: // %entry
|
|
; CHECK-NOFP16-SD-NEXT: sshll v1.2d, v0.2s, #0
|
|
; CHECK-NOFP16-SD-NEXT: sshll2 v0.2d, v0.4s, #0
|
|
; CHECK-NOFP16-SD-NEXT: scvtf v3.2d, v1.2d
|
|
; CHECK-NOFP16-SD-NEXT: scvtf v2.2d, v0.2d
|
|
; CHECK-NOFP16-SD-NEXT: // kill: def $d2 killed $d2 killed $q2
|
|
; CHECK-NOFP16-SD-NEXT: fmov d0, d3
|
|
; CHECK-NOFP16-SD-NEXT: ext v1.16b, v3.16b, v3.16b, #8
|
|
; CHECK-NOFP16-SD-NEXT: // kill: def $d1 killed $d1 killed $q1
|
|
; CHECK-NOFP16-SD-NEXT: ret
|
|
;
|
|
; CHECK-FP16-SD-LABEL: stofp_v3i32_v3f64:
|
|
; CHECK-FP16-SD: // %bb.0: // %entry
|
|
; CHECK-FP16-SD-NEXT: sshll v1.2d, v0.2s, #0
|
|
; CHECK-FP16-SD-NEXT: sshll2 v0.2d, v0.4s, #0
|
|
; CHECK-FP16-SD-NEXT: scvtf v3.2d, v1.2d
|
|
; CHECK-FP16-SD-NEXT: scvtf v2.2d, v0.2d
|
|
; CHECK-FP16-SD-NEXT: // kill: def $d2 killed $d2 killed $q2
|
|
; CHECK-FP16-SD-NEXT: fmov d0, d3
|
|
; CHECK-FP16-SD-NEXT: ext v1.16b, v3.16b, v3.16b, #8
|
|
; CHECK-FP16-SD-NEXT: // kill: def $d1 killed $d1 killed $q1
|
|
; CHECK-FP16-SD-NEXT: ret
|
|
;
|
|
; CHECK-NOFP16-GI-LABEL: stofp_v3i32_v3f64:
|
|
; CHECK-NOFP16-GI: // %bb.0: // %entry
|
|
; CHECK-NOFP16-GI-NEXT: sshll v1.2d, v0.2s, #0
|
|
; CHECK-NOFP16-GI-NEXT: sshll2 v0.2d, v0.4s, #0
|
|
; CHECK-NOFP16-GI-NEXT: scvtf v3.2d, v1.2d
|
|
; CHECK-NOFP16-GI-NEXT: scvtf v2.2d, v0.2d
|
|
; CHECK-NOFP16-GI-NEXT: // kill: def $d2 killed $d2 killed $q2
|
|
; CHECK-NOFP16-GI-NEXT: mov d1, v3.d[1]
|
|
; CHECK-NOFP16-GI-NEXT: fmov d0, d3
|
|
; CHECK-NOFP16-GI-NEXT: ret
|
|
;
|
|
; CHECK-FP16-GI-LABEL: stofp_v3i32_v3f64:
|
|
; CHECK-FP16-GI: // %bb.0: // %entry
|
|
; CHECK-FP16-GI-NEXT: sshll v1.2d, v0.2s, #0
|
|
; CHECK-FP16-GI-NEXT: sshll2 v0.2d, v0.4s, #0
|
|
; CHECK-FP16-GI-NEXT: scvtf v3.2d, v1.2d
|
|
; CHECK-FP16-GI-NEXT: scvtf v2.2d, v0.2d
|
|
; CHECK-FP16-GI-NEXT: // kill: def $d2 killed $d2 killed $q2
|
|
; CHECK-FP16-GI-NEXT: mov d1, v3.d[1]
|
|
; CHECK-FP16-GI-NEXT: fmov d0, d3
|
|
; CHECK-FP16-GI-NEXT: ret
|
|
entry:
|
|
%c = sitofp <3 x i32> %a to <3 x double>
|
|
ret <3 x double> %c
|
|
}
|
|
|
|
define <3 x double> @utofp_v3i32_v3f64(<3 x i32> %a) {
|
|
; CHECK-NOFP16-SD-LABEL: utofp_v3i32_v3f64:
|
|
; CHECK-NOFP16-SD: // %bb.0: // %entry
|
|
; CHECK-NOFP16-SD-NEXT: ushll v1.2d, v0.2s, #0
|
|
; CHECK-NOFP16-SD-NEXT: ushll2 v0.2d, v0.4s, #0
|
|
; CHECK-NOFP16-SD-NEXT: ucvtf v3.2d, v1.2d
|
|
; CHECK-NOFP16-SD-NEXT: ucvtf v2.2d, v0.2d
|
|
; CHECK-NOFP16-SD-NEXT: // kill: def $d2 killed $d2 killed $q2
|
|
; CHECK-NOFP16-SD-NEXT: fmov d0, d3
|
|
; CHECK-NOFP16-SD-NEXT: ext v1.16b, v3.16b, v3.16b, #8
|
|
; CHECK-NOFP16-SD-NEXT: // kill: def $d1 killed $d1 killed $q1
|
|
; CHECK-NOFP16-SD-NEXT: ret
|
|
;
|
|
; CHECK-FP16-SD-LABEL: utofp_v3i32_v3f64:
|
|
; CHECK-FP16-SD: // %bb.0: // %entry
|
|
; CHECK-FP16-SD-NEXT: ushll v1.2d, v0.2s, #0
|
|
; CHECK-FP16-SD-NEXT: ushll2 v0.2d, v0.4s, #0
|
|
; CHECK-FP16-SD-NEXT: ucvtf v3.2d, v1.2d
|
|
; CHECK-FP16-SD-NEXT: ucvtf v2.2d, v0.2d
|
|
; CHECK-FP16-SD-NEXT: // kill: def $d2 killed $d2 killed $q2
|
|
; CHECK-FP16-SD-NEXT: fmov d0, d3
|
|
; CHECK-FP16-SD-NEXT: ext v1.16b, v3.16b, v3.16b, #8
|
|
; CHECK-FP16-SD-NEXT: // kill: def $d1 killed $d1 killed $q1
|
|
; CHECK-FP16-SD-NEXT: ret
|
|
;
|
|
; CHECK-NOFP16-GI-LABEL: utofp_v3i32_v3f64:
|
|
; CHECK-NOFP16-GI: // %bb.0: // %entry
|
|
; CHECK-NOFP16-GI-NEXT: ushll v1.2d, v0.2s, #0
|
|
; CHECK-NOFP16-GI-NEXT: ushll2 v0.2d, v0.4s, #0
|
|
; CHECK-NOFP16-GI-NEXT: ucvtf v3.2d, v1.2d
|
|
; CHECK-NOFP16-GI-NEXT: ucvtf v2.2d, v0.2d
|
|
; CHECK-NOFP16-GI-NEXT: // kill: def $d2 killed $d2 killed $q2
|
|
; CHECK-NOFP16-GI-NEXT: mov d1, v3.d[1]
|
|
; CHECK-NOFP16-GI-NEXT: fmov d0, d3
|
|
; CHECK-NOFP16-GI-NEXT: ret
|
|
;
|
|
; CHECK-FP16-GI-LABEL: utofp_v3i32_v3f64:
|
|
; CHECK-FP16-GI: // %bb.0: // %entry
|
|
; CHECK-FP16-GI-NEXT: ushll v1.2d, v0.2s, #0
|
|
; CHECK-FP16-GI-NEXT: ushll2 v0.2d, v0.4s, #0
|
|
; CHECK-FP16-GI-NEXT: ucvtf v3.2d, v1.2d
|
|
; CHECK-FP16-GI-NEXT: ucvtf v2.2d, v0.2d
|
|
; CHECK-FP16-GI-NEXT: // kill: def $d2 killed $d2 killed $q2
|
|
; CHECK-FP16-GI-NEXT: mov d1, v3.d[1]
|
|
; CHECK-FP16-GI-NEXT: fmov d0, d3
|
|
; CHECK-FP16-GI-NEXT: ret
|
|
entry:
|
|
%c = uitofp <3 x i32> %a to <3 x double>
|
|
ret <3 x double> %c
|
|
}
|
|
|
|
define <4 x double> @stofp_v4i32_v4f64(<4 x i32> %a) {
|
|
; CHECK-NOFP16-SD-LABEL: stofp_v4i32_v4f64:
|
|
; CHECK-NOFP16-SD: // %bb.0: // %entry
|
|
; CHECK-NOFP16-SD-NEXT: sshll2 v1.2d, v0.4s, #0
|
|
; CHECK-NOFP16-SD-NEXT: sshll v0.2d, v0.2s, #0
|
|
; CHECK-NOFP16-SD-NEXT: scvtf v1.2d, v1.2d
|
|
; CHECK-NOFP16-SD-NEXT: scvtf v0.2d, v0.2d
|
|
; CHECK-NOFP16-SD-NEXT: ret
|
|
;
|
|
; CHECK-FP16-SD-LABEL: stofp_v4i32_v4f64:
|
|
; CHECK-FP16-SD: // %bb.0: // %entry
|
|
; CHECK-FP16-SD-NEXT: sshll2 v1.2d, v0.4s, #0
|
|
; CHECK-FP16-SD-NEXT: sshll v0.2d, v0.2s, #0
|
|
; CHECK-FP16-SD-NEXT: scvtf v1.2d, v1.2d
|
|
; CHECK-FP16-SD-NEXT: scvtf v0.2d, v0.2d
|
|
; CHECK-FP16-SD-NEXT: ret
|
|
;
|
|
; CHECK-NOFP16-GI-LABEL: stofp_v4i32_v4f64:
|
|
; CHECK-NOFP16-GI: // %bb.0: // %entry
|
|
; CHECK-NOFP16-GI-NEXT: sshll v1.2d, v0.2s, #0
|
|
; CHECK-NOFP16-GI-NEXT: sshll2 v2.2d, v0.4s, #0
|
|
; CHECK-NOFP16-GI-NEXT: scvtf v0.2d, v1.2d
|
|
; CHECK-NOFP16-GI-NEXT: scvtf v1.2d, v2.2d
|
|
; CHECK-NOFP16-GI-NEXT: ret
|
|
;
|
|
; CHECK-FP16-GI-LABEL: stofp_v4i32_v4f64:
|
|
; CHECK-FP16-GI: // %bb.0: // %entry
|
|
; CHECK-FP16-GI-NEXT: sshll v1.2d, v0.2s, #0
|
|
; CHECK-FP16-GI-NEXT: sshll2 v2.2d, v0.4s, #0
|
|
; CHECK-FP16-GI-NEXT: scvtf v0.2d, v1.2d
|
|
; CHECK-FP16-GI-NEXT: scvtf v1.2d, v2.2d
|
|
; CHECK-FP16-GI-NEXT: ret
|
|
entry:
|
|
%c = sitofp <4 x i32> %a to <4 x double>
|
|
ret <4 x double> %c
|
|
}
|
|
|
|
define <4 x double> @utofp_v4i32_v4f64(<4 x i32> %a) {
|
|
; CHECK-NOFP16-SD-LABEL: utofp_v4i32_v4f64:
|
|
; CHECK-NOFP16-SD: // %bb.0: // %entry
|
|
; CHECK-NOFP16-SD-NEXT: ushll2 v1.2d, v0.4s, #0
|
|
; CHECK-NOFP16-SD-NEXT: ushll v0.2d, v0.2s, #0
|
|
; CHECK-NOFP16-SD-NEXT: ucvtf v1.2d, v1.2d
|
|
; CHECK-NOFP16-SD-NEXT: ucvtf v0.2d, v0.2d
|
|
; CHECK-NOFP16-SD-NEXT: ret
|
|
;
|
|
; CHECK-FP16-SD-LABEL: utofp_v4i32_v4f64:
|
|
; CHECK-FP16-SD: // %bb.0: // %entry
|
|
; CHECK-FP16-SD-NEXT: ushll2 v1.2d, v0.4s, #0
|
|
; CHECK-FP16-SD-NEXT: ushll v0.2d, v0.2s, #0
|
|
; CHECK-FP16-SD-NEXT: ucvtf v1.2d, v1.2d
|
|
; CHECK-FP16-SD-NEXT: ucvtf v0.2d, v0.2d
|
|
; CHECK-FP16-SD-NEXT: ret
|
|
;
|
|
; CHECK-NOFP16-GI-LABEL: utofp_v4i32_v4f64:
|
|
; CHECK-NOFP16-GI: // %bb.0: // %entry
|
|
; CHECK-NOFP16-GI-NEXT: ushll v1.2d, v0.2s, #0
|
|
; CHECK-NOFP16-GI-NEXT: ushll2 v2.2d, v0.4s, #0
|
|
; CHECK-NOFP16-GI-NEXT: ucvtf v0.2d, v1.2d
|
|
; CHECK-NOFP16-GI-NEXT: ucvtf v1.2d, v2.2d
|
|
; CHECK-NOFP16-GI-NEXT: ret
|
|
;
|
|
; CHECK-FP16-GI-LABEL: utofp_v4i32_v4f64:
|
|
; CHECK-FP16-GI: // %bb.0: // %entry
|
|
; CHECK-FP16-GI-NEXT: ushll v1.2d, v0.2s, #0
|
|
; CHECK-FP16-GI-NEXT: ushll2 v2.2d, v0.4s, #0
|
|
; CHECK-FP16-GI-NEXT: ucvtf v0.2d, v1.2d
|
|
; CHECK-FP16-GI-NEXT: ucvtf v1.2d, v2.2d
|
|
; CHECK-FP16-GI-NEXT: ret
|
|
entry:
|
|
%c = uitofp <4 x i32> %a to <4 x double>
|
|
ret <4 x double> %c
|
|
}
|
|
|
|
define <8 x double> @stofp_v8i32_v8f64(<8 x i32> %a) {
|
|
; CHECK-NOFP16-SD-LABEL: stofp_v8i32_v8f64:
|
|
; CHECK-NOFP16-SD: // %bb.0: // %entry
|
|
; CHECK-NOFP16-SD-NEXT: sshll v2.2d, v0.2s, #0
|
|
; CHECK-NOFP16-SD-NEXT: sshll2 v3.2d, v0.4s, #0
|
|
; CHECK-NOFP16-SD-NEXT: sshll2 v4.2d, v1.4s, #0
|
|
; CHECK-NOFP16-SD-NEXT: sshll v5.2d, v1.2s, #0
|
|
; CHECK-NOFP16-SD-NEXT: scvtf v0.2d, v2.2d
|
|
; CHECK-NOFP16-SD-NEXT: scvtf v1.2d, v3.2d
|
|
; CHECK-NOFP16-SD-NEXT: scvtf v3.2d, v4.2d
|
|
; CHECK-NOFP16-SD-NEXT: scvtf v2.2d, v5.2d
|
|
; CHECK-NOFP16-SD-NEXT: ret
|
|
;
|
|
; CHECK-FP16-SD-LABEL: stofp_v8i32_v8f64:
|
|
; CHECK-FP16-SD: // %bb.0: // %entry
|
|
; CHECK-FP16-SD-NEXT: sshll v2.2d, v0.2s, #0
|
|
; CHECK-FP16-SD-NEXT: sshll2 v3.2d, v0.4s, #0
|
|
; CHECK-FP16-SD-NEXT: sshll2 v4.2d, v1.4s, #0
|
|
; CHECK-FP16-SD-NEXT: sshll v5.2d, v1.2s, #0
|
|
; CHECK-FP16-SD-NEXT: scvtf v0.2d, v2.2d
|
|
; CHECK-FP16-SD-NEXT: scvtf v1.2d, v3.2d
|
|
; CHECK-FP16-SD-NEXT: scvtf v3.2d, v4.2d
|
|
; CHECK-FP16-SD-NEXT: scvtf v2.2d, v5.2d
|
|
; CHECK-FP16-SD-NEXT: ret
|
|
;
|
|
; CHECK-NOFP16-GI-LABEL: stofp_v8i32_v8f64:
|
|
; CHECK-NOFP16-GI: // %bb.0: // %entry
|
|
; CHECK-NOFP16-GI-NEXT: sshll v2.2d, v0.2s, #0
|
|
; CHECK-NOFP16-GI-NEXT: sshll2 v3.2d, v0.4s, #0
|
|
; CHECK-NOFP16-GI-NEXT: sshll v4.2d, v1.2s, #0
|
|
; CHECK-NOFP16-GI-NEXT: sshll2 v5.2d, v1.4s, #0
|
|
; CHECK-NOFP16-GI-NEXT: scvtf v0.2d, v2.2d
|
|
; CHECK-NOFP16-GI-NEXT: scvtf v1.2d, v3.2d
|
|
; CHECK-NOFP16-GI-NEXT: scvtf v2.2d, v4.2d
|
|
; CHECK-NOFP16-GI-NEXT: scvtf v3.2d, v5.2d
|
|
; CHECK-NOFP16-GI-NEXT: ret
|
|
;
|
|
; CHECK-FP16-GI-LABEL: stofp_v8i32_v8f64:
|
|
; CHECK-FP16-GI: // %bb.0: // %entry
|
|
; CHECK-FP16-GI-NEXT: sshll v2.2d, v0.2s, #0
|
|
; CHECK-FP16-GI-NEXT: sshll2 v3.2d, v0.4s, #0
|
|
; CHECK-FP16-GI-NEXT: sshll v4.2d, v1.2s, #0
|
|
; CHECK-FP16-GI-NEXT: sshll2 v5.2d, v1.4s, #0
|
|
; CHECK-FP16-GI-NEXT: scvtf v0.2d, v2.2d
|
|
; CHECK-FP16-GI-NEXT: scvtf v1.2d, v3.2d
|
|
; CHECK-FP16-GI-NEXT: scvtf v2.2d, v4.2d
|
|
; CHECK-FP16-GI-NEXT: scvtf v3.2d, v5.2d
|
|
; CHECK-FP16-GI-NEXT: ret
|
|
entry:
|
|
%c = sitofp <8 x i32> %a to <8 x double>
|
|
ret <8 x double> %c
|
|
}
|
|
|
|
define <8 x double> @utofp_v8i32_v8f64(<8 x i32> %a) {
|
|
; CHECK-NOFP16-SD-LABEL: utofp_v8i32_v8f64:
|
|
; CHECK-NOFP16-SD: // %bb.0: // %entry
|
|
; CHECK-NOFP16-SD-NEXT: ushll v2.2d, v0.2s, #0
|
|
; CHECK-NOFP16-SD-NEXT: ushll2 v3.2d, v0.4s, #0
|
|
; CHECK-NOFP16-SD-NEXT: ushll2 v4.2d, v1.4s, #0
|
|
; CHECK-NOFP16-SD-NEXT: ushll v5.2d, v1.2s, #0
|
|
; CHECK-NOFP16-SD-NEXT: ucvtf v0.2d, v2.2d
|
|
; CHECK-NOFP16-SD-NEXT: ucvtf v1.2d, v3.2d
|
|
; CHECK-NOFP16-SD-NEXT: ucvtf v3.2d, v4.2d
|
|
; CHECK-NOFP16-SD-NEXT: ucvtf v2.2d, v5.2d
|
|
; CHECK-NOFP16-SD-NEXT: ret
|
|
;
|
|
; CHECK-FP16-SD-LABEL: utofp_v8i32_v8f64:
|
|
; CHECK-FP16-SD: // %bb.0: // %entry
|
|
; CHECK-FP16-SD-NEXT: ushll v2.2d, v0.2s, #0
|
|
; CHECK-FP16-SD-NEXT: ushll2 v3.2d, v0.4s, #0
|
|
; CHECK-FP16-SD-NEXT: ushll2 v4.2d, v1.4s, #0
|
|
; CHECK-FP16-SD-NEXT: ushll v5.2d, v1.2s, #0
|
|
; CHECK-FP16-SD-NEXT: ucvtf v0.2d, v2.2d
|
|
; CHECK-FP16-SD-NEXT: ucvtf v1.2d, v3.2d
|
|
; CHECK-FP16-SD-NEXT: ucvtf v3.2d, v4.2d
|
|
; CHECK-FP16-SD-NEXT: ucvtf v2.2d, v5.2d
|
|
; CHECK-FP16-SD-NEXT: ret
|
|
;
|
|
; CHECK-NOFP16-GI-LABEL: utofp_v8i32_v8f64:
|
|
; CHECK-NOFP16-GI: // %bb.0: // %entry
|
|
; CHECK-NOFP16-GI-NEXT: ushll v2.2d, v0.2s, #0
|
|
; CHECK-NOFP16-GI-NEXT: ushll2 v3.2d, v0.4s, #0
|
|
; CHECK-NOFP16-GI-NEXT: ushll v4.2d, v1.2s, #0
|
|
; CHECK-NOFP16-GI-NEXT: ushll2 v5.2d, v1.4s, #0
|
|
; CHECK-NOFP16-GI-NEXT: ucvtf v0.2d, v2.2d
|
|
; CHECK-NOFP16-GI-NEXT: ucvtf v1.2d, v3.2d
|
|
; CHECK-NOFP16-GI-NEXT: ucvtf v2.2d, v4.2d
|
|
; CHECK-NOFP16-GI-NEXT: ucvtf v3.2d, v5.2d
|
|
; CHECK-NOFP16-GI-NEXT: ret
|
|
;
|
|
; CHECK-FP16-GI-LABEL: utofp_v8i32_v8f64:
|
|
; CHECK-FP16-GI: // %bb.0: // %entry
|
|
; CHECK-FP16-GI-NEXT: ushll v2.2d, v0.2s, #0
|
|
; CHECK-FP16-GI-NEXT: ushll2 v3.2d, v0.4s, #0
|
|
; CHECK-FP16-GI-NEXT: ushll v4.2d, v1.2s, #0
|
|
; CHECK-FP16-GI-NEXT: ushll2 v5.2d, v1.4s, #0
|
|
; CHECK-FP16-GI-NEXT: ucvtf v0.2d, v2.2d
|
|
; CHECK-FP16-GI-NEXT: ucvtf v1.2d, v3.2d
|
|
; CHECK-FP16-GI-NEXT: ucvtf v2.2d, v4.2d
|
|
; CHECK-FP16-GI-NEXT: ucvtf v3.2d, v5.2d
|
|
; CHECK-FP16-GI-NEXT: ret
|
|
entry:
|
|
%c = uitofp <8 x i32> %a to <8 x double>
|
|
ret <8 x double> %c
|
|
}
|
|
|
|
define <2 x double> @stofp_v2i16_v2f64(<2 x i16> %a) {
|
|
; CHECK-NOFP16-SD-LABEL: stofp_v2i16_v2f64:
|
|
; CHECK-NOFP16-SD: // %bb.0: // %entry
|
|
; CHECK-NOFP16-SD-NEXT: shl v0.2s, v0.2s, #16
|
|
; CHECK-NOFP16-SD-NEXT: sshr v0.2s, v0.2s, #16
|
|
; CHECK-NOFP16-SD-NEXT: sshll v0.2d, v0.2s, #0
|
|
; CHECK-NOFP16-SD-NEXT: scvtf v0.2d, v0.2d
|
|
; CHECK-NOFP16-SD-NEXT: ret
|
|
;
|
|
; CHECK-FP16-SD-LABEL: stofp_v2i16_v2f64:
|
|
; CHECK-FP16-SD: // %bb.0: // %entry
|
|
; CHECK-FP16-SD-NEXT: shl v0.2s, v0.2s, #16
|
|
; CHECK-FP16-SD-NEXT: sshr v0.2s, v0.2s, #16
|
|
; CHECK-FP16-SD-NEXT: sshll v0.2d, v0.2s, #0
|
|
; CHECK-FP16-SD-NEXT: scvtf v0.2d, v0.2d
|
|
; CHECK-FP16-SD-NEXT: ret
|
|
;
|
|
; CHECK-NOFP16-GI-LABEL: stofp_v2i16_v2f64:
|
|
; CHECK-NOFP16-GI: // %bb.0: // %entry
|
|
; CHECK-NOFP16-GI-NEXT: ushll v0.2d, v0.2s, #0
|
|
; CHECK-NOFP16-GI-NEXT: shl v0.2d, v0.2d, #48
|
|
; CHECK-NOFP16-GI-NEXT: sshr v0.2d, v0.2d, #48
|
|
; CHECK-NOFP16-GI-NEXT: scvtf v0.2d, v0.2d
|
|
; CHECK-NOFP16-GI-NEXT: ret
|
|
;
|
|
; CHECK-FP16-GI-LABEL: stofp_v2i16_v2f64:
|
|
; CHECK-FP16-GI: // %bb.0: // %entry
|
|
; CHECK-FP16-GI-NEXT: ushll v0.2d, v0.2s, #0
|
|
; CHECK-FP16-GI-NEXT: shl v0.2d, v0.2d, #48
|
|
; CHECK-FP16-GI-NEXT: sshr v0.2d, v0.2d, #48
|
|
; CHECK-FP16-GI-NEXT: scvtf v0.2d, v0.2d
|
|
; CHECK-FP16-GI-NEXT: ret
|
|
entry:
|
|
%c = sitofp <2 x i16> %a to <2 x double>
|
|
ret <2 x double> %c
|
|
}
|
|
|
|
define <2 x double> @utofp_v2i16_v2f64(<2 x i16> %a) {
|
|
; CHECK-NOFP16-SD-LABEL: utofp_v2i16_v2f64:
|
|
; CHECK-NOFP16-SD: // %bb.0: // %entry
|
|
; CHECK-NOFP16-SD-NEXT: movi d1, #0x00ffff0000ffff
|
|
; CHECK-NOFP16-SD-NEXT: and v0.8b, v0.8b, v1.8b
|
|
; CHECK-NOFP16-SD-NEXT: ushll v0.2d, v0.2s, #0
|
|
; CHECK-NOFP16-SD-NEXT: ucvtf v0.2d, v0.2d
|
|
; CHECK-NOFP16-SD-NEXT: ret
|
|
;
|
|
; CHECK-FP16-SD-LABEL: utofp_v2i16_v2f64:
|
|
; CHECK-FP16-SD: // %bb.0: // %entry
|
|
; CHECK-FP16-SD-NEXT: movi d1, #0x00ffff0000ffff
|
|
; CHECK-FP16-SD-NEXT: and v0.8b, v0.8b, v1.8b
|
|
; CHECK-FP16-SD-NEXT: ushll v0.2d, v0.2s, #0
|
|
; CHECK-FP16-SD-NEXT: ucvtf v0.2d, v0.2d
|
|
; CHECK-FP16-SD-NEXT: ret
|
|
;
|
|
; CHECK-NOFP16-GI-LABEL: utofp_v2i16_v2f64:
|
|
; CHECK-NOFP16-GI: // %bb.0: // %entry
|
|
; CHECK-NOFP16-GI-NEXT: movi v1.2d, #0x0000000000ffff
|
|
; CHECK-NOFP16-GI-NEXT: ushll v0.2d, v0.2s, #0
|
|
; CHECK-NOFP16-GI-NEXT: and v0.16b, v0.16b, v1.16b
|
|
; CHECK-NOFP16-GI-NEXT: ucvtf v0.2d, v0.2d
|
|
; CHECK-NOFP16-GI-NEXT: ret
|
|
;
|
|
; CHECK-FP16-GI-LABEL: utofp_v2i16_v2f64:
|
|
; CHECK-FP16-GI: // %bb.0: // %entry
|
|
; CHECK-FP16-GI-NEXT: movi v1.2d, #0x0000000000ffff
|
|
; CHECK-FP16-GI-NEXT: ushll v0.2d, v0.2s, #0
|
|
; CHECK-FP16-GI-NEXT: and v0.16b, v0.16b, v1.16b
|
|
; CHECK-FP16-GI-NEXT: ucvtf v0.2d, v0.2d
|
|
; CHECK-FP16-GI-NEXT: ret
|
|
entry:
|
|
%c = uitofp <2 x i16> %a to <2 x double>
|
|
ret <2 x double> %c
|
|
}
|
|
|
|
define <3 x double> @stofp_v3i16_v3f64(<3 x i16> %a) {
|
|
; CHECK-NOFP16-SD-LABEL: stofp_v3i16_v3f64:
|
|
; CHECK-NOFP16-SD: // %bb.0: // %entry
|
|
; CHECK-NOFP16-SD-NEXT: sshll v1.4s, v0.4h, #0
|
|
; CHECK-NOFP16-SD-NEXT: sshll v0.2d, v1.2s, #0
|
|
; CHECK-NOFP16-SD-NEXT: sshll2 v1.2d, v1.4s, #0
|
|
; CHECK-NOFP16-SD-NEXT: scvtf v0.2d, v0.2d
|
|
; CHECK-NOFP16-SD-NEXT: scvtf v2.2d, v1.2d
|
|
; CHECK-NOFP16-SD-NEXT: // kill: def $d2 killed $d2 killed $q2
|
|
; CHECK-NOFP16-SD-NEXT: ext v1.16b, v0.16b, v0.16b, #8
|
|
; CHECK-NOFP16-SD-NEXT: // kill: def $d0 killed $d0 killed $q0
|
|
; CHECK-NOFP16-SD-NEXT: // kill: def $d1 killed $d1 killed $q1
|
|
; CHECK-NOFP16-SD-NEXT: ret
|
|
;
|
|
; CHECK-FP16-SD-LABEL: stofp_v3i16_v3f64:
|
|
; CHECK-FP16-SD: // %bb.0: // %entry
|
|
; CHECK-FP16-SD-NEXT: sshll v1.4s, v0.4h, #0
|
|
; CHECK-FP16-SD-NEXT: sshll v0.2d, v1.2s, #0
|
|
; CHECK-FP16-SD-NEXT: sshll2 v1.2d, v1.4s, #0
|
|
; CHECK-FP16-SD-NEXT: scvtf v0.2d, v0.2d
|
|
; CHECK-FP16-SD-NEXT: scvtf v2.2d, v1.2d
|
|
; CHECK-FP16-SD-NEXT: // kill: def $d2 killed $d2 killed $q2
|
|
; CHECK-FP16-SD-NEXT: ext v1.16b, v0.16b, v0.16b, #8
|
|
; CHECK-FP16-SD-NEXT: // kill: def $d0 killed $d0 killed $q0
|
|
; CHECK-FP16-SD-NEXT: // kill: def $d1 killed $d1 killed $q1
|
|
; CHECK-FP16-SD-NEXT: ret
|
|
;
|
|
; CHECK-NOFP16-GI-LABEL: stofp_v3i16_v3f64:
|
|
; CHECK-NOFP16-GI: // %bb.0: // %entry
|
|
; CHECK-NOFP16-GI-NEXT: sshll v1.4s, v0.4h, #0
|
|
; CHECK-NOFP16-GI-NEXT: sshll v0.2d, v1.2s, #0
|
|
; CHECK-NOFP16-GI-NEXT: sshll2 v1.2d, v1.4s, #0
|
|
; CHECK-NOFP16-GI-NEXT: scvtf v0.2d, v0.2d
|
|
; CHECK-NOFP16-GI-NEXT: scvtf v2.2d, v1.2d
|
|
; CHECK-NOFP16-GI-NEXT: // kill: def $d2 killed $d2 killed $q2
|
|
; CHECK-NOFP16-GI-NEXT: mov d1, v0.d[1]
|
|
; CHECK-NOFP16-GI-NEXT: // kill: def $d0 killed $d0 killed $q0
|
|
; CHECK-NOFP16-GI-NEXT: ret
|
|
;
|
|
; CHECK-FP16-GI-LABEL: stofp_v3i16_v3f64:
|
|
; CHECK-FP16-GI: // %bb.0: // %entry
|
|
; CHECK-FP16-GI-NEXT: sshll v1.4s, v0.4h, #0
|
|
; CHECK-FP16-GI-NEXT: sshll v0.2d, v1.2s, #0
|
|
; CHECK-FP16-GI-NEXT: sshll2 v1.2d, v1.4s, #0
|
|
; CHECK-FP16-GI-NEXT: scvtf v0.2d, v0.2d
|
|
; CHECK-FP16-GI-NEXT: scvtf v2.2d, v1.2d
|
|
; CHECK-FP16-GI-NEXT: // kill: def $d2 killed $d2 killed $q2
|
|
; CHECK-FP16-GI-NEXT: mov d1, v0.d[1]
|
|
; CHECK-FP16-GI-NEXT: // kill: def $d0 killed $d0 killed $q0
|
|
; CHECK-FP16-GI-NEXT: ret
|
|
entry:
|
|
%c = sitofp <3 x i16> %a to <3 x double>
|
|
ret <3 x double> %c
|
|
}
|
|
|
|
define <3 x double> @utofp_v3i16_v3f64(<3 x i16> %a) {
|
|
; CHECK-NOFP16-SD-LABEL: utofp_v3i16_v3f64:
|
|
; CHECK-NOFP16-SD: // %bb.0: // %entry
|
|
; CHECK-NOFP16-SD-NEXT: ushll v1.4s, v0.4h, #0
|
|
; CHECK-NOFP16-SD-NEXT: ushll v0.2d, v1.2s, #0
|
|
; CHECK-NOFP16-SD-NEXT: ushll2 v1.2d, v1.4s, #0
|
|
; CHECK-NOFP16-SD-NEXT: ucvtf v0.2d, v0.2d
|
|
; CHECK-NOFP16-SD-NEXT: ucvtf v2.2d, v1.2d
|
|
; CHECK-NOFP16-SD-NEXT: // kill: def $d2 killed $d2 killed $q2
|
|
; CHECK-NOFP16-SD-NEXT: ext v1.16b, v0.16b, v0.16b, #8
|
|
; CHECK-NOFP16-SD-NEXT: // kill: def $d0 killed $d0 killed $q0
|
|
; CHECK-NOFP16-SD-NEXT: // kill: def $d1 killed $d1 killed $q1
|
|
; CHECK-NOFP16-SD-NEXT: ret
|
|
;
|
|
; CHECK-FP16-SD-LABEL: utofp_v3i16_v3f64:
|
|
; CHECK-FP16-SD: // %bb.0: // %entry
|
|
; CHECK-FP16-SD-NEXT: ushll v1.4s, v0.4h, #0
|
|
; CHECK-FP16-SD-NEXT: ushll v0.2d, v1.2s, #0
|
|
; CHECK-FP16-SD-NEXT: ushll2 v1.2d, v1.4s, #0
|
|
; CHECK-FP16-SD-NEXT: ucvtf v0.2d, v0.2d
|
|
; CHECK-FP16-SD-NEXT: ucvtf v2.2d, v1.2d
|
|
; CHECK-FP16-SD-NEXT: // kill: def $d2 killed $d2 killed $q2
|
|
; CHECK-FP16-SD-NEXT: ext v1.16b, v0.16b, v0.16b, #8
|
|
; CHECK-FP16-SD-NEXT: // kill: def $d0 killed $d0 killed $q0
|
|
; CHECK-FP16-SD-NEXT: // kill: def $d1 killed $d1 killed $q1
|
|
; CHECK-FP16-SD-NEXT: ret
|
|
;
|
|
; CHECK-NOFP16-GI-LABEL: utofp_v3i16_v3f64:
|
|
; CHECK-NOFP16-GI: // %bb.0: // %entry
|
|
; CHECK-NOFP16-GI-NEXT: ushll v1.4s, v0.4h, #0
|
|
; CHECK-NOFP16-GI-NEXT: ushll v0.2d, v1.2s, #0
|
|
; CHECK-NOFP16-GI-NEXT: ushll2 v1.2d, v1.4s, #0
|
|
; CHECK-NOFP16-GI-NEXT: ucvtf v0.2d, v0.2d
|
|
; CHECK-NOFP16-GI-NEXT: ucvtf v2.2d, v1.2d
|
|
; CHECK-NOFP16-GI-NEXT: // kill: def $d2 killed $d2 killed $q2
|
|
; CHECK-NOFP16-GI-NEXT: mov d1, v0.d[1]
|
|
; CHECK-NOFP16-GI-NEXT: // kill: def $d0 killed $d0 killed $q0
|
|
; CHECK-NOFP16-GI-NEXT: ret
|
|
;
|
|
; CHECK-FP16-GI-LABEL: utofp_v3i16_v3f64:
|
|
; CHECK-FP16-GI: // %bb.0: // %entry
|
|
; CHECK-FP16-GI-NEXT: ushll v1.4s, v0.4h, #0
|
|
; CHECK-FP16-GI-NEXT: ushll v0.2d, v1.2s, #0
|
|
; CHECK-FP16-GI-NEXT: ushll2 v1.2d, v1.4s, #0
|
|
; CHECK-FP16-GI-NEXT: ucvtf v0.2d, v0.2d
|
|
; CHECK-FP16-GI-NEXT: ucvtf v2.2d, v1.2d
|
|
; CHECK-FP16-GI-NEXT: // kill: def $d2 killed $d2 killed $q2
|
|
; CHECK-FP16-GI-NEXT: mov d1, v0.d[1]
|
|
; CHECK-FP16-GI-NEXT: // kill: def $d0 killed $d0 killed $q0
|
|
; CHECK-FP16-GI-NEXT: ret
|
|
entry:
|
|
%c = uitofp <3 x i16> %a to <3 x double>
|
|
ret <3 x double> %c
|
|
}
|
|
|
|
define <4 x double> @stofp_v4i16_v4f64(<4 x i16> %a) {
|
|
; CHECK-NOFP16-SD-LABEL: stofp_v4i16_v4f64:
|
|
; CHECK-NOFP16-SD: // %bb.0: // %entry
|
|
; CHECK-NOFP16-SD-NEXT: sshll v0.4s, v0.4h, #0
|
|
; CHECK-NOFP16-SD-NEXT: sshll2 v1.2d, v0.4s, #0
|
|
; CHECK-NOFP16-SD-NEXT: sshll v0.2d, v0.2s, #0
|
|
; CHECK-NOFP16-SD-NEXT: scvtf v1.2d, v1.2d
|
|
; CHECK-NOFP16-SD-NEXT: scvtf v0.2d, v0.2d
|
|
; CHECK-NOFP16-SD-NEXT: ret
|
|
;
|
|
; CHECK-FP16-SD-LABEL: stofp_v4i16_v4f64:
|
|
; CHECK-FP16-SD: // %bb.0: // %entry
|
|
; CHECK-FP16-SD-NEXT: sshll v0.4s, v0.4h, #0
|
|
; CHECK-FP16-SD-NEXT: sshll2 v1.2d, v0.4s, #0
|
|
; CHECK-FP16-SD-NEXT: sshll v0.2d, v0.2s, #0
|
|
; CHECK-FP16-SD-NEXT: scvtf v1.2d, v1.2d
|
|
; CHECK-FP16-SD-NEXT: scvtf v0.2d, v0.2d
|
|
; CHECK-FP16-SD-NEXT: ret
|
|
;
|
|
; CHECK-NOFP16-GI-LABEL: stofp_v4i16_v4f64:
|
|
; CHECK-NOFP16-GI: // %bb.0: // %entry
|
|
; CHECK-NOFP16-GI-NEXT: sshll v0.4s, v0.4h, #0
|
|
; CHECK-NOFP16-GI-NEXT: sshll v1.2d, v0.2s, #0
|
|
; CHECK-NOFP16-GI-NEXT: sshll2 v2.2d, v0.4s, #0
|
|
; CHECK-NOFP16-GI-NEXT: scvtf v0.2d, v1.2d
|
|
; CHECK-NOFP16-GI-NEXT: scvtf v1.2d, v2.2d
|
|
; CHECK-NOFP16-GI-NEXT: ret
|
|
;
|
|
; CHECK-FP16-GI-LABEL: stofp_v4i16_v4f64:
|
|
; CHECK-FP16-GI: // %bb.0: // %entry
|
|
; CHECK-FP16-GI-NEXT: sshll v0.4s, v0.4h, #0
|
|
; CHECK-FP16-GI-NEXT: sshll v1.2d, v0.2s, #0
|
|
; CHECK-FP16-GI-NEXT: sshll2 v2.2d, v0.4s, #0
|
|
; CHECK-FP16-GI-NEXT: scvtf v0.2d, v1.2d
|
|
; CHECK-FP16-GI-NEXT: scvtf v1.2d, v2.2d
|
|
; CHECK-FP16-GI-NEXT: ret
|
|
entry:
|
|
%c = sitofp <4 x i16> %a to <4 x double>
|
|
ret <4 x double> %c
|
|
}
|
|
|
|
define <4 x double> @utofp_v4i16_v4f64(<4 x i16> %a) {
|
|
; CHECK-NOFP16-SD-LABEL: utofp_v4i16_v4f64:
|
|
; CHECK-NOFP16-SD: // %bb.0: // %entry
|
|
; CHECK-NOFP16-SD-NEXT: ushll v0.4s, v0.4h, #0
|
|
; CHECK-NOFP16-SD-NEXT: ushll2 v1.2d, v0.4s, #0
|
|
; CHECK-NOFP16-SD-NEXT: ushll v0.2d, v0.2s, #0
|
|
; CHECK-NOFP16-SD-NEXT: ucvtf v1.2d, v1.2d
|
|
; CHECK-NOFP16-SD-NEXT: ucvtf v0.2d, v0.2d
|
|
; CHECK-NOFP16-SD-NEXT: ret
|
|
;
|
|
; CHECK-FP16-SD-LABEL: utofp_v4i16_v4f64:
|
|
; CHECK-FP16-SD: // %bb.0: // %entry
|
|
; CHECK-FP16-SD-NEXT: ushll v0.4s, v0.4h, #0
|
|
; CHECK-FP16-SD-NEXT: ushll2 v1.2d, v0.4s, #0
|
|
; CHECK-FP16-SD-NEXT: ushll v0.2d, v0.2s, #0
|
|
; CHECK-FP16-SD-NEXT: ucvtf v1.2d, v1.2d
|
|
; CHECK-FP16-SD-NEXT: ucvtf v0.2d, v0.2d
|
|
; CHECK-FP16-SD-NEXT: ret
|
|
;
|
|
; CHECK-NOFP16-GI-LABEL: utofp_v4i16_v4f64:
|
|
; CHECK-NOFP16-GI: // %bb.0: // %entry
|
|
; CHECK-NOFP16-GI-NEXT: ushll v0.4s, v0.4h, #0
|
|
; CHECK-NOFP16-GI-NEXT: ushll v1.2d, v0.2s, #0
|
|
; CHECK-NOFP16-GI-NEXT: ushll2 v2.2d, v0.4s, #0
|
|
; CHECK-NOFP16-GI-NEXT: ucvtf v0.2d, v1.2d
|
|
; CHECK-NOFP16-GI-NEXT: ucvtf v1.2d, v2.2d
|
|
; CHECK-NOFP16-GI-NEXT: ret
|
|
;
|
|
; CHECK-FP16-GI-LABEL: utofp_v4i16_v4f64:
|
|
; CHECK-FP16-GI: // %bb.0: // %entry
|
|
; CHECK-FP16-GI-NEXT: ushll v0.4s, v0.4h, #0
|
|
; CHECK-FP16-GI-NEXT: ushll v1.2d, v0.2s, #0
|
|
; CHECK-FP16-GI-NEXT: ushll2 v2.2d, v0.4s, #0
|
|
; CHECK-FP16-GI-NEXT: ucvtf v0.2d, v1.2d
|
|
; CHECK-FP16-GI-NEXT: ucvtf v1.2d, v2.2d
|
|
; CHECK-FP16-GI-NEXT: ret
|
|
entry:
|
|
%c = uitofp <4 x i16> %a to <4 x double>
|
|
ret <4 x double> %c
|
|
}
|
|
|
|
define <8 x double> @stofp_v8i16_v8f64(<8 x i16> %a) {
|
|
; CHECK-NOFP16-SD-LABEL: stofp_v8i16_v8f64:
|
|
; CHECK-NOFP16-SD: // %bb.0: // %entry
|
|
; CHECK-NOFP16-SD-NEXT: sshll v1.4s, v0.4h, #0
|
|
; CHECK-NOFP16-SD-NEXT: sshll2 v0.4s, v0.8h, #0
|
|
; CHECK-NOFP16-SD-NEXT: sshll v2.2d, v1.2s, #0
|
|
; CHECK-NOFP16-SD-NEXT: sshll2 v3.2d, v0.4s, #0
|
|
; CHECK-NOFP16-SD-NEXT: sshll2 v1.2d, v1.4s, #0
|
|
; CHECK-NOFP16-SD-NEXT: sshll v4.2d, v0.2s, #0
|
|
; CHECK-NOFP16-SD-NEXT: scvtf v0.2d, v2.2d
|
|
; CHECK-NOFP16-SD-NEXT: scvtf v3.2d, v3.2d
|
|
; CHECK-NOFP16-SD-NEXT: scvtf v1.2d, v1.2d
|
|
; CHECK-NOFP16-SD-NEXT: scvtf v2.2d, v4.2d
|
|
; CHECK-NOFP16-SD-NEXT: ret
|
|
;
|
|
; CHECK-FP16-SD-LABEL: stofp_v8i16_v8f64:
|
|
; CHECK-FP16-SD: // %bb.0: // %entry
|
|
; CHECK-FP16-SD-NEXT: sshll v1.4s, v0.4h, #0
|
|
; CHECK-FP16-SD-NEXT: sshll2 v0.4s, v0.8h, #0
|
|
; CHECK-FP16-SD-NEXT: sshll v2.2d, v1.2s, #0
|
|
; CHECK-FP16-SD-NEXT: sshll2 v3.2d, v0.4s, #0
|
|
; CHECK-FP16-SD-NEXT: sshll2 v1.2d, v1.4s, #0
|
|
; CHECK-FP16-SD-NEXT: sshll v4.2d, v0.2s, #0
|
|
; CHECK-FP16-SD-NEXT: scvtf v0.2d, v2.2d
|
|
; CHECK-FP16-SD-NEXT: scvtf v3.2d, v3.2d
|
|
; CHECK-FP16-SD-NEXT: scvtf v1.2d, v1.2d
|
|
; CHECK-FP16-SD-NEXT: scvtf v2.2d, v4.2d
|
|
; CHECK-FP16-SD-NEXT: ret
|
|
;
|
|
; CHECK-NOFP16-GI-LABEL: stofp_v8i16_v8f64:
|
|
; CHECK-NOFP16-GI: // %bb.0: // %entry
|
|
; CHECK-NOFP16-GI-NEXT: sshll v1.4s, v0.4h, #0
|
|
; CHECK-NOFP16-GI-NEXT: sshll2 v0.4s, v0.8h, #0
|
|
; CHECK-NOFP16-GI-NEXT: sshll v2.2d, v1.2s, #0
|
|
; CHECK-NOFP16-GI-NEXT: sshll2 v1.2d, v1.4s, #0
|
|
; CHECK-NOFP16-GI-NEXT: sshll v3.2d, v0.2s, #0
|
|
; CHECK-NOFP16-GI-NEXT: sshll2 v4.2d, v0.4s, #0
|
|
; CHECK-NOFP16-GI-NEXT: scvtf v0.2d, v2.2d
|
|
; CHECK-NOFP16-GI-NEXT: scvtf v1.2d, v1.2d
|
|
; CHECK-NOFP16-GI-NEXT: scvtf v2.2d, v3.2d
|
|
; CHECK-NOFP16-GI-NEXT: scvtf v3.2d, v4.2d
|
|
; CHECK-NOFP16-GI-NEXT: ret
|
|
;
|
|
; CHECK-FP16-GI-LABEL: stofp_v8i16_v8f64:
|
|
; CHECK-FP16-GI: // %bb.0: // %entry
|
|
; CHECK-FP16-GI-NEXT: sshll v1.4s, v0.4h, #0
|
|
; CHECK-FP16-GI-NEXT: sshll2 v0.4s, v0.8h, #0
|
|
; CHECK-FP16-GI-NEXT: sshll v2.2d, v1.2s, #0
|
|
; CHECK-FP16-GI-NEXT: sshll2 v1.2d, v1.4s, #0
|
|
; CHECK-FP16-GI-NEXT: sshll v3.2d, v0.2s, #0
|
|
; CHECK-FP16-GI-NEXT: sshll2 v4.2d, v0.4s, #0
|
|
; CHECK-FP16-GI-NEXT: scvtf v0.2d, v2.2d
|
|
; CHECK-FP16-GI-NEXT: scvtf v1.2d, v1.2d
|
|
; CHECK-FP16-GI-NEXT: scvtf v2.2d, v3.2d
|
|
; CHECK-FP16-GI-NEXT: scvtf v3.2d, v4.2d
|
|
; CHECK-FP16-GI-NEXT: ret
|
|
entry:
|
|
%c = sitofp <8 x i16> %a to <8 x double>
|
|
ret <8 x double> %c
|
|
}
|
|
|
|
define <8 x double> @utofp_v8i16_v8f64(<8 x i16> %a) {
|
|
; CHECK-NOFP16-SD-LABEL: utofp_v8i16_v8f64:
|
|
; CHECK-NOFP16-SD: // %bb.0: // %entry
|
|
; CHECK-NOFP16-SD-NEXT: ushll v1.4s, v0.4h, #0
|
|
; CHECK-NOFP16-SD-NEXT: ushll2 v0.4s, v0.8h, #0
|
|
; CHECK-NOFP16-SD-NEXT: ushll v2.2d, v1.2s, #0
|
|
; CHECK-NOFP16-SD-NEXT: ushll2 v3.2d, v0.4s, #0
|
|
; CHECK-NOFP16-SD-NEXT: ushll2 v1.2d, v1.4s, #0
|
|
; CHECK-NOFP16-SD-NEXT: ushll v4.2d, v0.2s, #0
|
|
; CHECK-NOFP16-SD-NEXT: ucvtf v0.2d, v2.2d
|
|
; CHECK-NOFP16-SD-NEXT: ucvtf v3.2d, v3.2d
|
|
; CHECK-NOFP16-SD-NEXT: ucvtf v1.2d, v1.2d
|
|
; CHECK-NOFP16-SD-NEXT: ucvtf v2.2d, v4.2d
|
|
; CHECK-NOFP16-SD-NEXT: ret
|
|
;
|
|
; CHECK-FP16-SD-LABEL: utofp_v8i16_v8f64:
|
|
; CHECK-FP16-SD: // %bb.0: // %entry
|
|
; CHECK-FP16-SD-NEXT: ushll v1.4s, v0.4h, #0
|
|
; CHECK-FP16-SD-NEXT: ushll2 v0.4s, v0.8h, #0
|
|
; CHECK-FP16-SD-NEXT: ushll v2.2d, v1.2s, #0
|
|
; CHECK-FP16-SD-NEXT: ushll2 v3.2d, v0.4s, #0
|
|
; CHECK-FP16-SD-NEXT: ushll2 v1.2d, v1.4s, #0
|
|
; CHECK-FP16-SD-NEXT: ushll v4.2d, v0.2s, #0
|
|
; CHECK-FP16-SD-NEXT: ucvtf v0.2d, v2.2d
|
|
; CHECK-FP16-SD-NEXT: ucvtf v3.2d, v3.2d
|
|
; CHECK-FP16-SD-NEXT: ucvtf v1.2d, v1.2d
|
|
; CHECK-FP16-SD-NEXT: ucvtf v2.2d, v4.2d
|
|
; CHECK-FP16-SD-NEXT: ret
|
|
;
|
|
; CHECK-NOFP16-GI-LABEL: utofp_v8i16_v8f64:
|
|
; CHECK-NOFP16-GI: // %bb.0: // %entry
|
|
; CHECK-NOFP16-GI-NEXT: ushll v1.4s, v0.4h, #0
|
|
; CHECK-NOFP16-GI-NEXT: ushll2 v0.4s, v0.8h, #0
|
|
; CHECK-NOFP16-GI-NEXT: ushll v2.2d, v1.2s, #0
|
|
; CHECK-NOFP16-GI-NEXT: ushll2 v1.2d, v1.4s, #0
|
|
; CHECK-NOFP16-GI-NEXT: ushll v3.2d, v0.2s, #0
|
|
; CHECK-NOFP16-GI-NEXT: ushll2 v4.2d, v0.4s, #0
|
|
; CHECK-NOFP16-GI-NEXT: ucvtf v0.2d, v2.2d
|
|
; CHECK-NOFP16-GI-NEXT: ucvtf v1.2d, v1.2d
|
|
; CHECK-NOFP16-GI-NEXT: ucvtf v2.2d, v3.2d
|
|
; CHECK-NOFP16-GI-NEXT: ucvtf v3.2d, v4.2d
|
|
; CHECK-NOFP16-GI-NEXT: ret
|
|
;
|
|
; CHECK-FP16-GI-LABEL: utofp_v8i16_v8f64:
|
|
; CHECK-FP16-GI: // %bb.0: // %entry
|
|
; CHECK-FP16-GI-NEXT: ushll v1.4s, v0.4h, #0
|
|
; CHECK-FP16-GI-NEXT: ushll2 v0.4s, v0.8h, #0
|
|
; CHECK-FP16-GI-NEXT: ushll v2.2d, v1.2s, #0
|
|
; CHECK-FP16-GI-NEXT: ushll2 v1.2d, v1.4s, #0
|
|
; CHECK-FP16-GI-NEXT: ushll v3.2d, v0.2s, #0
|
|
; CHECK-FP16-GI-NEXT: ushll2 v4.2d, v0.4s, #0
|
|
; CHECK-FP16-GI-NEXT: ucvtf v0.2d, v2.2d
|
|
; CHECK-FP16-GI-NEXT: ucvtf v1.2d, v1.2d
|
|
; CHECK-FP16-GI-NEXT: ucvtf v2.2d, v3.2d
|
|
; CHECK-FP16-GI-NEXT: ucvtf v3.2d, v4.2d
|
|
; CHECK-FP16-GI-NEXT: ret
|
|
entry:
|
|
%c = uitofp <8 x i16> %a to <8 x double>
|
|
ret <8 x double> %c
|
|
}
|
|
|
|
define <16 x double> @stofp_v16i16_v16f64(<16 x i16> %a) {
|
|
; CHECK-NOFP16-SD-LABEL: stofp_v16i16_v16f64:
|
|
; CHECK-NOFP16-SD: // %bb.0: // %entry
|
|
; CHECK-NOFP16-SD-NEXT: sshll v2.4s, v0.4h, #0
|
|
; CHECK-NOFP16-SD-NEXT: sshll2 v0.4s, v0.8h, #0
|
|
; CHECK-NOFP16-SD-NEXT: sshll v3.4s, v1.4h, #0
|
|
; CHECK-NOFP16-SD-NEXT: sshll2 v1.4s, v1.8h, #0
|
|
; CHECK-NOFP16-SD-NEXT: sshll2 v4.2d, v2.4s, #0
|
|
; CHECK-NOFP16-SD-NEXT: sshll v2.2d, v2.2s, #0
|
|
; CHECK-NOFP16-SD-NEXT: sshll2 v5.2d, v0.4s, #0
|
|
; CHECK-NOFP16-SD-NEXT: sshll v6.2d, v0.2s, #0
|
|
; CHECK-NOFP16-SD-NEXT: sshll v7.2d, v3.2s, #0
|
|
; CHECK-NOFP16-SD-NEXT: sshll2 v16.2d, v1.4s, #0
|
|
; CHECK-NOFP16-SD-NEXT: sshll2 v17.2d, v3.4s, #0
|
|
; CHECK-NOFP16-SD-NEXT: sshll v18.2d, v1.2s, #0
|
|
; CHECK-NOFP16-SD-NEXT: scvtf v1.2d, v4.2d
|
|
; CHECK-NOFP16-SD-NEXT: scvtf v0.2d, v2.2d
|
|
; CHECK-NOFP16-SD-NEXT: scvtf v3.2d, v5.2d
|
|
; CHECK-NOFP16-SD-NEXT: scvtf v2.2d, v6.2d
|
|
; CHECK-NOFP16-SD-NEXT: scvtf v4.2d, v7.2d
|
|
; CHECK-NOFP16-SD-NEXT: scvtf v7.2d, v16.2d
|
|
; CHECK-NOFP16-SD-NEXT: scvtf v5.2d, v17.2d
|
|
; CHECK-NOFP16-SD-NEXT: scvtf v6.2d, v18.2d
|
|
; CHECK-NOFP16-SD-NEXT: ret
|
|
;
|
|
; CHECK-FP16-SD-LABEL: stofp_v16i16_v16f64:
|
|
; CHECK-FP16-SD: // %bb.0: // %entry
|
|
; CHECK-FP16-SD-NEXT: sshll v2.4s, v0.4h, #0
|
|
; CHECK-FP16-SD-NEXT: sshll2 v0.4s, v0.8h, #0
|
|
; CHECK-FP16-SD-NEXT: sshll v3.4s, v1.4h, #0
|
|
; CHECK-FP16-SD-NEXT: sshll2 v1.4s, v1.8h, #0
|
|
; CHECK-FP16-SD-NEXT: sshll2 v4.2d, v2.4s, #0
|
|
; CHECK-FP16-SD-NEXT: sshll v2.2d, v2.2s, #0
|
|
; CHECK-FP16-SD-NEXT: sshll2 v5.2d, v0.4s, #0
|
|
; CHECK-FP16-SD-NEXT: sshll v6.2d, v0.2s, #0
|
|
; CHECK-FP16-SD-NEXT: sshll v7.2d, v3.2s, #0
|
|
; CHECK-FP16-SD-NEXT: sshll2 v16.2d, v1.4s, #0
|
|
; CHECK-FP16-SD-NEXT: sshll2 v17.2d, v3.4s, #0
|
|
; CHECK-FP16-SD-NEXT: sshll v18.2d, v1.2s, #0
|
|
; CHECK-FP16-SD-NEXT: scvtf v1.2d, v4.2d
|
|
; CHECK-FP16-SD-NEXT: scvtf v0.2d, v2.2d
|
|
; CHECK-FP16-SD-NEXT: scvtf v3.2d, v5.2d
|
|
; CHECK-FP16-SD-NEXT: scvtf v2.2d, v6.2d
|
|
; CHECK-FP16-SD-NEXT: scvtf v4.2d, v7.2d
|
|
; CHECK-FP16-SD-NEXT: scvtf v7.2d, v16.2d
|
|
; CHECK-FP16-SD-NEXT: scvtf v5.2d, v17.2d
|
|
; CHECK-FP16-SD-NEXT: scvtf v6.2d, v18.2d
|
|
; CHECK-FP16-SD-NEXT: ret
|
|
;
|
|
; CHECK-NOFP16-GI-LABEL: stofp_v16i16_v16f64:
|
|
; CHECK-NOFP16-GI: // %bb.0: // %entry
|
|
; CHECK-NOFP16-GI-NEXT: sshll v2.4s, v0.4h, #0
|
|
; CHECK-NOFP16-GI-NEXT: sshll2 v0.4s, v0.8h, #0
|
|
; CHECK-NOFP16-GI-NEXT: sshll v3.4s, v1.4h, #0
|
|
; CHECK-NOFP16-GI-NEXT: sshll2 v1.4s, v1.8h, #0
|
|
; CHECK-NOFP16-GI-NEXT: sshll v4.2d, v2.2s, #0
|
|
; CHECK-NOFP16-GI-NEXT: sshll2 v2.2d, v2.4s, #0
|
|
; CHECK-NOFP16-GI-NEXT: sshll v5.2d, v0.2s, #0
|
|
; CHECK-NOFP16-GI-NEXT: sshll2 v6.2d, v0.4s, #0
|
|
; CHECK-NOFP16-GI-NEXT: sshll v7.2d, v3.2s, #0
|
|
; CHECK-NOFP16-GI-NEXT: sshll2 v16.2d, v3.4s, #0
|
|
; CHECK-NOFP16-GI-NEXT: sshll v17.2d, v1.2s, #0
|
|
; CHECK-NOFP16-GI-NEXT: sshll2 v18.2d, v1.4s, #0
|
|
; CHECK-NOFP16-GI-NEXT: scvtf v0.2d, v4.2d
|
|
; CHECK-NOFP16-GI-NEXT: scvtf v1.2d, v2.2d
|
|
; CHECK-NOFP16-GI-NEXT: scvtf v2.2d, v5.2d
|
|
; CHECK-NOFP16-GI-NEXT: scvtf v3.2d, v6.2d
|
|
; CHECK-NOFP16-GI-NEXT: scvtf v4.2d, v7.2d
|
|
; CHECK-NOFP16-GI-NEXT: scvtf v5.2d, v16.2d
|
|
; CHECK-NOFP16-GI-NEXT: scvtf v6.2d, v17.2d
|
|
; CHECK-NOFP16-GI-NEXT: scvtf v7.2d, v18.2d
|
|
; CHECK-NOFP16-GI-NEXT: ret
|
|
;
|
|
; CHECK-FP16-GI-LABEL: stofp_v16i16_v16f64:
|
|
; CHECK-FP16-GI: // %bb.0: // %entry
|
|
; CHECK-FP16-GI-NEXT: sshll v2.4s, v0.4h, #0
|
|
; CHECK-FP16-GI-NEXT: sshll2 v0.4s, v0.8h, #0
|
|
; CHECK-FP16-GI-NEXT: sshll v3.4s, v1.4h, #0
|
|
; CHECK-FP16-GI-NEXT: sshll2 v1.4s, v1.8h, #0
|
|
; CHECK-FP16-GI-NEXT: sshll v4.2d, v2.2s, #0
|
|
; CHECK-FP16-GI-NEXT: sshll2 v2.2d, v2.4s, #0
|
|
; CHECK-FP16-GI-NEXT: sshll v5.2d, v0.2s, #0
|
|
; CHECK-FP16-GI-NEXT: sshll2 v6.2d, v0.4s, #0
|
|
; CHECK-FP16-GI-NEXT: sshll v7.2d, v3.2s, #0
|
|
; CHECK-FP16-GI-NEXT: sshll2 v16.2d, v3.4s, #0
|
|
; CHECK-FP16-GI-NEXT: sshll v17.2d, v1.2s, #0
|
|
; CHECK-FP16-GI-NEXT: sshll2 v18.2d, v1.4s, #0
|
|
; CHECK-FP16-GI-NEXT: scvtf v0.2d, v4.2d
|
|
; CHECK-FP16-GI-NEXT: scvtf v1.2d, v2.2d
|
|
; CHECK-FP16-GI-NEXT: scvtf v2.2d, v5.2d
|
|
; CHECK-FP16-GI-NEXT: scvtf v3.2d, v6.2d
|
|
; CHECK-FP16-GI-NEXT: scvtf v4.2d, v7.2d
|
|
; CHECK-FP16-GI-NEXT: scvtf v5.2d, v16.2d
|
|
; CHECK-FP16-GI-NEXT: scvtf v6.2d, v17.2d
|
|
; CHECK-FP16-GI-NEXT: scvtf v7.2d, v18.2d
|
|
; CHECK-FP16-GI-NEXT: ret
|
|
entry:
|
|
%c = sitofp <16 x i16> %a to <16 x double>
|
|
ret <16 x double> %c
|
|
}
|
|
|
|
define <16 x double> @utofp_v16i16_v16f64(<16 x i16> %a) {
|
|
; CHECK-NOFP16-SD-LABEL: utofp_v16i16_v16f64:
|
|
; CHECK-NOFP16-SD: // %bb.0: // %entry
|
|
; CHECK-NOFP16-SD-NEXT: ushll v2.4s, v0.4h, #0
|
|
; CHECK-NOFP16-SD-NEXT: ushll2 v0.4s, v0.8h, #0
|
|
; CHECK-NOFP16-SD-NEXT: ushll v3.4s, v1.4h, #0
|
|
; CHECK-NOFP16-SD-NEXT: ushll2 v1.4s, v1.8h, #0
|
|
; CHECK-NOFP16-SD-NEXT: ushll2 v4.2d, v2.4s, #0
|
|
; CHECK-NOFP16-SD-NEXT: ushll v2.2d, v2.2s, #0
|
|
; CHECK-NOFP16-SD-NEXT: ushll2 v5.2d, v0.4s, #0
|
|
; CHECK-NOFP16-SD-NEXT: ushll v6.2d, v0.2s, #0
|
|
; CHECK-NOFP16-SD-NEXT: ushll v7.2d, v3.2s, #0
|
|
; CHECK-NOFP16-SD-NEXT: ushll2 v16.2d, v1.4s, #0
|
|
; CHECK-NOFP16-SD-NEXT: ushll2 v17.2d, v3.4s, #0
|
|
; CHECK-NOFP16-SD-NEXT: ushll v18.2d, v1.2s, #0
|
|
; CHECK-NOFP16-SD-NEXT: ucvtf v1.2d, v4.2d
|
|
; CHECK-NOFP16-SD-NEXT: ucvtf v0.2d, v2.2d
|
|
; CHECK-NOFP16-SD-NEXT: ucvtf v3.2d, v5.2d
|
|
; CHECK-NOFP16-SD-NEXT: ucvtf v2.2d, v6.2d
|
|
; CHECK-NOFP16-SD-NEXT: ucvtf v4.2d, v7.2d
|
|
; CHECK-NOFP16-SD-NEXT: ucvtf v7.2d, v16.2d
|
|
; CHECK-NOFP16-SD-NEXT: ucvtf v5.2d, v17.2d
|
|
; CHECK-NOFP16-SD-NEXT: ucvtf v6.2d, v18.2d
|
|
; CHECK-NOFP16-SD-NEXT: ret
|
|
;
|
|
; CHECK-FP16-SD-LABEL: utofp_v16i16_v16f64:
|
|
; CHECK-FP16-SD: // %bb.0: // %entry
|
|
; CHECK-FP16-SD-NEXT: ushll v2.4s, v0.4h, #0
|
|
; CHECK-FP16-SD-NEXT: ushll2 v0.4s, v0.8h, #0
|
|
; CHECK-FP16-SD-NEXT: ushll v3.4s, v1.4h, #0
|
|
; CHECK-FP16-SD-NEXT: ushll2 v1.4s, v1.8h, #0
|
|
; CHECK-FP16-SD-NEXT: ushll2 v4.2d, v2.4s, #0
|
|
; CHECK-FP16-SD-NEXT: ushll v2.2d, v2.2s, #0
|
|
; CHECK-FP16-SD-NEXT: ushll2 v5.2d, v0.4s, #0
|
|
; CHECK-FP16-SD-NEXT: ushll v6.2d, v0.2s, #0
|
|
; CHECK-FP16-SD-NEXT: ushll v7.2d, v3.2s, #0
|
|
; CHECK-FP16-SD-NEXT: ushll2 v16.2d, v1.4s, #0
|
|
; CHECK-FP16-SD-NEXT: ushll2 v17.2d, v3.4s, #0
|
|
; CHECK-FP16-SD-NEXT: ushll v18.2d, v1.2s, #0
|
|
; CHECK-FP16-SD-NEXT: ucvtf v1.2d, v4.2d
|
|
; CHECK-FP16-SD-NEXT: ucvtf v0.2d, v2.2d
|
|
; CHECK-FP16-SD-NEXT: ucvtf v3.2d, v5.2d
|
|
; CHECK-FP16-SD-NEXT: ucvtf v2.2d, v6.2d
|
|
; CHECK-FP16-SD-NEXT: ucvtf v4.2d, v7.2d
|
|
; CHECK-FP16-SD-NEXT: ucvtf v7.2d, v16.2d
|
|
; CHECK-FP16-SD-NEXT: ucvtf v5.2d, v17.2d
|
|
; CHECK-FP16-SD-NEXT: ucvtf v6.2d, v18.2d
|
|
; CHECK-FP16-SD-NEXT: ret
|
|
;
|
|
; CHECK-NOFP16-GI-LABEL: utofp_v16i16_v16f64:
|
|
; CHECK-NOFP16-GI: // %bb.0: // %entry
|
|
; CHECK-NOFP16-GI-NEXT: ushll v2.4s, v0.4h, #0
|
|
; CHECK-NOFP16-GI-NEXT: ushll2 v0.4s, v0.8h, #0
|
|
; CHECK-NOFP16-GI-NEXT: ushll v3.4s, v1.4h, #0
|
|
; CHECK-NOFP16-GI-NEXT: ushll2 v1.4s, v1.8h, #0
|
|
; CHECK-NOFP16-GI-NEXT: ushll v4.2d, v2.2s, #0
|
|
; CHECK-NOFP16-GI-NEXT: ushll2 v2.2d, v2.4s, #0
|
|
; CHECK-NOFP16-GI-NEXT: ushll v5.2d, v0.2s, #0
|
|
; CHECK-NOFP16-GI-NEXT: ushll2 v6.2d, v0.4s, #0
|
|
; CHECK-NOFP16-GI-NEXT: ushll v7.2d, v3.2s, #0
|
|
; CHECK-NOFP16-GI-NEXT: ushll2 v16.2d, v3.4s, #0
|
|
; CHECK-NOFP16-GI-NEXT: ushll v17.2d, v1.2s, #0
|
|
; CHECK-NOFP16-GI-NEXT: ushll2 v18.2d, v1.4s, #0
|
|
; CHECK-NOFP16-GI-NEXT: ucvtf v0.2d, v4.2d
|
|
; CHECK-NOFP16-GI-NEXT: ucvtf v1.2d, v2.2d
|
|
; CHECK-NOFP16-GI-NEXT: ucvtf v2.2d, v5.2d
|
|
; CHECK-NOFP16-GI-NEXT: ucvtf v3.2d, v6.2d
|
|
; CHECK-NOFP16-GI-NEXT: ucvtf v4.2d, v7.2d
|
|
; CHECK-NOFP16-GI-NEXT: ucvtf v5.2d, v16.2d
|
|
; CHECK-NOFP16-GI-NEXT: ucvtf v6.2d, v17.2d
|
|
; CHECK-NOFP16-GI-NEXT: ucvtf v7.2d, v18.2d
|
|
; CHECK-NOFP16-GI-NEXT: ret
|
|
;
|
|
; CHECK-FP16-GI-LABEL: utofp_v16i16_v16f64:
|
|
; CHECK-FP16-GI: // %bb.0: // %entry
|
|
; CHECK-FP16-GI-NEXT: ushll v2.4s, v0.4h, #0
|
|
; CHECK-FP16-GI-NEXT: ushll2 v0.4s, v0.8h, #0
|
|
; CHECK-FP16-GI-NEXT: ushll v3.4s, v1.4h, #0
|
|
; CHECK-FP16-GI-NEXT: ushll2 v1.4s, v1.8h, #0
|
|
; CHECK-FP16-GI-NEXT: ushll v4.2d, v2.2s, #0
|
|
; CHECK-FP16-GI-NEXT: ushll2 v2.2d, v2.4s, #0
|
|
; CHECK-FP16-GI-NEXT: ushll v5.2d, v0.2s, #0
|
|
; CHECK-FP16-GI-NEXT: ushll2 v6.2d, v0.4s, #0
|
|
; CHECK-FP16-GI-NEXT: ushll v7.2d, v3.2s, #0
|
|
; CHECK-FP16-GI-NEXT: ushll2 v16.2d, v3.4s, #0
|
|
; CHECK-FP16-GI-NEXT: ushll v17.2d, v1.2s, #0
|
|
; CHECK-FP16-GI-NEXT: ushll2 v18.2d, v1.4s, #0
|
|
; CHECK-FP16-GI-NEXT: ucvtf v0.2d, v4.2d
|
|
; CHECK-FP16-GI-NEXT: ucvtf v1.2d, v2.2d
|
|
; CHECK-FP16-GI-NEXT: ucvtf v2.2d, v5.2d
|
|
; CHECK-FP16-GI-NEXT: ucvtf v3.2d, v6.2d
|
|
; CHECK-FP16-GI-NEXT: ucvtf v4.2d, v7.2d
|
|
; CHECK-FP16-GI-NEXT: ucvtf v5.2d, v16.2d
|
|
; CHECK-FP16-GI-NEXT: ucvtf v6.2d, v17.2d
|
|
; CHECK-FP16-GI-NEXT: ucvtf v7.2d, v18.2d
|
|
; CHECK-FP16-GI-NEXT: ret
|
|
entry:
|
|
%c = uitofp <16 x i16> %a to <16 x double>
|
|
ret <16 x double> %c
|
|
}
|
|
|
|
define <2 x double> @stofp_v2i8_v2f64(<2 x i8> %a) {
|
|
; CHECK-NOFP16-SD-LABEL: stofp_v2i8_v2f64:
|
|
; CHECK-NOFP16-SD: // %bb.0: // %entry
|
|
; CHECK-NOFP16-SD-NEXT: shl v0.2s, v0.2s, #24
|
|
; CHECK-NOFP16-SD-NEXT: sshr v0.2s, v0.2s, #24
|
|
; CHECK-NOFP16-SD-NEXT: sshll v0.2d, v0.2s, #0
|
|
; CHECK-NOFP16-SD-NEXT: scvtf v0.2d, v0.2d
|
|
; CHECK-NOFP16-SD-NEXT: ret
|
|
;
|
|
; CHECK-FP16-SD-LABEL: stofp_v2i8_v2f64:
|
|
; CHECK-FP16-SD: // %bb.0: // %entry
|
|
; CHECK-FP16-SD-NEXT: shl v0.2s, v0.2s, #24
|
|
; CHECK-FP16-SD-NEXT: sshr v0.2s, v0.2s, #24
|
|
; CHECK-FP16-SD-NEXT: sshll v0.2d, v0.2s, #0
|
|
; CHECK-FP16-SD-NEXT: scvtf v0.2d, v0.2d
|
|
; CHECK-FP16-SD-NEXT: ret
|
|
;
|
|
; CHECK-NOFP16-GI-LABEL: stofp_v2i8_v2f64:
|
|
; CHECK-NOFP16-GI: // %bb.0: // %entry
|
|
; CHECK-NOFP16-GI-NEXT: ushll v0.2d, v0.2s, #0
|
|
; CHECK-NOFP16-GI-NEXT: shl v0.2d, v0.2d, #56
|
|
; CHECK-NOFP16-GI-NEXT: sshr v0.2d, v0.2d, #56
|
|
; CHECK-NOFP16-GI-NEXT: scvtf v0.2d, v0.2d
|
|
; CHECK-NOFP16-GI-NEXT: ret
|
|
;
|
|
; CHECK-FP16-GI-LABEL: stofp_v2i8_v2f64:
|
|
; CHECK-FP16-GI: // %bb.0: // %entry
|
|
; CHECK-FP16-GI-NEXT: ushll v0.2d, v0.2s, #0
|
|
; CHECK-FP16-GI-NEXT: shl v0.2d, v0.2d, #56
|
|
; CHECK-FP16-GI-NEXT: sshr v0.2d, v0.2d, #56
|
|
; CHECK-FP16-GI-NEXT: scvtf v0.2d, v0.2d
|
|
; CHECK-FP16-GI-NEXT: ret
|
|
entry:
|
|
%c = sitofp <2 x i8> %a to <2 x double>
|
|
ret <2 x double> %c
|
|
}
|
|
|
|
define <2 x double> @utofp_v2i8_v2f64(<2 x i8> %a) {
|
|
; CHECK-NOFP16-SD-LABEL: utofp_v2i8_v2f64:
|
|
; CHECK-NOFP16-SD: // %bb.0: // %entry
|
|
; CHECK-NOFP16-SD-NEXT: movi d1, #0x0000ff000000ff
|
|
; CHECK-NOFP16-SD-NEXT: and v0.8b, v0.8b, v1.8b
|
|
; CHECK-NOFP16-SD-NEXT: ushll v0.2d, v0.2s, #0
|
|
; CHECK-NOFP16-SD-NEXT: ucvtf v0.2d, v0.2d
|
|
; CHECK-NOFP16-SD-NEXT: ret
|
|
;
|
|
; CHECK-FP16-SD-LABEL: utofp_v2i8_v2f64:
|
|
; CHECK-FP16-SD: // %bb.0: // %entry
|
|
; CHECK-FP16-SD-NEXT: movi d1, #0x0000ff000000ff
|
|
; CHECK-FP16-SD-NEXT: and v0.8b, v0.8b, v1.8b
|
|
; CHECK-FP16-SD-NEXT: ushll v0.2d, v0.2s, #0
|
|
; CHECK-FP16-SD-NEXT: ucvtf v0.2d, v0.2d
|
|
; CHECK-FP16-SD-NEXT: ret
|
|
;
|
|
; CHECK-NOFP16-GI-LABEL: utofp_v2i8_v2f64:
|
|
; CHECK-NOFP16-GI: // %bb.0: // %entry
|
|
; CHECK-NOFP16-GI-NEXT: movi v1.2d, #0x000000000000ff
|
|
; CHECK-NOFP16-GI-NEXT: ushll v0.2d, v0.2s, #0
|
|
; CHECK-NOFP16-GI-NEXT: and v0.16b, v0.16b, v1.16b
|
|
; CHECK-NOFP16-GI-NEXT: ucvtf v0.2d, v0.2d
|
|
; CHECK-NOFP16-GI-NEXT: ret
|
|
;
|
|
; CHECK-FP16-GI-LABEL: utofp_v2i8_v2f64:
|
|
; CHECK-FP16-GI: // %bb.0: // %entry
|
|
; CHECK-FP16-GI-NEXT: movi v1.2d, #0x000000000000ff
|
|
; CHECK-FP16-GI-NEXT: ushll v0.2d, v0.2s, #0
|
|
; CHECK-FP16-GI-NEXT: and v0.16b, v0.16b, v1.16b
|
|
; CHECK-FP16-GI-NEXT: ucvtf v0.2d, v0.2d
|
|
; CHECK-FP16-GI-NEXT: ret
|
|
entry:
|
|
%c = uitofp <2 x i8> %a to <2 x double>
|
|
ret <2 x double> %c
|
|
}
|
|
|
|
define <3 x double> @stofp_v3i8_v3f64(<3 x i8> %a) {
|
|
; CHECK-NOFP16-SD-LABEL: stofp_v3i8_v3f64:
|
|
; CHECK-NOFP16-SD: // %bb.0: // %entry
|
|
; CHECK-NOFP16-SD-NEXT: fmov s0, w0
|
|
; CHECK-NOFP16-SD-NEXT: fmov s1, w2
|
|
; CHECK-NOFP16-SD-NEXT: mov v0.s[1], w1
|
|
; CHECK-NOFP16-SD-NEXT: shl v1.2s, v1.2s, #24
|
|
; CHECK-NOFP16-SD-NEXT: sshr v1.2s, v1.2s, #24
|
|
; CHECK-NOFP16-SD-NEXT: shl v0.2s, v0.2s, #24
|
|
; CHECK-NOFP16-SD-NEXT: sshll v1.2d, v1.2s, #0
|
|
; CHECK-NOFP16-SD-NEXT: sshr v0.2s, v0.2s, #24
|
|
; CHECK-NOFP16-SD-NEXT: scvtf v2.2d, v1.2d
|
|
; CHECK-NOFP16-SD-NEXT: sshll v0.2d, v0.2s, #0
|
|
; CHECK-NOFP16-SD-NEXT: // kill: def $d2 killed $d2 killed $q2
|
|
; CHECK-NOFP16-SD-NEXT: scvtf v0.2d, v0.2d
|
|
; CHECK-NOFP16-SD-NEXT: ext v1.16b, v0.16b, v0.16b, #8
|
|
; CHECK-NOFP16-SD-NEXT: // kill: def $d0 killed $d0 killed $q0
|
|
; CHECK-NOFP16-SD-NEXT: // kill: def $d1 killed $d1 killed $q1
|
|
; CHECK-NOFP16-SD-NEXT: ret
|
|
;
|
|
; CHECK-FP16-SD-LABEL: stofp_v3i8_v3f64:
|
|
; CHECK-FP16-SD: // %bb.0: // %entry
|
|
; CHECK-FP16-SD-NEXT: fmov s0, w0
|
|
; CHECK-FP16-SD-NEXT: fmov s1, w2
|
|
; CHECK-FP16-SD-NEXT: mov v0.s[1], w1
|
|
; CHECK-FP16-SD-NEXT: shl v1.2s, v1.2s, #24
|
|
; CHECK-FP16-SD-NEXT: sshr v1.2s, v1.2s, #24
|
|
; CHECK-FP16-SD-NEXT: shl v0.2s, v0.2s, #24
|
|
; CHECK-FP16-SD-NEXT: sshll v1.2d, v1.2s, #0
|
|
; CHECK-FP16-SD-NEXT: sshr v0.2s, v0.2s, #24
|
|
; CHECK-FP16-SD-NEXT: scvtf v2.2d, v1.2d
|
|
; CHECK-FP16-SD-NEXT: sshll v0.2d, v0.2s, #0
|
|
; CHECK-FP16-SD-NEXT: // kill: def $d2 killed $d2 killed $q2
|
|
; CHECK-FP16-SD-NEXT: scvtf v0.2d, v0.2d
|
|
; CHECK-FP16-SD-NEXT: ext v1.16b, v0.16b, v0.16b, #8
|
|
; CHECK-FP16-SD-NEXT: // kill: def $d0 killed $d0 killed $q0
|
|
; CHECK-FP16-SD-NEXT: // kill: def $d1 killed $d1 killed $q1
|
|
; CHECK-FP16-SD-NEXT: ret
|
|
;
|
|
; CHECK-NOFP16-GI-LABEL: stofp_v3i8_v3f64:
|
|
; CHECK-NOFP16-GI: // %bb.0: // %entry
|
|
; CHECK-NOFP16-GI-NEXT: fmov s0, w0
|
|
; CHECK-NOFP16-GI-NEXT: mov v0.h[1], w1
|
|
; CHECK-NOFP16-GI-NEXT: mov v0.h[2], w2
|
|
; CHECK-NOFP16-GI-NEXT: shl v0.4h, v0.4h, #8
|
|
; CHECK-NOFP16-GI-NEXT: sshr v0.4h, v0.4h, #8
|
|
; CHECK-NOFP16-GI-NEXT: smov x8, v0.h[0]
|
|
; CHECK-NOFP16-GI-NEXT: smov x9, v0.h[1]
|
|
; CHECK-NOFP16-GI-NEXT: fmov d1, x8
|
|
; CHECK-NOFP16-GI-NEXT: smov x8, v0.h[2]
|
|
; CHECK-NOFP16-GI-NEXT: mov v1.d[1], x9
|
|
; CHECK-NOFP16-GI-NEXT: smov x9, v0.h[3]
|
|
; CHECK-NOFP16-GI-NEXT: fmov d2, x8
|
|
; CHECK-NOFP16-GI-NEXT: scvtf v0.2d, v1.2d
|
|
; CHECK-NOFP16-GI-NEXT: mov v2.d[1], x9
|
|
; CHECK-NOFP16-GI-NEXT: mov d1, v0.d[1]
|
|
; CHECK-NOFP16-GI-NEXT: scvtf v2.2d, v2.2d
|
|
; CHECK-NOFP16-GI-NEXT: // kill: def $d0 killed $d0 killed $q0
|
|
; CHECK-NOFP16-GI-NEXT: // kill: def $d2 killed $d2 killed $q2
|
|
; CHECK-NOFP16-GI-NEXT: ret
|
|
;
|
|
; CHECK-FP16-GI-LABEL: stofp_v3i8_v3f64:
|
|
; CHECK-FP16-GI: // %bb.0: // %entry
|
|
; CHECK-FP16-GI-NEXT: fmov s0, w0
|
|
; CHECK-FP16-GI-NEXT: mov v0.h[1], w1
|
|
; CHECK-FP16-GI-NEXT: mov v0.h[2], w2
|
|
; CHECK-FP16-GI-NEXT: shl v0.4h, v0.4h, #8
|
|
; CHECK-FP16-GI-NEXT: sshr v0.4h, v0.4h, #8
|
|
; CHECK-FP16-GI-NEXT: smov x8, v0.h[0]
|
|
; CHECK-FP16-GI-NEXT: smov x9, v0.h[1]
|
|
; CHECK-FP16-GI-NEXT: fmov d1, x8
|
|
; CHECK-FP16-GI-NEXT: smov x8, v0.h[2]
|
|
; CHECK-FP16-GI-NEXT: mov v1.d[1], x9
|
|
; CHECK-FP16-GI-NEXT: smov x9, v0.h[3]
|
|
; CHECK-FP16-GI-NEXT: fmov d2, x8
|
|
; CHECK-FP16-GI-NEXT: scvtf v0.2d, v1.2d
|
|
; CHECK-FP16-GI-NEXT: mov v2.d[1], x9
|
|
; CHECK-FP16-GI-NEXT: mov d1, v0.d[1]
|
|
; CHECK-FP16-GI-NEXT: scvtf v2.2d, v2.2d
|
|
; CHECK-FP16-GI-NEXT: // kill: def $d0 killed $d0 killed $q0
|
|
; CHECK-FP16-GI-NEXT: // kill: def $d2 killed $d2 killed $q2
|
|
; CHECK-FP16-GI-NEXT: ret
|
|
entry:
|
|
%c = sitofp <3 x i8> %a to <3 x double>
|
|
ret <3 x double> %c
|
|
}
|
|
|
|
define <3 x double> @utofp_v3i8_v3f64(<3 x i8> %a) {
|
|
; CHECK-NOFP16-SD-LABEL: utofp_v3i8_v3f64:
|
|
; CHECK-NOFP16-SD: // %bb.0: // %entry
|
|
; CHECK-NOFP16-SD-NEXT: fmov s0, w0
|
|
; CHECK-NOFP16-SD-NEXT: movi d1, #0x0000ff000000ff
|
|
; CHECK-NOFP16-SD-NEXT: fmov s2, w2
|
|
; CHECK-NOFP16-SD-NEXT: mov v0.s[1], w1
|
|
; CHECK-NOFP16-SD-NEXT: and v0.8b, v0.8b, v1.8b
|
|
; CHECK-NOFP16-SD-NEXT: and v1.8b, v2.8b, v1.8b
|
|
; CHECK-NOFP16-SD-NEXT: ushll v0.2d, v0.2s, #0
|
|
; CHECK-NOFP16-SD-NEXT: ushll v1.2d, v1.2s, #0
|
|
; CHECK-NOFP16-SD-NEXT: ucvtf v0.2d, v0.2d
|
|
; CHECK-NOFP16-SD-NEXT: ucvtf v2.2d, v1.2d
|
|
; CHECK-NOFP16-SD-NEXT: // kill: def $d2 killed $d2 killed $q2
|
|
; CHECK-NOFP16-SD-NEXT: ext v1.16b, v0.16b, v0.16b, #8
|
|
; CHECK-NOFP16-SD-NEXT: // kill: def $d0 killed $d0 killed $q0
|
|
; CHECK-NOFP16-SD-NEXT: // kill: def $d1 killed $d1 killed $q1
|
|
; CHECK-NOFP16-SD-NEXT: ret
|
|
;
|
|
; CHECK-FP16-SD-LABEL: utofp_v3i8_v3f64:
|
|
; CHECK-FP16-SD: // %bb.0: // %entry
|
|
; CHECK-FP16-SD-NEXT: fmov s0, w0
|
|
; CHECK-FP16-SD-NEXT: movi d1, #0x0000ff000000ff
|
|
; CHECK-FP16-SD-NEXT: fmov s2, w2
|
|
; CHECK-FP16-SD-NEXT: mov v0.s[1], w1
|
|
; CHECK-FP16-SD-NEXT: and v0.8b, v0.8b, v1.8b
|
|
; CHECK-FP16-SD-NEXT: and v1.8b, v2.8b, v1.8b
|
|
; CHECK-FP16-SD-NEXT: ushll v0.2d, v0.2s, #0
|
|
; CHECK-FP16-SD-NEXT: ushll v1.2d, v1.2s, #0
|
|
; CHECK-FP16-SD-NEXT: ucvtf v0.2d, v0.2d
|
|
; CHECK-FP16-SD-NEXT: ucvtf v2.2d, v1.2d
|
|
; CHECK-FP16-SD-NEXT: // kill: def $d2 killed $d2 killed $q2
|
|
; CHECK-FP16-SD-NEXT: ext v1.16b, v0.16b, v0.16b, #8
|
|
; CHECK-FP16-SD-NEXT: // kill: def $d0 killed $d0 killed $q0
|
|
; CHECK-FP16-SD-NEXT: // kill: def $d1 killed $d1 killed $q1
|
|
; CHECK-FP16-SD-NEXT: ret
|
|
;
|
|
; CHECK-NOFP16-GI-LABEL: utofp_v3i8_v3f64:
|
|
; CHECK-NOFP16-GI: // %bb.0: // %entry
|
|
; CHECK-NOFP16-GI-NEXT: fmov s0, w0
|
|
; CHECK-NOFP16-GI-NEXT: movi d1, #0xff00ff00ff00ff
|
|
; CHECK-NOFP16-GI-NEXT: mov v0.h[1], w1
|
|
; CHECK-NOFP16-GI-NEXT: mov v0.h[2], w2
|
|
; CHECK-NOFP16-GI-NEXT: and v0.8b, v0.8b, v1.8b
|
|
; CHECK-NOFP16-GI-NEXT: umov w8, v0.h[0]
|
|
; CHECK-NOFP16-GI-NEXT: umov w9, v0.h[1]
|
|
; CHECK-NOFP16-GI-NEXT: fmov d1, x8
|
|
; CHECK-NOFP16-GI-NEXT: umov w8, v0.h[2]
|
|
; CHECK-NOFP16-GI-NEXT: mov v1.d[1], x9
|
|
; CHECK-NOFP16-GI-NEXT: umov w9, v0.h[3]
|
|
; CHECK-NOFP16-GI-NEXT: fmov d2, x8
|
|
; CHECK-NOFP16-GI-NEXT: ucvtf v0.2d, v1.2d
|
|
; CHECK-NOFP16-GI-NEXT: mov v2.d[1], x9
|
|
; CHECK-NOFP16-GI-NEXT: mov d1, v0.d[1]
|
|
; CHECK-NOFP16-GI-NEXT: ucvtf v2.2d, v2.2d
|
|
; CHECK-NOFP16-GI-NEXT: // kill: def $d0 killed $d0 killed $q0
|
|
; CHECK-NOFP16-GI-NEXT: // kill: def $d2 killed $d2 killed $q2
|
|
; CHECK-NOFP16-GI-NEXT: ret
|
|
;
|
|
; CHECK-FP16-GI-LABEL: utofp_v3i8_v3f64:
|
|
; CHECK-FP16-GI: // %bb.0: // %entry
|
|
; CHECK-FP16-GI-NEXT: fmov s0, w0
|
|
; CHECK-FP16-GI-NEXT: movi d1, #0xff00ff00ff00ff
|
|
; CHECK-FP16-GI-NEXT: mov v0.h[1], w1
|
|
; CHECK-FP16-GI-NEXT: mov v0.h[2], w2
|
|
; CHECK-FP16-GI-NEXT: and v0.8b, v0.8b, v1.8b
|
|
; CHECK-FP16-GI-NEXT: umov w8, v0.h[0]
|
|
; CHECK-FP16-GI-NEXT: umov w9, v0.h[1]
|
|
; CHECK-FP16-GI-NEXT: fmov d1, x8
|
|
; CHECK-FP16-GI-NEXT: umov w8, v0.h[2]
|
|
; CHECK-FP16-GI-NEXT: mov v1.d[1], x9
|
|
; CHECK-FP16-GI-NEXT: umov w9, v0.h[3]
|
|
; CHECK-FP16-GI-NEXT: fmov d2, x8
|
|
; CHECK-FP16-GI-NEXT: ucvtf v0.2d, v1.2d
|
|
; CHECK-FP16-GI-NEXT: mov v2.d[1], x9
|
|
; CHECK-FP16-GI-NEXT: mov d1, v0.d[1]
|
|
; CHECK-FP16-GI-NEXT: ucvtf v2.2d, v2.2d
|
|
; CHECK-FP16-GI-NEXT: // kill: def $d0 killed $d0 killed $q0
|
|
; CHECK-FP16-GI-NEXT: // kill: def $d2 killed $d2 killed $q2
|
|
; CHECK-FP16-GI-NEXT: ret
|
|
entry:
|
|
%c = uitofp <3 x i8> %a to <3 x double>
|
|
ret <3 x double> %c
|
|
}
|
|
|
|
define <4 x double> @stofp_v4i8_v4f64(<4 x i8> %a) {
|
|
; CHECK-NOFP16-SD-LABEL: stofp_v4i8_v4f64:
|
|
; CHECK-NOFP16-SD: // %bb.0: // %entry
|
|
; CHECK-NOFP16-SD-NEXT: ushll v0.4s, v0.4h, #0
|
|
; CHECK-NOFP16-SD-NEXT: ext v1.16b, v0.16b, v0.16b, #8
|
|
; CHECK-NOFP16-SD-NEXT: shl v0.2s, v0.2s, #24
|
|
; CHECK-NOFP16-SD-NEXT: sshr v0.2s, v0.2s, #24
|
|
; CHECK-NOFP16-SD-NEXT: shl v1.2s, v1.2s, #24
|
|
; CHECK-NOFP16-SD-NEXT: sshll v0.2d, v0.2s, #0
|
|
; CHECK-NOFP16-SD-NEXT: sshr v1.2s, v1.2s, #24
|
|
; CHECK-NOFP16-SD-NEXT: scvtf v0.2d, v0.2d
|
|
; CHECK-NOFP16-SD-NEXT: sshll v1.2d, v1.2s, #0
|
|
; CHECK-NOFP16-SD-NEXT: scvtf v1.2d, v1.2d
|
|
; CHECK-NOFP16-SD-NEXT: ret
|
|
;
|
|
; CHECK-FP16-SD-LABEL: stofp_v4i8_v4f64:
|
|
; CHECK-FP16-SD: // %bb.0: // %entry
|
|
; CHECK-FP16-SD-NEXT: ushll v0.4s, v0.4h, #0
|
|
; CHECK-FP16-SD-NEXT: ext v1.16b, v0.16b, v0.16b, #8
|
|
; CHECK-FP16-SD-NEXT: shl v0.2s, v0.2s, #24
|
|
; CHECK-FP16-SD-NEXT: sshr v0.2s, v0.2s, #24
|
|
; CHECK-FP16-SD-NEXT: shl v1.2s, v1.2s, #24
|
|
; CHECK-FP16-SD-NEXT: sshll v0.2d, v0.2s, #0
|
|
; CHECK-FP16-SD-NEXT: sshr v1.2s, v1.2s, #24
|
|
; CHECK-FP16-SD-NEXT: scvtf v0.2d, v0.2d
|
|
; CHECK-FP16-SD-NEXT: sshll v1.2d, v1.2s, #0
|
|
; CHECK-FP16-SD-NEXT: scvtf v1.2d, v1.2d
|
|
; CHECK-FP16-SD-NEXT: ret
|
|
;
|
|
; CHECK-NOFP16-GI-LABEL: stofp_v4i8_v4f64:
|
|
; CHECK-NOFP16-GI: // %bb.0: // %entry
|
|
; CHECK-NOFP16-GI-NEXT: ushll v0.4s, v0.4h, #0
|
|
; CHECK-NOFP16-GI-NEXT: ushll v1.2d, v0.2s, #0
|
|
; CHECK-NOFP16-GI-NEXT: ushll2 v0.2d, v0.4s, #0
|
|
; CHECK-NOFP16-GI-NEXT: shl v1.2d, v1.2d, #56
|
|
; CHECK-NOFP16-GI-NEXT: shl v0.2d, v0.2d, #56
|
|
; CHECK-NOFP16-GI-NEXT: sshr v1.2d, v1.2d, #56
|
|
; CHECK-NOFP16-GI-NEXT: sshr v2.2d, v0.2d, #56
|
|
; CHECK-NOFP16-GI-NEXT: scvtf v0.2d, v1.2d
|
|
; CHECK-NOFP16-GI-NEXT: scvtf v1.2d, v2.2d
|
|
; CHECK-NOFP16-GI-NEXT: ret
|
|
;
|
|
; CHECK-FP16-GI-LABEL: stofp_v4i8_v4f64:
|
|
; CHECK-FP16-GI: // %bb.0: // %entry
|
|
; CHECK-FP16-GI-NEXT: ushll v0.4s, v0.4h, #0
|
|
; CHECK-FP16-GI-NEXT: ushll v1.2d, v0.2s, #0
|
|
; CHECK-FP16-GI-NEXT: ushll2 v0.2d, v0.4s, #0
|
|
; CHECK-FP16-GI-NEXT: shl v1.2d, v1.2d, #56
|
|
; CHECK-FP16-GI-NEXT: shl v0.2d, v0.2d, #56
|
|
; CHECK-FP16-GI-NEXT: sshr v1.2d, v1.2d, #56
|
|
; CHECK-FP16-GI-NEXT: sshr v2.2d, v0.2d, #56
|
|
; CHECK-FP16-GI-NEXT: scvtf v0.2d, v1.2d
|
|
; CHECK-FP16-GI-NEXT: scvtf v1.2d, v2.2d
|
|
; CHECK-FP16-GI-NEXT: ret
|
|
entry:
|
|
%c = sitofp <4 x i8> %a to <4 x double>
|
|
ret <4 x double> %c
|
|
}
|
|
|
|
define <4 x double> @utofp_v4i8_v4f64(<4 x i8> %a) {
|
|
; CHECK-NOFP16-SD-LABEL: utofp_v4i8_v4f64:
|
|
; CHECK-NOFP16-SD: // %bb.0: // %entry
|
|
; CHECK-NOFP16-SD-NEXT: ushll v0.4s, v0.4h, #0
|
|
; CHECK-NOFP16-SD-NEXT: movi d1, #0x0000ff000000ff
|
|
; CHECK-NOFP16-SD-NEXT: ext v2.16b, v0.16b, v0.16b, #8
|
|
; CHECK-NOFP16-SD-NEXT: and v0.8b, v0.8b, v1.8b
|
|
; CHECK-NOFP16-SD-NEXT: and v1.8b, v2.8b, v1.8b
|
|
; CHECK-NOFP16-SD-NEXT: ushll v0.2d, v0.2s, #0
|
|
; CHECK-NOFP16-SD-NEXT: ushll v1.2d, v1.2s, #0
|
|
; CHECK-NOFP16-SD-NEXT: ucvtf v0.2d, v0.2d
|
|
; CHECK-NOFP16-SD-NEXT: ucvtf v1.2d, v1.2d
|
|
; CHECK-NOFP16-SD-NEXT: ret
|
|
;
|
|
; CHECK-FP16-SD-LABEL: utofp_v4i8_v4f64:
|
|
; CHECK-FP16-SD: // %bb.0: // %entry
|
|
; CHECK-FP16-SD-NEXT: ushll v0.4s, v0.4h, #0
|
|
; CHECK-FP16-SD-NEXT: movi d1, #0x0000ff000000ff
|
|
; CHECK-FP16-SD-NEXT: ext v2.16b, v0.16b, v0.16b, #8
|
|
; CHECK-FP16-SD-NEXT: and v0.8b, v0.8b, v1.8b
|
|
; CHECK-FP16-SD-NEXT: and v1.8b, v2.8b, v1.8b
|
|
; CHECK-FP16-SD-NEXT: ushll v0.2d, v0.2s, #0
|
|
; CHECK-FP16-SD-NEXT: ushll v1.2d, v1.2s, #0
|
|
; CHECK-FP16-SD-NEXT: ucvtf v0.2d, v0.2d
|
|
; CHECK-FP16-SD-NEXT: ucvtf v1.2d, v1.2d
|
|
; CHECK-FP16-SD-NEXT: ret
|
|
;
|
|
; CHECK-NOFP16-GI-LABEL: utofp_v4i8_v4f64:
|
|
; CHECK-NOFP16-GI: // %bb.0: // %entry
|
|
; CHECK-NOFP16-GI-NEXT: ushll v0.4s, v0.4h, #0
|
|
; CHECK-NOFP16-GI-NEXT: movi v1.2d, #0x000000000000ff
|
|
; CHECK-NOFP16-GI-NEXT: ushll v2.2d, v0.2s, #0
|
|
; CHECK-NOFP16-GI-NEXT: ushll2 v0.2d, v0.4s, #0
|
|
; CHECK-NOFP16-GI-NEXT: and v2.16b, v2.16b, v1.16b
|
|
; CHECK-NOFP16-GI-NEXT: and v1.16b, v0.16b, v1.16b
|
|
; CHECK-NOFP16-GI-NEXT: ucvtf v0.2d, v2.2d
|
|
; CHECK-NOFP16-GI-NEXT: ucvtf v1.2d, v1.2d
|
|
; CHECK-NOFP16-GI-NEXT: ret
|
|
;
|
|
; CHECK-FP16-GI-LABEL: utofp_v4i8_v4f64:
|
|
; CHECK-FP16-GI: // %bb.0: // %entry
|
|
; CHECK-FP16-GI-NEXT: ushll v0.4s, v0.4h, #0
|
|
; CHECK-FP16-GI-NEXT: movi v1.2d, #0x000000000000ff
|
|
; CHECK-FP16-GI-NEXT: ushll v2.2d, v0.2s, #0
|
|
; CHECK-FP16-GI-NEXT: ushll2 v0.2d, v0.4s, #0
|
|
; CHECK-FP16-GI-NEXT: and v2.16b, v2.16b, v1.16b
|
|
; CHECK-FP16-GI-NEXT: and v1.16b, v0.16b, v1.16b
|
|
; CHECK-FP16-GI-NEXT: ucvtf v0.2d, v2.2d
|
|
; CHECK-FP16-GI-NEXT: ucvtf v1.2d, v1.2d
|
|
; CHECK-FP16-GI-NEXT: ret
|
|
entry:
|
|
%c = uitofp <4 x i8> %a to <4 x double>
|
|
ret <4 x double> %c
|
|
}
|
|
|
|
define <8 x double> @stofp_v8i8_v8f64(<8 x i8> %a) {
|
|
; CHECK-NOFP16-SD-LABEL: stofp_v8i8_v8f64:
|
|
; CHECK-NOFP16-SD: // %bb.0: // %entry
|
|
; CHECK-NOFP16-SD-NEXT: // kill: def $d0 killed $d0 def $q0
|
|
; CHECK-NOFP16-SD-NEXT: mov b1, v0.b[0]
|
|
; CHECK-NOFP16-SD-NEXT: mov b2, v0.b[2]
|
|
; CHECK-NOFP16-SD-NEXT: mov b3, v0.b[4]
|
|
; CHECK-NOFP16-SD-NEXT: mov b4, v0.b[6]
|
|
; CHECK-NOFP16-SD-NEXT: mov v1.b[4], v0.b[1]
|
|
; CHECK-NOFP16-SD-NEXT: mov v2.b[4], v0.b[3]
|
|
; CHECK-NOFP16-SD-NEXT: mov v3.b[4], v0.b[5]
|
|
; CHECK-NOFP16-SD-NEXT: mov v4.b[4], v0.b[7]
|
|
; CHECK-NOFP16-SD-NEXT: shl v0.2s, v1.2s, #24
|
|
; CHECK-NOFP16-SD-NEXT: shl v1.2s, v2.2s, #24
|
|
; CHECK-NOFP16-SD-NEXT: shl v2.2s, v3.2s, #24
|
|
; CHECK-NOFP16-SD-NEXT: shl v3.2s, v4.2s, #24
|
|
; CHECK-NOFP16-SD-NEXT: sshr v0.2s, v0.2s, #24
|
|
; CHECK-NOFP16-SD-NEXT: sshr v1.2s, v1.2s, #24
|
|
; CHECK-NOFP16-SD-NEXT: sshr v2.2s, v2.2s, #24
|
|
; CHECK-NOFP16-SD-NEXT: sshr v3.2s, v3.2s, #24
|
|
; CHECK-NOFP16-SD-NEXT: sshll v0.2d, v0.2s, #0
|
|
; CHECK-NOFP16-SD-NEXT: sshll v1.2d, v1.2s, #0
|
|
; CHECK-NOFP16-SD-NEXT: sshll v2.2d, v2.2s, #0
|
|
; CHECK-NOFP16-SD-NEXT: sshll v3.2d, v3.2s, #0
|
|
; CHECK-NOFP16-SD-NEXT: scvtf v0.2d, v0.2d
|
|
; CHECK-NOFP16-SD-NEXT: scvtf v1.2d, v1.2d
|
|
; CHECK-NOFP16-SD-NEXT: scvtf v2.2d, v2.2d
|
|
; CHECK-NOFP16-SD-NEXT: scvtf v3.2d, v3.2d
|
|
; CHECK-NOFP16-SD-NEXT: ret
|
|
;
|
|
; CHECK-FP16-SD-LABEL: stofp_v8i8_v8f64:
|
|
; CHECK-FP16-SD: // %bb.0: // %entry
|
|
; CHECK-FP16-SD-NEXT: // kill: def $d0 killed $d0 def $q0
|
|
; CHECK-FP16-SD-NEXT: mov b1, v0.b[0]
|
|
; CHECK-FP16-SD-NEXT: mov b2, v0.b[2]
|
|
; CHECK-FP16-SD-NEXT: mov b3, v0.b[4]
|
|
; CHECK-FP16-SD-NEXT: mov b4, v0.b[6]
|
|
; CHECK-FP16-SD-NEXT: mov v1.b[4], v0.b[1]
|
|
; CHECK-FP16-SD-NEXT: mov v2.b[4], v0.b[3]
|
|
; CHECK-FP16-SD-NEXT: mov v3.b[4], v0.b[5]
|
|
; CHECK-FP16-SD-NEXT: mov v4.b[4], v0.b[7]
|
|
; CHECK-FP16-SD-NEXT: shl v0.2s, v1.2s, #24
|
|
; CHECK-FP16-SD-NEXT: shl v1.2s, v2.2s, #24
|
|
; CHECK-FP16-SD-NEXT: shl v2.2s, v3.2s, #24
|
|
; CHECK-FP16-SD-NEXT: shl v3.2s, v4.2s, #24
|
|
; CHECK-FP16-SD-NEXT: sshr v0.2s, v0.2s, #24
|
|
; CHECK-FP16-SD-NEXT: sshr v1.2s, v1.2s, #24
|
|
; CHECK-FP16-SD-NEXT: sshr v2.2s, v2.2s, #24
|
|
; CHECK-FP16-SD-NEXT: sshr v3.2s, v3.2s, #24
|
|
; CHECK-FP16-SD-NEXT: sshll v0.2d, v0.2s, #0
|
|
; CHECK-FP16-SD-NEXT: sshll v1.2d, v1.2s, #0
|
|
; CHECK-FP16-SD-NEXT: sshll v2.2d, v2.2s, #0
|
|
; CHECK-FP16-SD-NEXT: sshll v3.2d, v3.2s, #0
|
|
; CHECK-FP16-SD-NEXT: scvtf v0.2d, v0.2d
|
|
; CHECK-FP16-SD-NEXT: scvtf v1.2d, v1.2d
|
|
; CHECK-FP16-SD-NEXT: scvtf v2.2d, v2.2d
|
|
; CHECK-FP16-SD-NEXT: scvtf v3.2d, v3.2d
|
|
; CHECK-FP16-SD-NEXT: ret
|
|
;
|
|
; CHECK-NOFP16-GI-LABEL: stofp_v8i8_v8f64:
|
|
; CHECK-NOFP16-GI: // %bb.0: // %entry
|
|
; CHECK-NOFP16-GI-NEXT: sshll v0.8h, v0.8b, #0
|
|
; CHECK-NOFP16-GI-NEXT: sshll v1.4s, v0.4h, #0
|
|
; CHECK-NOFP16-GI-NEXT: sshll2 v0.4s, v0.8h, #0
|
|
; CHECK-NOFP16-GI-NEXT: sshll v2.2d, v1.2s, #0
|
|
; CHECK-NOFP16-GI-NEXT: sshll2 v1.2d, v1.4s, #0
|
|
; CHECK-NOFP16-GI-NEXT: sshll v3.2d, v0.2s, #0
|
|
; CHECK-NOFP16-GI-NEXT: sshll2 v4.2d, v0.4s, #0
|
|
; CHECK-NOFP16-GI-NEXT: scvtf v0.2d, v2.2d
|
|
; CHECK-NOFP16-GI-NEXT: scvtf v1.2d, v1.2d
|
|
; CHECK-NOFP16-GI-NEXT: scvtf v2.2d, v3.2d
|
|
; CHECK-NOFP16-GI-NEXT: scvtf v3.2d, v4.2d
|
|
; CHECK-NOFP16-GI-NEXT: ret
|
|
;
|
|
; CHECK-FP16-GI-LABEL: stofp_v8i8_v8f64:
|
|
; CHECK-FP16-GI: // %bb.0: // %entry
|
|
; CHECK-FP16-GI-NEXT: sshll v0.8h, v0.8b, #0
|
|
; CHECK-FP16-GI-NEXT: sshll v1.4s, v0.4h, #0
|
|
; CHECK-FP16-GI-NEXT: sshll2 v0.4s, v0.8h, #0
|
|
; CHECK-FP16-GI-NEXT: sshll v2.2d, v1.2s, #0
|
|
; CHECK-FP16-GI-NEXT: sshll2 v1.2d, v1.4s, #0
|
|
; CHECK-FP16-GI-NEXT: sshll v3.2d, v0.2s, #0
|
|
; CHECK-FP16-GI-NEXT: sshll2 v4.2d, v0.4s, #0
|
|
; CHECK-FP16-GI-NEXT: scvtf v0.2d, v2.2d
|
|
; CHECK-FP16-GI-NEXT: scvtf v1.2d, v1.2d
|
|
; CHECK-FP16-GI-NEXT: scvtf v2.2d, v3.2d
|
|
; CHECK-FP16-GI-NEXT: scvtf v3.2d, v4.2d
|
|
; CHECK-FP16-GI-NEXT: ret
|
|
entry:
|
|
%c = sitofp <8 x i8> %a to <8 x double>
|
|
ret <8 x double> %c
|
|
}
|
|
|
|
define <8 x double> @utofp_v8i8_v8f64(<8 x i8> %a) {
|
|
; CHECK-NOFP16-SD-LABEL: utofp_v8i8_v8f64:
|
|
; CHECK-NOFP16-SD: // %bb.0: // %entry
|
|
; CHECK-NOFP16-SD-NEXT: // kill: def $d0 killed $d0 def $q0
|
|
; CHECK-NOFP16-SD-NEXT: mov b2, v0.b[0]
|
|
; CHECK-NOFP16-SD-NEXT: mov b3, v0.b[2]
|
|
; CHECK-NOFP16-SD-NEXT: mov b4, v0.b[4]
|
|
; CHECK-NOFP16-SD-NEXT: mov b5, v0.b[6]
|
|
; CHECK-NOFP16-SD-NEXT: movi d1, #0x0000ff000000ff
|
|
; CHECK-NOFP16-SD-NEXT: mov v2.b[4], v0.b[1]
|
|
; CHECK-NOFP16-SD-NEXT: mov v3.b[4], v0.b[3]
|
|
; CHECK-NOFP16-SD-NEXT: mov v4.b[4], v0.b[5]
|
|
; CHECK-NOFP16-SD-NEXT: mov v5.b[4], v0.b[7]
|
|
; CHECK-NOFP16-SD-NEXT: and v0.8b, v2.8b, v1.8b
|
|
; CHECK-NOFP16-SD-NEXT: and v2.8b, v3.8b, v1.8b
|
|
; CHECK-NOFP16-SD-NEXT: and v3.8b, v4.8b, v1.8b
|
|
; CHECK-NOFP16-SD-NEXT: and v1.8b, v5.8b, v1.8b
|
|
; CHECK-NOFP16-SD-NEXT: ushll v0.2d, v0.2s, #0
|
|
; CHECK-NOFP16-SD-NEXT: ushll v2.2d, v2.2s, #0
|
|
; CHECK-NOFP16-SD-NEXT: ushll v3.2d, v3.2s, #0
|
|
; CHECK-NOFP16-SD-NEXT: ushll v4.2d, v1.2s, #0
|
|
; CHECK-NOFP16-SD-NEXT: ucvtf v0.2d, v0.2d
|
|
; CHECK-NOFP16-SD-NEXT: ucvtf v1.2d, v2.2d
|
|
; CHECK-NOFP16-SD-NEXT: ucvtf v2.2d, v3.2d
|
|
; CHECK-NOFP16-SD-NEXT: ucvtf v3.2d, v4.2d
|
|
; CHECK-NOFP16-SD-NEXT: ret
|
|
;
|
|
; CHECK-FP16-SD-LABEL: utofp_v8i8_v8f64:
|
|
; CHECK-FP16-SD: // %bb.0: // %entry
|
|
; CHECK-FP16-SD-NEXT: // kill: def $d0 killed $d0 def $q0
|
|
; CHECK-FP16-SD-NEXT: mov b2, v0.b[0]
|
|
; CHECK-FP16-SD-NEXT: mov b3, v0.b[2]
|
|
; CHECK-FP16-SD-NEXT: mov b4, v0.b[4]
|
|
; CHECK-FP16-SD-NEXT: mov b5, v0.b[6]
|
|
; CHECK-FP16-SD-NEXT: movi d1, #0x0000ff000000ff
|
|
; CHECK-FP16-SD-NEXT: mov v2.b[4], v0.b[1]
|
|
; CHECK-FP16-SD-NEXT: mov v3.b[4], v0.b[3]
|
|
; CHECK-FP16-SD-NEXT: mov v4.b[4], v0.b[5]
|
|
; CHECK-FP16-SD-NEXT: mov v5.b[4], v0.b[7]
|
|
; CHECK-FP16-SD-NEXT: and v0.8b, v2.8b, v1.8b
|
|
; CHECK-FP16-SD-NEXT: and v2.8b, v3.8b, v1.8b
|
|
; CHECK-FP16-SD-NEXT: and v3.8b, v4.8b, v1.8b
|
|
; CHECK-FP16-SD-NEXT: and v1.8b, v5.8b, v1.8b
|
|
; CHECK-FP16-SD-NEXT: ushll v0.2d, v0.2s, #0
|
|
; CHECK-FP16-SD-NEXT: ushll v2.2d, v2.2s, #0
|
|
; CHECK-FP16-SD-NEXT: ushll v3.2d, v3.2s, #0
|
|
; CHECK-FP16-SD-NEXT: ushll v4.2d, v1.2s, #0
|
|
; CHECK-FP16-SD-NEXT: ucvtf v0.2d, v0.2d
|
|
; CHECK-FP16-SD-NEXT: ucvtf v1.2d, v2.2d
|
|
; CHECK-FP16-SD-NEXT: ucvtf v2.2d, v3.2d
|
|
; CHECK-FP16-SD-NEXT: ucvtf v3.2d, v4.2d
|
|
; CHECK-FP16-SD-NEXT: ret
|
|
;
|
|
; CHECK-NOFP16-GI-LABEL: utofp_v8i8_v8f64:
|
|
; CHECK-NOFP16-GI: // %bb.0: // %entry
|
|
; CHECK-NOFP16-GI-NEXT: ushll v0.8h, v0.8b, #0
|
|
; CHECK-NOFP16-GI-NEXT: ushll v1.4s, v0.4h, #0
|
|
; CHECK-NOFP16-GI-NEXT: ushll2 v0.4s, v0.8h, #0
|
|
; CHECK-NOFP16-GI-NEXT: ushll v2.2d, v1.2s, #0
|
|
; CHECK-NOFP16-GI-NEXT: ushll2 v1.2d, v1.4s, #0
|
|
; CHECK-NOFP16-GI-NEXT: ushll v3.2d, v0.2s, #0
|
|
; CHECK-NOFP16-GI-NEXT: ushll2 v4.2d, v0.4s, #0
|
|
; CHECK-NOFP16-GI-NEXT: ucvtf v0.2d, v2.2d
|
|
; CHECK-NOFP16-GI-NEXT: ucvtf v1.2d, v1.2d
|
|
; CHECK-NOFP16-GI-NEXT: ucvtf v2.2d, v3.2d
|
|
; CHECK-NOFP16-GI-NEXT: ucvtf v3.2d, v4.2d
|
|
; CHECK-NOFP16-GI-NEXT: ret
|
|
;
|
|
; CHECK-FP16-GI-LABEL: utofp_v8i8_v8f64:
|
|
; CHECK-FP16-GI: // %bb.0: // %entry
|
|
; CHECK-FP16-GI-NEXT: ushll v0.8h, v0.8b, #0
|
|
; CHECK-FP16-GI-NEXT: ushll v1.4s, v0.4h, #0
|
|
; CHECK-FP16-GI-NEXT: ushll2 v0.4s, v0.8h, #0
|
|
; CHECK-FP16-GI-NEXT: ushll v2.2d, v1.2s, #0
|
|
; CHECK-FP16-GI-NEXT: ushll2 v1.2d, v1.4s, #0
|
|
; CHECK-FP16-GI-NEXT: ushll v3.2d, v0.2s, #0
|
|
; CHECK-FP16-GI-NEXT: ushll2 v4.2d, v0.4s, #0
|
|
; CHECK-FP16-GI-NEXT: ucvtf v0.2d, v2.2d
|
|
; CHECK-FP16-GI-NEXT: ucvtf v1.2d, v1.2d
|
|
; CHECK-FP16-GI-NEXT: ucvtf v2.2d, v3.2d
|
|
; CHECK-FP16-GI-NEXT: ucvtf v3.2d, v4.2d
|
|
; CHECK-FP16-GI-NEXT: ret
|
|
entry:
|
|
%c = uitofp <8 x i8> %a to <8 x double>
|
|
ret <8 x double> %c
|
|
}
|
|
|
|
define <16 x double> @stofp_v16i8_v16f64(<16 x i8> %a) {
|
|
; CHECK-NOFP16-SD-LABEL: stofp_v16i8_v16f64:
|
|
; CHECK-NOFP16-SD: // %bb.0: // %entry
|
|
; CHECK-NOFP16-SD-NEXT: ext v1.16b, v0.16b, v0.16b, #8
|
|
; CHECK-NOFP16-SD-NEXT: mov b2, v0.b[0]
|
|
; CHECK-NOFP16-SD-NEXT: mov b3, v0.b[2]
|
|
; CHECK-NOFP16-SD-NEXT: mov b4, v0.b[4]
|
|
; CHECK-NOFP16-SD-NEXT: mov b5, v0.b[6]
|
|
; CHECK-NOFP16-SD-NEXT: mov b6, v1.b[0]
|
|
; CHECK-NOFP16-SD-NEXT: mov b7, v1.b[2]
|
|
; CHECK-NOFP16-SD-NEXT: mov b16, v1.b[4]
|
|
; CHECK-NOFP16-SD-NEXT: mov b17, v1.b[6]
|
|
; CHECK-NOFP16-SD-NEXT: mov v2.b[4], v0.b[1]
|
|
; CHECK-NOFP16-SD-NEXT: mov v3.b[4], v0.b[3]
|
|
; CHECK-NOFP16-SD-NEXT: mov v4.b[4], v0.b[5]
|
|
; CHECK-NOFP16-SD-NEXT: mov v5.b[4], v0.b[7]
|
|
; CHECK-NOFP16-SD-NEXT: mov v6.b[4], v1.b[1]
|
|
; CHECK-NOFP16-SD-NEXT: mov v7.b[4], v1.b[3]
|
|
; CHECK-NOFP16-SD-NEXT: mov v16.b[4], v1.b[5]
|
|
; CHECK-NOFP16-SD-NEXT: mov v17.b[4], v1.b[7]
|
|
; CHECK-NOFP16-SD-NEXT: shl v0.2s, v2.2s, #24
|
|
; CHECK-NOFP16-SD-NEXT: shl v1.2s, v3.2s, #24
|
|
; CHECK-NOFP16-SD-NEXT: shl v2.2s, v4.2s, #24
|
|
; CHECK-NOFP16-SD-NEXT: shl v3.2s, v5.2s, #24
|
|
; CHECK-NOFP16-SD-NEXT: shl v4.2s, v6.2s, #24
|
|
; CHECK-NOFP16-SD-NEXT: shl v5.2s, v7.2s, #24
|
|
; CHECK-NOFP16-SD-NEXT: shl v6.2s, v16.2s, #24
|
|
; CHECK-NOFP16-SD-NEXT: shl v7.2s, v17.2s, #24
|
|
; CHECK-NOFP16-SD-NEXT: sshr v0.2s, v0.2s, #24
|
|
; CHECK-NOFP16-SD-NEXT: sshr v1.2s, v1.2s, #24
|
|
; CHECK-NOFP16-SD-NEXT: sshr v2.2s, v2.2s, #24
|
|
; CHECK-NOFP16-SD-NEXT: sshr v3.2s, v3.2s, #24
|
|
; CHECK-NOFP16-SD-NEXT: sshr v4.2s, v4.2s, #24
|
|
; CHECK-NOFP16-SD-NEXT: sshr v5.2s, v5.2s, #24
|
|
; CHECK-NOFP16-SD-NEXT: sshr v6.2s, v6.2s, #24
|
|
; CHECK-NOFP16-SD-NEXT: sshr v7.2s, v7.2s, #24
|
|
; CHECK-NOFP16-SD-NEXT: sshll v0.2d, v0.2s, #0
|
|
; CHECK-NOFP16-SD-NEXT: sshll v1.2d, v1.2s, #0
|
|
; CHECK-NOFP16-SD-NEXT: sshll v2.2d, v2.2s, #0
|
|
; CHECK-NOFP16-SD-NEXT: sshll v3.2d, v3.2s, #0
|
|
; CHECK-NOFP16-SD-NEXT: sshll v4.2d, v4.2s, #0
|
|
; CHECK-NOFP16-SD-NEXT: sshll v5.2d, v5.2s, #0
|
|
; CHECK-NOFP16-SD-NEXT: sshll v6.2d, v6.2s, #0
|
|
; CHECK-NOFP16-SD-NEXT: sshll v7.2d, v7.2s, #0
|
|
; CHECK-NOFP16-SD-NEXT: scvtf v0.2d, v0.2d
|
|
; CHECK-NOFP16-SD-NEXT: scvtf v1.2d, v1.2d
|
|
; CHECK-NOFP16-SD-NEXT: scvtf v2.2d, v2.2d
|
|
; CHECK-NOFP16-SD-NEXT: scvtf v3.2d, v3.2d
|
|
; CHECK-NOFP16-SD-NEXT: scvtf v4.2d, v4.2d
|
|
; CHECK-NOFP16-SD-NEXT: scvtf v5.2d, v5.2d
|
|
; CHECK-NOFP16-SD-NEXT: scvtf v6.2d, v6.2d
|
|
; CHECK-NOFP16-SD-NEXT: scvtf v7.2d, v7.2d
|
|
; CHECK-NOFP16-SD-NEXT: ret
|
|
;
|
|
; CHECK-FP16-SD-LABEL: stofp_v16i8_v16f64:
|
|
; CHECK-FP16-SD: // %bb.0: // %entry
|
|
; CHECK-FP16-SD-NEXT: ext v1.16b, v0.16b, v0.16b, #8
|
|
; CHECK-FP16-SD-NEXT: mov b2, v0.b[0]
|
|
; CHECK-FP16-SD-NEXT: mov b3, v0.b[2]
|
|
; CHECK-FP16-SD-NEXT: mov b4, v0.b[4]
|
|
; CHECK-FP16-SD-NEXT: mov b5, v0.b[6]
|
|
; CHECK-FP16-SD-NEXT: mov b6, v1.b[0]
|
|
; CHECK-FP16-SD-NEXT: mov b7, v1.b[2]
|
|
; CHECK-FP16-SD-NEXT: mov b16, v1.b[4]
|
|
; CHECK-FP16-SD-NEXT: mov b17, v1.b[6]
|
|
; CHECK-FP16-SD-NEXT: mov v2.b[4], v0.b[1]
|
|
; CHECK-FP16-SD-NEXT: mov v3.b[4], v0.b[3]
|
|
; CHECK-FP16-SD-NEXT: mov v4.b[4], v0.b[5]
|
|
; CHECK-FP16-SD-NEXT: mov v5.b[4], v0.b[7]
|
|
; CHECK-FP16-SD-NEXT: mov v6.b[4], v1.b[1]
|
|
; CHECK-FP16-SD-NEXT: mov v7.b[4], v1.b[3]
|
|
; CHECK-FP16-SD-NEXT: mov v16.b[4], v1.b[5]
|
|
; CHECK-FP16-SD-NEXT: mov v17.b[4], v1.b[7]
|
|
; CHECK-FP16-SD-NEXT: shl v0.2s, v2.2s, #24
|
|
; CHECK-FP16-SD-NEXT: shl v1.2s, v3.2s, #24
|
|
; CHECK-FP16-SD-NEXT: shl v2.2s, v4.2s, #24
|
|
; CHECK-FP16-SD-NEXT: shl v3.2s, v5.2s, #24
|
|
; CHECK-FP16-SD-NEXT: shl v4.2s, v6.2s, #24
|
|
; CHECK-FP16-SD-NEXT: shl v5.2s, v7.2s, #24
|
|
; CHECK-FP16-SD-NEXT: shl v6.2s, v16.2s, #24
|
|
; CHECK-FP16-SD-NEXT: shl v7.2s, v17.2s, #24
|
|
; CHECK-FP16-SD-NEXT: sshr v0.2s, v0.2s, #24
|
|
; CHECK-FP16-SD-NEXT: sshr v1.2s, v1.2s, #24
|
|
; CHECK-FP16-SD-NEXT: sshr v2.2s, v2.2s, #24
|
|
; CHECK-FP16-SD-NEXT: sshr v3.2s, v3.2s, #24
|
|
; CHECK-FP16-SD-NEXT: sshr v4.2s, v4.2s, #24
|
|
; CHECK-FP16-SD-NEXT: sshr v5.2s, v5.2s, #24
|
|
; CHECK-FP16-SD-NEXT: sshr v6.2s, v6.2s, #24
|
|
; CHECK-FP16-SD-NEXT: sshr v7.2s, v7.2s, #24
|
|
; CHECK-FP16-SD-NEXT: sshll v0.2d, v0.2s, #0
|
|
; CHECK-FP16-SD-NEXT: sshll v1.2d, v1.2s, #0
|
|
; CHECK-FP16-SD-NEXT: sshll v2.2d, v2.2s, #0
|
|
; CHECK-FP16-SD-NEXT: sshll v3.2d, v3.2s, #0
|
|
; CHECK-FP16-SD-NEXT: sshll v4.2d, v4.2s, #0
|
|
; CHECK-FP16-SD-NEXT: sshll v5.2d, v5.2s, #0
|
|
; CHECK-FP16-SD-NEXT: sshll v6.2d, v6.2s, #0
|
|
; CHECK-FP16-SD-NEXT: sshll v7.2d, v7.2s, #0
|
|
; CHECK-FP16-SD-NEXT: scvtf v0.2d, v0.2d
|
|
; CHECK-FP16-SD-NEXT: scvtf v1.2d, v1.2d
|
|
; CHECK-FP16-SD-NEXT: scvtf v2.2d, v2.2d
|
|
; CHECK-FP16-SD-NEXT: scvtf v3.2d, v3.2d
|
|
; CHECK-FP16-SD-NEXT: scvtf v4.2d, v4.2d
|
|
; CHECK-FP16-SD-NEXT: scvtf v5.2d, v5.2d
|
|
; CHECK-FP16-SD-NEXT: scvtf v6.2d, v6.2d
|
|
; CHECK-FP16-SD-NEXT: scvtf v7.2d, v7.2d
|
|
; CHECK-FP16-SD-NEXT: ret
|
|
;
|
|
; CHECK-NOFP16-GI-LABEL: stofp_v16i8_v16f64:
|
|
; CHECK-NOFP16-GI: // %bb.0: // %entry
|
|
; CHECK-NOFP16-GI-NEXT: sshll v1.8h, v0.8b, #0
|
|
; CHECK-NOFP16-GI-NEXT: sshll2 v0.8h, v0.16b, #0
|
|
; CHECK-NOFP16-GI-NEXT: sshll v2.4s, v1.4h, #0
|
|
; CHECK-NOFP16-GI-NEXT: sshll2 v1.4s, v1.8h, #0
|
|
; CHECK-NOFP16-GI-NEXT: sshll v3.4s, v0.4h, #0
|
|
; CHECK-NOFP16-GI-NEXT: sshll2 v0.4s, v0.8h, #0
|
|
; CHECK-NOFP16-GI-NEXT: sshll v4.2d, v2.2s, #0
|
|
; CHECK-NOFP16-GI-NEXT: sshll2 v2.2d, v2.4s, #0
|
|
; CHECK-NOFP16-GI-NEXT: sshll v5.2d, v1.2s, #0
|
|
; CHECK-NOFP16-GI-NEXT: sshll2 v6.2d, v1.4s, #0
|
|
; CHECK-NOFP16-GI-NEXT: sshll v7.2d, v3.2s, #0
|
|
; CHECK-NOFP16-GI-NEXT: sshll2 v16.2d, v3.4s, #0
|
|
; CHECK-NOFP16-GI-NEXT: sshll v17.2d, v0.2s, #0
|
|
; CHECK-NOFP16-GI-NEXT: sshll2 v18.2d, v0.4s, #0
|
|
; CHECK-NOFP16-GI-NEXT: scvtf v0.2d, v4.2d
|
|
; CHECK-NOFP16-GI-NEXT: scvtf v1.2d, v2.2d
|
|
; CHECK-NOFP16-GI-NEXT: scvtf v2.2d, v5.2d
|
|
; CHECK-NOFP16-GI-NEXT: scvtf v3.2d, v6.2d
|
|
; CHECK-NOFP16-GI-NEXT: scvtf v4.2d, v7.2d
|
|
; CHECK-NOFP16-GI-NEXT: scvtf v5.2d, v16.2d
|
|
; CHECK-NOFP16-GI-NEXT: scvtf v6.2d, v17.2d
|
|
; CHECK-NOFP16-GI-NEXT: scvtf v7.2d, v18.2d
|
|
; CHECK-NOFP16-GI-NEXT: ret
|
|
;
|
|
; CHECK-FP16-GI-LABEL: stofp_v16i8_v16f64:
|
|
; CHECK-FP16-GI: // %bb.0: // %entry
|
|
; CHECK-FP16-GI-NEXT: sshll v1.8h, v0.8b, #0
|
|
; CHECK-FP16-GI-NEXT: sshll2 v0.8h, v0.16b, #0
|
|
; CHECK-FP16-GI-NEXT: sshll v2.4s, v1.4h, #0
|
|
; CHECK-FP16-GI-NEXT: sshll2 v1.4s, v1.8h, #0
|
|
; CHECK-FP16-GI-NEXT: sshll v3.4s, v0.4h, #0
|
|
; CHECK-FP16-GI-NEXT: sshll2 v0.4s, v0.8h, #0
|
|
; CHECK-FP16-GI-NEXT: sshll v4.2d, v2.2s, #0
|
|
; CHECK-FP16-GI-NEXT: sshll2 v2.2d, v2.4s, #0
|
|
; CHECK-FP16-GI-NEXT: sshll v5.2d, v1.2s, #0
|
|
; CHECK-FP16-GI-NEXT: sshll2 v6.2d, v1.4s, #0
|
|
; CHECK-FP16-GI-NEXT: sshll v7.2d, v3.2s, #0
|
|
; CHECK-FP16-GI-NEXT: sshll2 v16.2d, v3.4s, #0
|
|
; CHECK-FP16-GI-NEXT: sshll v17.2d, v0.2s, #0
|
|
; CHECK-FP16-GI-NEXT: sshll2 v18.2d, v0.4s, #0
|
|
; CHECK-FP16-GI-NEXT: scvtf v0.2d, v4.2d
|
|
; CHECK-FP16-GI-NEXT: scvtf v1.2d, v2.2d
|
|
; CHECK-FP16-GI-NEXT: scvtf v2.2d, v5.2d
|
|
; CHECK-FP16-GI-NEXT: scvtf v3.2d, v6.2d
|
|
; CHECK-FP16-GI-NEXT: scvtf v4.2d, v7.2d
|
|
; CHECK-FP16-GI-NEXT: scvtf v5.2d, v16.2d
|
|
; CHECK-FP16-GI-NEXT: scvtf v6.2d, v17.2d
|
|
; CHECK-FP16-GI-NEXT: scvtf v7.2d, v18.2d
|
|
; CHECK-FP16-GI-NEXT: ret
|
|
entry:
|
|
%c = sitofp <16 x i8> %a to <16 x double>
|
|
ret <16 x double> %c
|
|
}
|
|
|
|
define <16 x double> @utofp_v16i8_v16f64(<16 x i8> %a) {
|
|
; CHECK-NOFP16-SD-LABEL: utofp_v16i8_v16f64:
|
|
; CHECK-NOFP16-SD: // %bb.0: // %entry
|
|
; CHECK-NOFP16-SD-NEXT: ext v2.16b, v0.16b, v0.16b, #8
|
|
; CHECK-NOFP16-SD-NEXT: mov b3, v0.b[0]
|
|
; CHECK-NOFP16-SD-NEXT: mov b4, v0.b[2]
|
|
; CHECK-NOFP16-SD-NEXT: mov b5, v0.b[4]
|
|
; CHECK-NOFP16-SD-NEXT: mov b6, v0.b[6]
|
|
; CHECK-NOFP16-SD-NEXT: movi d1, #0x0000ff000000ff
|
|
; CHECK-NOFP16-SD-NEXT: mov b7, v2.b[0]
|
|
; CHECK-NOFP16-SD-NEXT: mov b16, v2.b[2]
|
|
; CHECK-NOFP16-SD-NEXT: mov b17, v2.b[4]
|
|
; CHECK-NOFP16-SD-NEXT: mov b18, v2.b[6]
|
|
; CHECK-NOFP16-SD-NEXT: mov v3.b[4], v0.b[1]
|
|
; CHECK-NOFP16-SD-NEXT: mov v4.b[4], v0.b[3]
|
|
; CHECK-NOFP16-SD-NEXT: mov v5.b[4], v0.b[5]
|
|
; CHECK-NOFP16-SD-NEXT: mov v6.b[4], v0.b[7]
|
|
; CHECK-NOFP16-SD-NEXT: mov v7.b[4], v2.b[1]
|
|
; CHECK-NOFP16-SD-NEXT: mov v16.b[4], v2.b[3]
|
|
; CHECK-NOFP16-SD-NEXT: mov v17.b[4], v2.b[5]
|
|
; CHECK-NOFP16-SD-NEXT: mov v18.b[4], v2.b[7]
|
|
; CHECK-NOFP16-SD-NEXT: and v0.8b, v3.8b, v1.8b
|
|
; CHECK-NOFP16-SD-NEXT: and v2.8b, v4.8b, v1.8b
|
|
; CHECK-NOFP16-SD-NEXT: and v3.8b, v5.8b, v1.8b
|
|
; CHECK-NOFP16-SD-NEXT: and v4.8b, v6.8b, v1.8b
|
|
; CHECK-NOFP16-SD-NEXT: and v5.8b, v7.8b, v1.8b
|
|
; CHECK-NOFP16-SD-NEXT: and v6.8b, v16.8b, v1.8b
|
|
; CHECK-NOFP16-SD-NEXT: and v7.8b, v17.8b, v1.8b
|
|
; CHECK-NOFP16-SD-NEXT: and v1.8b, v18.8b, v1.8b
|
|
; CHECK-NOFP16-SD-NEXT: ushll v0.2d, v0.2s, #0
|
|
; CHECK-NOFP16-SD-NEXT: ushll v2.2d, v2.2s, #0
|
|
; CHECK-NOFP16-SD-NEXT: ushll v3.2d, v3.2s, #0
|
|
; CHECK-NOFP16-SD-NEXT: ushll v4.2d, v4.2s, #0
|
|
; CHECK-NOFP16-SD-NEXT: ushll v5.2d, v5.2s, #0
|
|
; CHECK-NOFP16-SD-NEXT: ushll v6.2d, v6.2s, #0
|
|
; CHECK-NOFP16-SD-NEXT: ushll v7.2d, v7.2s, #0
|
|
; CHECK-NOFP16-SD-NEXT: ushll v16.2d, v1.2s, #0
|
|
; CHECK-NOFP16-SD-NEXT: ucvtf v0.2d, v0.2d
|
|
; CHECK-NOFP16-SD-NEXT: ucvtf v1.2d, v2.2d
|
|
; CHECK-NOFP16-SD-NEXT: ucvtf v2.2d, v3.2d
|
|
; CHECK-NOFP16-SD-NEXT: ucvtf v3.2d, v4.2d
|
|
; CHECK-NOFP16-SD-NEXT: ucvtf v4.2d, v5.2d
|
|
; CHECK-NOFP16-SD-NEXT: ucvtf v5.2d, v6.2d
|
|
; CHECK-NOFP16-SD-NEXT: ucvtf v6.2d, v7.2d
|
|
; CHECK-NOFP16-SD-NEXT: ucvtf v7.2d, v16.2d
|
|
; CHECK-NOFP16-SD-NEXT: ret
|
|
;
|
|
; CHECK-FP16-SD-LABEL: utofp_v16i8_v16f64:
|
|
; CHECK-FP16-SD: // %bb.0: // %entry
|
|
; CHECK-FP16-SD-NEXT: ext v2.16b, v0.16b, v0.16b, #8
|
|
; CHECK-FP16-SD-NEXT: mov b3, v0.b[0]
|
|
; CHECK-FP16-SD-NEXT: mov b4, v0.b[2]
|
|
; CHECK-FP16-SD-NEXT: mov b5, v0.b[4]
|
|
; CHECK-FP16-SD-NEXT: mov b6, v0.b[6]
|
|
; CHECK-FP16-SD-NEXT: movi d1, #0x0000ff000000ff
|
|
; CHECK-FP16-SD-NEXT: mov b7, v2.b[0]
|
|
; CHECK-FP16-SD-NEXT: mov b16, v2.b[2]
|
|
; CHECK-FP16-SD-NEXT: mov b17, v2.b[4]
|
|
; CHECK-FP16-SD-NEXT: mov b18, v2.b[6]
|
|
; CHECK-FP16-SD-NEXT: mov v3.b[4], v0.b[1]
|
|
; CHECK-FP16-SD-NEXT: mov v4.b[4], v0.b[3]
|
|
; CHECK-FP16-SD-NEXT: mov v5.b[4], v0.b[5]
|
|
; CHECK-FP16-SD-NEXT: mov v6.b[4], v0.b[7]
|
|
; CHECK-FP16-SD-NEXT: mov v7.b[4], v2.b[1]
|
|
; CHECK-FP16-SD-NEXT: mov v16.b[4], v2.b[3]
|
|
; CHECK-FP16-SD-NEXT: mov v17.b[4], v2.b[5]
|
|
; CHECK-FP16-SD-NEXT: mov v18.b[4], v2.b[7]
|
|
; CHECK-FP16-SD-NEXT: and v0.8b, v3.8b, v1.8b
|
|
; CHECK-FP16-SD-NEXT: and v2.8b, v4.8b, v1.8b
|
|
; CHECK-FP16-SD-NEXT: and v3.8b, v5.8b, v1.8b
|
|
; CHECK-FP16-SD-NEXT: and v4.8b, v6.8b, v1.8b
|
|
; CHECK-FP16-SD-NEXT: and v5.8b, v7.8b, v1.8b
|
|
; CHECK-FP16-SD-NEXT: and v6.8b, v16.8b, v1.8b
|
|
; CHECK-FP16-SD-NEXT: and v7.8b, v17.8b, v1.8b
|
|
; CHECK-FP16-SD-NEXT: and v1.8b, v18.8b, v1.8b
|
|
; CHECK-FP16-SD-NEXT: ushll v0.2d, v0.2s, #0
|
|
; CHECK-FP16-SD-NEXT: ushll v2.2d, v2.2s, #0
|
|
; CHECK-FP16-SD-NEXT: ushll v3.2d, v3.2s, #0
|
|
; CHECK-FP16-SD-NEXT: ushll v4.2d, v4.2s, #0
|
|
; CHECK-FP16-SD-NEXT: ushll v5.2d, v5.2s, #0
|
|
; CHECK-FP16-SD-NEXT: ushll v6.2d, v6.2s, #0
|
|
; CHECK-FP16-SD-NEXT: ushll v7.2d, v7.2s, #0
|
|
; CHECK-FP16-SD-NEXT: ushll v16.2d, v1.2s, #0
|
|
; CHECK-FP16-SD-NEXT: ucvtf v0.2d, v0.2d
|
|
; CHECK-FP16-SD-NEXT: ucvtf v1.2d, v2.2d
|
|
; CHECK-FP16-SD-NEXT: ucvtf v2.2d, v3.2d
|
|
; CHECK-FP16-SD-NEXT: ucvtf v3.2d, v4.2d
|
|
; CHECK-FP16-SD-NEXT: ucvtf v4.2d, v5.2d
|
|
; CHECK-FP16-SD-NEXT: ucvtf v5.2d, v6.2d
|
|
; CHECK-FP16-SD-NEXT: ucvtf v6.2d, v7.2d
|
|
; CHECK-FP16-SD-NEXT: ucvtf v7.2d, v16.2d
|
|
; CHECK-FP16-SD-NEXT: ret
|
|
;
|
|
; CHECK-NOFP16-GI-LABEL: utofp_v16i8_v16f64:
|
|
; CHECK-NOFP16-GI: // %bb.0: // %entry
|
|
; CHECK-NOFP16-GI-NEXT: ushll v1.8h, v0.8b, #0
|
|
; CHECK-NOFP16-GI-NEXT: ushll2 v0.8h, v0.16b, #0
|
|
; CHECK-NOFP16-GI-NEXT: ushll v2.4s, v1.4h, #0
|
|
; CHECK-NOFP16-GI-NEXT: ushll2 v1.4s, v1.8h, #0
|
|
; CHECK-NOFP16-GI-NEXT: ushll v3.4s, v0.4h, #0
|
|
; CHECK-NOFP16-GI-NEXT: ushll2 v0.4s, v0.8h, #0
|
|
; CHECK-NOFP16-GI-NEXT: ushll v4.2d, v2.2s, #0
|
|
; CHECK-NOFP16-GI-NEXT: ushll2 v2.2d, v2.4s, #0
|
|
; CHECK-NOFP16-GI-NEXT: ushll v5.2d, v1.2s, #0
|
|
; CHECK-NOFP16-GI-NEXT: ushll2 v6.2d, v1.4s, #0
|
|
; CHECK-NOFP16-GI-NEXT: ushll v7.2d, v3.2s, #0
|
|
; CHECK-NOFP16-GI-NEXT: ushll2 v16.2d, v3.4s, #0
|
|
; CHECK-NOFP16-GI-NEXT: ushll v17.2d, v0.2s, #0
|
|
; CHECK-NOFP16-GI-NEXT: ushll2 v18.2d, v0.4s, #0
|
|
; CHECK-NOFP16-GI-NEXT: ucvtf v0.2d, v4.2d
|
|
; CHECK-NOFP16-GI-NEXT: ucvtf v1.2d, v2.2d
|
|
; CHECK-NOFP16-GI-NEXT: ucvtf v2.2d, v5.2d
|
|
; CHECK-NOFP16-GI-NEXT: ucvtf v3.2d, v6.2d
|
|
; CHECK-NOFP16-GI-NEXT: ucvtf v4.2d, v7.2d
|
|
; CHECK-NOFP16-GI-NEXT: ucvtf v5.2d, v16.2d
|
|
; CHECK-NOFP16-GI-NEXT: ucvtf v6.2d, v17.2d
|
|
; CHECK-NOFP16-GI-NEXT: ucvtf v7.2d, v18.2d
|
|
; CHECK-NOFP16-GI-NEXT: ret
|
|
;
|
|
; CHECK-FP16-GI-LABEL: utofp_v16i8_v16f64:
|
|
; CHECK-FP16-GI: // %bb.0: // %entry
|
|
; CHECK-FP16-GI-NEXT: ushll v1.8h, v0.8b, #0
|
|
; CHECK-FP16-GI-NEXT: ushll2 v0.8h, v0.16b, #0
|
|
; CHECK-FP16-GI-NEXT: ushll v2.4s, v1.4h, #0
|
|
; CHECK-FP16-GI-NEXT: ushll2 v1.4s, v1.8h, #0
|
|
; CHECK-FP16-GI-NEXT: ushll v3.4s, v0.4h, #0
|
|
; CHECK-FP16-GI-NEXT: ushll2 v0.4s, v0.8h, #0
|
|
; CHECK-FP16-GI-NEXT: ushll v4.2d, v2.2s, #0
|
|
; CHECK-FP16-GI-NEXT: ushll2 v2.2d, v2.4s, #0
|
|
; CHECK-FP16-GI-NEXT: ushll v5.2d, v1.2s, #0
|
|
; CHECK-FP16-GI-NEXT: ushll2 v6.2d, v1.4s, #0
|
|
; CHECK-FP16-GI-NEXT: ushll v7.2d, v3.2s, #0
|
|
; CHECK-FP16-GI-NEXT: ushll2 v16.2d, v3.4s, #0
|
|
; CHECK-FP16-GI-NEXT: ushll v17.2d, v0.2s, #0
|
|
; CHECK-FP16-GI-NEXT: ushll2 v18.2d, v0.4s, #0
|
|
; CHECK-FP16-GI-NEXT: ucvtf v0.2d, v4.2d
|
|
; CHECK-FP16-GI-NEXT: ucvtf v1.2d, v2.2d
|
|
; CHECK-FP16-GI-NEXT: ucvtf v2.2d, v5.2d
|
|
; CHECK-FP16-GI-NEXT: ucvtf v3.2d, v6.2d
|
|
; CHECK-FP16-GI-NEXT: ucvtf v4.2d, v7.2d
|
|
; CHECK-FP16-GI-NEXT: ucvtf v5.2d, v16.2d
|
|
; CHECK-FP16-GI-NEXT: ucvtf v6.2d, v17.2d
|
|
; CHECK-FP16-GI-NEXT: ucvtf v7.2d, v18.2d
|
|
; CHECK-FP16-GI-NEXT: ret
|
|
entry:
|
|
%c = uitofp <16 x i8> %a to <16 x double>
|
|
ret <16 x double> %c
|
|
}
|
|
|
|
define <32 x double> @stofp_v32i8_v32f64(<32 x i8> %a) {
|
|
; CHECK-NOFP16-SD-LABEL: stofp_v32i8_v32f64:
|
|
; CHECK-NOFP16-SD: // %bb.0: // %entry
|
|
; CHECK-NOFP16-SD-NEXT: ext v3.16b, v0.16b, v0.16b, #8
|
|
; CHECK-NOFP16-SD-NEXT: mov b5, v1.b[6]
|
|
; CHECK-NOFP16-SD-NEXT: mov b17, v1.b[4]
|
|
; CHECK-NOFP16-SD-NEXT: mov b20, v1.b[2]
|
|
; CHECK-NOFP16-SD-NEXT: mov b21, v1.b[0]
|
|
; CHECK-NOFP16-SD-NEXT: mov b18, v0.b[0]
|
|
; CHECK-NOFP16-SD-NEXT: mov b19, v0.b[6]
|
|
; CHECK-NOFP16-SD-NEXT: mov b22, v0.b[4]
|
|
; CHECK-NOFP16-SD-NEXT: ext v16.16b, v1.16b, v1.16b, #8
|
|
; CHECK-NOFP16-SD-NEXT: mov b2, v3.b[0]
|
|
; CHECK-NOFP16-SD-NEXT: mov b4, v3.b[2]
|
|
; CHECK-NOFP16-SD-NEXT: mov b6, v3.b[4]
|
|
; CHECK-NOFP16-SD-NEXT: mov b7, v3.b[6]
|
|
; CHECK-NOFP16-SD-NEXT: mov v5.b[4], v1.b[7]
|
|
; CHECK-NOFP16-SD-NEXT: mov v17.b[4], v1.b[5]
|
|
; CHECK-NOFP16-SD-NEXT: mov v20.b[4], v1.b[3]
|
|
; CHECK-NOFP16-SD-NEXT: mov v21.b[4], v1.b[1]
|
|
; CHECK-NOFP16-SD-NEXT: mov v19.b[4], v0.b[7]
|
|
; CHECK-NOFP16-SD-NEXT: mov v22.b[4], v0.b[5]
|
|
; CHECK-NOFP16-SD-NEXT: mov v18.b[4], v0.b[1]
|
|
; CHECK-NOFP16-SD-NEXT: mov b23, v16.b[0]
|
|
; CHECK-NOFP16-SD-NEXT: mov v2.b[4], v3.b[1]
|
|
; CHECK-NOFP16-SD-NEXT: mov v4.b[4], v3.b[3]
|
|
; CHECK-NOFP16-SD-NEXT: mov v6.b[4], v3.b[5]
|
|
; CHECK-NOFP16-SD-NEXT: mov v7.b[4], v3.b[7]
|
|
; CHECK-NOFP16-SD-NEXT: mov b3, v0.b[2]
|
|
; CHECK-NOFP16-SD-NEXT: shl v5.2s, v5.2s, #24
|
|
; CHECK-NOFP16-SD-NEXT: shl v17.2s, v17.2s, #24
|
|
; CHECK-NOFP16-SD-NEXT: shl v20.2s, v20.2s, #24
|
|
; CHECK-NOFP16-SD-NEXT: mov b24, v16.b[4]
|
|
; CHECK-NOFP16-SD-NEXT: mov v23.b[4], v16.b[1]
|
|
; CHECK-NOFP16-SD-NEXT: shl v18.2s, v18.2s, #24
|
|
; CHECK-NOFP16-SD-NEXT: shl v19.2s, v19.2s, #24
|
|
; CHECK-NOFP16-SD-NEXT: sshr v5.2s, v5.2s, #24
|
|
; CHECK-NOFP16-SD-NEXT: shl v1.2s, v2.2s, #24
|
|
; CHECK-NOFP16-SD-NEXT: shl v2.2s, v4.2s, #24
|
|
; CHECK-NOFP16-SD-NEXT: sshr v17.2s, v17.2s, #24
|
|
; CHECK-NOFP16-SD-NEXT: mov v3.b[4], v0.b[3]
|
|
; CHECK-NOFP16-SD-NEXT: shl v0.2s, v21.2s, #24
|
|
; CHECK-NOFP16-SD-NEXT: shl v4.2s, v6.2s, #24
|
|
; CHECK-NOFP16-SD-NEXT: shl v6.2s, v7.2s, #24
|
|
; CHECK-NOFP16-SD-NEXT: mov b7, v16.b[2]
|
|
; CHECK-NOFP16-SD-NEXT: sshll v5.2d, v5.2s, #0
|
|
; CHECK-NOFP16-SD-NEXT: sshr v20.2s, v20.2s, #24
|
|
; CHECK-NOFP16-SD-NEXT: mov b21, v16.b[6]
|
|
; CHECK-NOFP16-SD-NEXT: sshll v17.2d, v17.2s, #0
|
|
; CHECK-NOFP16-SD-NEXT: sshr v0.2s, v0.2s, #24
|
|
; CHECK-NOFP16-SD-NEXT: shl v22.2s, v22.2s, #24
|
|
; CHECK-NOFP16-SD-NEXT: shl v3.2s, v3.2s, #24
|
|
; CHECK-NOFP16-SD-NEXT: mov v24.b[4], v16.b[5]
|
|
; CHECK-NOFP16-SD-NEXT: sshr v19.2s, v19.2s, #24
|
|
; CHECK-NOFP16-SD-NEXT: scvtf v5.2d, v5.2d
|
|
; CHECK-NOFP16-SD-NEXT: mov v7.b[4], v16.b[3]
|
|
; CHECK-NOFP16-SD-NEXT: sshll v20.2d, v20.2s, #0
|
|
; CHECK-NOFP16-SD-NEXT: scvtf v17.2d, v17.2d
|
|
; CHECK-NOFP16-SD-NEXT: sshll v0.2d, v0.2s, #0
|
|
; CHECK-NOFP16-SD-NEXT: mov v21.b[4], v16.b[7]
|
|
; CHECK-NOFP16-SD-NEXT: sshr v3.2s, v3.2s, #24
|
|
; CHECK-NOFP16-SD-NEXT: sshr v16.2s, v22.2s, #24
|
|
; CHECK-NOFP16-SD-NEXT: sshll v19.2d, v19.2s, #0
|
|
; CHECK-NOFP16-SD-NEXT: scvtf v20.2d, v20.2d
|
|
; CHECK-NOFP16-SD-NEXT: shl v22.2s, v24.2s, #24
|
|
; CHECK-NOFP16-SD-NEXT: sshr v6.2s, v6.2s, #24
|
|
; CHECK-NOFP16-SD-NEXT: scvtf v0.2d, v0.2d
|
|
; CHECK-NOFP16-SD-NEXT: shl v7.2s, v7.2s, #24
|
|
; CHECK-NOFP16-SD-NEXT: sshr v4.2s, v4.2s, #24
|
|
; CHECK-NOFP16-SD-NEXT: stp q17, q5, [x8, #160]
|
|
; CHECK-NOFP16-SD-NEXT: sshr v5.2s, v18.2s, #24
|
|
; CHECK-NOFP16-SD-NEXT: shl v17.2s, v23.2s, #24
|
|
; CHECK-NOFP16-SD-NEXT: sshll v3.2d, v3.2s, #0
|
|
; CHECK-NOFP16-SD-NEXT: sshll v16.2d, v16.2s, #0
|
|
; CHECK-NOFP16-SD-NEXT: shl v21.2s, v21.2s, #24
|
|
; CHECK-NOFP16-SD-NEXT: scvtf v19.2d, v19.2d
|
|
; CHECK-NOFP16-SD-NEXT: sshr v2.2s, v2.2s, #24
|
|
; CHECK-NOFP16-SD-NEXT: sshr v1.2s, v1.2s, #24
|
|
; CHECK-NOFP16-SD-NEXT: stp q0, q20, [x8, #128]
|
|
; CHECK-NOFP16-SD-NEXT: sshll v5.2d, v5.2s, #0
|
|
; CHECK-NOFP16-SD-NEXT: sshr v0.2s, v7.2s, #24
|
|
; CHECK-NOFP16-SD-NEXT: sshr v7.2s, v17.2s, #24
|
|
; CHECK-NOFP16-SD-NEXT: scvtf v3.2d, v3.2d
|
|
; CHECK-NOFP16-SD-NEXT: scvtf v16.2d, v16.2d
|
|
; CHECK-NOFP16-SD-NEXT: sshr v18.2s, v21.2s, #24
|
|
; CHECK-NOFP16-SD-NEXT: sshr v20.2s, v22.2s, #24
|
|
; CHECK-NOFP16-SD-NEXT: sshll v6.2d, v6.2s, #0
|
|
; CHECK-NOFP16-SD-NEXT: scvtf v5.2d, v5.2d
|
|
; CHECK-NOFP16-SD-NEXT: sshll v0.2d, v0.2s, #0
|
|
; CHECK-NOFP16-SD-NEXT: sshll v4.2d, v4.2s, #0
|
|
; CHECK-NOFP16-SD-NEXT: sshll v7.2d, v7.2s, #0
|
|
; CHECK-NOFP16-SD-NEXT: sshll v2.2d, v2.2s, #0
|
|
; CHECK-NOFP16-SD-NEXT: sshll v1.2d, v1.2s, #0
|
|
; CHECK-NOFP16-SD-NEXT: stp q16, q19, [x8, #32]
|
|
; CHECK-NOFP16-SD-NEXT: sshll v17.2d, v18.2s, #0
|
|
; CHECK-NOFP16-SD-NEXT: sshll v16.2d, v20.2s, #0
|
|
; CHECK-NOFP16-SD-NEXT: scvtf v0.2d, v0.2d
|
|
; CHECK-NOFP16-SD-NEXT: scvtf v4.2d, v4.2d
|
|
; CHECK-NOFP16-SD-NEXT: stp q5, q3, [x8]
|
|
; CHECK-NOFP16-SD-NEXT: scvtf v3.2d, v7.2d
|
|
; CHECK-NOFP16-SD-NEXT: scvtf v5.2d, v6.2d
|
|
; CHECK-NOFP16-SD-NEXT: scvtf v17.2d, v17.2d
|
|
; CHECK-NOFP16-SD-NEXT: scvtf v16.2d, v16.2d
|
|
; CHECK-NOFP16-SD-NEXT: scvtf v2.2d, v2.2d
|
|
; CHECK-NOFP16-SD-NEXT: stp q4, q5, [x8, #96]
|
|
; CHECK-NOFP16-SD-NEXT: stp q3, q0, [x8, #192]
|
|
; CHECK-NOFP16-SD-NEXT: scvtf v0.2d, v1.2d
|
|
; CHECK-NOFP16-SD-NEXT: stp q16, q17, [x8, #224]
|
|
; CHECK-NOFP16-SD-NEXT: stp q0, q2, [x8, #64]
|
|
; CHECK-NOFP16-SD-NEXT: ret
|
|
;
|
|
; CHECK-FP16-SD-LABEL: stofp_v32i8_v32f64:
|
|
; CHECK-FP16-SD: // %bb.0: // %entry
|
|
; CHECK-FP16-SD-NEXT: ext v3.16b, v0.16b, v0.16b, #8
|
|
; CHECK-FP16-SD-NEXT: mov b5, v1.b[6]
|
|
; CHECK-FP16-SD-NEXT: mov b17, v1.b[4]
|
|
; CHECK-FP16-SD-NEXT: mov b20, v1.b[2]
|
|
; CHECK-FP16-SD-NEXT: mov b21, v1.b[0]
|
|
; CHECK-FP16-SD-NEXT: mov b18, v0.b[0]
|
|
; CHECK-FP16-SD-NEXT: mov b19, v0.b[6]
|
|
; CHECK-FP16-SD-NEXT: mov b22, v0.b[4]
|
|
; CHECK-FP16-SD-NEXT: ext v16.16b, v1.16b, v1.16b, #8
|
|
; CHECK-FP16-SD-NEXT: mov b2, v3.b[0]
|
|
; CHECK-FP16-SD-NEXT: mov b4, v3.b[2]
|
|
; CHECK-FP16-SD-NEXT: mov b6, v3.b[4]
|
|
; CHECK-FP16-SD-NEXT: mov b7, v3.b[6]
|
|
; CHECK-FP16-SD-NEXT: mov v5.b[4], v1.b[7]
|
|
; CHECK-FP16-SD-NEXT: mov v17.b[4], v1.b[5]
|
|
; CHECK-FP16-SD-NEXT: mov v20.b[4], v1.b[3]
|
|
; CHECK-FP16-SD-NEXT: mov v21.b[4], v1.b[1]
|
|
; CHECK-FP16-SD-NEXT: mov v19.b[4], v0.b[7]
|
|
; CHECK-FP16-SD-NEXT: mov v22.b[4], v0.b[5]
|
|
; CHECK-FP16-SD-NEXT: mov v18.b[4], v0.b[1]
|
|
; CHECK-FP16-SD-NEXT: mov b23, v16.b[0]
|
|
; CHECK-FP16-SD-NEXT: mov v2.b[4], v3.b[1]
|
|
; CHECK-FP16-SD-NEXT: mov v4.b[4], v3.b[3]
|
|
; CHECK-FP16-SD-NEXT: mov v6.b[4], v3.b[5]
|
|
; CHECK-FP16-SD-NEXT: mov v7.b[4], v3.b[7]
|
|
; CHECK-FP16-SD-NEXT: mov b3, v0.b[2]
|
|
; CHECK-FP16-SD-NEXT: shl v5.2s, v5.2s, #24
|
|
; CHECK-FP16-SD-NEXT: shl v17.2s, v17.2s, #24
|
|
; CHECK-FP16-SD-NEXT: shl v20.2s, v20.2s, #24
|
|
; CHECK-FP16-SD-NEXT: mov b24, v16.b[4]
|
|
; CHECK-FP16-SD-NEXT: mov v23.b[4], v16.b[1]
|
|
; CHECK-FP16-SD-NEXT: shl v18.2s, v18.2s, #24
|
|
; CHECK-FP16-SD-NEXT: shl v19.2s, v19.2s, #24
|
|
; CHECK-FP16-SD-NEXT: sshr v5.2s, v5.2s, #24
|
|
; CHECK-FP16-SD-NEXT: shl v1.2s, v2.2s, #24
|
|
; CHECK-FP16-SD-NEXT: shl v2.2s, v4.2s, #24
|
|
; CHECK-FP16-SD-NEXT: sshr v17.2s, v17.2s, #24
|
|
; CHECK-FP16-SD-NEXT: mov v3.b[4], v0.b[3]
|
|
; CHECK-FP16-SD-NEXT: shl v0.2s, v21.2s, #24
|
|
; CHECK-FP16-SD-NEXT: shl v4.2s, v6.2s, #24
|
|
; CHECK-FP16-SD-NEXT: shl v6.2s, v7.2s, #24
|
|
; CHECK-FP16-SD-NEXT: mov b7, v16.b[2]
|
|
; CHECK-FP16-SD-NEXT: sshll v5.2d, v5.2s, #0
|
|
; CHECK-FP16-SD-NEXT: sshr v20.2s, v20.2s, #24
|
|
; CHECK-FP16-SD-NEXT: mov b21, v16.b[6]
|
|
; CHECK-FP16-SD-NEXT: sshll v17.2d, v17.2s, #0
|
|
; CHECK-FP16-SD-NEXT: sshr v0.2s, v0.2s, #24
|
|
; CHECK-FP16-SD-NEXT: shl v22.2s, v22.2s, #24
|
|
; CHECK-FP16-SD-NEXT: shl v3.2s, v3.2s, #24
|
|
; CHECK-FP16-SD-NEXT: mov v24.b[4], v16.b[5]
|
|
; CHECK-FP16-SD-NEXT: sshr v19.2s, v19.2s, #24
|
|
; CHECK-FP16-SD-NEXT: scvtf v5.2d, v5.2d
|
|
; CHECK-FP16-SD-NEXT: mov v7.b[4], v16.b[3]
|
|
; CHECK-FP16-SD-NEXT: sshll v20.2d, v20.2s, #0
|
|
; CHECK-FP16-SD-NEXT: scvtf v17.2d, v17.2d
|
|
; CHECK-FP16-SD-NEXT: sshll v0.2d, v0.2s, #0
|
|
; CHECK-FP16-SD-NEXT: mov v21.b[4], v16.b[7]
|
|
; CHECK-FP16-SD-NEXT: sshr v3.2s, v3.2s, #24
|
|
; CHECK-FP16-SD-NEXT: sshr v16.2s, v22.2s, #24
|
|
; CHECK-FP16-SD-NEXT: sshll v19.2d, v19.2s, #0
|
|
; CHECK-FP16-SD-NEXT: scvtf v20.2d, v20.2d
|
|
; CHECK-FP16-SD-NEXT: shl v22.2s, v24.2s, #24
|
|
; CHECK-FP16-SD-NEXT: sshr v6.2s, v6.2s, #24
|
|
; CHECK-FP16-SD-NEXT: scvtf v0.2d, v0.2d
|
|
; CHECK-FP16-SD-NEXT: shl v7.2s, v7.2s, #24
|
|
; CHECK-FP16-SD-NEXT: sshr v4.2s, v4.2s, #24
|
|
; CHECK-FP16-SD-NEXT: stp q17, q5, [x8, #160]
|
|
; CHECK-FP16-SD-NEXT: sshr v5.2s, v18.2s, #24
|
|
; CHECK-FP16-SD-NEXT: shl v17.2s, v23.2s, #24
|
|
; CHECK-FP16-SD-NEXT: sshll v3.2d, v3.2s, #0
|
|
; CHECK-FP16-SD-NEXT: sshll v16.2d, v16.2s, #0
|
|
; CHECK-FP16-SD-NEXT: shl v21.2s, v21.2s, #24
|
|
; CHECK-FP16-SD-NEXT: scvtf v19.2d, v19.2d
|
|
; CHECK-FP16-SD-NEXT: sshr v2.2s, v2.2s, #24
|
|
; CHECK-FP16-SD-NEXT: sshr v1.2s, v1.2s, #24
|
|
; CHECK-FP16-SD-NEXT: stp q0, q20, [x8, #128]
|
|
; CHECK-FP16-SD-NEXT: sshll v5.2d, v5.2s, #0
|
|
; CHECK-FP16-SD-NEXT: sshr v0.2s, v7.2s, #24
|
|
; CHECK-FP16-SD-NEXT: sshr v7.2s, v17.2s, #24
|
|
; CHECK-FP16-SD-NEXT: scvtf v3.2d, v3.2d
|
|
; CHECK-FP16-SD-NEXT: scvtf v16.2d, v16.2d
|
|
; CHECK-FP16-SD-NEXT: sshr v18.2s, v21.2s, #24
|
|
; CHECK-FP16-SD-NEXT: sshr v20.2s, v22.2s, #24
|
|
; CHECK-FP16-SD-NEXT: sshll v6.2d, v6.2s, #0
|
|
; CHECK-FP16-SD-NEXT: scvtf v5.2d, v5.2d
|
|
; CHECK-FP16-SD-NEXT: sshll v0.2d, v0.2s, #0
|
|
; CHECK-FP16-SD-NEXT: sshll v4.2d, v4.2s, #0
|
|
; CHECK-FP16-SD-NEXT: sshll v7.2d, v7.2s, #0
|
|
; CHECK-FP16-SD-NEXT: sshll v2.2d, v2.2s, #0
|
|
; CHECK-FP16-SD-NEXT: sshll v1.2d, v1.2s, #0
|
|
; CHECK-FP16-SD-NEXT: stp q16, q19, [x8, #32]
|
|
; CHECK-FP16-SD-NEXT: sshll v17.2d, v18.2s, #0
|
|
; CHECK-FP16-SD-NEXT: sshll v16.2d, v20.2s, #0
|
|
; CHECK-FP16-SD-NEXT: scvtf v0.2d, v0.2d
|
|
; CHECK-FP16-SD-NEXT: scvtf v4.2d, v4.2d
|
|
; CHECK-FP16-SD-NEXT: stp q5, q3, [x8]
|
|
; CHECK-FP16-SD-NEXT: scvtf v3.2d, v7.2d
|
|
; CHECK-FP16-SD-NEXT: scvtf v5.2d, v6.2d
|
|
; CHECK-FP16-SD-NEXT: scvtf v17.2d, v17.2d
|
|
; CHECK-FP16-SD-NEXT: scvtf v16.2d, v16.2d
|
|
; CHECK-FP16-SD-NEXT: scvtf v2.2d, v2.2d
|
|
; CHECK-FP16-SD-NEXT: stp q4, q5, [x8, #96]
|
|
; CHECK-FP16-SD-NEXT: stp q3, q0, [x8, #192]
|
|
; CHECK-FP16-SD-NEXT: scvtf v0.2d, v1.2d
|
|
; CHECK-FP16-SD-NEXT: stp q16, q17, [x8, #224]
|
|
; CHECK-FP16-SD-NEXT: stp q0, q2, [x8, #64]
|
|
; CHECK-FP16-SD-NEXT: ret
|
|
;
|
|
; CHECK-NOFP16-GI-LABEL: stofp_v32i8_v32f64:
|
|
; CHECK-NOFP16-GI: // %bb.0: // %entry
|
|
; CHECK-NOFP16-GI-NEXT: sshll v2.8h, v0.8b, #0
|
|
; CHECK-NOFP16-GI-NEXT: sshll2 v0.8h, v0.16b, #0
|
|
; CHECK-NOFP16-GI-NEXT: sshll v4.8h, v1.8b, #0
|
|
; CHECK-NOFP16-GI-NEXT: sshll2 v1.8h, v1.16b, #0
|
|
; CHECK-NOFP16-GI-NEXT: sshll v3.4s, v2.4h, #0
|
|
; CHECK-NOFP16-GI-NEXT: sshll2 v2.4s, v2.8h, #0
|
|
; CHECK-NOFP16-GI-NEXT: sshll v6.4s, v0.4h, #0
|
|
; CHECK-NOFP16-GI-NEXT: sshll2 v0.4s, v0.8h, #0
|
|
; CHECK-NOFP16-GI-NEXT: sshll v16.4s, v4.4h, #0
|
|
; CHECK-NOFP16-GI-NEXT: sshll2 v4.4s, v4.8h, #0
|
|
; CHECK-NOFP16-GI-NEXT: sshll v18.4s, v1.4h, #0
|
|
; CHECK-NOFP16-GI-NEXT: sshll2 v1.4s, v1.8h, #0
|
|
; CHECK-NOFP16-GI-NEXT: sshll v5.2d, v3.2s, #0
|
|
; CHECK-NOFP16-GI-NEXT: sshll2 v3.2d, v3.4s, #0
|
|
; CHECK-NOFP16-GI-NEXT: sshll v7.2d, v2.2s, #0
|
|
; CHECK-NOFP16-GI-NEXT: sshll2 v2.2d, v2.4s, #0
|
|
; CHECK-NOFP16-GI-NEXT: sshll v17.2d, v6.2s, #0
|
|
; CHECK-NOFP16-GI-NEXT: sshll2 v6.2d, v6.4s, #0
|
|
; CHECK-NOFP16-GI-NEXT: sshll v19.2d, v0.2s, #0
|
|
; CHECK-NOFP16-GI-NEXT: sshll2 v0.2d, v0.4s, #0
|
|
; CHECK-NOFP16-GI-NEXT: sshll v20.2d, v16.2s, #0
|
|
; CHECK-NOFP16-GI-NEXT: scvtf v5.2d, v5.2d
|
|
; CHECK-NOFP16-GI-NEXT: scvtf v3.2d, v3.2d
|
|
; CHECK-NOFP16-GI-NEXT: scvtf v7.2d, v7.2d
|
|
; CHECK-NOFP16-GI-NEXT: scvtf v2.2d, v2.2d
|
|
; CHECK-NOFP16-GI-NEXT: scvtf v17.2d, v17.2d
|
|
; CHECK-NOFP16-GI-NEXT: scvtf v6.2d, v6.2d
|
|
; CHECK-NOFP16-GI-NEXT: scvtf v0.2d, v0.2d
|
|
; CHECK-NOFP16-GI-NEXT: stp q5, q3, [x8]
|
|
; CHECK-NOFP16-GI-NEXT: sshll2 v5.2d, v16.4s, #0
|
|
; CHECK-NOFP16-GI-NEXT: scvtf v16.2d, v19.2d
|
|
; CHECK-NOFP16-GI-NEXT: stp q7, q2, [x8, #32]
|
|
; CHECK-NOFP16-GI-NEXT: scvtf v2.2d, v20.2d
|
|
; CHECK-NOFP16-GI-NEXT: sshll v3.2d, v4.2s, #0
|
|
; CHECK-NOFP16-GI-NEXT: stp q17, q6, [x8, #64]
|
|
; CHECK-NOFP16-GI-NEXT: sshll2 v4.2d, v4.4s, #0
|
|
; CHECK-NOFP16-GI-NEXT: sshll v6.2d, v18.2s, #0
|
|
; CHECK-NOFP16-GI-NEXT: scvtf v5.2d, v5.2d
|
|
; CHECK-NOFP16-GI-NEXT: sshll2 v7.2d, v18.4s, #0
|
|
; CHECK-NOFP16-GI-NEXT: stp q16, q0, [x8, #96]
|
|
; CHECK-NOFP16-GI-NEXT: sshll v0.2d, v1.2s, #0
|
|
; CHECK-NOFP16-GI-NEXT: sshll2 v1.2d, v1.4s, #0
|
|
; CHECK-NOFP16-GI-NEXT: scvtf v3.2d, v3.2d
|
|
; CHECK-NOFP16-GI-NEXT: scvtf v4.2d, v4.2d
|
|
; CHECK-NOFP16-GI-NEXT: scvtf v6.2d, v6.2d
|
|
; CHECK-NOFP16-GI-NEXT: stp q2, q5, [x8, #128]
|
|
; CHECK-NOFP16-GI-NEXT: scvtf v2.2d, v7.2d
|
|
; CHECK-NOFP16-GI-NEXT: scvtf v0.2d, v0.2d
|
|
; CHECK-NOFP16-GI-NEXT: scvtf v1.2d, v1.2d
|
|
; CHECK-NOFP16-GI-NEXT: stp q3, q4, [x8, #160]
|
|
; CHECK-NOFP16-GI-NEXT: stp q6, q2, [x8, #192]
|
|
; CHECK-NOFP16-GI-NEXT: stp q0, q1, [x8, #224]
|
|
; CHECK-NOFP16-GI-NEXT: ret
|
|
;
|
|
; CHECK-FP16-GI-LABEL: stofp_v32i8_v32f64:
|
|
; CHECK-FP16-GI: // %bb.0: // %entry
|
|
; CHECK-FP16-GI-NEXT: sshll v2.8h, v0.8b, #0
|
|
; CHECK-FP16-GI-NEXT: sshll2 v0.8h, v0.16b, #0
|
|
; CHECK-FP16-GI-NEXT: sshll v4.8h, v1.8b, #0
|
|
; CHECK-FP16-GI-NEXT: sshll2 v1.8h, v1.16b, #0
|
|
; CHECK-FP16-GI-NEXT: sshll v3.4s, v2.4h, #0
|
|
; CHECK-FP16-GI-NEXT: sshll2 v2.4s, v2.8h, #0
|
|
; CHECK-FP16-GI-NEXT: sshll v6.4s, v0.4h, #0
|
|
; CHECK-FP16-GI-NEXT: sshll2 v0.4s, v0.8h, #0
|
|
; CHECK-FP16-GI-NEXT: sshll v16.4s, v4.4h, #0
|
|
; CHECK-FP16-GI-NEXT: sshll2 v4.4s, v4.8h, #0
|
|
; CHECK-FP16-GI-NEXT: sshll v18.4s, v1.4h, #0
|
|
; CHECK-FP16-GI-NEXT: sshll2 v1.4s, v1.8h, #0
|
|
; CHECK-FP16-GI-NEXT: sshll v5.2d, v3.2s, #0
|
|
; CHECK-FP16-GI-NEXT: sshll2 v3.2d, v3.4s, #0
|
|
; CHECK-FP16-GI-NEXT: sshll v7.2d, v2.2s, #0
|
|
; CHECK-FP16-GI-NEXT: sshll2 v2.2d, v2.4s, #0
|
|
; CHECK-FP16-GI-NEXT: sshll v17.2d, v6.2s, #0
|
|
; CHECK-FP16-GI-NEXT: sshll2 v6.2d, v6.4s, #0
|
|
; CHECK-FP16-GI-NEXT: sshll v19.2d, v0.2s, #0
|
|
; CHECK-FP16-GI-NEXT: sshll2 v0.2d, v0.4s, #0
|
|
; CHECK-FP16-GI-NEXT: sshll v20.2d, v16.2s, #0
|
|
; CHECK-FP16-GI-NEXT: scvtf v5.2d, v5.2d
|
|
; CHECK-FP16-GI-NEXT: scvtf v3.2d, v3.2d
|
|
; CHECK-FP16-GI-NEXT: scvtf v7.2d, v7.2d
|
|
; CHECK-FP16-GI-NEXT: scvtf v2.2d, v2.2d
|
|
; CHECK-FP16-GI-NEXT: scvtf v17.2d, v17.2d
|
|
; CHECK-FP16-GI-NEXT: scvtf v6.2d, v6.2d
|
|
; CHECK-FP16-GI-NEXT: scvtf v0.2d, v0.2d
|
|
; CHECK-FP16-GI-NEXT: stp q5, q3, [x8]
|
|
; CHECK-FP16-GI-NEXT: sshll2 v5.2d, v16.4s, #0
|
|
; CHECK-FP16-GI-NEXT: scvtf v16.2d, v19.2d
|
|
; CHECK-FP16-GI-NEXT: stp q7, q2, [x8, #32]
|
|
; CHECK-FP16-GI-NEXT: scvtf v2.2d, v20.2d
|
|
; CHECK-FP16-GI-NEXT: sshll v3.2d, v4.2s, #0
|
|
; CHECK-FP16-GI-NEXT: stp q17, q6, [x8, #64]
|
|
; CHECK-FP16-GI-NEXT: sshll2 v4.2d, v4.4s, #0
|
|
; CHECK-FP16-GI-NEXT: sshll v6.2d, v18.2s, #0
|
|
; CHECK-FP16-GI-NEXT: scvtf v5.2d, v5.2d
|
|
; CHECK-FP16-GI-NEXT: sshll2 v7.2d, v18.4s, #0
|
|
; CHECK-FP16-GI-NEXT: stp q16, q0, [x8, #96]
|
|
; CHECK-FP16-GI-NEXT: sshll v0.2d, v1.2s, #0
|
|
; CHECK-FP16-GI-NEXT: sshll2 v1.2d, v1.4s, #0
|
|
; CHECK-FP16-GI-NEXT: scvtf v3.2d, v3.2d
|
|
; CHECK-FP16-GI-NEXT: scvtf v4.2d, v4.2d
|
|
; CHECK-FP16-GI-NEXT: scvtf v6.2d, v6.2d
|
|
; CHECK-FP16-GI-NEXT: stp q2, q5, [x8, #128]
|
|
; CHECK-FP16-GI-NEXT: scvtf v2.2d, v7.2d
|
|
; CHECK-FP16-GI-NEXT: scvtf v0.2d, v0.2d
|
|
; CHECK-FP16-GI-NEXT: scvtf v1.2d, v1.2d
|
|
; CHECK-FP16-GI-NEXT: stp q3, q4, [x8, #160]
|
|
; CHECK-FP16-GI-NEXT: stp q6, q2, [x8, #192]
|
|
; CHECK-FP16-GI-NEXT: stp q0, q1, [x8, #224]
|
|
; CHECK-FP16-GI-NEXT: ret
|
|
entry:
|
|
%c = sitofp <32 x i8> %a to <32 x double>
|
|
ret <32 x double> %c
|
|
}
|
|
|
|
define <32 x double> @utofp_v32i8_v32f64(<32 x i8> %a) {
|
|
; CHECK-NOFP16-SD-LABEL: utofp_v32i8_v32f64:
|
|
; CHECK-NOFP16-SD: // %bb.0: // %entry
|
|
; CHECK-NOFP16-SD-NEXT: mov b6, v1.b[6]
|
|
; CHECK-NOFP16-SD-NEXT: mov b7, v1.b[4]
|
|
; CHECK-NOFP16-SD-NEXT: ext v3.16b, v1.16b, v1.16b, #8
|
|
; CHECK-NOFP16-SD-NEXT: mov b16, v1.b[2]
|
|
; CHECK-NOFP16-SD-NEXT: mov b17, v1.b[0]
|
|
; CHECK-NOFP16-SD-NEXT: mov b19, v0.b[6]
|
|
; CHECK-NOFP16-SD-NEXT: mov b20, v0.b[4]
|
|
; CHECK-NOFP16-SD-NEXT: movi d5, #0x0000ff000000ff
|
|
; CHECK-NOFP16-SD-NEXT: mov b24, v0.b[2]
|
|
; CHECK-NOFP16-SD-NEXT: mov b25, v0.b[0]
|
|
; CHECK-NOFP16-SD-NEXT: ext v2.16b, v0.16b, v0.16b, #8
|
|
; CHECK-NOFP16-SD-NEXT: mov v6.b[4], v1.b[7]
|
|
; CHECK-NOFP16-SD-NEXT: mov v7.b[4], v1.b[5]
|
|
; CHECK-NOFP16-SD-NEXT: mov b18, v3.b[0]
|
|
; CHECK-NOFP16-SD-NEXT: mov b21, v3.b[2]
|
|
; CHECK-NOFP16-SD-NEXT: mov b23, v3.b[4]
|
|
; CHECK-NOFP16-SD-NEXT: mov v16.b[4], v1.b[3]
|
|
; CHECK-NOFP16-SD-NEXT: mov v17.b[4], v1.b[1]
|
|
; CHECK-NOFP16-SD-NEXT: mov b1, v3.b[6]
|
|
; CHECK-NOFP16-SD-NEXT: mov v19.b[4], v0.b[7]
|
|
; CHECK-NOFP16-SD-NEXT: mov v20.b[4], v0.b[5]
|
|
; CHECK-NOFP16-SD-NEXT: mov v24.b[4], v0.b[3]
|
|
; CHECK-NOFP16-SD-NEXT: mov v25.b[4], v0.b[1]
|
|
; CHECK-NOFP16-SD-NEXT: and v6.8b, v6.8b, v5.8b
|
|
; CHECK-NOFP16-SD-NEXT: and v7.8b, v7.8b, v5.8b
|
|
; CHECK-NOFP16-SD-NEXT: mov v18.b[4], v3.b[1]
|
|
; CHECK-NOFP16-SD-NEXT: mov v21.b[4], v3.b[3]
|
|
; CHECK-NOFP16-SD-NEXT: mov v23.b[4], v3.b[5]
|
|
; CHECK-NOFP16-SD-NEXT: and v16.8b, v16.8b, v5.8b
|
|
; CHECK-NOFP16-SD-NEXT: and v17.8b, v17.8b, v5.8b
|
|
; CHECK-NOFP16-SD-NEXT: mov v1.b[4], v3.b[7]
|
|
; CHECK-NOFP16-SD-NEXT: and v3.8b, v19.8b, v5.8b
|
|
; CHECK-NOFP16-SD-NEXT: ushll v6.2d, v6.2s, #0
|
|
; CHECK-NOFP16-SD-NEXT: ushll v7.2d, v7.2s, #0
|
|
; CHECK-NOFP16-SD-NEXT: and v20.8b, v20.8b, v5.8b
|
|
; CHECK-NOFP16-SD-NEXT: ushll v16.2d, v16.2s, #0
|
|
; CHECK-NOFP16-SD-NEXT: mov b4, v2.b[0]
|
|
; CHECK-NOFP16-SD-NEXT: mov b22, v2.b[2]
|
|
; CHECK-NOFP16-SD-NEXT: ushll v17.2d, v17.2s, #0
|
|
; CHECK-NOFP16-SD-NEXT: ushll v0.2d, v3.2s, #0
|
|
; CHECK-NOFP16-SD-NEXT: mov b19, v2.b[4]
|
|
; CHECK-NOFP16-SD-NEXT: ucvtf v6.2d, v6.2d
|
|
; CHECK-NOFP16-SD-NEXT: ucvtf v3.2d, v7.2d
|
|
; CHECK-NOFP16-SD-NEXT: ushll v20.2d, v20.2s, #0
|
|
; CHECK-NOFP16-SD-NEXT: mov b7, v2.b[6]
|
|
; CHECK-NOFP16-SD-NEXT: ucvtf v16.2d, v16.2d
|
|
; CHECK-NOFP16-SD-NEXT: and v24.8b, v24.8b, v5.8b
|
|
; CHECK-NOFP16-SD-NEXT: ucvtf v17.2d, v17.2d
|
|
; CHECK-NOFP16-SD-NEXT: ucvtf v0.2d, v0.2d
|
|
; CHECK-NOFP16-SD-NEXT: mov v4.b[4], v2.b[1]
|
|
; CHECK-NOFP16-SD-NEXT: ucvtf v20.2d, v20.2d
|
|
; CHECK-NOFP16-SD-NEXT: mov v22.b[4], v2.b[3]
|
|
; CHECK-NOFP16-SD-NEXT: mov v19.b[4], v2.b[5]
|
|
; CHECK-NOFP16-SD-NEXT: stp q3, q6, [x8, #160]
|
|
; CHECK-NOFP16-SD-NEXT: and v6.8b, v25.8b, v5.8b
|
|
; CHECK-NOFP16-SD-NEXT: and v1.8b, v1.8b, v5.8b
|
|
; CHECK-NOFP16-SD-NEXT: mov v7.b[4], v2.b[7]
|
|
; CHECK-NOFP16-SD-NEXT: and v2.8b, v23.8b, v5.8b
|
|
; CHECK-NOFP16-SD-NEXT: ushll v3.2d, v24.2s, #0
|
|
; CHECK-NOFP16-SD-NEXT: stp q17, q16, [x8, #128]
|
|
; CHECK-NOFP16-SD-NEXT: and v16.8b, v21.8b, v5.8b
|
|
; CHECK-NOFP16-SD-NEXT: and v4.8b, v4.8b, v5.8b
|
|
; CHECK-NOFP16-SD-NEXT: stp q20, q0, [x8, #32]
|
|
; CHECK-NOFP16-SD-NEXT: ushll v6.2d, v6.2s, #0
|
|
; CHECK-NOFP16-SD-NEXT: and v0.8b, v18.8b, v5.8b
|
|
; CHECK-NOFP16-SD-NEXT: ushll v1.2d, v1.2s, #0
|
|
; CHECK-NOFP16-SD-NEXT: ushll v2.2d, v2.2s, #0
|
|
; CHECK-NOFP16-SD-NEXT: ucvtf v3.2d, v3.2d
|
|
; CHECK-NOFP16-SD-NEXT: ushll v16.2d, v16.2s, #0
|
|
; CHECK-NOFP16-SD-NEXT: and v7.8b, v7.8b, v5.8b
|
|
; CHECK-NOFP16-SD-NEXT: and v17.8b, v19.8b, v5.8b
|
|
; CHECK-NOFP16-SD-NEXT: ucvtf v6.2d, v6.2d
|
|
; CHECK-NOFP16-SD-NEXT: ushll v0.2d, v0.2s, #0
|
|
; CHECK-NOFP16-SD-NEXT: and v18.8b, v22.8b, v5.8b
|
|
; CHECK-NOFP16-SD-NEXT: ucvtf v1.2d, v1.2d
|
|
; CHECK-NOFP16-SD-NEXT: ucvtf v2.2d, v2.2d
|
|
; CHECK-NOFP16-SD-NEXT: ushll v4.2d, v4.2s, #0
|
|
; CHECK-NOFP16-SD-NEXT: ucvtf v16.2d, v16.2d
|
|
; CHECK-NOFP16-SD-NEXT: ushll v5.2d, v7.2s, #0
|
|
; CHECK-NOFP16-SD-NEXT: ushll v7.2d, v17.2s, #0
|
|
; CHECK-NOFP16-SD-NEXT: ucvtf v0.2d, v0.2d
|
|
; CHECK-NOFP16-SD-NEXT: stp q6, q3, [x8]
|
|
; CHECK-NOFP16-SD-NEXT: ushll v3.2d, v18.2s, #0
|
|
; CHECK-NOFP16-SD-NEXT: stp q2, q1, [x8, #224]
|
|
; CHECK-NOFP16-SD-NEXT: ucvtf v5.2d, v5.2d
|
|
; CHECK-NOFP16-SD-NEXT: ucvtf v1.2d, v7.2d
|
|
; CHECK-NOFP16-SD-NEXT: stp q0, q16, [x8, #192]
|
|
; CHECK-NOFP16-SD-NEXT: ucvtf v2.2d, v3.2d
|
|
; CHECK-NOFP16-SD-NEXT: ucvtf v0.2d, v4.2d
|
|
; CHECK-NOFP16-SD-NEXT: stp q1, q5, [x8, #96]
|
|
; CHECK-NOFP16-SD-NEXT: stp q0, q2, [x8, #64]
|
|
; CHECK-NOFP16-SD-NEXT: ret
|
|
;
|
|
; CHECK-FP16-SD-LABEL: utofp_v32i8_v32f64:
|
|
; CHECK-FP16-SD: // %bb.0: // %entry
|
|
; CHECK-FP16-SD-NEXT: mov b6, v1.b[6]
|
|
; CHECK-FP16-SD-NEXT: mov b7, v1.b[4]
|
|
; CHECK-FP16-SD-NEXT: ext v3.16b, v1.16b, v1.16b, #8
|
|
; CHECK-FP16-SD-NEXT: mov b16, v1.b[2]
|
|
; CHECK-FP16-SD-NEXT: mov b17, v1.b[0]
|
|
; CHECK-FP16-SD-NEXT: mov b19, v0.b[6]
|
|
; CHECK-FP16-SD-NEXT: mov b20, v0.b[4]
|
|
; CHECK-FP16-SD-NEXT: movi d5, #0x0000ff000000ff
|
|
; CHECK-FP16-SD-NEXT: mov b24, v0.b[2]
|
|
; CHECK-FP16-SD-NEXT: mov b25, v0.b[0]
|
|
; CHECK-FP16-SD-NEXT: ext v2.16b, v0.16b, v0.16b, #8
|
|
; CHECK-FP16-SD-NEXT: mov v6.b[4], v1.b[7]
|
|
; CHECK-FP16-SD-NEXT: mov v7.b[4], v1.b[5]
|
|
; CHECK-FP16-SD-NEXT: mov b18, v3.b[0]
|
|
; CHECK-FP16-SD-NEXT: mov b21, v3.b[2]
|
|
; CHECK-FP16-SD-NEXT: mov b23, v3.b[4]
|
|
; CHECK-FP16-SD-NEXT: mov v16.b[4], v1.b[3]
|
|
; CHECK-FP16-SD-NEXT: mov v17.b[4], v1.b[1]
|
|
; CHECK-FP16-SD-NEXT: mov b1, v3.b[6]
|
|
; CHECK-FP16-SD-NEXT: mov v19.b[4], v0.b[7]
|
|
; CHECK-FP16-SD-NEXT: mov v20.b[4], v0.b[5]
|
|
; CHECK-FP16-SD-NEXT: mov v24.b[4], v0.b[3]
|
|
; CHECK-FP16-SD-NEXT: mov v25.b[4], v0.b[1]
|
|
; CHECK-FP16-SD-NEXT: and v6.8b, v6.8b, v5.8b
|
|
; CHECK-FP16-SD-NEXT: and v7.8b, v7.8b, v5.8b
|
|
; CHECK-FP16-SD-NEXT: mov v18.b[4], v3.b[1]
|
|
; CHECK-FP16-SD-NEXT: mov v21.b[4], v3.b[3]
|
|
; CHECK-FP16-SD-NEXT: mov v23.b[4], v3.b[5]
|
|
; CHECK-FP16-SD-NEXT: and v16.8b, v16.8b, v5.8b
|
|
; CHECK-FP16-SD-NEXT: and v17.8b, v17.8b, v5.8b
|
|
; CHECK-FP16-SD-NEXT: mov v1.b[4], v3.b[7]
|
|
; CHECK-FP16-SD-NEXT: and v3.8b, v19.8b, v5.8b
|
|
; CHECK-FP16-SD-NEXT: ushll v6.2d, v6.2s, #0
|
|
; CHECK-FP16-SD-NEXT: ushll v7.2d, v7.2s, #0
|
|
; CHECK-FP16-SD-NEXT: and v20.8b, v20.8b, v5.8b
|
|
; CHECK-FP16-SD-NEXT: ushll v16.2d, v16.2s, #0
|
|
; CHECK-FP16-SD-NEXT: mov b4, v2.b[0]
|
|
; CHECK-FP16-SD-NEXT: mov b22, v2.b[2]
|
|
; CHECK-FP16-SD-NEXT: ushll v17.2d, v17.2s, #0
|
|
; CHECK-FP16-SD-NEXT: ushll v0.2d, v3.2s, #0
|
|
; CHECK-FP16-SD-NEXT: mov b19, v2.b[4]
|
|
; CHECK-FP16-SD-NEXT: ucvtf v6.2d, v6.2d
|
|
; CHECK-FP16-SD-NEXT: ucvtf v3.2d, v7.2d
|
|
; CHECK-FP16-SD-NEXT: ushll v20.2d, v20.2s, #0
|
|
; CHECK-FP16-SD-NEXT: mov b7, v2.b[6]
|
|
; CHECK-FP16-SD-NEXT: ucvtf v16.2d, v16.2d
|
|
; CHECK-FP16-SD-NEXT: and v24.8b, v24.8b, v5.8b
|
|
; CHECK-FP16-SD-NEXT: ucvtf v17.2d, v17.2d
|
|
; CHECK-FP16-SD-NEXT: ucvtf v0.2d, v0.2d
|
|
; CHECK-FP16-SD-NEXT: mov v4.b[4], v2.b[1]
|
|
; CHECK-FP16-SD-NEXT: ucvtf v20.2d, v20.2d
|
|
; CHECK-FP16-SD-NEXT: mov v22.b[4], v2.b[3]
|
|
; CHECK-FP16-SD-NEXT: mov v19.b[4], v2.b[5]
|
|
; CHECK-FP16-SD-NEXT: stp q3, q6, [x8, #160]
|
|
; CHECK-FP16-SD-NEXT: and v6.8b, v25.8b, v5.8b
|
|
; CHECK-FP16-SD-NEXT: and v1.8b, v1.8b, v5.8b
|
|
; CHECK-FP16-SD-NEXT: mov v7.b[4], v2.b[7]
|
|
; CHECK-FP16-SD-NEXT: and v2.8b, v23.8b, v5.8b
|
|
; CHECK-FP16-SD-NEXT: ushll v3.2d, v24.2s, #0
|
|
; CHECK-FP16-SD-NEXT: stp q17, q16, [x8, #128]
|
|
; CHECK-FP16-SD-NEXT: and v16.8b, v21.8b, v5.8b
|
|
; CHECK-FP16-SD-NEXT: and v4.8b, v4.8b, v5.8b
|
|
; CHECK-FP16-SD-NEXT: stp q20, q0, [x8, #32]
|
|
; CHECK-FP16-SD-NEXT: ushll v6.2d, v6.2s, #0
|
|
; CHECK-FP16-SD-NEXT: and v0.8b, v18.8b, v5.8b
|
|
; CHECK-FP16-SD-NEXT: ushll v1.2d, v1.2s, #0
|
|
; CHECK-FP16-SD-NEXT: ushll v2.2d, v2.2s, #0
|
|
; CHECK-FP16-SD-NEXT: ucvtf v3.2d, v3.2d
|
|
; CHECK-FP16-SD-NEXT: ushll v16.2d, v16.2s, #0
|
|
; CHECK-FP16-SD-NEXT: and v7.8b, v7.8b, v5.8b
|
|
; CHECK-FP16-SD-NEXT: and v17.8b, v19.8b, v5.8b
|
|
; CHECK-FP16-SD-NEXT: ucvtf v6.2d, v6.2d
|
|
; CHECK-FP16-SD-NEXT: ushll v0.2d, v0.2s, #0
|
|
; CHECK-FP16-SD-NEXT: and v18.8b, v22.8b, v5.8b
|
|
; CHECK-FP16-SD-NEXT: ucvtf v1.2d, v1.2d
|
|
; CHECK-FP16-SD-NEXT: ucvtf v2.2d, v2.2d
|
|
; CHECK-FP16-SD-NEXT: ushll v4.2d, v4.2s, #0
|
|
; CHECK-FP16-SD-NEXT: ucvtf v16.2d, v16.2d
|
|
; CHECK-FP16-SD-NEXT: ushll v5.2d, v7.2s, #0
|
|
; CHECK-FP16-SD-NEXT: ushll v7.2d, v17.2s, #0
|
|
; CHECK-FP16-SD-NEXT: ucvtf v0.2d, v0.2d
|
|
; CHECK-FP16-SD-NEXT: stp q6, q3, [x8]
|
|
; CHECK-FP16-SD-NEXT: ushll v3.2d, v18.2s, #0
|
|
; CHECK-FP16-SD-NEXT: stp q2, q1, [x8, #224]
|
|
; CHECK-FP16-SD-NEXT: ucvtf v5.2d, v5.2d
|
|
; CHECK-FP16-SD-NEXT: ucvtf v1.2d, v7.2d
|
|
; CHECK-FP16-SD-NEXT: stp q0, q16, [x8, #192]
|
|
; CHECK-FP16-SD-NEXT: ucvtf v2.2d, v3.2d
|
|
; CHECK-FP16-SD-NEXT: ucvtf v0.2d, v4.2d
|
|
; CHECK-FP16-SD-NEXT: stp q1, q5, [x8, #96]
|
|
; CHECK-FP16-SD-NEXT: stp q0, q2, [x8, #64]
|
|
; CHECK-FP16-SD-NEXT: ret
|
|
;
|
|
; CHECK-NOFP16-GI-LABEL: utofp_v32i8_v32f64:
|
|
; CHECK-NOFP16-GI: // %bb.0: // %entry
|
|
; CHECK-NOFP16-GI-NEXT: ushll v2.8h, v0.8b, #0
|
|
; CHECK-NOFP16-GI-NEXT: ushll2 v0.8h, v0.16b, #0
|
|
; CHECK-NOFP16-GI-NEXT: ushll v4.8h, v1.8b, #0
|
|
; CHECK-NOFP16-GI-NEXT: ushll2 v1.8h, v1.16b, #0
|
|
; CHECK-NOFP16-GI-NEXT: ushll v3.4s, v2.4h, #0
|
|
; CHECK-NOFP16-GI-NEXT: ushll2 v2.4s, v2.8h, #0
|
|
; CHECK-NOFP16-GI-NEXT: ushll v6.4s, v0.4h, #0
|
|
; CHECK-NOFP16-GI-NEXT: ushll2 v0.4s, v0.8h, #0
|
|
; CHECK-NOFP16-GI-NEXT: ushll v16.4s, v4.4h, #0
|
|
; CHECK-NOFP16-GI-NEXT: ushll2 v4.4s, v4.8h, #0
|
|
; CHECK-NOFP16-GI-NEXT: ushll v18.4s, v1.4h, #0
|
|
; CHECK-NOFP16-GI-NEXT: ushll2 v1.4s, v1.8h, #0
|
|
; CHECK-NOFP16-GI-NEXT: ushll v5.2d, v3.2s, #0
|
|
; CHECK-NOFP16-GI-NEXT: ushll2 v3.2d, v3.4s, #0
|
|
; CHECK-NOFP16-GI-NEXT: ushll v7.2d, v2.2s, #0
|
|
; CHECK-NOFP16-GI-NEXT: ushll2 v2.2d, v2.4s, #0
|
|
; CHECK-NOFP16-GI-NEXT: ushll v17.2d, v6.2s, #0
|
|
; CHECK-NOFP16-GI-NEXT: ushll2 v6.2d, v6.4s, #0
|
|
; CHECK-NOFP16-GI-NEXT: ushll v19.2d, v0.2s, #0
|
|
; CHECK-NOFP16-GI-NEXT: ushll2 v0.2d, v0.4s, #0
|
|
; CHECK-NOFP16-GI-NEXT: ushll v20.2d, v16.2s, #0
|
|
; CHECK-NOFP16-GI-NEXT: ucvtf v5.2d, v5.2d
|
|
; CHECK-NOFP16-GI-NEXT: ucvtf v3.2d, v3.2d
|
|
; CHECK-NOFP16-GI-NEXT: ucvtf v7.2d, v7.2d
|
|
; CHECK-NOFP16-GI-NEXT: ucvtf v2.2d, v2.2d
|
|
; CHECK-NOFP16-GI-NEXT: ucvtf v17.2d, v17.2d
|
|
; CHECK-NOFP16-GI-NEXT: ucvtf v6.2d, v6.2d
|
|
; CHECK-NOFP16-GI-NEXT: ucvtf v0.2d, v0.2d
|
|
; CHECK-NOFP16-GI-NEXT: stp q5, q3, [x8]
|
|
; CHECK-NOFP16-GI-NEXT: ushll2 v5.2d, v16.4s, #0
|
|
; CHECK-NOFP16-GI-NEXT: ucvtf v16.2d, v19.2d
|
|
; CHECK-NOFP16-GI-NEXT: stp q7, q2, [x8, #32]
|
|
; CHECK-NOFP16-GI-NEXT: ucvtf v2.2d, v20.2d
|
|
; CHECK-NOFP16-GI-NEXT: ushll v3.2d, v4.2s, #0
|
|
; CHECK-NOFP16-GI-NEXT: stp q17, q6, [x8, #64]
|
|
; CHECK-NOFP16-GI-NEXT: ushll2 v4.2d, v4.4s, #0
|
|
; CHECK-NOFP16-GI-NEXT: ushll v6.2d, v18.2s, #0
|
|
; CHECK-NOFP16-GI-NEXT: ucvtf v5.2d, v5.2d
|
|
; CHECK-NOFP16-GI-NEXT: ushll2 v7.2d, v18.4s, #0
|
|
; CHECK-NOFP16-GI-NEXT: stp q16, q0, [x8, #96]
|
|
; CHECK-NOFP16-GI-NEXT: ushll v0.2d, v1.2s, #0
|
|
; CHECK-NOFP16-GI-NEXT: ushll2 v1.2d, v1.4s, #0
|
|
; CHECK-NOFP16-GI-NEXT: ucvtf v3.2d, v3.2d
|
|
; CHECK-NOFP16-GI-NEXT: ucvtf v4.2d, v4.2d
|
|
; CHECK-NOFP16-GI-NEXT: ucvtf v6.2d, v6.2d
|
|
; CHECK-NOFP16-GI-NEXT: stp q2, q5, [x8, #128]
|
|
; CHECK-NOFP16-GI-NEXT: ucvtf v2.2d, v7.2d
|
|
; CHECK-NOFP16-GI-NEXT: ucvtf v0.2d, v0.2d
|
|
; CHECK-NOFP16-GI-NEXT: ucvtf v1.2d, v1.2d
|
|
; CHECK-NOFP16-GI-NEXT: stp q3, q4, [x8, #160]
|
|
; CHECK-NOFP16-GI-NEXT: stp q6, q2, [x8, #192]
|
|
; CHECK-NOFP16-GI-NEXT: stp q0, q1, [x8, #224]
|
|
; CHECK-NOFP16-GI-NEXT: ret
|
|
;
|
|
; CHECK-FP16-GI-LABEL: utofp_v32i8_v32f64:
|
|
; CHECK-FP16-GI: // %bb.0: // %entry
|
|
; CHECK-FP16-GI-NEXT: ushll v2.8h, v0.8b, #0
|
|
; CHECK-FP16-GI-NEXT: ushll2 v0.8h, v0.16b, #0
|
|
; CHECK-FP16-GI-NEXT: ushll v4.8h, v1.8b, #0
|
|
; CHECK-FP16-GI-NEXT: ushll2 v1.8h, v1.16b, #0
|
|
; CHECK-FP16-GI-NEXT: ushll v3.4s, v2.4h, #0
|
|
; CHECK-FP16-GI-NEXT: ushll2 v2.4s, v2.8h, #0
|
|
; CHECK-FP16-GI-NEXT: ushll v6.4s, v0.4h, #0
|
|
; CHECK-FP16-GI-NEXT: ushll2 v0.4s, v0.8h, #0
|
|
; CHECK-FP16-GI-NEXT: ushll v16.4s, v4.4h, #0
|
|
; CHECK-FP16-GI-NEXT: ushll2 v4.4s, v4.8h, #0
|
|
; CHECK-FP16-GI-NEXT: ushll v18.4s, v1.4h, #0
|
|
; CHECK-FP16-GI-NEXT: ushll2 v1.4s, v1.8h, #0
|
|
; CHECK-FP16-GI-NEXT: ushll v5.2d, v3.2s, #0
|
|
; CHECK-FP16-GI-NEXT: ushll2 v3.2d, v3.4s, #0
|
|
; CHECK-FP16-GI-NEXT: ushll v7.2d, v2.2s, #0
|
|
; CHECK-FP16-GI-NEXT: ushll2 v2.2d, v2.4s, #0
|
|
; CHECK-FP16-GI-NEXT: ushll v17.2d, v6.2s, #0
|
|
; CHECK-FP16-GI-NEXT: ushll2 v6.2d, v6.4s, #0
|
|
; CHECK-FP16-GI-NEXT: ushll v19.2d, v0.2s, #0
|
|
; CHECK-FP16-GI-NEXT: ushll2 v0.2d, v0.4s, #0
|
|
; CHECK-FP16-GI-NEXT: ushll v20.2d, v16.2s, #0
|
|
; CHECK-FP16-GI-NEXT: ucvtf v5.2d, v5.2d
|
|
; CHECK-FP16-GI-NEXT: ucvtf v3.2d, v3.2d
|
|
; CHECK-FP16-GI-NEXT: ucvtf v7.2d, v7.2d
|
|
; CHECK-FP16-GI-NEXT: ucvtf v2.2d, v2.2d
|
|
; CHECK-FP16-GI-NEXT: ucvtf v17.2d, v17.2d
|
|
; CHECK-FP16-GI-NEXT: ucvtf v6.2d, v6.2d
|
|
; CHECK-FP16-GI-NEXT: ucvtf v0.2d, v0.2d
|
|
; CHECK-FP16-GI-NEXT: stp q5, q3, [x8]
|
|
; CHECK-FP16-GI-NEXT: ushll2 v5.2d, v16.4s, #0
|
|
; CHECK-FP16-GI-NEXT: ucvtf v16.2d, v19.2d
|
|
; CHECK-FP16-GI-NEXT: stp q7, q2, [x8, #32]
|
|
; CHECK-FP16-GI-NEXT: ucvtf v2.2d, v20.2d
|
|
; CHECK-FP16-GI-NEXT: ushll v3.2d, v4.2s, #0
|
|
; CHECK-FP16-GI-NEXT: stp q17, q6, [x8, #64]
|
|
; CHECK-FP16-GI-NEXT: ushll2 v4.2d, v4.4s, #0
|
|
; CHECK-FP16-GI-NEXT: ushll v6.2d, v18.2s, #0
|
|
; CHECK-FP16-GI-NEXT: ucvtf v5.2d, v5.2d
|
|
; CHECK-FP16-GI-NEXT: ushll2 v7.2d, v18.4s, #0
|
|
; CHECK-FP16-GI-NEXT: stp q16, q0, [x8, #96]
|
|
; CHECK-FP16-GI-NEXT: ushll v0.2d, v1.2s, #0
|
|
; CHECK-FP16-GI-NEXT: ushll2 v1.2d, v1.4s, #0
|
|
; CHECK-FP16-GI-NEXT: ucvtf v3.2d, v3.2d
|
|
; CHECK-FP16-GI-NEXT: ucvtf v4.2d, v4.2d
|
|
; CHECK-FP16-GI-NEXT: ucvtf v6.2d, v6.2d
|
|
; CHECK-FP16-GI-NEXT: stp q2, q5, [x8, #128]
|
|
; CHECK-FP16-GI-NEXT: ucvtf v2.2d, v7.2d
|
|
; CHECK-FP16-GI-NEXT: ucvtf v0.2d, v0.2d
|
|
; CHECK-FP16-GI-NEXT: ucvtf v1.2d, v1.2d
|
|
; CHECK-FP16-GI-NEXT: stp q3, q4, [x8, #160]
|
|
; CHECK-FP16-GI-NEXT: stp q6, q2, [x8, #192]
|
|
; CHECK-FP16-GI-NEXT: stp q0, q1, [x8, #224]
|
|
; CHECK-FP16-GI-NEXT: ret
|
|
entry:
|
|
%c = uitofp <32 x i8> %a to <32 x double>
|
|
ret <32 x double> %c
|
|
}
|
|
|
|
define <2 x double> @stofp_v2i128_v2f64(<2 x i128> %a) {
|
|
; CHECK-NOFP16-SD-LABEL: stofp_v2i128_v2f64:
|
|
; CHECK-NOFP16-SD: // %bb.0: // %entry
|
|
; CHECK-NOFP16-SD-NEXT: sub sp, sp, #48
|
|
; CHECK-NOFP16-SD-NEXT: str x30, [sp, #16] // 8-byte Folded Spill
|
|
; CHECK-NOFP16-SD-NEXT: stp x20, x19, [sp, #32] // 16-byte Folded Spill
|
|
; CHECK-NOFP16-SD-NEXT: .cfi_def_cfa_offset 48
|
|
; CHECK-NOFP16-SD-NEXT: .cfi_offset w19, -8
|
|
; CHECK-NOFP16-SD-NEXT: .cfi_offset w20, -16
|
|
; CHECK-NOFP16-SD-NEXT: .cfi_offset w30, -32
|
|
; CHECK-NOFP16-SD-NEXT: mov x19, x1
|
|
; CHECK-NOFP16-SD-NEXT: mov x20, x0
|
|
; CHECK-NOFP16-SD-NEXT: mov x0, x2
|
|
; CHECK-NOFP16-SD-NEXT: mov x1, x3
|
|
; CHECK-NOFP16-SD-NEXT: bl __floattidf
|
|
; CHECK-NOFP16-SD-NEXT: mov x0, x20
|
|
; CHECK-NOFP16-SD-NEXT: mov x1, x19
|
|
; CHECK-NOFP16-SD-NEXT: // kill: def $d0 killed $d0 def $q0
|
|
; CHECK-NOFP16-SD-NEXT: str q0, [sp] // 16-byte Folded Spill
|
|
; CHECK-NOFP16-SD-NEXT: bl __floattidf
|
|
; CHECK-NOFP16-SD-NEXT: ldr q1, [sp] // 16-byte Folded Reload
|
|
; CHECK-NOFP16-SD-NEXT: ldp x20, x19, [sp, #32] // 16-byte Folded Reload
|
|
; CHECK-NOFP16-SD-NEXT: // kill: def $d0 killed $d0 def $q0
|
|
; CHECK-NOFP16-SD-NEXT: ldr x30, [sp, #16] // 8-byte Folded Reload
|
|
; CHECK-NOFP16-SD-NEXT: mov v0.d[1], v1.d[0]
|
|
; CHECK-NOFP16-SD-NEXT: add sp, sp, #48
|
|
; CHECK-NOFP16-SD-NEXT: ret
|
|
;
|
|
; CHECK-FP16-SD-LABEL: stofp_v2i128_v2f64:
|
|
; CHECK-FP16-SD: // %bb.0: // %entry
|
|
; CHECK-FP16-SD-NEXT: sub sp, sp, #48
|
|
; CHECK-FP16-SD-NEXT: str x30, [sp, #16] // 8-byte Folded Spill
|
|
; CHECK-FP16-SD-NEXT: stp x20, x19, [sp, #32] // 16-byte Folded Spill
|
|
; CHECK-FP16-SD-NEXT: .cfi_def_cfa_offset 48
|
|
; CHECK-FP16-SD-NEXT: .cfi_offset w19, -8
|
|
; CHECK-FP16-SD-NEXT: .cfi_offset w20, -16
|
|
; CHECK-FP16-SD-NEXT: .cfi_offset w30, -32
|
|
; CHECK-FP16-SD-NEXT: mov x19, x1
|
|
; CHECK-FP16-SD-NEXT: mov x20, x0
|
|
; CHECK-FP16-SD-NEXT: mov x0, x2
|
|
; CHECK-FP16-SD-NEXT: mov x1, x3
|
|
; CHECK-FP16-SD-NEXT: bl __floattidf
|
|
; CHECK-FP16-SD-NEXT: mov x0, x20
|
|
; CHECK-FP16-SD-NEXT: mov x1, x19
|
|
; CHECK-FP16-SD-NEXT: // kill: def $d0 killed $d0 def $q0
|
|
; CHECK-FP16-SD-NEXT: str q0, [sp] // 16-byte Folded Spill
|
|
; CHECK-FP16-SD-NEXT: bl __floattidf
|
|
; CHECK-FP16-SD-NEXT: ldr q1, [sp] // 16-byte Folded Reload
|
|
; CHECK-FP16-SD-NEXT: ldp x20, x19, [sp, #32] // 16-byte Folded Reload
|
|
; CHECK-FP16-SD-NEXT: // kill: def $d0 killed $d0 def $q0
|
|
; CHECK-FP16-SD-NEXT: ldr x30, [sp, #16] // 8-byte Folded Reload
|
|
; CHECK-FP16-SD-NEXT: mov v0.d[1], v1.d[0]
|
|
; CHECK-FP16-SD-NEXT: add sp, sp, #48
|
|
; CHECK-FP16-SD-NEXT: ret
|
|
;
|
|
; CHECK-NOFP16-GI-LABEL: stofp_v2i128_v2f64:
|
|
; CHECK-NOFP16-GI: // %bb.0: // %entry
|
|
; CHECK-NOFP16-GI-NEXT: sub sp, sp, #48
|
|
; CHECK-NOFP16-GI-NEXT: str x30, [sp, #16] // 8-byte Folded Spill
|
|
; CHECK-NOFP16-GI-NEXT: stp x20, x19, [sp, #32] // 16-byte Folded Spill
|
|
; CHECK-NOFP16-GI-NEXT: .cfi_def_cfa_offset 48
|
|
; CHECK-NOFP16-GI-NEXT: .cfi_offset w19, -8
|
|
; CHECK-NOFP16-GI-NEXT: .cfi_offset w20, -16
|
|
; CHECK-NOFP16-GI-NEXT: .cfi_offset w30, -32
|
|
; CHECK-NOFP16-GI-NEXT: mov x19, x2
|
|
; CHECK-NOFP16-GI-NEXT: mov x20, x3
|
|
; CHECK-NOFP16-GI-NEXT: bl __floattidf
|
|
; CHECK-NOFP16-GI-NEXT: mov x0, x19
|
|
; CHECK-NOFP16-GI-NEXT: mov x1, x20
|
|
; CHECK-NOFP16-GI-NEXT: // kill: def $d0 killed $d0 def $q0
|
|
; CHECK-NOFP16-GI-NEXT: str q0, [sp] // 16-byte Folded Spill
|
|
; CHECK-NOFP16-GI-NEXT: bl __floattidf
|
|
; CHECK-NOFP16-GI-NEXT: ldr q1, [sp] // 16-byte Folded Reload
|
|
; CHECK-NOFP16-GI-NEXT: // kill: def $d0 killed $d0 def $q0
|
|
; CHECK-NOFP16-GI-NEXT: ldp x20, x19, [sp, #32] // 16-byte Folded Reload
|
|
; CHECK-NOFP16-GI-NEXT: ldr x30, [sp, #16] // 8-byte Folded Reload
|
|
; CHECK-NOFP16-GI-NEXT: mov v1.d[1], v0.d[0]
|
|
; CHECK-NOFP16-GI-NEXT: mov v0.16b, v1.16b
|
|
; CHECK-NOFP16-GI-NEXT: add sp, sp, #48
|
|
; CHECK-NOFP16-GI-NEXT: ret
|
|
;
|
|
; CHECK-FP16-GI-LABEL: stofp_v2i128_v2f64:
|
|
; CHECK-FP16-GI: // %bb.0: // %entry
|
|
; CHECK-FP16-GI-NEXT: sub sp, sp, #48
|
|
; CHECK-FP16-GI-NEXT: str x30, [sp, #16] // 8-byte Folded Spill
|
|
; CHECK-FP16-GI-NEXT: stp x20, x19, [sp, #32] // 16-byte Folded Spill
|
|
; CHECK-FP16-GI-NEXT: .cfi_def_cfa_offset 48
|
|
; CHECK-FP16-GI-NEXT: .cfi_offset w19, -8
|
|
; CHECK-FP16-GI-NEXT: .cfi_offset w20, -16
|
|
; CHECK-FP16-GI-NEXT: .cfi_offset w30, -32
|
|
; CHECK-FP16-GI-NEXT: mov x19, x2
|
|
; CHECK-FP16-GI-NEXT: mov x20, x3
|
|
; CHECK-FP16-GI-NEXT: bl __floattidf
|
|
; CHECK-FP16-GI-NEXT: mov x0, x19
|
|
; CHECK-FP16-GI-NEXT: mov x1, x20
|
|
; CHECK-FP16-GI-NEXT: // kill: def $d0 killed $d0 def $q0
|
|
; CHECK-FP16-GI-NEXT: str q0, [sp] // 16-byte Folded Spill
|
|
; CHECK-FP16-GI-NEXT: bl __floattidf
|
|
; CHECK-FP16-GI-NEXT: ldr q1, [sp] // 16-byte Folded Reload
|
|
; CHECK-FP16-GI-NEXT: // kill: def $d0 killed $d0 def $q0
|
|
; CHECK-FP16-GI-NEXT: ldp x20, x19, [sp, #32] // 16-byte Folded Reload
|
|
; CHECK-FP16-GI-NEXT: ldr x30, [sp, #16] // 8-byte Folded Reload
|
|
; CHECK-FP16-GI-NEXT: mov v1.d[1], v0.d[0]
|
|
; CHECK-FP16-GI-NEXT: mov v0.16b, v1.16b
|
|
; CHECK-FP16-GI-NEXT: add sp, sp, #48
|
|
; CHECK-FP16-GI-NEXT: ret
|
|
entry:
|
|
%c = sitofp <2 x i128> %a to <2 x double>
|
|
ret <2 x double> %c
|
|
}
|
|
|
|
define <2 x double> @utofp_v2i128_v2f64(<2 x i128> %a) {
|
|
; CHECK-NOFP16-SD-LABEL: utofp_v2i128_v2f64:
|
|
; CHECK-NOFP16-SD: // %bb.0: // %entry
|
|
; CHECK-NOFP16-SD-NEXT: sub sp, sp, #48
|
|
; CHECK-NOFP16-SD-NEXT: str x30, [sp, #16] // 8-byte Folded Spill
|
|
; CHECK-NOFP16-SD-NEXT: stp x20, x19, [sp, #32] // 16-byte Folded Spill
|
|
; CHECK-NOFP16-SD-NEXT: .cfi_def_cfa_offset 48
|
|
; CHECK-NOFP16-SD-NEXT: .cfi_offset w19, -8
|
|
; CHECK-NOFP16-SD-NEXT: .cfi_offset w20, -16
|
|
; CHECK-NOFP16-SD-NEXT: .cfi_offset w30, -32
|
|
; CHECK-NOFP16-SD-NEXT: mov x19, x1
|
|
; CHECK-NOFP16-SD-NEXT: mov x20, x0
|
|
; CHECK-NOFP16-SD-NEXT: mov x0, x2
|
|
; CHECK-NOFP16-SD-NEXT: mov x1, x3
|
|
; CHECK-NOFP16-SD-NEXT: bl __floatuntidf
|
|
; CHECK-NOFP16-SD-NEXT: mov x0, x20
|
|
; CHECK-NOFP16-SD-NEXT: mov x1, x19
|
|
; CHECK-NOFP16-SD-NEXT: // kill: def $d0 killed $d0 def $q0
|
|
; CHECK-NOFP16-SD-NEXT: str q0, [sp] // 16-byte Folded Spill
|
|
; CHECK-NOFP16-SD-NEXT: bl __floatuntidf
|
|
; CHECK-NOFP16-SD-NEXT: ldr q1, [sp] // 16-byte Folded Reload
|
|
; CHECK-NOFP16-SD-NEXT: ldp x20, x19, [sp, #32] // 16-byte Folded Reload
|
|
; CHECK-NOFP16-SD-NEXT: // kill: def $d0 killed $d0 def $q0
|
|
; CHECK-NOFP16-SD-NEXT: ldr x30, [sp, #16] // 8-byte Folded Reload
|
|
; CHECK-NOFP16-SD-NEXT: mov v0.d[1], v1.d[0]
|
|
; CHECK-NOFP16-SD-NEXT: add sp, sp, #48
|
|
; CHECK-NOFP16-SD-NEXT: ret
|
|
;
|
|
; CHECK-FP16-SD-LABEL: utofp_v2i128_v2f64:
|
|
; CHECK-FP16-SD: // %bb.0: // %entry
|
|
; CHECK-FP16-SD-NEXT: sub sp, sp, #48
|
|
; CHECK-FP16-SD-NEXT: str x30, [sp, #16] // 8-byte Folded Spill
|
|
; CHECK-FP16-SD-NEXT: stp x20, x19, [sp, #32] // 16-byte Folded Spill
|
|
; CHECK-FP16-SD-NEXT: .cfi_def_cfa_offset 48
|
|
; CHECK-FP16-SD-NEXT: .cfi_offset w19, -8
|
|
; CHECK-FP16-SD-NEXT: .cfi_offset w20, -16
|
|
; CHECK-FP16-SD-NEXT: .cfi_offset w30, -32
|
|
; CHECK-FP16-SD-NEXT: mov x19, x1
|
|
; CHECK-FP16-SD-NEXT: mov x20, x0
|
|
; CHECK-FP16-SD-NEXT: mov x0, x2
|
|
; CHECK-FP16-SD-NEXT: mov x1, x3
|
|
; CHECK-FP16-SD-NEXT: bl __floatuntidf
|
|
; CHECK-FP16-SD-NEXT: mov x0, x20
|
|
; CHECK-FP16-SD-NEXT: mov x1, x19
|
|
; CHECK-FP16-SD-NEXT: // kill: def $d0 killed $d0 def $q0
|
|
; CHECK-FP16-SD-NEXT: str q0, [sp] // 16-byte Folded Spill
|
|
; CHECK-FP16-SD-NEXT: bl __floatuntidf
|
|
; CHECK-FP16-SD-NEXT: ldr q1, [sp] // 16-byte Folded Reload
|
|
; CHECK-FP16-SD-NEXT: ldp x20, x19, [sp, #32] // 16-byte Folded Reload
|
|
; CHECK-FP16-SD-NEXT: // kill: def $d0 killed $d0 def $q0
|
|
; CHECK-FP16-SD-NEXT: ldr x30, [sp, #16] // 8-byte Folded Reload
|
|
; CHECK-FP16-SD-NEXT: mov v0.d[1], v1.d[0]
|
|
; CHECK-FP16-SD-NEXT: add sp, sp, #48
|
|
; CHECK-FP16-SD-NEXT: ret
|
|
;
|
|
; CHECK-NOFP16-GI-LABEL: utofp_v2i128_v2f64:
|
|
; CHECK-NOFP16-GI: // %bb.0: // %entry
|
|
; CHECK-NOFP16-GI-NEXT: sub sp, sp, #48
|
|
; CHECK-NOFP16-GI-NEXT: str x30, [sp, #16] // 8-byte Folded Spill
|
|
; CHECK-NOFP16-GI-NEXT: stp x20, x19, [sp, #32] // 16-byte Folded Spill
|
|
; CHECK-NOFP16-GI-NEXT: .cfi_def_cfa_offset 48
|
|
; CHECK-NOFP16-GI-NEXT: .cfi_offset w19, -8
|
|
; CHECK-NOFP16-GI-NEXT: .cfi_offset w20, -16
|
|
; CHECK-NOFP16-GI-NEXT: .cfi_offset w30, -32
|
|
; CHECK-NOFP16-GI-NEXT: mov x19, x2
|
|
; CHECK-NOFP16-GI-NEXT: mov x20, x3
|
|
; CHECK-NOFP16-GI-NEXT: bl __floatuntidf
|
|
; CHECK-NOFP16-GI-NEXT: mov x0, x19
|
|
; CHECK-NOFP16-GI-NEXT: mov x1, x20
|
|
; CHECK-NOFP16-GI-NEXT: // kill: def $d0 killed $d0 def $q0
|
|
; CHECK-NOFP16-GI-NEXT: str q0, [sp] // 16-byte Folded Spill
|
|
; CHECK-NOFP16-GI-NEXT: bl __floatuntidf
|
|
; CHECK-NOFP16-GI-NEXT: ldr q1, [sp] // 16-byte Folded Reload
|
|
; CHECK-NOFP16-GI-NEXT: // kill: def $d0 killed $d0 def $q0
|
|
; CHECK-NOFP16-GI-NEXT: ldp x20, x19, [sp, #32] // 16-byte Folded Reload
|
|
; CHECK-NOFP16-GI-NEXT: ldr x30, [sp, #16] // 8-byte Folded Reload
|
|
; CHECK-NOFP16-GI-NEXT: mov v1.d[1], v0.d[0]
|
|
; CHECK-NOFP16-GI-NEXT: mov v0.16b, v1.16b
|
|
; CHECK-NOFP16-GI-NEXT: add sp, sp, #48
|
|
; CHECK-NOFP16-GI-NEXT: ret
|
|
;
|
|
; CHECK-FP16-GI-LABEL: utofp_v2i128_v2f64:
|
|
; CHECK-FP16-GI: // %bb.0: // %entry
|
|
; CHECK-FP16-GI-NEXT: sub sp, sp, #48
|
|
; CHECK-FP16-GI-NEXT: str x30, [sp, #16] // 8-byte Folded Spill
|
|
; CHECK-FP16-GI-NEXT: stp x20, x19, [sp, #32] // 16-byte Folded Spill
|
|
; CHECK-FP16-GI-NEXT: .cfi_def_cfa_offset 48
|
|
; CHECK-FP16-GI-NEXT: .cfi_offset w19, -8
|
|
; CHECK-FP16-GI-NEXT: .cfi_offset w20, -16
|
|
; CHECK-FP16-GI-NEXT: .cfi_offset w30, -32
|
|
; CHECK-FP16-GI-NEXT: mov x19, x2
|
|
; CHECK-FP16-GI-NEXT: mov x20, x3
|
|
; CHECK-FP16-GI-NEXT: bl __floatuntidf
|
|
; CHECK-FP16-GI-NEXT: mov x0, x19
|
|
; CHECK-FP16-GI-NEXT: mov x1, x20
|
|
; CHECK-FP16-GI-NEXT: // kill: def $d0 killed $d0 def $q0
|
|
; CHECK-FP16-GI-NEXT: str q0, [sp] // 16-byte Folded Spill
|
|
; CHECK-FP16-GI-NEXT: bl __floatuntidf
|
|
; CHECK-FP16-GI-NEXT: ldr q1, [sp] // 16-byte Folded Reload
|
|
; CHECK-FP16-GI-NEXT: // kill: def $d0 killed $d0 def $q0
|
|
; CHECK-FP16-GI-NEXT: ldp x20, x19, [sp, #32] // 16-byte Folded Reload
|
|
; CHECK-FP16-GI-NEXT: ldr x30, [sp, #16] // 8-byte Folded Reload
|
|
; CHECK-FP16-GI-NEXT: mov v1.d[1], v0.d[0]
|
|
; CHECK-FP16-GI-NEXT: mov v0.16b, v1.16b
|
|
; CHECK-FP16-GI-NEXT: add sp, sp, #48
|
|
; CHECK-FP16-GI-NEXT: ret
|
|
entry:
|
|
%c = uitofp <2 x i128> %a to <2 x double>
|
|
ret <2 x double> %c
|
|
}
|
|
|
|
define <2 x float> @stofp_v2i64_v2f32(<2 x i64> %a) {
|
|
; CHECK-LABEL: stofp_v2i64_v2f32:
|
|
; CHECK: // %bb.0: // %entry
|
|
; CHECK-NEXT: mov x8, v0.d[1]
|
|
; CHECK-NEXT: fmov x9, d0
|
|
; CHECK-NEXT: scvtf s0, x9
|
|
; CHECK-NEXT: scvtf s1, x8
|
|
; CHECK-NEXT: mov v0.s[1], v1.s[0]
|
|
; CHECK-NEXT: // kill: def $d0 killed $d0 killed $q0
|
|
; CHECK-NEXT: ret
|
|
entry:
|
|
%c = sitofp <2 x i64> %a to <2 x float>
|
|
ret <2 x float> %c
|
|
}
|
|
|
|
define <2 x float> @utofp_v2i64_v2f32(<2 x i64> %a) {
|
|
; CHECK-LABEL: utofp_v2i64_v2f32:
|
|
; CHECK: // %bb.0: // %entry
|
|
; CHECK-NEXT: mov x8, v0.d[1]
|
|
; CHECK-NEXT: fmov x9, d0
|
|
; CHECK-NEXT: ucvtf s0, x9
|
|
; CHECK-NEXT: ucvtf s1, x8
|
|
; CHECK-NEXT: mov v0.s[1], v1.s[0]
|
|
; CHECK-NEXT: // kill: def $d0 killed $d0 killed $q0
|
|
; CHECK-NEXT: ret
|
|
entry:
|
|
%c = uitofp <2 x i64> %a to <2 x float>
|
|
ret <2 x float> %c
|
|
}
|
|
|
|
define <3 x float> @stofp_v3i64_v3f32(<3 x i64> %a) {
|
|
; CHECK-NOFP16-SD-LABEL: stofp_v3i64_v3f32:
|
|
; CHECK-NOFP16-SD: // %bb.0: // %entry
|
|
; CHECK-NOFP16-SD-NEXT: // kill: def $d0 killed $d0 def $q0
|
|
; CHECK-NOFP16-SD-NEXT: fmov x8, d0
|
|
; CHECK-NOFP16-SD-NEXT: // kill: def $d1 killed $d1 def $q1
|
|
; CHECK-NOFP16-SD-NEXT: // kill: def $d2 killed $d2 def $q2
|
|
; CHECK-NOFP16-SD-NEXT: movi v0.2d, #0000000000000000
|
|
; CHECK-NOFP16-SD-NEXT: scvtf s3, x8
|
|
; CHECK-NOFP16-SD-NEXT: fmov x8, d1
|
|
; CHECK-NOFP16-SD-NEXT: scvtf s1, x8
|
|
; CHECK-NOFP16-SD-NEXT: fmov x8, d2
|
|
; CHECK-NOFP16-SD-NEXT: mov v0.s[0], v3.s[0]
|
|
; CHECK-NOFP16-SD-NEXT: mov v0.s[1], v1.s[0]
|
|
; CHECK-NOFP16-SD-NEXT: scvtf s1, x8
|
|
; CHECK-NOFP16-SD-NEXT: mov v0.s[2], v1.s[0]
|
|
; CHECK-NOFP16-SD-NEXT: ret
|
|
;
|
|
; CHECK-FP16-SD-LABEL: stofp_v3i64_v3f32:
|
|
; CHECK-FP16-SD: // %bb.0: // %entry
|
|
; CHECK-FP16-SD-NEXT: // kill: def $d0 killed $d0 def $q0
|
|
; CHECK-FP16-SD-NEXT: fmov x8, d0
|
|
; CHECK-FP16-SD-NEXT: // kill: def $d1 killed $d1 def $q1
|
|
; CHECK-FP16-SD-NEXT: // kill: def $d2 killed $d2 def $q2
|
|
; CHECK-FP16-SD-NEXT: movi v0.2d, #0000000000000000
|
|
; CHECK-FP16-SD-NEXT: scvtf s3, x8
|
|
; CHECK-FP16-SD-NEXT: fmov x8, d1
|
|
; CHECK-FP16-SD-NEXT: scvtf s1, x8
|
|
; CHECK-FP16-SD-NEXT: fmov x8, d2
|
|
; CHECK-FP16-SD-NEXT: mov v0.s[0], v3.s[0]
|
|
; CHECK-FP16-SD-NEXT: mov v0.s[1], v1.s[0]
|
|
; CHECK-FP16-SD-NEXT: scvtf s1, x8
|
|
; CHECK-FP16-SD-NEXT: mov v0.s[2], v1.s[0]
|
|
; CHECK-FP16-SD-NEXT: ret
|
|
;
|
|
; CHECK-NOFP16-GI-LABEL: stofp_v3i64_v3f32:
|
|
; CHECK-NOFP16-GI: // %bb.0: // %entry
|
|
; CHECK-NOFP16-GI-NEXT: fmov x8, d0
|
|
; CHECK-NOFP16-GI-NEXT: fmov x9, d1
|
|
; CHECK-NOFP16-GI-NEXT: scvtf s0, x8
|
|
; CHECK-NOFP16-GI-NEXT: scvtf s1, x9
|
|
; CHECK-NOFP16-GI-NEXT: fmov x8, d2
|
|
; CHECK-NOFP16-GI-NEXT: scvtf s2, x8
|
|
; CHECK-NOFP16-GI-NEXT: mov v0.s[1], v1.s[0]
|
|
; CHECK-NOFP16-GI-NEXT: mov v0.s[2], v2.s[0]
|
|
; CHECK-NOFP16-GI-NEXT: ret
|
|
;
|
|
; CHECK-FP16-GI-LABEL: stofp_v3i64_v3f32:
|
|
; CHECK-FP16-GI: // %bb.0: // %entry
|
|
; CHECK-FP16-GI-NEXT: fmov x8, d0
|
|
; CHECK-FP16-GI-NEXT: fmov x9, d1
|
|
; CHECK-FP16-GI-NEXT: scvtf s0, x8
|
|
; CHECK-FP16-GI-NEXT: scvtf s1, x9
|
|
; CHECK-FP16-GI-NEXT: fmov x8, d2
|
|
; CHECK-FP16-GI-NEXT: scvtf s2, x8
|
|
; CHECK-FP16-GI-NEXT: mov v0.s[1], v1.s[0]
|
|
; CHECK-FP16-GI-NEXT: mov v0.s[2], v2.s[0]
|
|
; CHECK-FP16-GI-NEXT: ret
|
|
entry:
|
|
%c = sitofp <3 x i64> %a to <3 x float>
|
|
ret <3 x float> %c
|
|
}
|
|
|
|
define <3 x float> @utofp_v3i64_v3f32(<3 x i64> %a) {
|
|
; CHECK-NOFP16-SD-LABEL: utofp_v3i64_v3f32:
|
|
; CHECK-NOFP16-SD: // %bb.0: // %entry
|
|
; CHECK-NOFP16-SD-NEXT: // kill: def $d0 killed $d0 def $q0
|
|
; CHECK-NOFP16-SD-NEXT: fmov x8, d0
|
|
; CHECK-NOFP16-SD-NEXT: // kill: def $d1 killed $d1 def $q1
|
|
; CHECK-NOFP16-SD-NEXT: // kill: def $d2 killed $d2 def $q2
|
|
; CHECK-NOFP16-SD-NEXT: movi v0.2d, #0000000000000000
|
|
; CHECK-NOFP16-SD-NEXT: ucvtf s3, x8
|
|
; CHECK-NOFP16-SD-NEXT: fmov x8, d1
|
|
; CHECK-NOFP16-SD-NEXT: ucvtf s1, x8
|
|
; CHECK-NOFP16-SD-NEXT: fmov x8, d2
|
|
; CHECK-NOFP16-SD-NEXT: mov v0.s[0], v3.s[0]
|
|
; CHECK-NOFP16-SD-NEXT: mov v0.s[1], v1.s[0]
|
|
; CHECK-NOFP16-SD-NEXT: ucvtf s1, x8
|
|
; CHECK-NOFP16-SD-NEXT: mov v0.s[2], v1.s[0]
|
|
; CHECK-NOFP16-SD-NEXT: ret
|
|
;
|
|
; CHECK-FP16-SD-LABEL: utofp_v3i64_v3f32:
|
|
; CHECK-FP16-SD: // %bb.0: // %entry
|
|
; CHECK-FP16-SD-NEXT: // kill: def $d0 killed $d0 def $q0
|
|
; CHECK-FP16-SD-NEXT: fmov x8, d0
|
|
; CHECK-FP16-SD-NEXT: // kill: def $d1 killed $d1 def $q1
|
|
; CHECK-FP16-SD-NEXT: // kill: def $d2 killed $d2 def $q2
|
|
; CHECK-FP16-SD-NEXT: movi v0.2d, #0000000000000000
|
|
; CHECK-FP16-SD-NEXT: ucvtf s3, x8
|
|
; CHECK-FP16-SD-NEXT: fmov x8, d1
|
|
; CHECK-FP16-SD-NEXT: ucvtf s1, x8
|
|
; CHECK-FP16-SD-NEXT: fmov x8, d2
|
|
; CHECK-FP16-SD-NEXT: mov v0.s[0], v3.s[0]
|
|
; CHECK-FP16-SD-NEXT: mov v0.s[1], v1.s[0]
|
|
; CHECK-FP16-SD-NEXT: ucvtf s1, x8
|
|
; CHECK-FP16-SD-NEXT: mov v0.s[2], v1.s[0]
|
|
; CHECK-FP16-SD-NEXT: ret
|
|
;
|
|
; CHECK-NOFP16-GI-LABEL: utofp_v3i64_v3f32:
|
|
; CHECK-NOFP16-GI: // %bb.0: // %entry
|
|
; CHECK-NOFP16-GI-NEXT: fmov x8, d0
|
|
; CHECK-NOFP16-GI-NEXT: fmov x9, d1
|
|
; CHECK-NOFP16-GI-NEXT: ucvtf s0, x8
|
|
; CHECK-NOFP16-GI-NEXT: ucvtf s1, x9
|
|
; CHECK-NOFP16-GI-NEXT: fmov x8, d2
|
|
; CHECK-NOFP16-GI-NEXT: ucvtf s2, x8
|
|
; CHECK-NOFP16-GI-NEXT: mov v0.s[1], v1.s[0]
|
|
; CHECK-NOFP16-GI-NEXT: mov v0.s[2], v2.s[0]
|
|
; CHECK-NOFP16-GI-NEXT: ret
|
|
;
|
|
; CHECK-FP16-GI-LABEL: utofp_v3i64_v3f32:
|
|
; CHECK-FP16-GI: // %bb.0: // %entry
|
|
; CHECK-FP16-GI-NEXT: fmov x8, d0
|
|
; CHECK-FP16-GI-NEXT: fmov x9, d1
|
|
; CHECK-FP16-GI-NEXT: ucvtf s0, x8
|
|
; CHECK-FP16-GI-NEXT: ucvtf s1, x9
|
|
; CHECK-FP16-GI-NEXT: fmov x8, d2
|
|
; CHECK-FP16-GI-NEXT: ucvtf s2, x8
|
|
; CHECK-FP16-GI-NEXT: mov v0.s[1], v1.s[0]
|
|
; CHECK-FP16-GI-NEXT: mov v0.s[2], v2.s[0]
|
|
; CHECK-FP16-GI-NEXT: ret
|
|
entry:
|
|
%c = uitofp <3 x i64> %a to <3 x float>
|
|
ret <3 x float> %c
|
|
}
|
|
|
|
define <4 x float> @stofp_v4i64_v4f32(<4 x i64> %a) {
|
|
; CHECK-NOFP16-SD-LABEL: stofp_v4i64_v4f32:
|
|
; CHECK-NOFP16-SD: // %bb.0: // %entry
|
|
; CHECK-NOFP16-SD-NEXT: mov x8, v0.d[1]
|
|
; CHECK-NOFP16-SD-NEXT: fmov x9, d0
|
|
; CHECK-NOFP16-SD-NEXT: scvtf s0, x9
|
|
; CHECK-NOFP16-SD-NEXT: mov x9, v1.d[1]
|
|
; CHECK-NOFP16-SD-NEXT: scvtf s2, x8
|
|
; CHECK-NOFP16-SD-NEXT: fmov x8, d1
|
|
; CHECK-NOFP16-SD-NEXT: scvtf s1, x8
|
|
; CHECK-NOFP16-SD-NEXT: mov v0.s[1], v2.s[0]
|
|
; CHECK-NOFP16-SD-NEXT: mov v0.s[2], v1.s[0]
|
|
; CHECK-NOFP16-SD-NEXT: scvtf s1, x9
|
|
; CHECK-NOFP16-SD-NEXT: mov v0.s[3], v1.s[0]
|
|
; CHECK-NOFP16-SD-NEXT: ret
|
|
;
|
|
; CHECK-FP16-SD-LABEL: stofp_v4i64_v4f32:
|
|
; CHECK-FP16-SD: // %bb.0: // %entry
|
|
; CHECK-FP16-SD-NEXT: mov x8, v0.d[1]
|
|
; CHECK-FP16-SD-NEXT: fmov x9, d0
|
|
; CHECK-FP16-SD-NEXT: scvtf s0, x9
|
|
; CHECK-FP16-SD-NEXT: mov x9, v1.d[1]
|
|
; CHECK-FP16-SD-NEXT: scvtf s2, x8
|
|
; CHECK-FP16-SD-NEXT: fmov x8, d1
|
|
; CHECK-FP16-SD-NEXT: scvtf s1, x8
|
|
; CHECK-FP16-SD-NEXT: mov v0.s[1], v2.s[0]
|
|
; CHECK-FP16-SD-NEXT: mov v0.s[2], v1.s[0]
|
|
; CHECK-FP16-SD-NEXT: scvtf s1, x9
|
|
; CHECK-FP16-SD-NEXT: mov v0.s[3], v1.s[0]
|
|
; CHECK-FP16-SD-NEXT: ret
|
|
;
|
|
; CHECK-NOFP16-GI-LABEL: stofp_v4i64_v4f32:
|
|
; CHECK-NOFP16-GI: // %bb.0: // %entry
|
|
; CHECK-NOFP16-GI-NEXT: mov x8, v0.d[1]
|
|
; CHECK-NOFP16-GI-NEXT: fmov x9, d0
|
|
; CHECK-NOFP16-GI-NEXT: scvtf s0, x9
|
|
; CHECK-NOFP16-GI-NEXT: mov x9, v1.d[1]
|
|
; CHECK-NOFP16-GI-NEXT: scvtf s2, x8
|
|
; CHECK-NOFP16-GI-NEXT: fmov x8, d1
|
|
; CHECK-NOFP16-GI-NEXT: scvtf s1, x8
|
|
; CHECK-NOFP16-GI-NEXT: mov v0.s[1], v2.s[0]
|
|
; CHECK-NOFP16-GI-NEXT: scvtf s2, x9
|
|
; CHECK-NOFP16-GI-NEXT: mov v0.s[2], v1.s[0]
|
|
; CHECK-NOFP16-GI-NEXT: mov v0.s[3], v2.s[0]
|
|
; CHECK-NOFP16-GI-NEXT: ret
|
|
;
|
|
; CHECK-FP16-GI-LABEL: stofp_v4i64_v4f32:
|
|
; CHECK-FP16-GI: // %bb.0: // %entry
|
|
; CHECK-FP16-GI-NEXT: mov x8, v0.d[1]
|
|
; CHECK-FP16-GI-NEXT: fmov x9, d0
|
|
; CHECK-FP16-GI-NEXT: scvtf s0, x9
|
|
; CHECK-FP16-GI-NEXT: mov x9, v1.d[1]
|
|
; CHECK-FP16-GI-NEXT: scvtf s2, x8
|
|
; CHECK-FP16-GI-NEXT: fmov x8, d1
|
|
; CHECK-FP16-GI-NEXT: scvtf s1, x8
|
|
; CHECK-FP16-GI-NEXT: mov v0.s[1], v2.s[0]
|
|
; CHECK-FP16-GI-NEXT: scvtf s2, x9
|
|
; CHECK-FP16-GI-NEXT: mov v0.s[2], v1.s[0]
|
|
; CHECK-FP16-GI-NEXT: mov v0.s[3], v2.s[0]
|
|
; CHECK-FP16-GI-NEXT: ret
|
|
entry:
|
|
%c = sitofp <4 x i64> %a to <4 x float>
|
|
ret <4 x float> %c
|
|
}
|
|
|
|
define <4 x float> @utofp_v4i64_v4f32(<4 x i64> %a) {
|
|
; CHECK-NOFP16-SD-LABEL: utofp_v4i64_v4f32:
|
|
; CHECK-NOFP16-SD: // %bb.0: // %entry
|
|
; CHECK-NOFP16-SD-NEXT: mov x8, v0.d[1]
|
|
; CHECK-NOFP16-SD-NEXT: fmov x9, d0
|
|
; CHECK-NOFP16-SD-NEXT: ucvtf s0, x9
|
|
; CHECK-NOFP16-SD-NEXT: mov x9, v1.d[1]
|
|
; CHECK-NOFP16-SD-NEXT: ucvtf s2, x8
|
|
; CHECK-NOFP16-SD-NEXT: fmov x8, d1
|
|
; CHECK-NOFP16-SD-NEXT: ucvtf s1, x8
|
|
; CHECK-NOFP16-SD-NEXT: mov v0.s[1], v2.s[0]
|
|
; CHECK-NOFP16-SD-NEXT: mov v0.s[2], v1.s[0]
|
|
; CHECK-NOFP16-SD-NEXT: ucvtf s1, x9
|
|
; CHECK-NOFP16-SD-NEXT: mov v0.s[3], v1.s[0]
|
|
; CHECK-NOFP16-SD-NEXT: ret
|
|
;
|
|
; CHECK-FP16-SD-LABEL: utofp_v4i64_v4f32:
|
|
; CHECK-FP16-SD: // %bb.0: // %entry
|
|
; CHECK-FP16-SD-NEXT: mov x8, v0.d[1]
|
|
; CHECK-FP16-SD-NEXT: fmov x9, d0
|
|
; CHECK-FP16-SD-NEXT: ucvtf s0, x9
|
|
; CHECK-FP16-SD-NEXT: mov x9, v1.d[1]
|
|
; CHECK-FP16-SD-NEXT: ucvtf s2, x8
|
|
; CHECK-FP16-SD-NEXT: fmov x8, d1
|
|
; CHECK-FP16-SD-NEXT: ucvtf s1, x8
|
|
; CHECK-FP16-SD-NEXT: mov v0.s[1], v2.s[0]
|
|
; CHECK-FP16-SD-NEXT: mov v0.s[2], v1.s[0]
|
|
; CHECK-FP16-SD-NEXT: ucvtf s1, x9
|
|
; CHECK-FP16-SD-NEXT: mov v0.s[3], v1.s[0]
|
|
; CHECK-FP16-SD-NEXT: ret
|
|
;
|
|
; CHECK-NOFP16-GI-LABEL: utofp_v4i64_v4f32:
|
|
; CHECK-NOFP16-GI: // %bb.0: // %entry
|
|
; CHECK-NOFP16-GI-NEXT: mov x8, v0.d[1]
|
|
; CHECK-NOFP16-GI-NEXT: fmov x9, d0
|
|
; CHECK-NOFP16-GI-NEXT: ucvtf s0, x9
|
|
; CHECK-NOFP16-GI-NEXT: mov x9, v1.d[1]
|
|
; CHECK-NOFP16-GI-NEXT: ucvtf s2, x8
|
|
; CHECK-NOFP16-GI-NEXT: fmov x8, d1
|
|
; CHECK-NOFP16-GI-NEXT: ucvtf s1, x8
|
|
; CHECK-NOFP16-GI-NEXT: mov v0.s[1], v2.s[0]
|
|
; CHECK-NOFP16-GI-NEXT: ucvtf s2, x9
|
|
; CHECK-NOFP16-GI-NEXT: mov v0.s[2], v1.s[0]
|
|
; CHECK-NOFP16-GI-NEXT: mov v0.s[3], v2.s[0]
|
|
; CHECK-NOFP16-GI-NEXT: ret
|
|
;
|
|
; CHECK-FP16-GI-LABEL: utofp_v4i64_v4f32:
|
|
; CHECK-FP16-GI: // %bb.0: // %entry
|
|
; CHECK-FP16-GI-NEXT: mov x8, v0.d[1]
|
|
; CHECK-FP16-GI-NEXT: fmov x9, d0
|
|
; CHECK-FP16-GI-NEXT: ucvtf s0, x9
|
|
; CHECK-FP16-GI-NEXT: mov x9, v1.d[1]
|
|
; CHECK-FP16-GI-NEXT: ucvtf s2, x8
|
|
; CHECK-FP16-GI-NEXT: fmov x8, d1
|
|
; CHECK-FP16-GI-NEXT: ucvtf s1, x8
|
|
; CHECK-FP16-GI-NEXT: mov v0.s[1], v2.s[0]
|
|
; CHECK-FP16-GI-NEXT: ucvtf s2, x9
|
|
; CHECK-FP16-GI-NEXT: mov v0.s[2], v1.s[0]
|
|
; CHECK-FP16-GI-NEXT: mov v0.s[3], v2.s[0]
|
|
; CHECK-FP16-GI-NEXT: ret
|
|
entry:
|
|
%c = uitofp <4 x i64> %a to <4 x float>
|
|
ret <4 x float> %c
|
|
}
|
|
|
|
define <8 x float> @stofp_v8i64_v8f32(<8 x i64> %a) {
|
|
; CHECK-NOFP16-SD-LABEL: stofp_v8i64_v8f32:
|
|
; CHECK-NOFP16-SD: // %bb.0: // %entry
|
|
; CHECK-NOFP16-SD-NEXT: mov x8, v0.d[1]
|
|
; CHECK-NOFP16-SD-NEXT: mov x9, v2.d[1]
|
|
; CHECK-NOFP16-SD-NEXT: fmov x10, d0
|
|
; CHECK-NOFP16-SD-NEXT: fmov x11, d2
|
|
; CHECK-NOFP16-SD-NEXT: scvtf s0, x10
|
|
; CHECK-NOFP16-SD-NEXT: mov x10, v3.d[1]
|
|
; CHECK-NOFP16-SD-NEXT: scvtf s4, x8
|
|
; CHECK-NOFP16-SD-NEXT: scvtf s5, x9
|
|
; CHECK-NOFP16-SD-NEXT: scvtf s2, x11
|
|
; CHECK-NOFP16-SD-NEXT: fmov x9, d1
|
|
; CHECK-NOFP16-SD-NEXT: fmov x11, d3
|
|
; CHECK-NOFP16-SD-NEXT: mov x8, v1.d[1]
|
|
; CHECK-NOFP16-SD-NEXT: scvtf s1, x9
|
|
; CHECK-NOFP16-SD-NEXT: mov v0.s[1], v4.s[0]
|
|
; CHECK-NOFP16-SD-NEXT: scvtf s3, x11
|
|
; CHECK-NOFP16-SD-NEXT: mov v2.s[1], v5.s[0]
|
|
; CHECK-NOFP16-SD-NEXT: scvtf s4, x8
|
|
; CHECK-NOFP16-SD-NEXT: mov v0.s[2], v1.s[0]
|
|
; CHECK-NOFP16-SD-NEXT: scvtf s1, x10
|
|
; CHECK-NOFP16-SD-NEXT: mov v2.s[2], v3.s[0]
|
|
; CHECK-NOFP16-SD-NEXT: mov v0.s[3], v4.s[0]
|
|
; CHECK-NOFP16-SD-NEXT: mov v2.s[3], v1.s[0]
|
|
; CHECK-NOFP16-SD-NEXT: mov v1.16b, v2.16b
|
|
; CHECK-NOFP16-SD-NEXT: ret
|
|
;
|
|
; CHECK-FP16-SD-LABEL: stofp_v8i64_v8f32:
|
|
; CHECK-FP16-SD: // %bb.0: // %entry
|
|
; CHECK-FP16-SD-NEXT: mov x8, v0.d[1]
|
|
; CHECK-FP16-SD-NEXT: mov x9, v2.d[1]
|
|
; CHECK-FP16-SD-NEXT: fmov x10, d0
|
|
; CHECK-FP16-SD-NEXT: fmov x11, d2
|
|
; CHECK-FP16-SD-NEXT: scvtf s0, x10
|
|
; CHECK-FP16-SD-NEXT: mov x10, v3.d[1]
|
|
; CHECK-FP16-SD-NEXT: scvtf s4, x8
|
|
; CHECK-FP16-SD-NEXT: scvtf s5, x9
|
|
; CHECK-FP16-SD-NEXT: scvtf s2, x11
|
|
; CHECK-FP16-SD-NEXT: fmov x9, d1
|
|
; CHECK-FP16-SD-NEXT: fmov x11, d3
|
|
; CHECK-FP16-SD-NEXT: mov x8, v1.d[1]
|
|
; CHECK-FP16-SD-NEXT: scvtf s1, x9
|
|
; CHECK-FP16-SD-NEXT: mov v0.s[1], v4.s[0]
|
|
; CHECK-FP16-SD-NEXT: scvtf s3, x11
|
|
; CHECK-FP16-SD-NEXT: mov v2.s[1], v5.s[0]
|
|
; CHECK-FP16-SD-NEXT: scvtf s4, x8
|
|
; CHECK-FP16-SD-NEXT: mov v0.s[2], v1.s[0]
|
|
; CHECK-FP16-SD-NEXT: scvtf s1, x10
|
|
; CHECK-FP16-SD-NEXT: mov v2.s[2], v3.s[0]
|
|
; CHECK-FP16-SD-NEXT: mov v0.s[3], v4.s[0]
|
|
; CHECK-FP16-SD-NEXT: mov v2.s[3], v1.s[0]
|
|
; CHECK-FP16-SD-NEXT: mov v1.16b, v2.16b
|
|
; CHECK-FP16-SD-NEXT: ret
|
|
;
|
|
; CHECK-NOFP16-GI-LABEL: stofp_v8i64_v8f32:
|
|
; CHECK-NOFP16-GI: // %bb.0: // %entry
|
|
; CHECK-NOFP16-GI-NEXT: fmov x10, d0
|
|
; CHECK-NOFP16-GI-NEXT: mov x9, v2.d[1]
|
|
; CHECK-NOFP16-GI-NEXT: mov x8, v0.d[1]
|
|
; CHECK-NOFP16-GI-NEXT: scvtf s0, x10
|
|
; CHECK-NOFP16-GI-NEXT: fmov x10, d2
|
|
; CHECK-NOFP16-GI-NEXT: scvtf s5, x9
|
|
; CHECK-NOFP16-GI-NEXT: fmov x9, d1
|
|
; CHECK-NOFP16-GI-NEXT: scvtf s4, x8
|
|
; CHECK-NOFP16-GI-NEXT: mov x8, v1.d[1]
|
|
; CHECK-NOFP16-GI-NEXT: scvtf s2, x10
|
|
; CHECK-NOFP16-GI-NEXT: fmov x10, d3
|
|
; CHECK-NOFP16-GI-NEXT: scvtf s1, x9
|
|
; CHECK-NOFP16-GI-NEXT: mov x9, v3.d[1]
|
|
; CHECK-NOFP16-GI-NEXT: mov v0.s[1], v4.s[0]
|
|
; CHECK-NOFP16-GI-NEXT: scvtf s3, x10
|
|
; CHECK-NOFP16-GI-NEXT: scvtf s4, x8
|
|
; CHECK-NOFP16-GI-NEXT: mov v2.s[1], v5.s[0]
|
|
; CHECK-NOFP16-GI-NEXT: scvtf s5, x9
|
|
; CHECK-NOFP16-GI-NEXT: mov v0.s[2], v1.s[0]
|
|
; CHECK-NOFP16-GI-NEXT: mov v2.s[2], v3.s[0]
|
|
; CHECK-NOFP16-GI-NEXT: mov v0.s[3], v4.s[0]
|
|
; CHECK-NOFP16-GI-NEXT: mov v2.s[3], v5.s[0]
|
|
; CHECK-NOFP16-GI-NEXT: mov v1.16b, v2.16b
|
|
; CHECK-NOFP16-GI-NEXT: ret
|
|
;
|
|
; CHECK-FP16-GI-LABEL: stofp_v8i64_v8f32:
|
|
; CHECK-FP16-GI: // %bb.0: // %entry
|
|
; CHECK-FP16-GI-NEXT: fmov x10, d0
|
|
; CHECK-FP16-GI-NEXT: mov x9, v2.d[1]
|
|
; CHECK-FP16-GI-NEXT: mov x8, v0.d[1]
|
|
; CHECK-FP16-GI-NEXT: scvtf s0, x10
|
|
; CHECK-FP16-GI-NEXT: fmov x10, d2
|
|
; CHECK-FP16-GI-NEXT: scvtf s5, x9
|
|
; CHECK-FP16-GI-NEXT: fmov x9, d1
|
|
; CHECK-FP16-GI-NEXT: scvtf s4, x8
|
|
; CHECK-FP16-GI-NEXT: mov x8, v1.d[1]
|
|
; CHECK-FP16-GI-NEXT: scvtf s2, x10
|
|
; CHECK-FP16-GI-NEXT: fmov x10, d3
|
|
; CHECK-FP16-GI-NEXT: scvtf s1, x9
|
|
; CHECK-FP16-GI-NEXT: mov x9, v3.d[1]
|
|
; CHECK-FP16-GI-NEXT: mov v0.s[1], v4.s[0]
|
|
; CHECK-FP16-GI-NEXT: scvtf s3, x10
|
|
; CHECK-FP16-GI-NEXT: scvtf s4, x8
|
|
; CHECK-FP16-GI-NEXT: mov v2.s[1], v5.s[0]
|
|
; CHECK-FP16-GI-NEXT: scvtf s5, x9
|
|
; CHECK-FP16-GI-NEXT: mov v0.s[2], v1.s[0]
|
|
; CHECK-FP16-GI-NEXT: mov v2.s[2], v3.s[0]
|
|
; CHECK-FP16-GI-NEXT: mov v0.s[3], v4.s[0]
|
|
; CHECK-FP16-GI-NEXT: mov v2.s[3], v5.s[0]
|
|
; CHECK-FP16-GI-NEXT: mov v1.16b, v2.16b
|
|
; CHECK-FP16-GI-NEXT: ret
|
|
entry:
|
|
%c = sitofp <8 x i64> %a to <8 x float>
|
|
ret <8 x float> %c
|
|
}
|
|
|
|
define <8 x float> @utofp_v8i64_v8f32(<8 x i64> %a) {
|
|
; CHECK-NOFP16-SD-LABEL: utofp_v8i64_v8f32:
|
|
; CHECK-NOFP16-SD: // %bb.0: // %entry
|
|
; CHECK-NOFP16-SD-NEXT: mov x8, v0.d[1]
|
|
; CHECK-NOFP16-SD-NEXT: mov x9, v2.d[1]
|
|
; CHECK-NOFP16-SD-NEXT: fmov x10, d0
|
|
; CHECK-NOFP16-SD-NEXT: fmov x11, d2
|
|
; CHECK-NOFP16-SD-NEXT: ucvtf s0, x10
|
|
; CHECK-NOFP16-SD-NEXT: mov x10, v3.d[1]
|
|
; CHECK-NOFP16-SD-NEXT: ucvtf s4, x8
|
|
; CHECK-NOFP16-SD-NEXT: ucvtf s5, x9
|
|
; CHECK-NOFP16-SD-NEXT: ucvtf s2, x11
|
|
; CHECK-NOFP16-SD-NEXT: fmov x9, d1
|
|
; CHECK-NOFP16-SD-NEXT: fmov x11, d3
|
|
; CHECK-NOFP16-SD-NEXT: mov x8, v1.d[1]
|
|
; CHECK-NOFP16-SD-NEXT: ucvtf s1, x9
|
|
; CHECK-NOFP16-SD-NEXT: mov v0.s[1], v4.s[0]
|
|
; CHECK-NOFP16-SD-NEXT: ucvtf s3, x11
|
|
; CHECK-NOFP16-SD-NEXT: mov v2.s[1], v5.s[0]
|
|
; CHECK-NOFP16-SD-NEXT: ucvtf s4, x8
|
|
; CHECK-NOFP16-SD-NEXT: mov v0.s[2], v1.s[0]
|
|
; CHECK-NOFP16-SD-NEXT: ucvtf s1, x10
|
|
; CHECK-NOFP16-SD-NEXT: mov v2.s[2], v3.s[0]
|
|
; CHECK-NOFP16-SD-NEXT: mov v0.s[3], v4.s[0]
|
|
; CHECK-NOFP16-SD-NEXT: mov v2.s[3], v1.s[0]
|
|
; CHECK-NOFP16-SD-NEXT: mov v1.16b, v2.16b
|
|
; CHECK-NOFP16-SD-NEXT: ret
|
|
;
|
|
; CHECK-FP16-SD-LABEL: utofp_v8i64_v8f32:
|
|
; CHECK-FP16-SD: // %bb.0: // %entry
|
|
; CHECK-FP16-SD-NEXT: mov x8, v0.d[1]
|
|
; CHECK-FP16-SD-NEXT: mov x9, v2.d[1]
|
|
; CHECK-FP16-SD-NEXT: fmov x10, d0
|
|
; CHECK-FP16-SD-NEXT: fmov x11, d2
|
|
; CHECK-FP16-SD-NEXT: ucvtf s0, x10
|
|
; CHECK-FP16-SD-NEXT: mov x10, v3.d[1]
|
|
; CHECK-FP16-SD-NEXT: ucvtf s4, x8
|
|
; CHECK-FP16-SD-NEXT: ucvtf s5, x9
|
|
; CHECK-FP16-SD-NEXT: ucvtf s2, x11
|
|
; CHECK-FP16-SD-NEXT: fmov x9, d1
|
|
; CHECK-FP16-SD-NEXT: fmov x11, d3
|
|
; CHECK-FP16-SD-NEXT: mov x8, v1.d[1]
|
|
; CHECK-FP16-SD-NEXT: ucvtf s1, x9
|
|
; CHECK-FP16-SD-NEXT: mov v0.s[1], v4.s[0]
|
|
; CHECK-FP16-SD-NEXT: ucvtf s3, x11
|
|
; CHECK-FP16-SD-NEXT: mov v2.s[1], v5.s[0]
|
|
; CHECK-FP16-SD-NEXT: ucvtf s4, x8
|
|
; CHECK-FP16-SD-NEXT: mov v0.s[2], v1.s[0]
|
|
; CHECK-FP16-SD-NEXT: ucvtf s1, x10
|
|
; CHECK-FP16-SD-NEXT: mov v2.s[2], v3.s[0]
|
|
; CHECK-FP16-SD-NEXT: mov v0.s[3], v4.s[0]
|
|
; CHECK-FP16-SD-NEXT: mov v2.s[3], v1.s[0]
|
|
; CHECK-FP16-SD-NEXT: mov v1.16b, v2.16b
|
|
; CHECK-FP16-SD-NEXT: ret
|
|
;
|
|
; CHECK-NOFP16-GI-LABEL: utofp_v8i64_v8f32:
|
|
; CHECK-NOFP16-GI: // %bb.0: // %entry
|
|
; CHECK-NOFP16-GI-NEXT: fmov x10, d0
|
|
; CHECK-NOFP16-GI-NEXT: mov x9, v2.d[1]
|
|
; CHECK-NOFP16-GI-NEXT: mov x8, v0.d[1]
|
|
; CHECK-NOFP16-GI-NEXT: ucvtf s0, x10
|
|
; CHECK-NOFP16-GI-NEXT: fmov x10, d2
|
|
; CHECK-NOFP16-GI-NEXT: ucvtf s5, x9
|
|
; CHECK-NOFP16-GI-NEXT: fmov x9, d1
|
|
; CHECK-NOFP16-GI-NEXT: ucvtf s4, x8
|
|
; CHECK-NOFP16-GI-NEXT: mov x8, v1.d[1]
|
|
; CHECK-NOFP16-GI-NEXT: ucvtf s2, x10
|
|
; CHECK-NOFP16-GI-NEXT: fmov x10, d3
|
|
; CHECK-NOFP16-GI-NEXT: ucvtf s1, x9
|
|
; CHECK-NOFP16-GI-NEXT: mov x9, v3.d[1]
|
|
; CHECK-NOFP16-GI-NEXT: mov v0.s[1], v4.s[0]
|
|
; CHECK-NOFP16-GI-NEXT: ucvtf s3, x10
|
|
; CHECK-NOFP16-GI-NEXT: ucvtf s4, x8
|
|
; CHECK-NOFP16-GI-NEXT: mov v2.s[1], v5.s[0]
|
|
; CHECK-NOFP16-GI-NEXT: ucvtf s5, x9
|
|
; CHECK-NOFP16-GI-NEXT: mov v0.s[2], v1.s[0]
|
|
; CHECK-NOFP16-GI-NEXT: mov v2.s[2], v3.s[0]
|
|
; CHECK-NOFP16-GI-NEXT: mov v0.s[3], v4.s[0]
|
|
; CHECK-NOFP16-GI-NEXT: mov v2.s[3], v5.s[0]
|
|
; CHECK-NOFP16-GI-NEXT: mov v1.16b, v2.16b
|
|
; CHECK-NOFP16-GI-NEXT: ret
|
|
;
|
|
; CHECK-FP16-GI-LABEL: utofp_v8i64_v8f32:
|
|
; CHECK-FP16-GI: // %bb.0: // %entry
|
|
; CHECK-FP16-GI-NEXT: fmov x10, d0
|
|
; CHECK-FP16-GI-NEXT: mov x9, v2.d[1]
|
|
; CHECK-FP16-GI-NEXT: mov x8, v0.d[1]
|
|
; CHECK-FP16-GI-NEXT: ucvtf s0, x10
|
|
; CHECK-FP16-GI-NEXT: fmov x10, d2
|
|
; CHECK-FP16-GI-NEXT: ucvtf s5, x9
|
|
; CHECK-FP16-GI-NEXT: fmov x9, d1
|
|
; CHECK-FP16-GI-NEXT: ucvtf s4, x8
|
|
; CHECK-FP16-GI-NEXT: mov x8, v1.d[1]
|
|
; CHECK-FP16-GI-NEXT: ucvtf s2, x10
|
|
; CHECK-FP16-GI-NEXT: fmov x10, d3
|
|
; CHECK-FP16-GI-NEXT: ucvtf s1, x9
|
|
; CHECK-FP16-GI-NEXT: mov x9, v3.d[1]
|
|
; CHECK-FP16-GI-NEXT: mov v0.s[1], v4.s[0]
|
|
; CHECK-FP16-GI-NEXT: ucvtf s3, x10
|
|
; CHECK-FP16-GI-NEXT: ucvtf s4, x8
|
|
; CHECK-FP16-GI-NEXT: mov v2.s[1], v5.s[0]
|
|
; CHECK-FP16-GI-NEXT: ucvtf s5, x9
|
|
; CHECK-FP16-GI-NEXT: mov v0.s[2], v1.s[0]
|
|
; CHECK-FP16-GI-NEXT: mov v2.s[2], v3.s[0]
|
|
; CHECK-FP16-GI-NEXT: mov v0.s[3], v4.s[0]
|
|
; CHECK-FP16-GI-NEXT: mov v2.s[3], v5.s[0]
|
|
; CHECK-FP16-GI-NEXT: mov v1.16b, v2.16b
|
|
; CHECK-FP16-GI-NEXT: ret
|
|
entry:
|
|
%c = uitofp <8 x i64> %a to <8 x float>
|
|
ret <8 x float> %c
|
|
}
|
|
|
|
define <2 x float> @stofp_v2i32_v2f32(<2 x i32> %a) {
|
|
; CHECK-LABEL: stofp_v2i32_v2f32:
|
|
; CHECK: // %bb.0: // %entry
|
|
; CHECK-NEXT: scvtf v0.2s, v0.2s
|
|
; CHECK-NEXT: ret
|
|
entry:
|
|
%c = sitofp <2 x i32> %a to <2 x float>
|
|
ret <2 x float> %c
|
|
}
|
|
|
|
define <2 x float> @utofp_v2i32_v2f32(<2 x i32> %a) {
|
|
; CHECK-LABEL: utofp_v2i32_v2f32:
|
|
; CHECK: // %bb.0: // %entry
|
|
; CHECK-NEXT: ucvtf v0.2s, v0.2s
|
|
; CHECK-NEXT: ret
|
|
entry:
|
|
%c = uitofp <2 x i32> %a to <2 x float>
|
|
ret <2 x float> %c
|
|
}
|
|
|
|
define <3 x float> @stofp_v3i32_v3f32(<3 x i32> %a) {
|
|
; CHECK-LABEL: stofp_v3i32_v3f32:
|
|
; CHECK: // %bb.0: // %entry
|
|
; CHECK-NEXT: scvtf v0.4s, v0.4s
|
|
; CHECK-NEXT: ret
|
|
entry:
|
|
%c = sitofp <3 x i32> %a to <3 x float>
|
|
ret <3 x float> %c
|
|
}
|
|
|
|
define <3 x float> @utofp_v3i32_v3f32(<3 x i32> %a) {
|
|
; CHECK-LABEL: utofp_v3i32_v3f32:
|
|
; CHECK: // %bb.0: // %entry
|
|
; CHECK-NEXT: ucvtf v0.4s, v0.4s
|
|
; CHECK-NEXT: ret
|
|
entry:
|
|
%c = uitofp <3 x i32> %a to <3 x float>
|
|
ret <3 x float> %c
|
|
}
|
|
|
|
define <4 x float> @stofp_v4i32_v4f32(<4 x i32> %a) {
|
|
; CHECK-LABEL: stofp_v4i32_v4f32:
|
|
; CHECK: // %bb.0: // %entry
|
|
; CHECK-NEXT: scvtf v0.4s, v0.4s
|
|
; CHECK-NEXT: ret
|
|
entry:
|
|
%c = sitofp <4 x i32> %a to <4 x float>
|
|
ret <4 x float> %c
|
|
}
|
|
|
|
define <4 x float> @utofp_v4i32_v4f32(<4 x i32> %a) {
|
|
; CHECK-LABEL: utofp_v4i32_v4f32:
|
|
; CHECK: // %bb.0: // %entry
|
|
; CHECK-NEXT: ucvtf v0.4s, v0.4s
|
|
; CHECK-NEXT: ret
|
|
entry:
|
|
%c = uitofp <4 x i32> %a to <4 x float>
|
|
ret <4 x float> %c
|
|
}
|
|
|
|
define <8 x float> @stofp_v8i32_v8f32(<8 x i32> %a) {
|
|
; CHECK-LABEL: stofp_v8i32_v8f32:
|
|
; CHECK: // %bb.0: // %entry
|
|
; CHECK-NEXT: scvtf v0.4s, v0.4s
|
|
; CHECK-NEXT: scvtf v1.4s, v1.4s
|
|
; CHECK-NEXT: ret
|
|
entry:
|
|
%c = sitofp <8 x i32> %a to <8 x float>
|
|
ret <8 x float> %c
|
|
}
|
|
|
|
define <8 x float> @utofp_v8i32_v8f32(<8 x i32> %a) {
|
|
; CHECK-LABEL: utofp_v8i32_v8f32:
|
|
; CHECK: // %bb.0: // %entry
|
|
; CHECK-NEXT: ucvtf v0.4s, v0.4s
|
|
; CHECK-NEXT: ucvtf v1.4s, v1.4s
|
|
; CHECK-NEXT: ret
|
|
entry:
|
|
%c = uitofp <8 x i32> %a to <8 x float>
|
|
ret <8 x float> %c
|
|
}
|
|
|
|
define <2 x float> @stofp_v2i16_v2f32(<2 x i16> %a) {
|
|
; CHECK-LABEL: stofp_v2i16_v2f32:
|
|
; CHECK: // %bb.0: // %entry
|
|
; CHECK-NEXT: shl v0.2s, v0.2s, #16
|
|
; CHECK-NEXT: sshr v0.2s, v0.2s, #16
|
|
; CHECK-NEXT: scvtf v0.2s, v0.2s
|
|
; CHECK-NEXT: ret
|
|
entry:
|
|
%c = sitofp <2 x i16> %a to <2 x float>
|
|
ret <2 x float> %c
|
|
}
|
|
|
|
define <2 x float> @utofp_v2i16_v2f32(<2 x i16> %a) {
|
|
; CHECK-LABEL: utofp_v2i16_v2f32:
|
|
; CHECK: // %bb.0: // %entry
|
|
; CHECK-NEXT: movi d1, #0x00ffff0000ffff
|
|
; CHECK-NEXT: and v0.8b, v0.8b, v1.8b
|
|
; CHECK-NEXT: ucvtf v0.2s, v0.2s
|
|
; CHECK-NEXT: ret
|
|
entry:
|
|
%c = uitofp <2 x i16> %a to <2 x float>
|
|
ret <2 x float> %c
|
|
}
|
|
|
|
define <3 x float> @stofp_v3i16_v3f32(<3 x i16> %a) {
|
|
; CHECK-LABEL: stofp_v3i16_v3f32:
|
|
; CHECK: // %bb.0: // %entry
|
|
; CHECK-NEXT: sshll v0.4s, v0.4h, #0
|
|
; CHECK-NEXT: scvtf v0.4s, v0.4s
|
|
; CHECK-NEXT: ret
|
|
entry:
|
|
%c = sitofp <3 x i16> %a to <3 x float>
|
|
ret <3 x float> %c
|
|
}
|
|
|
|
define <3 x float> @utofp_v3i16_v3f32(<3 x i16> %a) {
|
|
; CHECK-LABEL: utofp_v3i16_v3f32:
|
|
; CHECK: // %bb.0: // %entry
|
|
; CHECK-NEXT: ushll v0.4s, v0.4h, #0
|
|
; CHECK-NEXT: ucvtf v0.4s, v0.4s
|
|
; CHECK-NEXT: ret
|
|
entry:
|
|
%c = uitofp <3 x i16> %a to <3 x float>
|
|
ret <3 x float> %c
|
|
}
|
|
|
|
define <4 x float> @stofp_v4i16_v4f32(<4 x i16> %a) {
|
|
; CHECK-LABEL: stofp_v4i16_v4f32:
|
|
; CHECK: // %bb.0: // %entry
|
|
; CHECK-NEXT: sshll v0.4s, v0.4h, #0
|
|
; CHECK-NEXT: scvtf v0.4s, v0.4s
|
|
; CHECK-NEXT: ret
|
|
entry:
|
|
%c = sitofp <4 x i16> %a to <4 x float>
|
|
ret <4 x float> %c
|
|
}
|
|
|
|
define <4 x float> @utofp_v4i16_v4f32(<4 x i16> %a) {
|
|
; CHECK-LABEL: utofp_v4i16_v4f32:
|
|
; CHECK: // %bb.0: // %entry
|
|
; CHECK-NEXT: ushll v0.4s, v0.4h, #0
|
|
; CHECK-NEXT: ucvtf v0.4s, v0.4s
|
|
; CHECK-NEXT: ret
|
|
entry:
|
|
%c = uitofp <4 x i16> %a to <4 x float>
|
|
ret <4 x float> %c
|
|
}
|
|
|
|
define <8 x float> @stofp_v8i16_v8f32(<8 x i16> %a) {
|
|
; CHECK-NOFP16-SD-LABEL: stofp_v8i16_v8f32:
|
|
; CHECK-NOFP16-SD: // %bb.0: // %entry
|
|
; CHECK-NOFP16-SD-NEXT: sshll2 v1.4s, v0.8h, #0
|
|
; CHECK-NOFP16-SD-NEXT: sshll v0.4s, v0.4h, #0
|
|
; CHECK-NOFP16-SD-NEXT: scvtf v1.4s, v1.4s
|
|
; CHECK-NOFP16-SD-NEXT: scvtf v0.4s, v0.4s
|
|
; CHECK-NOFP16-SD-NEXT: ret
|
|
;
|
|
; CHECK-FP16-SD-LABEL: stofp_v8i16_v8f32:
|
|
; CHECK-FP16-SD: // %bb.0: // %entry
|
|
; CHECK-FP16-SD-NEXT: sshll2 v1.4s, v0.8h, #0
|
|
; CHECK-FP16-SD-NEXT: sshll v0.4s, v0.4h, #0
|
|
; CHECK-FP16-SD-NEXT: scvtf v1.4s, v1.4s
|
|
; CHECK-FP16-SD-NEXT: scvtf v0.4s, v0.4s
|
|
; CHECK-FP16-SD-NEXT: ret
|
|
;
|
|
; CHECK-NOFP16-GI-LABEL: stofp_v8i16_v8f32:
|
|
; CHECK-NOFP16-GI: // %bb.0: // %entry
|
|
; CHECK-NOFP16-GI-NEXT: sshll v1.4s, v0.4h, #0
|
|
; CHECK-NOFP16-GI-NEXT: sshll2 v2.4s, v0.8h, #0
|
|
; CHECK-NOFP16-GI-NEXT: scvtf v0.4s, v1.4s
|
|
; CHECK-NOFP16-GI-NEXT: scvtf v1.4s, v2.4s
|
|
; CHECK-NOFP16-GI-NEXT: ret
|
|
;
|
|
; CHECK-FP16-GI-LABEL: stofp_v8i16_v8f32:
|
|
; CHECK-FP16-GI: // %bb.0: // %entry
|
|
; CHECK-FP16-GI-NEXT: sshll v1.4s, v0.4h, #0
|
|
; CHECK-FP16-GI-NEXT: sshll2 v2.4s, v0.8h, #0
|
|
; CHECK-FP16-GI-NEXT: scvtf v0.4s, v1.4s
|
|
; CHECK-FP16-GI-NEXT: scvtf v1.4s, v2.4s
|
|
; CHECK-FP16-GI-NEXT: ret
|
|
entry:
|
|
%c = sitofp <8 x i16> %a to <8 x float>
|
|
ret <8 x float> %c
|
|
}
|
|
|
|
define <8 x float> @utofp_v8i16_v8f32(<8 x i16> %a) {
|
|
; CHECK-NOFP16-SD-LABEL: utofp_v8i16_v8f32:
|
|
; CHECK-NOFP16-SD: // %bb.0: // %entry
|
|
; CHECK-NOFP16-SD-NEXT: ushll2 v1.4s, v0.8h, #0
|
|
; CHECK-NOFP16-SD-NEXT: ushll v0.4s, v0.4h, #0
|
|
; CHECK-NOFP16-SD-NEXT: ucvtf v1.4s, v1.4s
|
|
; CHECK-NOFP16-SD-NEXT: ucvtf v0.4s, v0.4s
|
|
; CHECK-NOFP16-SD-NEXT: ret
|
|
;
|
|
; CHECK-FP16-SD-LABEL: utofp_v8i16_v8f32:
|
|
; CHECK-FP16-SD: // %bb.0: // %entry
|
|
; CHECK-FP16-SD-NEXT: ushll2 v1.4s, v0.8h, #0
|
|
; CHECK-FP16-SD-NEXT: ushll v0.4s, v0.4h, #0
|
|
; CHECK-FP16-SD-NEXT: ucvtf v1.4s, v1.4s
|
|
; CHECK-FP16-SD-NEXT: ucvtf v0.4s, v0.4s
|
|
; CHECK-FP16-SD-NEXT: ret
|
|
;
|
|
; CHECK-NOFP16-GI-LABEL: utofp_v8i16_v8f32:
|
|
; CHECK-NOFP16-GI: // %bb.0: // %entry
|
|
; CHECK-NOFP16-GI-NEXT: ushll v1.4s, v0.4h, #0
|
|
; CHECK-NOFP16-GI-NEXT: ushll2 v2.4s, v0.8h, #0
|
|
; CHECK-NOFP16-GI-NEXT: ucvtf v0.4s, v1.4s
|
|
; CHECK-NOFP16-GI-NEXT: ucvtf v1.4s, v2.4s
|
|
; CHECK-NOFP16-GI-NEXT: ret
|
|
;
|
|
; CHECK-FP16-GI-LABEL: utofp_v8i16_v8f32:
|
|
; CHECK-FP16-GI: // %bb.0: // %entry
|
|
; CHECK-FP16-GI-NEXT: ushll v1.4s, v0.4h, #0
|
|
; CHECK-FP16-GI-NEXT: ushll2 v2.4s, v0.8h, #0
|
|
; CHECK-FP16-GI-NEXT: ucvtf v0.4s, v1.4s
|
|
; CHECK-FP16-GI-NEXT: ucvtf v1.4s, v2.4s
|
|
; CHECK-FP16-GI-NEXT: ret
|
|
entry:
|
|
%c = uitofp <8 x i16> %a to <8 x float>
|
|
ret <8 x float> %c
|
|
}
|
|
|
|
define <16 x float> @stofp_v16i16_v16f32(<16 x i16> %a) {
|
|
; CHECK-NOFP16-SD-LABEL: stofp_v16i16_v16f32:
|
|
; CHECK-NOFP16-SD: // %bb.0: // %entry
|
|
; CHECK-NOFP16-SD-NEXT: sshll v2.4s, v0.4h, #0
|
|
; CHECK-NOFP16-SD-NEXT: sshll2 v3.4s, v0.8h, #0
|
|
; CHECK-NOFP16-SD-NEXT: sshll2 v4.4s, v1.8h, #0
|
|
; CHECK-NOFP16-SD-NEXT: sshll v5.4s, v1.4h, #0
|
|
; CHECK-NOFP16-SD-NEXT: scvtf v0.4s, v2.4s
|
|
; CHECK-NOFP16-SD-NEXT: scvtf v1.4s, v3.4s
|
|
; CHECK-NOFP16-SD-NEXT: scvtf v3.4s, v4.4s
|
|
; CHECK-NOFP16-SD-NEXT: scvtf v2.4s, v5.4s
|
|
; CHECK-NOFP16-SD-NEXT: ret
|
|
;
|
|
; CHECK-FP16-SD-LABEL: stofp_v16i16_v16f32:
|
|
; CHECK-FP16-SD: // %bb.0: // %entry
|
|
; CHECK-FP16-SD-NEXT: sshll v2.4s, v0.4h, #0
|
|
; CHECK-FP16-SD-NEXT: sshll2 v3.4s, v0.8h, #0
|
|
; CHECK-FP16-SD-NEXT: sshll2 v4.4s, v1.8h, #0
|
|
; CHECK-FP16-SD-NEXT: sshll v5.4s, v1.4h, #0
|
|
; CHECK-FP16-SD-NEXT: scvtf v0.4s, v2.4s
|
|
; CHECK-FP16-SD-NEXT: scvtf v1.4s, v3.4s
|
|
; CHECK-FP16-SD-NEXT: scvtf v3.4s, v4.4s
|
|
; CHECK-FP16-SD-NEXT: scvtf v2.4s, v5.4s
|
|
; CHECK-FP16-SD-NEXT: ret
|
|
;
|
|
; CHECK-NOFP16-GI-LABEL: stofp_v16i16_v16f32:
|
|
; CHECK-NOFP16-GI: // %bb.0: // %entry
|
|
; CHECK-NOFP16-GI-NEXT: sshll v2.4s, v0.4h, #0
|
|
; CHECK-NOFP16-GI-NEXT: sshll2 v3.4s, v0.8h, #0
|
|
; CHECK-NOFP16-GI-NEXT: sshll v4.4s, v1.4h, #0
|
|
; CHECK-NOFP16-GI-NEXT: sshll2 v5.4s, v1.8h, #0
|
|
; CHECK-NOFP16-GI-NEXT: scvtf v0.4s, v2.4s
|
|
; CHECK-NOFP16-GI-NEXT: scvtf v1.4s, v3.4s
|
|
; CHECK-NOFP16-GI-NEXT: scvtf v2.4s, v4.4s
|
|
; CHECK-NOFP16-GI-NEXT: scvtf v3.4s, v5.4s
|
|
; CHECK-NOFP16-GI-NEXT: ret
|
|
;
|
|
; CHECK-FP16-GI-LABEL: stofp_v16i16_v16f32:
|
|
; CHECK-FP16-GI: // %bb.0: // %entry
|
|
; CHECK-FP16-GI-NEXT: sshll v2.4s, v0.4h, #0
|
|
; CHECK-FP16-GI-NEXT: sshll2 v3.4s, v0.8h, #0
|
|
; CHECK-FP16-GI-NEXT: sshll v4.4s, v1.4h, #0
|
|
; CHECK-FP16-GI-NEXT: sshll2 v5.4s, v1.8h, #0
|
|
; CHECK-FP16-GI-NEXT: scvtf v0.4s, v2.4s
|
|
; CHECK-FP16-GI-NEXT: scvtf v1.4s, v3.4s
|
|
; CHECK-FP16-GI-NEXT: scvtf v2.4s, v4.4s
|
|
; CHECK-FP16-GI-NEXT: scvtf v3.4s, v5.4s
|
|
; CHECK-FP16-GI-NEXT: ret
|
|
entry:
|
|
%c = sitofp <16 x i16> %a to <16 x float>
|
|
ret <16 x float> %c
|
|
}
|
|
|
|
define <16 x float> @utofp_v16i16_v16f32(<16 x i16> %a) {
|
|
; CHECK-NOFP16-SD-LABEL: utofp_v16i16_v16f32:
|
|
; CHECK-NOFP16-SD: // %bb.0: // %entry
|
|
; CHECK-NOFP16-SD-NEXT: ushll v2.4s, v0.4h, #0
|
|
; CHECK-NOFP16-SD-NEXT: ushll2 v3.4s, v0.8h, #0
|
|
; CHECK-NOFP16-SD-NEXT: ushll2 v4.4s, v1.8h, #0
|
|
; CHECK-NOFP16-SD-NEXT: ushll v5.4s, v1.4h, #0
|
|
; CHECK-NOFP16-SD-NEXT: ucvtf v0.4s, v2.4s
|
|
; CHECK-NOFP16-SD-NEXT: ucvtf v1.4s, v3.4s
|
|
; CHECK-NOFP16-SD-NEXT: ucvtf v3.4s, v4.4s
|
|
; CHECK-NOFP16-SD-NEXT: ucvtf v2.4s, v5.4s
|
|
; CHECK-NOFP16-SD-NEXT: ret
|
|
;
|
|
; CHECK-FP16-SD-LABEL: utofp_v16i16_v16f32:
|
|
; CHECK-FP16-SD: // %bb.0: // %entry
|
|
; CHECK-FP16-SD-NEXT: ushll v2.4s, v0.4h, #0
|
|
; CHECK-FP16-SD-NEXT: ushll2 v3.4s, v0.8h, #0
|
|
; CHECK-FP16-SD-NEXT: ushll2 v4.4s, v1.8h, #0
|
|
; CHECK-FP16-SD-NEXT: ushll v5.4s, v1.4h, #0
|
|
; CHECK-FP16-SD-NEXT: ucvtf v0.4s, v2.4s
|
|
; CHECK-FP16-SD-NEXT: ucvtf v1.4s, v3.4s
|
|
; CHECK-FP16-SD-NEXT: ucvtf v3.4s, v4.4s
|
|
; CHECK-FP16-SD-NEXT: ucvtf v2.4s, v5.4s
|
|
; CHECK-FP16-SD-NEXT: ret
|
|
;
|
|
; CHECK-NOFP16-GI-LABEL: utofp_v16i16_v16f32:
|
|
; CHECK-NOFP16-GI: // %bb.0: // %entry
|
|
; CHECK-NOFP16-GI-NEXT: ushll v2.4s, v0.4h, #0
|
|
; CHECK-NOFP16-GI-NEXT: ushll2 v3.4s, v0.8h, #0
|
|
; CHECK-NOFP16-GI-NEXT: ushll v4.4s, v1.4h, #0
|
|
; CHECK-NOFP16-GI-NEXT: ushll2 v5.4s, v1.8h, #0
|
|
; CHECK-NOFP16-GI-NEXT: ucvtf v0.4s, v2.4s
|
|
; CHECK-NOFP16-GI-NEXT: ucvtf v1.4s, v3.4s
|
|
; CHECK-NOFP16-GI-NEXT: ucvtf v2.4s, v4.4s
|
|
; CHECK-NOFP16-GI-NEXT: ucvtf v3.4s, v5.4s
|
|
; CHECK-NOFP16-GI-NEXT: ret
|
|
;
|
|
; CHECK-FP16-GI-LABEL: utofp_v16i16_v16f32:
|
|
; CHECK-FP16-GI: // %bb.0: // %entry
|
|
; CHECK-FP16-GI-NEXT: ushll v2.4s, v0.4h, #0
|
|
; CHECK-FP16-GI-NEXT: ushll2 v3.4s, v0.8h, #0
|
|
; CHECK-FP16-GI-NEXT: ushll v4.4s, v1.4h, #0
|
|
; CHECK-FP16-GI-NEXT: ushll2 v5.4s, v1.8h, #0
|
|
; CHECK-FP16-GI-NEXT: ucvtf v0.4s, v2.4s
|
|
; CHECK-FP16-GI-NEXT: ucvtf v1.4s, v3.4s
|
|
; CHECK-FP16-GI-NEXT: ucvtf v2.4s, v4.4s
|
|
; CHECK-FP16-GI-NEXT: ucvtf v3.4s, v5.4s
|
|
; CHECK-FP16-GI-NEXT: ret
|
|
entry:
|
|
%c = uitofp <16 x i16> %a to <16 x float>
|
|
ret <16 x float> %c
|
|
}
|
|
|
|
define <2 x float> @stofp_v2i8_v2f32(<2 x i8> %a) {
|
|
; CHECK-LABEL: stofp_v2i8_v2f32:
|
|
; CHECK: // %bb.0: // %entry
|
|
; CHECK-NEXT: shl v0.2s, v0.2s, #24
|
|
; CHECK-NEXT: sshr v0.2s, v0.2s, #24
|
|
; CHECK-NEXT: scvtf v0.2s, v0.2s
|
|
; CHECK-NEXT: ret
|
|
entry:
|
|
%c = sitofp <2 x i8> %a to <2 x float>
|
|
ret <2 x float> %c
|
|
}
|
|
|
|
define <2 x float> @utofp_v2i8_v2f32(<2 x i8> %a) {
|
|
; CHECK-LABEL: utofp_v2i8_v2f32:
|
|
; CHECK: // %bb.0: // %entry
|
|
; CHECK-NEXT: movi d1, #0x0000ff000000ff
|
|
; CHECK-NEXT: and v0.8b, v0.8b, v1.8b
|
|
; CHECK-NEXT: ucvtf v0.2s, v0.2s
|
|
; CHECK-NEXT: ret
|
|
entry:
|
|
%c = uitofp <2 x i8> %a to <2 x float>
|
|
ret <2 x float> %c
|
|
}
|
|
|
|
define <3 x float> @stofp_v3i8_v3f32(<3 x i8> %a) {
|
|
; CHECK-NOFP16-SD-LABEL: stofp_v3i8_v3f32:
|
|
; CHECK-NOFP16-SD: // %bb.0: // %entry
|
|
; CHECK-NOFP16-SD-NEXT: fmov s0, w0
|
|
; CHECK-NOFP16-SD-NEXT: mov v0.h[1], w1
|
|
; CHECK-NOFP16-SD-NEXT: mov v0.h[2], w2
|
|
; CHECK-NOFP16-SD-NEXT: shl v0.4h, v0.4h, #8
|
|
; CHECK-NOFP16-SD-NEXT: sshr v0.4h, v0.4h, #8
|
|
; CHECK-NOFP16-SD-NEXT: sshll v0.4s, v0.4h, #0
|
|
; CHECK-NOFP16-SD-NEXT: scvtf v0.4s, v0.4s
|
|
; CHECK-NOFP16-SD-NEXT: ret
|
|
;
|
|
; CHECK-FP16-SD-LABEL: stofp_v3i8_v3f32:
|
|
; CHECK-FP16-SD: // %bb.0: // %entry
|
|
; CHECK-FP16-SD-NEXT: fmov s0, w0
|
|
; CHECK-FP16-SD-NEXT: mov v0.h[1], w1
|
|
; CHECK-FP16-SD-NEXT: mov v0.h[2], w2
|
|
; CHECK-FP16-SD-NEXT: shl v0.4h, v0.4h, #8
|
|
; CHECK-FP16-SD-NEXT: sshr v0.4h, v0.4h, #8
|
|
; CHECK-FP16-SD-NEXT: sshll v0.4s, v0.4h, #0
|
|
; CHECK-FP16-SD-NEXT: scvtf v0.4s, v0.4s
|
|
; CHECK-FP16-SD-NEXT: ret
|
|
;
|
|
; CHECK-NOFP16-GI-LABEL: stofp_v3i8_v3f32:
|
|
; CHECK-NOFP16-GI: // %bb.0: // %entry
|
|
; CHECK-NOFP16-GI-NEXT: fmov s0, w0
|
|
; CHECK-NOFP16-GI-NEXT: mov v0.h[1], w1
|
|
; CHECK-NOFP16-GI-NEXT: mov v0.h[2], w2
|
|
; CHECK-NOFP16-GI-NEXT: shl v0.4h, v0.4h, #8
|
|
; CHECK-NOFP16-GI-NEXT: sshr v0.4h, v0.4h, #8
|
|
; CHECK-NOFP16-GI-NEXT: mov v1.h[0], v0.h[2]
|
|
; CHECK-NOFP16-GI-NEXT: mov v1.h[1], v0.h[3]
|
|
; CHECK-NOFP16-GI-NEXT: sshll v0.4s, v0.4h, #0
|
|
; CHECK-NOFP16-GI-NEXT: sshll v1.4s, v1.4h, #0
|
|
; CHECK-NOFP16-GI-NEXT: mov v0.d[1], v1.d[0]
|
|
; CHECK-NOFP16-GI-NEXT: scvtf v0.4s, v0.4s
|
|
; CHECK-NOFP16-GI-NEXT: ret
|
|
;
|
|
; CHECK-FP16-GI-LABEL: stofp_v3i8_v3f32:
|
|
; CHECK-FP16-GI: // %bb.0: // %entry
|
|
; CHECK-FP16-GI-NEXT: fmov s0, w0
|
|
; CHECK-FP16-GI-NEXT: mov v0.h[1], w1
|
|
; CHECK-FP16-GI-NEXT: mov v0.h[2], w2
|
|
; CHECK-FP16-GI-NEXT: shl v0.4h, v0.4h, #8
|
|
; CHECK-FP16-GI-NEXT: sshr v0.4h, v0.4h, #8
|
|
; CHECK-FP16-GI-NEXT: mov v1.h[0], v0.h[2]
|
|
; CHECK-FP16-GI-NEXT: mov v1.h[1], v0.h[3]
|
|
; CHECK-FP16-GI-NEXT: sshll v0.4s, v0.4h, #0
|
|
; CHECK-FP16-GI-NEXT: sshll v1.4s, v1.4h, #0
|
|
; CHECK-FP16-GI-NEXT: mov v0.d[1], v1.d[0]
|
|
; CHECK-FP16-GI-NEXT: scvtf v0.4s, v0.4s
|
|
; CHECK-FP16-GI-NEXT: ret
|
|
entry:
|
|
%c = sitofp <3 x i8> %a to <3 x float>
|
|
ret <3 x float> %c
|
|
}
|
|
|
|
define <3 x float> @utofp_v3i8_v3f32(<3 x i8> %a) {
|
|
; CHECK-NOFP16-SD-LABEL: utofp_v3i8_v3f32:
|
|
; CHECK-NOFP16-SD: // %bb.0: // %entry
|
|
; CHECK-NOFP16-SD-NEXT: fmov s0, w0
|
|
; CHECK-NOFP16-SD-NEXT: mov v0.h[1], w1
|
|
; CHECK-NOFP16-SD-NEXT: mov v0.h[2], w2
|
|
; CHECK-NOFP16-SD-NEXT: bic v0.4h, #255, lsl #8
|
|
; CHECK-NOFP16-SD-NEXT: ushll v0.4s, v0.4h, #0
|
|
; CHECK-NOFP16-SD-NEXT: ucvtf v0.4s, v0.4s
|
|
; CHECK-NOFP16-SD-NEXT: ret
|
|
;
|
|
; CHECK-FP16-SD-LABEL: utofp_v3i8_v3f32:
|
|
; CHECK-FP16-SD: // %bb.0: // %entry
|
|
; CHECK-FP16-SD-NEXT: fmov s0, w0
|
|
; CHECK-FP16-SD-NEXT: mov v0.h[1], w1
|
|
; CHECK-FP16-SD-NEXT: mov v0.h[2], w2
|
|
; CHECK-FP16-SD-NEXT: bic v0.4h, #255, lsl #8
|
|
; CHECK-FP16-SD-NEXT: ushll v0.4s, v0.4h, #0
|
|
; CHECK-FP16-SD-NEXT: ucvtf v0.4s, v0.4s
|
|
; CHECK-FP16-SD-NEXT: ret
|
|
;
|
|
; CHECK-NOFP16-GI-LABEL: utofp_v3i8_v3f32:
|
|
; CHECK-NOFP16-GI: // %bb.0: // %entry
|
|
; CHECK-NOFP16-GI-NEXT: fmov s0, w0
|
|
; CHECK-NOFP16-GI-NEXT: movi d1, #0xff00ff00ff00ff
|
|
; CHECK-NOFP16-GI-NEXT: mov v0.h[1], w1
|
|
; CHECK-NOFP16-GI-NEXT: mov v0.h[2], w2
|
|
; CHECK-NOFP16-GI-NEXT: and v0.8b, v0.8b, v1.8b
|
|
; CHECK-NOFP16-GI-NEXT: mov v1.h[0], v0.h[2]
|
|
; CHECK-NOFP16-GI-NEXT: mov v1.h[1], v0.h[3]
|
|
; CHECK-NOFP16-GI-NEXT: ushll v0.4s, v0.4h, #0
|
|
; CHECK-NOFP16-GI-NEXT: ushll v1.4s, v1.4h, #0
|
|
; CHECK-NOFP16-GI-NEXT: mov v0.d[1], v1.d[0]
|
|
; CHECK-NOFP16-GI-NEXT: ucvtf v0.4s, v0.4s
|
|
; CHECK-NOFP16-GI-NEXT: ret
|
|
;
|
|
; CHECK-FP16-GI-LABEL: utofp_v3i8_v3f32:
|
|
; CHECK-FP16-GI: // %bb.0: // %entry
|
|
; CHECK-FP16-GI-NEXT: fmov s0, w0
|
|
; CHECK-FP16-GI-NEXT: movi d1, #0xff00ff00ff00ff
|
|
; CHECK-FP16-GI-NEXT: mov v0.h[1], w1
|
|
; CHECK-FP16-GI-NEXT: mov v0.h[2], w2
|
|
; CHECK-FP16-GI-NEXT: and v0.8b, v0.8b, v1.8b
|
|
; CHECK-FP16-GI-NEXT: mov v1.h[0], v0.h[2]
|
|
; CHECK-FP16-GI-NEXT: mov v1.h[1], v0.h[3]
|
|
; CHECK-FP16-GI-NEXT: ushll v0.4s, v0.4h, #0
|
|
; CHECK-FP16-GI-NEXT: ushll v1.4s, v1.4h, #0
|
|
; CHECK-FP16-GI-NEXT: mov v0.d[1], v1.d[0]
|
|
; CHECK-FP16-GI-NEXT: ucvtf v0.4s, v0.4s
|
|
; CHECK-FP16-GI-NEXT: ret
|
|
entry:
|
|
%c = uitofp <3 x i8> %a to <3 x float>
|
|
ret <3 x float> %c
|
|
}
|
|
|
|
define <4 x float> @stofp_v4i8_v4f32(<4 x i8> %a) {
|
|
; CHECK-NOFP16-SD-LABEL: stofp_v4i8_v4f32:
|
|
; CHECK-NOFP16-SD: // %bb.0: // %entry
|
|
; CHECK-NOFP16-SD-NEXT: shl v0.4h, v0.4h, #8
|
|
; CHECK-NOFP16-SD-NEXT: sshr v0.4h, v0.4h, #8
|
|
; CHECK-NOFP16-SD-NEXT: sshll v0.4s, v0.4h, #0
|
|
; CHECK-NOFP16-SD-NEXT: scvtf v0.4s, v0.4s
|
|
; CHECK-NOFP16-SD-NEXT: ret
|
|
;
|
|
; CHECK-FP16-SD-LABEL: stofp_v4i8_v4f32:
|
|
; CHECK-FP16-SD: // %bb.0: // %entry
|
|
; CHECK-FP16-SD-NEXT: shl v0.4h, v0.4h, #8
|
|
; CHECK-FP16-SD-NEXT: sshr v0.4h, v0.4h, #8
|
|
; CHECK-FP16-SD-NEXT: sshll v0.4s, v0.4h, #0
|
|
; CHECK-FP16-SD-NEXT: scvtf v0.4s, v0.4s
|
|
; CHECK-FP16-SD-NEXT: ret
|
|
;
|
|
; CHECK-NOFP16-GI-LABEL: stofp_v4i8_v4f32:
|
|
; CHECK-NOFP16-GI: // %bb.0: // %entry
|
|
; CHECK-NOFP16-GI-NEXT: ushll v0.4s, v0.4h, #0
|
|
; CHECK-NOFP16-GI-NEXT: shl v0.4s, v0.4s, #24
|
|
; CHECK-NOFP16-GI-NEXT: sshr v0.4s, v0.4s, #24
|
|
; CHECK-NOFP16-GI-NEXT: scvtf v0.4s, v0.4s
|
|
; CHECK-NOFP16-GI-NEXT: ret
|
|
;
|
|
; CHECK-FP16-GI-LABEL: stofp_v4i8_v4f32:
|
|
; CHECK-FP16-GI: // %bb.0: // %entry
|
|
; CHECK-FP16-GI-NEXT: ushll v0.4s, v0.4h, #0
|
|
; CHECK-FP16-GI-NEXT: shl v0.4s, v0.4s, #24
|
|
; CHECK-FP16-GI-NEXT: sshr v0.4s, v0.4s, #24
|
|
; CHECK-FP16-GI-NEXT: scvtf v0.4s, v0.4s
|
|
; CHECK-FP16-GI-NEXT: ret
|
|
entry:
|
|
%c = sitofp <4 x i8> %a to <4 x float>
|
|
ret <4 x float> %c
|
|
}
|
|
|
|
define <4 x float> @utofp_v4i8_v4f32(<4 x i8> %a) {
|
|
; CHECK-NOFP16-SD-LABEL: utofp_v4i8_v4f32:
|
|
; CHECK-NOFP16-SD: // %bb.0: // %entry
|
|
; CHECK-NOFP16-SD-NEXT: bic v0.4h, #255, lsl #8
|
|
; CHECK-NOFP16-SD-NEXT: ushll v0.4s, v0.4h, #0
|
|
; CHECK-NOFP16-SD-NEXT: ucvtf v0.4s, v0.4s
|
|
; CHECK-NOFP16-SD-NEXT: ret
|
|
;
|
|
; CHECK-FP16-SD-LABEL: utofp_v4i8_v4f32:
|
|
; CHECK-FP16-SD: // %bb.0: // %entry
|
|
; CHECK-FP16-SD-NEXT: bic v0.4h, #255, lsl #8
|
|
; CHECK-FP16-SD-NEXT: ushll v0.4s, v0.4h, #0
|
|
; CHECK-FP16-SD-NEXT: ucvtf v0.4s, v0.4s
|
|
; CHECK-FP16-SD-NEXT: ret
|
|
;
|
|
; CHECK-NOFP16-GI-LABEL: utofp_v4i8_v4f32:
|
|
; CHECK-NOFP16-GI: // %bb.0: // %entry
|
|
; CHECK-NOFP16-GI-NEXT: movi v1.2d, #0x0000ff000000ff
|
|
; CHECK-NOFP16-GI-NEXT: ushll v0.4s, v0.4h, #0
|
|
; CHECK-NOFP16-GI-NEXT: and v0.16b, v0.16b, v1.16b
|
|
; CHECK-NOFP16-GI-NEXT: ucvtf v0.4s, v0.4s
|
|
; CHECK-NOFP16-GI-NEXT: ret
|
|
;
|
|
; CHECK-FP16-GI-LABEL: utofp_v4i8_v4f32:
|
|
; CHECK-FP16-GI: // %bb.0: // %entry
|
|
; CHECK-FP16-GI-NEXT: movi v1.2d, #0x0000ff000000ff
|
|
; CHECK-FP16-GI-NEXT: ushll v0.4s, v0.4h, #0
|
|
; CHECK-FP16-GI-NEXT: and v0.16b, v0.16b, v1.16b
|
|
; CHECK-FP16-GI-NEXT: ucvtf v0.4s, v0.4s
|
|
; CHECK-FP16-GI-NEXT: ret
|
|
entry:
|
|
%c = uitofp <4 x i8> %a to <4 x float>
|
|
ret <4 x float> %c
|
|
}
|
|
|
|
define <8 x float> @stofp_v8i8_v8f32(<8 x i8> %a) {
|
|
; CHECK-NOFP16-SD-LABEL: stofp_v8i8_v8f32:
|
|
; CHECK-NOFP16-SD: // %bb.0: // %entry
|
|
; CHECK-NOFP16-SD-NEXT: zip1 v1.8b, v0.8b, v0.8b
|
|
; CHECK-NOFP16-SD-NEXT: zip2 v0.8b, v0.8b, v0.8b
|
|
; CHECK-NOFP16-SD-NEXT: shl v1.4h, v1.4h, #8
|
|
; CHECK-NOFP16-SD-NEXT: shl v0.4h, v0.4h, #8
|
|
; CHECK-NOFP16-SD-NEXT: sshr v1.4h, v1.4h, #8
|
|
; CHECK-NOFP16-SD-NEXT: sshr v0.4h, v0.4h, #8
|
|
; CHECK-NOFP16-SD-NEXT: sshll v1.4s, v1.4h, #0
|
|
; CHECK-NOFP16-SD-NEXT: sshll v2.4s, v0.4h, #0
|
|
; CHECK-NOFP16-SD-NEXT: scvtf v0.4s, v1.4s
|
|
; CHECK-NOFP16-SD-NEXT: scvtf v1.4s, v2.4s
|
|
; CHECK-NOFP16-SD-NEXT: ret
|
|
;
|
|
; CHECK-FP16-SD-LABEL: stofp_v8i8_v8f32:
|
|
; CHECK-FP16-SD: // %bb.0: // %entry
|
|
; CHECK-FP16-SD-NEXT: zip1 v1.8b, v0.8b, v0.8b
|
|
; CHECK-FP16-SD-NEXT: zip2 v0.8b, v0.8b, v0.8b
|
|
; CHECK-FP16-SD-NEXT: shl v1.4h, v1.4h, #8
|
|
; CHECK-FP16-SD-NEXT: shl v0.4h, v0.4h, #8
|
|
; CHECK-FP16-SD-NEXT: sshr v1.4h, v1.4h, #8
|
|
; CHECK-FP16-SD-NEXT: sshr v0.4h, v0.4h, #8
|
|
; CHECK-FP16-SD-NEXT: sshll v1.4s, v1.4h, #0
|
|
; CHECK-FP16-SD-NEXT: sshll v2.4s, v0.4h, #0
|
|
; CHECK-FP16-SD-NEXT: scvtf v0.4s, v1.4s
|
|
; CHECK-FP16-SD-NEXT: scvtf v1.4s, v2.4s
|
|
; CHECK-FP16-SD-NEXT: ret
|
|
;
|
|
; CHECK-NOFP16-GI-LABEL: stofp_v8i8_v8f32:
|
|
; CHECK-NOFP16-GI: // %bb.0: // %entry
|
|
; CHECK-NOFP16-GI-NEXT: sshll v0.8h, v0.8b, #0
|
|
; CHECK-NOFP16-GI-NEXT: sshll v1.4s, v0.4h, #0
|
|
; CHECK-NOFP16-GI-NEXT: sshll2 v2.4s, v0.8h, #0
|
|
; CHECK-NOFP16-GI-NEXT: scvtf v0.4s, v1.4s
|
|
; CHECK-NOFP16-GI-NEXT: scvtf v1.4s, v2.4s
|
|
; CHECK-NOFP16-GI-NEXT: ret
|
|
;
|
|
; CHECK-FP16-GI-LABEL: stofp_v8i8_v8f32:
|
|
; CHECK-FP16-GI: // %bb.0: // %entry
|
|
; CHECK-FP16-GI-NEXT: sshll v0.8h, v0.8b, #0
|
|
; CHECK-FP16-GI-NEXT: sshll v1.4s, v0.4h, #0
|
|
; CHECK-FP16-GI-NEXT: sshll2 v2.4s, v0.8h, #0
|
|
; CHECK-FP16-GI-NEXT: scvtf v0.4s, v1.4s
|
|
; CHECK-FP16-GI-NEXT: scvtf v1.4s, v2.4s
|
|
; CHECK-FP16-GI-NEXT: ret
|
|
entry:
|
|
%c = sitofp <8 x i8> %a to <8 x float>
|
|
ret <8 x float> %c
|
|
}
|
|
|
|
define <8 x float> @utofp_v8i8_v8f32(<8 x i8> %a) {
|
|
; CHECK-NOFP16-SD-LABEL: utofp_v8i8_v8f32:
|
|
; CHECK-NOFP16-SD: // %bb.0: // %entry
|
|
; CHECK-NOFP16-SD-NEXT: zip1 v1.8b, v0.8b, v0.8b
|
|
; CHECK-NOFP16-SD-NEXT: zip2 v0.8b, v0.8b, v0.8b
|
|
; CHECK-NOFP16-SD-NEXT: bic v1.4h, #255, lsl #8
|
|
; CHECK-NOFP16-SD-NEXT: bic v0.4h, #255, lsl #8
|
|
; CHECK-NOFP16-SD-NEXT: ushll v1.4s, v1.4h, #0
|
|
; CHECK-NOFP16-SD-NEXT: ushll v2.4s, v0.4h, #0
|
|
; CHECK-NOFP16-SD-NEXT: ucvtf v0.4s, v1.4s
|
|
; CHECK-NOFP16-SD-NEXT: ucvtf v1.4s, v2.4s
|
|
; CHECK-NOFP16-SD-NEXT: ret
|
|
;
|
|
; CHECK-FP16-SD-LABEL: utofp_v8i8_v8f32:
|
|
; CHECK-FP16-SD: // %bb.0: // %entry
|
|
; CHECK-FP16-SD-NEXT: zip1 v1.8b, v0.8b, v0.8b
|
|
; CHECK-FP16-SD-NEXT: zip2 v0.8b, v0.8b, v0.8b
|
|
; CHECK-FP16-SD-NEXT: bic v1.4h, #255, lsl #8
|
|
; CHECK-FP16-SD-NEXT: bic v0.4h, #255, lsl #8
|
|
; CHECK-FP16-SD-NEXT: ushll v1.4s, v1.4h, #0
|
|
; CHECK-FP16-SD-NEXT: ushll v2.4s, v0.4h, #0
|
|
; CHECK-FP16-SD-NEXT: ucvtf v0.4s, v1.4s
|
|
; CHECK-FP16-SD-NEXT: ucvtf v1.4s, v2.4s
|
|
; CHECK-FP16-SD-NEXT: ret
|
|
;
|
|
; CHECK-NOFP16-GI-LABEL: utofp_v8i8_v8f32:
|
|
; CHECK-NOFP16-GI: // %bb.0: // %entry
|
|
; CHECK-NOFP16-GI-NEXT: ushll v0.8h, v0.8b, #0
|
|
; CHECK-NOFP16-GI-NEXT: ushll v1.4s, v0.4h, #0
|
|
; CHECK-NOFP16-GI-NEXT: ushll2 v2.4s, v0.8h, #0
|
|
; CHECK-NOFP16-GI-NEXT: ucvtf v0.4s, v1.4s
|
|
; CHECK-NOFP16-GI-NEXT: ucvtf v1.4s, v2.4s
|
|
; CHECK-NOFP16-GI-NEXT: ret
|
|
;
|
|
; CHECK-FP16-GI-LABEL: utofp_v8i8_v8f32:
|
|
; CHECK-FP16-GI: // %bb.0: // %entry
|
|
; CHECK-FP16-GI-NEXT: ushll v0.8h, v0.8b, #0
|
|
; CHECK-FP16-GI-NEXT: ushll v1.4s, v0.4h, #0
|
|
; CHECK-FP16-GI-NEXT: ushll2 v2.4s, v0.8h, #0
|
|
; CHECK-FP16-GI-NEXT: ucvtf v0.4s, v1.4s
|
|
; CHECK-FP16-GI-NEXT: ucvtf v1.4s, v2.4s
|
|
; CHECK-FP16-GI-NEXT: ret
|
|
entry:
|
|
%c = uitofp <8 x i8> %a to <8 x float>
|
|
ret <8 x float> %c
|
|
}
|
|
|
|
define <16 x float> @stofp_v16i8_v16f32(<16 x i8> %a) {
|
|
; CHECK-NOFP16-SD-LABEL: stofp_v16i8_v16f32:
|
|
; CHECK-NOFP16-SD: // %bb.0: // %entry
|
|
; CHECK-NOFP16-SD-NEXT: ext v1.16b, v0.16b, v0.16b, #8
|
|
; CHECK-NOFP16-SD-NEXT: zip1 v2.8b, v0.8b, v0.8b
|
|
; CHECK-NOFP16-SD-NEXT: zip2 v0.8b, v0.8b, v0.8b
|
|
; CHECK-NOFP16-SD-NEXT: zip1 v3.8b, v1.8b, v0.8b
|
|
; CHECK-NOFP16-SD-NEXT: zip2 v1.8b, v1.8b, v0.8b
|
|
; CHECK-NOFP16-SD-NEXT: shl v2.4h, v2.4h, #8
|
|
; CHECK-NOFP16-SD-NEXT: shl v0.4h, v0.4h, #8
|
|
; CHECK-NOFP16-SD-NEXT: sshr v2.4h, v2.4h, #8
|
|
; CHECK-NOFP16-SD-NEXT: shl v3.4h, v3.4h, #8
|
|
; CHECK-NOFP16-SD-NEXT: shl v1.4h, v1.4h, #8
|
|
; CHECK-NOFP16-SD-NEXT: sshr v0.4h, v0.4h, #8
|
|
; CHECK-NOFP16-SD-NEXT: sshll v2.4s, v2.4h, #0
|
|
; CHECK-NOFP16-SD-NEXT: sshr v3.4h, v3.4h, #8
|
|
; CHECK-NOFP16-SD-NEXT: sshr v1.4h, v1.4h, #8
|
|
; CHECK-NOFP16-SD-NEXT: sshll v4.4s, v0.4h, #0
|
|
; CHECK-NOFP16-SD-NEXT: scvtf v0.4s, v2.4s
|
|
; CHECK-NOFP16-SD-NEXT: sshll v3.4s, v3.4h, #0
|
|
; CHECK-NOFP16-SD-NEXT: sshll v5.4s, v1.4h, #0
|
|
; CHECK-NOFP16-SD-NEXT: scvtf v1.4s, v4.4s
|
|
; CHECK-NOFP16-SD-NEXT: scvtf v2.4s, v3.4s
|
|
; CHECK-NOFP16-SD-NEXT: scvtf v3.4s, v5.4s
|
|
; CHECK-NOFP16-SD-NEXT: ret
|
|
;
|
|
; CHECK-FP16-SD-LABEL: stofp_v16i8_v16f32:
|
|
; CHECK-FP16-SD: // %bb.0: // %entry
|
|
; CHECK-FP16-SD-NEXT: ext v1.16b, v0.16b, v0.16b, #8
|
|
; CHECK-FP16-SD-NEXT: zip1 v2.8b, v0.8b, v0.8b
|
|
; CHECK-FP16-SD-NEXT: zip2 v0.8b, v0.8b, v0.8b
|
|
; CHECK-FP16-SD-NEXT: zip1 v3.8b, v1.8b, v0.8b
|
|
; CHECK-FP16-SD-NEXT: zip2 v1.8b, v1.8b, v0.8b
|
|
; CHECK-FP16-SD-NEXT: shl v2.4h, v2.4h, #8
|
|
; CHECK-FP16-SD-NEXT: shl v0.4h, v0.4h, #8
|
|
; CHECK-FP16-SD-NEXT: sshr v2.4h, v2.4h, #8
|
|
; CHECK-FP16-SD-NEXT: shl v3.4h, v3.4h, #8
|
|
; CHECK-FP16-SD-NEXT: shl v1.4h, v1.4h, #8
|
|
; CHECK-FP16-SD-NEXT: sshr v0.4h, v0.4h, #8
|
|
; CHECK-FP16-SD-NEXT: sshll v2.4s, v2.4h, #0
|
|
; CHECK-FP16-SD-NEXT: sshr v3.4h, v3.4h, #8
|
|
; CHECK-FP16-SD-NEXT: sshr v1.4h, v1.4h, #8
|
|
; CHECK-FP16-SD-NEXT: sshll v4.4s, v0.4h, #0
|
|
; CHECK-FP16-SD-NEXT: scvtf v0.4s, v2.4s
|
|
; CHECK-FP16-SD-NEXT: sshll v3.4s, v3.4h, #0
|
|
; CHECK-FP16-SD-NEXT: sshll v5.4s, v1.4h, #0
|
|
; CHECK-FP16-SD-NEXT: scvtf v1.4s, v4.4s
|
|
; CHECK-FP16-SD-NEXT: scvtf v2.4s, v3.4s
|
|
; CHECK-FP16-SD-NEXT: scvtf v3.4s, v5.4s
|
|
; CHECK-FP16-SD-NEXT: ret
|
|
;
|
|
; CHECK-NOFP16-GI-LABEL: stofp_v16i8_v16f32:
|
|
; CHECK-NOFP16-GI: // %bb.0: // %entry
|
|
; CHECK-NOFP16-GI-NEXT: sshll v1.8h, v0.8b, #0
|
|
; CHECK-NOFP16-GI-NEXT: sshll2 v0.8h, v0.16b, #0
|
|
; CHECK-NOFP16-GI-NEXT: sshll v2.4s, v1.4h, #0
|
|
; CHECK-NOFP16-GI-NEXT: sshll2 v1.4s, v1.8h, #0
|
|
; CHECK-NOFP16-GI-NEXT: sshll v3.4s, v0.4h, #0
|
|
; CHECK-NOFP16-GI-NEXT: sshll2 v4.4s, v0.8h, #0
|
|
; CHECK-NOFP16-GI-NEXT: scvtf v0.4s, v2.4s
|
|
; CHECK-NOFP16-GI-NEXT: scvtf v1.4s, v1.4s
|
|
; CHECK-NOFP16-GI-NEXT: scvtf v2.4s, v3.4s
|
|
; CHECK-NOFP16-GI-NEXT: scvtf v3.4s, v4.4s
|
|
; CHECK-NOFP16-GI-NEXT: ret
|
|
;
|
|
; CHECK-FP16-GI-LABEL: stofp_v16i8_v16f32:
|
|
; CHECK-FP16-GI: // %bb.0: // %entry
|
|
; CHECK-FP16-GI-NEXT: sshll v1.8h, v0.8b, #0
|
|
; CHECK-FP16-GI-NEXT: sshll2 v0.8h, v0.16b, #0
|
|
; CHECK-FP16-GI-NEXT: sshll v2.4s, v1.4h, #0
|
|
; CHECK-FP16-GI-NEXT: sshll2 v1.4s, v1.8h, #0
|
|
; CHECK-FP16-GI-NEXT: sshll v3.4s, v0.4h, #0
|
|
; CHECK-FP16-GI-NEXT: sshll2 v4.4s, v0.8h, #0
|
|
; CHECK-FP16-GI-NEXT: scvtf v0.4s, v2.4s
|
|
; CHECK-FP16-GI-NEXT: scvtf v1.4s, v1.4s
|
|
; CHECK-FP16-GI-NEXT: scvtf v2.4s, v3.4s
|
|
; CHECK-FP16-GI-NEXT: scvtf v3.4s, v4.4s
|
|
; CHECK-FP16-GI-NEXT: ret
|
|
entry:
|
|
%c = sitofp <16 x i8> %a to <16 x float>
|
|
ret <16 x float> %c
|
|
}
|
|
|
|
define <16 x float> @utofp_v16i8_v16f32(<16 x i8> %a) {
|
|
; CHECK-NOFP16-SD-LABEL: utofp_v16i8_v16f32:
|
|
; CHECK-NOFP16-SD: // %bb.0: // %entry
|
|
; CHECK-NOFP16-SD-NEXT: ext v1.16b, v0.16b, v0.16b, #8
|
|
; CHECK-NOFP16-SD-NEXT: zip1 v2.8b, v0.8b, v0.8b
|
|
; CHECK-NOFP16-SD-NEXT: zip2 v0.8b, v0.8b, v0.8b
|
|
; CHECK-NOFP16-SD-NEXT: zip1 v3.8b, v1.8b, v0.8b
|
|
; CHECK-NOFP16-SD-NEXT: zip2 v1.8b, v1.8b, v0.8b
|
|
; CHECK-NOFP16-SD-NEXT: bic v2.4h, #255, lsl #8
|
|
; CHECK-NOFP16-SD-NEXT: bic v0.4h, #255, lsl #8
|
|
; CHECK-NOFP16-SD-NEXT: ushll v2.4s, v2.4h, #0
|
|
; CHECK-NOFP16-SD-NEXT: bic v3.4h, #255, lsl #8
|
|
; CHECK-NOFP16-SD-NEXT: bic v1.4h, #255, lsl #8
|
|
; CHECK-NOFP16-SD-NEXT: ushll v4.4s, v0.4h, #0
|
|
; CHECK-NOFP16-SD-NEXT: ucvtf v0.4s, v2.4s
|
|
; CHECK-NOFP16-SD-NEXT: ushll v3.4s, v3.4h, #0
|
|
; CHECK-NOFP16-SD-NEXT: ushll v5.4s, v1.4h, #0
|
|
; CHECK-NOFP16-SD-NEXT: ucvtf v1.4s, v4.4s
|
|
; CHECK-NOFP16-SD-NEXT: ucvtf v2.4s, v3.4s
|
|
; CHECK-NOFP16-SD-NEXT: ucvtf v3.4s, v5.4s
|
|
; CHECK-NOFP16-SD-NEXT: ret
|
|
;
|
|
; CHECK-FP16-SD-LABEL: utofp_v16i8_v16f32:
|
|
; CHECK-FP16-SD: // %bb.0: // %entry
|
|
; CHECK-FP16-SD-NEXT: ext v1.16b, v0.16b, v0.16b, #8
|
|
; CHECK-FP16-SD-NEXT: zip1 v2.8b, v0.8b, v0.8b
|
|
; CHECK-FP16-SD-NEXT: zip2 v0.8b, v0.8b, v0.8b
|
|
; CHECK-FP16-SD-NEXT: zip1 v3.8b, v1.8b, v0.8b
|
|
; CHECK-FP16-SD-NEXT: zip2 v1.8b, v1.8b, v0.8b
|
|
; CHECK-FP16-SD-NEXT: bic v2.4h, #255, lsl #8
|
|
; CHECK-FP16-SD-NEXT: bic v0.4h, #255, lsl #8
|
|
; CHECK-FP16-SD-NEXT: ushll v2.4s, v2.4h, #0
|
|
; CHECK-FP16-SD-NEXT: bic v3.4h, #255, lsl #8
|
|
; CHECK-FP16-SD-NEXT: bic v1.4h, #255, lsl #8
|
|
; CHECK-FP16-SD-NEXT: ushll v4.4s, v0.4h, #0
|
|
; CHECK-FP16-SD-NEXT: ucvtf v0.4s, v2.4s
|
|
; CHECK-FP16-SD-NEXT: ushll v3.4s, v3.4h, #0
|
|
; CHECK-FP16-SD-NEXT: ushll v5.4s, v1.4h, #0
|
|
; CHECK-FP16-SD-NEXT: ucvtf v1.4s, v4.4s
|
|
; CHECK-FP16-SD-NEXT: ucvtf v2.4s, v3.4s
|
|
; CHECK-FP16-SD-NEXT: ucvtf v3.4s, v5.4s
|
|
; CHECK-FP16-SD-NEXT: ret
|
|
;
|
|
; CHECK-NOFP16-GI-LABEL: utofp_v16i8_v16f32:
|
|
; CHECK-NOFP16-GI: // %bb.0: // %entry
|
|
; CHECK-NOFP16-GI-NEXT: ushll v1.8h, v0.8b, #0
|
|
; CHECK-NOFP16-GI-NEXT: ushll2 v0.8h, v0.16b, #0
|
|
; CHECK-NOFP16-GI-NEXT: ushll v2.4s, v1.4h, #0
|
|
; CHECK-NOFP16-GI-NEXT: ushll2 v1.4s, v1.8h, #0
|
|
; CHECK-NOFP16-GI-NEXT: ushll v3.4s, v0.4h, #0
|
|
; CHECK-NOFP16-GI-NEXT: ushll2 v4.4s, v0.8h, #0
|
|
; CHECK-NOFP16-GI-NEXT: ucvtf v0.4s, v2.4s
|
|
; CHECK-NOFP16-GI-NEXT: ucvtf v1.4s, v1.4s
|
|
; CHECK-NOFP16-GI-NEXT: ucvtf v2.4s, v3.4s
|
|
; CHECK-NOFP16-GI-NEXT: ucvtf v3.4s, v4.4s
|
|
; CHECK-NOFP16-GI-NEXT: ret
|
|
;
|
|
; CHECK-FP16-GI-LABEL: utofp_v16i8_v16f32:
|
|
; CHECK-FP16-GI: // %bb.0: // %entry
|
|
; CHECK-FP16-GI-NEXT: ushll v1.8h, v0.8b, #0
|
|
; CHECK-FP16-GI-NEXT: ushll2 v0.8h, v0.16b, #0
|
|
; CHECK-FP16-GI-NEXT: ushll v2.4s, v1.4h, #0
|
|
; CHECK-FP16-GI-NEXT: ushll2 v1.4s, v1.8h, #0
|
|
; CHECK-FP16-GI-NEXT: ushll v3.4s, v0.4h, #0
|
|
; CHECK-FP16-GI-NEXT: ushll2 v4.4s, v0.8h, #0
|
|
; CHECK-FP16-GI-NEXT: ucvtf v0.4s, v2.4s
|
|
; CHECK-FP16-GI-NEXT: ucvtf v1.4s, v1.4s
|
|
; CHECK-FP16-GI-NEXT: ucvtf v2.4s, v3.4s
|
|
; CHECK-FP16-GI-NEXT: ucvtf v3.4s, v4.4s
|
|
; CHECK-FP16-GI-NEXT: ret
|
|
entry:
|
|
%c = uitofp <16 x i8> %a to <16 x float>
|
|
ret <16 x float> %c
|
|
}
|
|
|
|
define <32 x float> @stofp_v32i8_v32f32(<32 x i8> %a) {
|
|
; CHECK-NOFP16-SD-LABEL: stofp_v32i8_v32f32:
|
|
; CHECK-NOFP16-SD: // %bb.0: // %entry
|
|
; CHECK-NOFP16-SD-NEXT: ext v2.16b, v0.16b, v0.16b, #8
|
|
; CHECK-NOFP16-SD-NEXT: ext v3.16b, v1.16b, v1.16b, #8
|
|
; CHECK-NOFP16-SD-NEXT: zip1 v4.8b, v0.8b, v0.8b
|
|
; CHECK-NOFP16-SD-NEXT: zip2 v0.8b, v0.8b, v0.8b
|
|
; CHECK-NOFP16-SD-NEXT: shl v4.4h, v4.4h, #8
|
|
; CHECK-NOFP16-SD-NEXT: zip1 v5.8b, v1.8b, v0.8b
|
|
; CHECK-NOFP16-SD-NEXT: zip1 v6.8b, v2.8b, v0.8b
|
|
; CHECK-NOFP16-SD-NEXT: zip2 v2.8b, v2.8b, v0.8b
|
|
; CHECK-NOFP16-SD-NEXT: zip2 v1.8b, v1.8b, v0.8b
|
|
; CHECK-NOFP16-SD-NEXT: zip1 v7.8b, v3.8b, v0.8b
|
|
; CHECK-NOFP16-SD-NEXT: zip2 v3.8b, v3.8b, v0.8b
|
|
; CHECK-NOFP16-SD-NEXT: shl v0.4h, v0.4h, #8
|
|
; CHECK-NOFP16-SD-NEXT: sshr v4.4h, v4.4h, #8
|
|
; CHECK-NOFP16-SD-NEXT: shl v5.4h, v5.4h, #8
|
|
; CHECK-NOFP16-SD-NEXT: shl v6.4h, v6.4h, #8
|
|
; CHECK-NOFP16-SD-NEXT: shl v2.4h, v2.4h, #8
|
|
; CHECK-NOFP16-SD-NEXT: shl v1.4h, v1.4h, #8
|
|
; CHECK-NOFP16-SD-NEXT: shl v7.4h, v7.4h, #8
|
|
; CHECK-NOFP16-SD-NEXT: shl v3.4h, v3.4h, #8
|
|
; CHECK-NOFP16-SD-NEXT: sshr v0.4h, v0.4h, #8
|
|
; CHECK-NOFP16-SD-NEXT: sshll v4.4s, v4.4h, #0
|
|
; CHECK-NOFP16-SD-NEXT: sshr v5.4h, v5.4h, #8
|
|
; CHECK-NOFP16-SD-NEXT: sshr v6.4h, v6.4h, #8
|
|
; CHECK-NOFP16-SD-NEXT: sshr v2.4h, v2.4h, #8
|
|
; CHECK-NOFP16-SD-NEXT: sshr v1.4h, v1.4h, #8
|
|
; CHECK-NOFP16-SD-NEXT: sshr v7.4h, v7.4h, #8
|
|
; CHECK-NOFP16-SD-NEXT: sshr v3.4h, v3.4h, #8
|
|
; CHECK-NOFP16-SD-NEXT: sshll v16.4s, v0.4h, #0
|
|
; CHECK-NOFP16-SD-NEXT: scvtf v0.4s, v4.4s
|
|
; CHECK-NOFP16-SD-NEXT: sshll v5.4s, v5.4h, #0
|
|
; CHECK-NOFP16-SD-NEXT: sshll v6.4s, v6.4h, #0
|
|
; CHECK-NOFP16-SD-NEXT: sshll v17.4s, v2.4h, #0
|
|
; CHECK-NOFP16-SD-NEXT: sshll v18.4s, v1.4h, #0
|
|
; CHECK-NOFP16-SD-NEXT: sshll v7.4s, v7.4h, #0
|
|
; CHECK-NOFP16-SD-NEXT: sshll v19.4s, v3.4h, #0
|
|
; CHECK-NOFP16-SD-NEXT: scvtf v1.4s, v16.4s
|
|
; CHECK-NOFP16-SD-NEXT: scvtf v4.4s, v5.4s
|
|
; CHECK-NOFP16-SD-NEXT: scvtf v2.4s, v6.4s
|
|
; CHECK-NOFP16-SD-NEXT: scvtf v3.4s, v17.4s
|
|
; CHECK-NOFP16-SD-NEXT: scvtf v5.4s, v18.4s
|
|
; CHECK-NOFP16-SD-NEXT: scvtf v6.4s, v7.4s
|
|
; CHECK-NOFP16-SD-NEXT: scvtf v7.4s, v19.4s
|
|
; CHECK-NOFP16-SD-NEXT: ret
|
|
;
|
|
; CHECK-FP16-SD-LABEL: stofp_v32i8_v32f32:
|
|
; CHECK-FP16-SD: // %bb.0: // %entry
|
|
; CHECK-FP16-SD-NEXT: ext v2.16b, v0.16b, v0.16b, #8
|
|
; CHECK-FP16-SD-NEXT: ext v3.16b, v1.16b, v1.16b, #8
|
|
; CHECK-FP16-SD-NEXT: zip1 v4.8b, v0.8b, v0.8b
|
|
; CHECK-FP16-SD-NEXT: zip2 v0.8b, v0.8b, v0.8b
|
|
; CHECK-FP16-SD-NEXT: shl v4.4h, v4.4h, #8
|
|
; CHECK-FP16-SD-NEXT: zip1 v5.8b, v1.8b, v0.8b
|
|
; CHECK-FP16-SD-NEXT: zip1 v6.8b, v2.8b, v0.8b
|
|
; CHECK-FP16-SD-NEXT: zip2 v2.8b, v2.8b, v0.8b
|
|
; CHECK-FP16-SD-NEXT: zip2 v1.8b, v1.8b, v0.8b
|
|
; CHECK-FP16-SD-NEXT: zip1 v7.8b, v3.8b, v0.8b
|
|
; CHECK-FP16-SD-NEXT: zip2 v3.8b, v3.8b, v0.8b
|
|
; CHECK-FP16-SD-NEXT: shl v0.4h, v0.4h, #8
|
|
; CHECK-FP16-SD-NEXT: sshr v4.4h, v4.4h, #8
|
|
; CHECK-FP16-SD-NEXT: shl v5.4h, v5.4h, #8
|
|
; CHECK-FP16-SD-NEXT: shl v6.4h, v6.4h, #8
|
|
; CHECK-FP16-SD-NEXT: shl v2.4h, v2.4h, #8
|
|
; CHECK-FP16-SD-NEXT: shl v1.4h, v1.4h, #8
|
|
; CHECK-FP16-SD-NEXT: shl v7.4h, v7.4h, #8
|
|
; CHECK-FP16-SD-NEXT: shl v3.4h, v3.4h, #8
|
|
; CHECK-FP16-SD-NEXT: sshr v0.4h, v0.4h, #8
|
|
; CHECK-FP16-SD-NEXT: sshll v4.4s, v4.4h, #0
|
|
; CHECK-FP16-SD-NEXT: sshr v5.4h, v5.4h, #8
|
|
; CHECK-FP16-SD-NEXT: sshr v6.4h, v6.4h, #8
|
|
; CHECK-FP16-SD-NEXT: sshr v2.4h, v2.4h, #8
|
|
; CHECK-FP16-SD-NEXT: sshr v1.4h, v1.4h, #8
|
|
; CHECK-FP16-SD-NEXT: sshr v7.4h, v7.4h, #8
|
|
; CHECK-FP16-SD-NEXT: sshr v3.4h, v3.4h, #8
|
|
; CHECK-FP16-SD-NEXT: sshll v16.4s, v0.4h, #0
|
|
; CHECK-FP16-SD-NEXT: scvtf v0.4s, v4.4s
|
|
; CHECK-FP16-SD-NEXT: sshll v5.4s, v5.4h, #0
|
|
; CHECK-FP16-SD-NEXT: sshll v6.4s, v6.4h, #0
|
|
; CHECK-FP16-SD-NEXT: sshll v17.4s, v2.4h, #0
|
|
; CHECK-FP16-SD-NEXT: sshll v18.4s, v1.4h, #0
|
|
; CHECK-FP16-SD-NEXT: sshll v7.4s, v7.4h, #0
|
|
; CHECK-FP16-SD-NEXT: sshll v19.4s, v3.4h, #0
|
|
; CHECK-FP16-SD-NEXT: scvtf v1.4s, v16.4s
|
|
; CHECK-FP16-SD-NEXT: scvtf v4.4s, v5.4s
|
|
; CHECK-FP16-SD-NEXT: scvtf v2.4s, v6.4s
|
|
; CHECK-FP16-SD-NEXT: scvtf v3.4s, v17.4s
|
|
; CHECK-FP16-SD-NEXT: scvtf v5.4s, v18.4s
|
|
; CHECK-FP16-SD-NEXT: scvtf v6.4s, v7.4s
|
|
; CHECK-FP16-SD-NEXT: scvtf v7.4s, v19.4s
|
|
; CHECK-FP16-SD-NEXT: ret
|
|
;
|
|
; CHECK-NOFP16-GI-LABEL: stofp_v32i8_v32f32:
|
|
; CHECK-NOFP16-GI: // %bb.0: // %entry
|
|
; CHECK-NOFP16-GI-NEXT: sshll v2.8h, v0.8b, #0
|
|
; CHECK-NOFP16-GI-NEXT: sshll2 v0.8h, v0.16b, #0
|
|
; CHECK-NOFP16-GI-NEXT: sshll v3.8h, v1.8b, #0
|
|
; CHECK-NOFP16-GI-NEXT: sshll2 v1.8h, v1.16b, #0
|
|
; CHECK-NOFP16-GI-NEXT: sshll v4.4s, v2.4h, #0
|
|
; CHECK-NOFP16-GI-NEXT: sshll2 v2.4s, v2.8h, #0
|
|
; CHECK-NOFP16-GI-NEXT: sshll v5.4s, v0.4h, #0
|
|
; CHECK-NOFP16-GI-NEXT: sshll2 v6.4s, v0.8h, #0
|
|
; CHECK-NOFP16-GI-NEXT: sshll v7.4s, v3.4h, #0
|
|
; CHECK-NOFP16-GI-NEXT: sshll2 v16.4s, v3.8h, #0
|
|
; CHECK-NOFP16-GI-NEXT: sshll v17.4s, v1.4h, #0
|
|
; CHECK-NOFP16-GI-NEXT: sshll2 v18.4s, v1.8h, #0
|
|
; CHECK-NOFP16-GI-NEXT: scvtf v0.4s, v4.4s
|
|
; CHECK-NOFP16-GI-NEXT: scvtf v1.4s, v2.4s
|
|
; CHECK-NOFP16-GI-NEXT: scvtf v2.4s, v5.4s
|
|
; CHECK-NOFP16-GI-NEXT: scvtf v3.4s, v6.4s
|
|
; CHECK-NOFP16-GI-NEXT: scvtf v4.4s, v7.4s
|
|
; CHECK-NOFP16-GI-NEXT: scvtf v5.4s, v16.4s
|
|
; CHECK-NOFP16-GI-NEXT: scvtf v6.4s, v17.4s
|
|
; CHECK-NOFP16-GI-NEXT: scvtf v7.4s, v18.4s
|
|
; CHECK-NOFP16-GI-NEXT: ret
|
|
;
|
|
; CHECK-FP16-GI-LABEL: stofp_v32i8_v32f32:
|
|
; CHECK-FP16-GI: // %bb.0: // %entry
|
|
; CHECK-FP16-GI-NEXT: sshll v2.8h, v0.8b, #0
|
|
; CHECK-FP16-GI-NEXT: sshll2 v0.8h, v0.16b, #0
|
|
; CHECK-FP16-GI-NEXT: sshll v3.8h, v1.8b, #0
|
|
; CHECK-FP16-GI-NEXT: sshll2 v1.8h, v1.16b, #0
|
|
; CHECK-FP16-GI-NEXT: sshll v4.4s, v2.4h, #0
|
|
; CHECK-FP16-GI-NEXT: sshll2 v2.4s, v2.8h, #0
|
|
; CHECK-FP16-GI-NEXT: sshll v5.4s, v0.4h, #0
|
|
; CHECK-FP16-GI-NEXT: sshll2 v6.4s, v0.8h, #0
|
|
; CHECK-FP16-GI-NEXT: sshll v7.4s, v3.4h, #0
|
|
; CHECK-FP16-GI-NEXT: sshll2 v16.4s, v3.8h, #0
|
|
; CHECK-FP16-GI-NEXT: sshll v17.4s, v1.4h, #0
|
|
; CHECK-FP16-GI-NEXT: sshll2 v18.4s, v1.8h, #0
|
|
; CHECK-FP16-GI-NEXT: scvtf v0.4s, v4.4s
|
|
; CHECK-FP16-GI-NEXT: scvtf v1.4s, v2.4s
|
|
; CHECK-FP16-GI-NEXT: scvtf v2.4s, v5.4s
|
|
; CHECK-FP16-GI-NEXT: scvtf v3.4s, v6.4s
|
|
; CHECK-FP16-GI-NEXT: scvtf v4.4s, v7.4s
|
|
; CHECK-FP16-GI-NEXT: scvtf v5.4s, v16.4s
|
|
; CHECK-FP16-GI-NEXT: scvtf v6.4s, v17.4s
|
|
; CHECK-FP16-GI-NEXT: scvtf v7.4s, v18.4s
|
|
; CHECK-FP16-GI-NEXT: ret
|
|
entry:
|
|
%c = sitofp <32 x i8> %a to <32 x float>
|
|
ret <32 x float> %c
|
|
}
|
|
|
|
define <32 x float> @utofp_v32i8_v32f32(<32 x i8> %a) {
|
|
; CHECK-NOFP16-SD-LABEL: utofp_v32i8_v32f32:
|
|
; CHECK-NOFP16-SD: // %bb.0: // %entry
|
|
; CHECK-NOFP16-SD-NEXT: ext v2.16b, v0.16b, v0.16b, #8
|
|
; CHECK-NOFP16-SD-NEXT: ext v3.16b, v1.16b, v1.16b, #8
|
|
; CHECK-NOFP16-SD-NEXT: zip1 v4.8b, v0.8b, v0.8b
|
|
; CHECK-NOFP16-SD-NEXT: zip2 v0.8b, v0.8b, v0.8b
|
|
; CHECK-NOFP16-SD-NEXT: bic v4.4h, #255, lsl #8
|
|
; CHECK-NOFP16-SD-NEXT: zip1 v5.8b, v1.8b, v0.8b
|
|
; CHECK-NOFP16-SD-NEXT: zip1 v6.8b, v2.8b, v0.8b
|
|
; CHECK-NOFP16-SD-NEXT: zip2 v2.8b, v2.8b, v0.8b
|
|
; CHECK-NOFP16-SD-NEXT: zip2 v1.8b, v1.8b, v0.8b
|
|
; CHECK-NOFP16-SD-NEXT: zip1 v7.8b, v3.8b, v0.8b
|
|
; CHECK-NOFP16-SD-NEXT: zip2 v3.8b, v3.8b, v0.8b
|
|
; CHECK-NOFP16-SD-NEXT: bic v0.4h, #255, lsl #8
|
|
; CHECK-NOFP16-SD-NEXT: ushll v4.4s, v4.4h, #0
|
|
; CHECK-NOFP16-SD-NEXT: bic v5.4h, #255, lsl #8
|
|
; CHECK-NOFP16-SD-NEXT: bic v6.4h, #255, lsl #8
|
|
; CHECK-NOFP16-SD-NEXT: bic v2.4h, #255, lsl #8
|
|
; CHECK-NOFP16-SD-NEXT: bic v1.4h, #255, lsl #8
|
|
; CHECK-NOFP16-SD-NEXT: bic v7.4h, #255, lsl #8
|
|
; CHECK-NOFP16-SD-NEXT: bic v3.4h, #255, lsl #8
|
|
; CHECK-NOFP16-SD-NEXT: ushll v16.4s, v0.4h, #0
|
|
; CHECK-NOFP16-SD-NEXT: ucvtf v0.4s, v4.4s
|
|
; CHECK-NOFP16-SD-NEXT: ushll v5.4s, v5.4h, #0
|
|
; CHECK-NOFP16-SD-NEXT: ushll v6.4s, v6.4h, #0
|
|
; CHECK-NOFP16-SD-NEXT: ushll v17.4s, v2.4h, #0
|
|
; CHECK-NOFP16-SD-NEXT: ushll v18.4s, v1.4h, #0
|
|
; CHECK-NOFP16-SD-NEXT: ushll v7.4s, v7.4h, #0
|
|
; CHECK-NOFP16-SD-NEXT: ushll v19.4s, v3.4h, #0
|
|
; CHECK-NOFP16-SD-NEXT: ucvtf v1.4s, v16.4s
|
|
; CHECK-NOFP16-SD-NEXT: ucvtf v4.4s, v5.4s
|
|
; CHECK-NOFP16-SD-NEXT: ucvtf v2.4s, v6.4s
|
|
; CHECK-NOFP16-SD-NEXT: ucvtf v3.4s, v17.4s
|
|
; CHECK-NOFP16-SD-NEXT: ucvtf v5.4s, v18.4s
|
|
; CHECK-NOFP16-SD-NEXT: ucvtf v6.4s, v7.4s
|
|
; CHECK-NOFP16-SD-NEXT: ucvtf v7.4s, v19.4s
|
|
; CHECK-NOFP16-SD-NEXT: ret
|
|
;
|
|
; CHECK-FP16-SD-LABEL: utofp_v32i8_v32f32:
|
|
; CHECK-FP16-SD: // %bb.0: // %entry
|
|
; CHECK-FP16-SD-NEXT: ext v2.16b, v0.16b, v0.16b, #8
|
|
; CHECK-FP16-SD-NEXT: ext v3.16b, v1.16b, v1.16b, #8
|
|
; CHECK-FP16-SD-NEXT: zip1 v4.8b, v0.8b, v0.8b
|
|
; CHECK-FP16-SD-NEXT: zip2 v0.8b, v0.8b, v0.8b
|
|
; CHECK-FP16-SD-NEXT: bic v4.4h, #255, lsl #8
|
|
; CHECK-FP16-SD-NEXT: zip1 v5.8b, v1.8b, v0.8b
|
|
; CHECK-FP16-SD-NEXT: zip1 v6.8b, v2.8b, v0.8b
|
|
; CHECK-FP16-SD-NEXT: zip2 v2.8b, v2.8b, v0.8b
|
|
; CHECK-FP16-SD-NEXT: zip2 v1.8b, v1.8b, v0.8b
|
|
; CHECK-FP16-SD-NEXT: zip1 v7.8b, v3.8b, v0.8b
|
|
; CHECK-FP16-SD-NEXT: zip2 v3.8b, v3.8b, v0.8b
|
|
; CHECK-FP16-SD-NEXT: bic v0.4h, #255, lsl #8
|
|
; CHECK-FP16-SD-NEXT: ushll v4.4s, v4.4h, #0
|
|
; CHECK-FP16-SD-NEXT: bic v5.4h, #255, lsl #8
|
|
; CHECK-FP16-SD-NEXT: bic v6.4h, #255, lsl #8
|
|
; CHECK-FP16-SD-NEXT: bic v2.4h, #255, lsl #8
|
|
; CHECK-FP16-SD-NEXT: bic v1.4h, #255, lsl #8
|
|
; CHECK-FP16-SD-NEXT: bic v7.4h, #255, lsl #8
|
|
; CHECK-FP16-SD-NEXT: bic v3.4h, #255, lsl #8
|
|
; CHECK-FP16-SD-NEXT: ushll v16.4s, v0.4h, #0
|
|
; CHECK-FP16-SD-NEXT: ucvtf v0.4s, v4.4s
|
|
; CHECK-FP16-SD-NEXT: ushll v5.4s, v5.4h, #0
|
|
; CHECK-FP16-SD-NEXT: ushll v6.4s, v6.4h, #0
|
|
; CHECK-FP16-SD-NEXT: ushll v17.4s, v2.4h, #0
|
|
; CHECK-FP16-SD-NEXT: ushll v18.4s, v1.4h, #0
|
|
; CHECK-FP16-SD-NEXT: ushll v7.4s, v7.4h, #0
|
|
; CHECK-FP16-SD-NEXT: ushll v19.4s, v3.4h, #0
|
|
; CHECK-FP16-SD-NEXT: ucvtf v1.4s, v16.4s
|
|
; CHECK-FP16-SD-NEXT: ucvtf v4.4s, v5.4s
|
|
; CHECK-FP16-SD-NEXT: ucvtf v2.4s, v6.4s
|
|
; CHECK-FP16-SD-NEXT: ucvtf v3.4s, v17.4s
|
|
; CHECK-FP16-SD-NEXT: ucvtf v5.4s, v18.4s
|
|
; CHECK-FP16-SD-NEXT: ucvtf v6.4s, v7.4s
|
|
; CHECK-FP16-SD-NEXT: ucvtf v7.4s, v19.4s
|
|
; CHECK-FP16-SD-NEXT: ret
|
|
;
|
|
; CHECK-NOFP16-GI-LABEL: utofp_v32i8_v32f32:
|
|
; CHECK-NOFP16-GI: // %bb.0: // %entry
|
|
; CHECK-NOFP16-GI-NEXT: ushll v2.8h, v0.8b, #0
|
|
; CHECK-NOFP16-GI-NEXT: ushll2 v0.8h, v0.16b, #0
|
|
; CHECK-NOFP16-GI-NEXT: ushll v3.8h, v1.8b, #0
|
|
; CHECK-NOFP16-GI-NEXT: ushll2 v1.8h, v1.16b, #0
|
|
; CHECK-NOFP16-GI-NEXT: ushll v4.4s, v2.4h, #0
|
|
; CHECK-NOFP16-GI-NEXT: ushll2 v2.4s, v2.8h, #0
|
|
; CHECK-NOFP16-GI-NEXT: ushll v5.4s, v0.4h, #0
|
|
; CHECK-NOFP16-GI-NEXT: ushll2 v6.4s, v0.8h, #0
|
|
; CHECK-NOFP16-GI-NEXT: ushll v7.4s, v3.4h, #0
|
|
; CHECK-NOFP16-GI-NEXT: ushll2 v16.4s, v3.8h, #0
|
|
; CHECK-NOFP16-GI-NEXT: ushll v17.4s, v1.4h, #0
|
|
; CHECK-NOFP16-GI-NEXT: ushll2 v18.4s, v1.8h, #0
|
|
; CHECK-NOFP16-GI-NEXT: ucvtf v0.4s, v4.4s
|
|
; CHECK-NOFP16-GI-NEXT: ucvtf v1.4s, v2.4s
|
|
; CHECK-NOFP16-GI-NEXT: ucvtf v2.4s, v5.4s
|
|
; CHECK-NOFP16-GI-NEXT: ucvtf v3.4s, v6.4s
|
|
; CHECK-NOFP16-GI-NEXT: ucvtf v4.4s, v7.4s
|
|
; CHECK-NOFP16-GI-NEXT: ucvtf v5.4s, v16.4s
|
|
; CHECK-NOFP16-GI-NEXT: ucvtf v6.4s, v17.4s
|
|
; CHECK-NOFP16-GI-NEXT: ucvtf v7.4s, v18.4s
|
|
; CHECK-NOFP16-GI-NEXT: ret
|
|
;
|
|
; CHECK-FP16-GI-LABEL: utofp_v32i8_v32f32:
|
|
; CHECK-FP16-GI: // %bb.0: // %entry
|
|
; CHECK-FP16-GI-NEXT: ushll v2.8h, v0.8b, #0
|
|
; CHECK-FP16-GI-NEXT: ushll2 v0.8h, v0.16b, #0
|
|
; CHECK-FP16-GI-NEXT: ushll v3.8h, v1.8b, #0
|
|
; CHECK-FP16-GI-NEXT: ushll2 v1.8h, v1.16b, #0
|
|
; CHECK-FP16-GI-NEXT: ushll v4.4s, v2.4h, #0
|
|
; CHECK-FP16-GI-NEXT: ushll2 v2.4s, v2.8h, #0
|
|
; CHECK-FP16-GI-NEXT: ushll v5.4s, v0.4h, #0
|
|
; CHECK-FP16-GI-NEXT: ushll2 v6.4s, v0.8h, #0
|
|
; CHECK-FP16-GI-NEXT: ushll v7.4s, v3.4h, #0
|
|
; CHECK-FP16-GI-NEXT: ushll2 v16.4s, v3.8h, #0
|
|
; CHECK-FP16-GI-NEXT: ushll v17.4s, v1.4h, #0
|
|
; CHECK-FP16-GI-NEXT: ushll2 v18.4s, v1.8h, #0
|
|
; CHECK-FP16-GI-NEXT: ucvtf v0.4s, v4.4s
|
|
; CHECK-FP16-GI-NEXT: ucvtf v1.4s, v2.4s
|
|
; CHECK-FP16-GI-NEXT: ucvtf v2.4s, v5.4s
|
|
; CHECK-FP16-GI-NEXT: ucvtf v3.4s, v6.4s
|
|
; CHECK-FP16-GI-NEXT: ucvtf v4.4s, v7.4s
|
|
; CHECK-FP16-GI-NEXT: ucvtf v5.4s, v16.4s
|
|
; CHECK-FP16-GI-NEXT: ucvtf v6.4s, v17.4s
|
|
; CHECK-FP16-GI-NEXT: ucvtf v7.4s, v18.4s
|
|
; CHECK-FP16-GI-NEXT: ret
|
|
entry:
|
|
%c = uitofp <32 x i8> %a to <32 x float>
|
|
ret <32 x float> %c
|
|
}
|
|
|
|
define <2 x float> @stofp_v2i128_v2f32(<2 x i128> %a) {
|
|
; CHECK-NOFP16-SD-LABEL: stofp_v2i128_v2f32:
|
|
; CHECK-NOFP16-SD: // %bb.0: // %entry
|
|
; CHECK-NOFP16-SD-NEXT: sub sp, sp, #48
|
|
; CHECK-NOFP16-SD-NEXT: str x30, [sp, #16] // 8-byte Folded Spill
|
|
; CHECK-NOFP16-SD-NEXT: stp x20, x19, [sp, #32] // 16-byte Folded Spill
|
|
; CHECK-NOFP16-SD-NEXT: .cfi_def_cfa_offset 48
|
|
; CHECK-NOFP16-SD-NEXT: .cfi_offset w19, -8
|
|
; CHECK-NOFP16-SD-NEXT: .cfi_offset w20, -16
|
|
; CHECK-NOFP16-SD-NEXT: .cfi_offset w30, -32
|
|
; CHECK-NOFP16-SD-NEXT: mov x19, x1
|
|
; CHECK-NOFP16-SD-NEXT: mov x20, x0
|
|
; CHECK-NOFP16-SD-NEXT: mov x0, x2
|
|
; CHECK-NOFP16-SD-NEXT: mov x1, x3
|
|
; CHECK-NOFP16-SD-NEXT: bl __floattisf
|
|
; CHECK-NOFP16-SD-NEXT: mov x0, x20
|
|
; CHECK-NOFP16-SD-NEXT: mov x1, x19
|
|
; CHECK-NOFP16-SD-NEXT: // kill: def $s0 killed $s0 def $q0
|
|
; CHECK-NOFP16-SD-NEXT: str q0, [sp] // 16-byte Folded Spill
|
|
; CHECK-NOFP16-SD-NEXT: bl __floattisf
|
|
; CHECK-NOFP16-SD-NEXT: ldr q1, [sp] // 16-byte Folded Reload
|
|
; CHECK-NOFP16-SD-NEXT: // kill: def $s0 killed $s0 def $q0
|
|
; CHECK-NOFP16-SD-NEXT: ldp x20, x19, [sp, #32] // 16-byte Folded Reload
|
|
; CHECK-NOFP16-SD-NEXT: ldr x30, [sp, #16] // 8-byte Folded Reload
|
|
; CHECK-NOFP16-SD-NEXT: mov v0.s[1], v1.s[0]
|
|
; CHECK-NOFP16-SD-NEXT: // kill: def $d0 killed $d0 killed $q0
|
|
; CHECK-NOFP16-SD-NEXT: add sp, sp, #48
|
|
; CHECK-NOFP16-SD-NEXT: ret
|
|
;
|
|
; CHECK-FP16-SD-LABEL: stofp_v2i128_v2f32:
|
|
; CHECK-FP16-SD: // %bb.0: // %entry
|
|
; CHECK-FP16-SD-NEXT: sub sp, sp, #48
|
|
; CHECK-FP16-SD-NEXT: str x30, [sp, #16] // 8-byte Folded Spill
|
|
; CHECK-FP16-SD-NEXT: stp x20, x19, [sp, #32] // 16-byte Folded Spill
|
|
; CHECK-FP16-SD-NEXT: .cfi_def_cfa_offset 48
|
|
; CHECK-FP16-SD-NEXT: .cfi_offset w19, -8
|
|
; CHECK-FP16-SD-NEXT: .cfi_offset w20, -16
|
|
; CHECK-FP16-SD-NEXT: .cfi_offset w30, -32
|
|
; CHECK-FP16-SD-NEXT: mov x19, x1
|
|
; CHECK-FP16-SD-NEXT: mov x20, x0
|
|
; CHECK-FP16-SD-NEXT: mov x0, x2
|
|
; CHECK-FP16-SD-NEXT: mov x1, x3
|
|
; CHECK-FP16-SD-NEXT: bl __floattisf
|
|
; CHECK-FP16-SD-NEXT: mov x0, x20
|
|
; CHECK-FP16-SD-NEXT: mov x1, x19
|
|
; CHECK-FP16-SD-NEXT: // kill: def $s0 killed $s0 def $q0
|
|
; CHECK-FP16-SD-NEXT: str q0, [sp] // 16-byte Folded Spill
|
|
; CHECK-FP16-SD-NEXT: bl __floattisf
|
|
; CHECK-FP16-SD-NEXT: ldr q1, [sp] // 16-byte Folded Reload
|
|
; CHECK-FP16-SD-NEXT: // kill: def $s0 killed $s0 def $q0
|
|
; CHECK-FP16-SD-NEXT: ldp x20, x19, [sp, #32] // 16-byte Folded Reload
|
|
; CHECK-FP16-SD-NEXT: ldr x30, [sp, #16] // 8-byte Folded Reload
|
|
; CHECK-FP16-SD-NEXT: mov v0.s[1], v1.s[0]
|
|
; CHECK-FP16-SD-NEXT: // kill: def $d0 killed $d0 killed $q0
|
|
; CHECK-FP16-SD-NEXT: add sp, sp, #48
|
|
; CHECK-FP16-SD-NEXT: ret
|
|
;
|
|
; CHECK-NOFP16-GI-LABEL: stofp_v2i128_v2f32:
|
|
; CHECK-NOFP16-GI: // %bb.0: // %entry
|
|
; CHECK-NOFP16-GI-NEXT: sub sp, sp, #48
|
|
; CHECK-NOFP16-GI-NEXT: str x30, [sp, #16] // 8-byte Folded Spill
|
|
; CHECK-NOFP16-GI-NEXT: stp x20, x19, [sp, #32] // 16-byte Folded Spill
|
|
; CHECK-NOFP16-GI-NEXT: .cfi_def_cfa_offset 48
|
|
; CHECK-NOFP16-GI-NEXT: .cfi_offset w19, -8
|
|
; CHECK-NOFP16-GI-NEXT: .cfi_offset w20, -16
|
|
; CHECK-NOFP16-GI-NEXT: .cfi_offset w30, -32
|
|
; CHECK-NOFP16-GI-NEXT: mov x19, x2
|
|
; CHECK-NOFP16-GI-NEXT: mov x20, x3
|
|
; CHECK-NOFP16-GI-NEXT: bl __floattisf
|
|
; CHECK-NOFP16-GI-NEXT: mov x0, x19
|
|
; CHECK-NOFP16-GI-NEXT: mov x1, x20
|
|
; CHECK-NOFP16-GI-NEXT: // kill: def $s0 killed $s0 def $q0
|
|
; CHECK-NOFP16-GI-NEXT: str q0, [sp] // 16-byte Folded Spill
|
|
; CHECK-NOFP16-GI-NEXT: bl __floattisf
|
|
; CHECK-NOFP16-GI-NEXT: ldr q1, [sp] // 16-byte Folded Reload
|
|
; CHECK-NOFP16-GI-NEXT: // kill: def $s0 killed $s0 def $q0
|
|
; CHECK-NOFP16-GI-NEXT: ldp x20, x19, [sp, #32] // 16-byte Folded Reload
|
|
; CHECK-NOFP16-GI-NEXT: ldr x30, [sp, #16] // 8-byte Folded Reload
|
|
; CHECK-NOFP16-GI-NEXT: mov v1.s[1], v0.s[0]
|
|
; CHECK-NOFP16-GI-NEXT: fmov d0, d1
|
|
; CHECK-NOFP16-GI-NEXT: add sp, sp, #48
|
|
; CHECK-NOFP16-GI-NEXT: ret
|
|
;
|
|
; CHECK-FP16-GI-LABEL: stofp_v2i128_v2f32:
|
|
; CHECK-FP16-GI: // %bb.0: // %entry
|
|
; CHECK-FP16-GI-NEXT: sub sp, sp, #48
|
|
; CHECK-FP16-GI-NEXT: str x30, [sp, #16] // 8-byte Folded Spill
|
|
; CHECK-FP16-GI-NEXT: stp x20, x19, [sp, #32] // 16-byte Folded Spill
|
|
; CHECK-FP16-GI-NEXT: .cfi_def_cfa_offset 48
|
|
; CHECK-FP16-GI-NEXT: .cfi_offset w19, -8
|
|
; CHECK-FP16-GI-NEXT: .cfi_offset w20, -16
|
|
; CHECK-FP16-GI-NEXT: .cfi_offset w30, -32
|
|
; CHECK-FP16-GI-NEXT: mov x19, x2
|
|
; CHECK-FP16-GI-NEXT: mov x20, x3
|
|
; CHECK-FP16-GI-NEXT: bl __floattisf
|
|
; CHECK-FP16-GI-NEXT: mov x0, x19
|
|
; CHECK-FP16-GI-NEXT: mov x1, x20
|
|
; CHECK-FP16-GI-NEXT: // kill: def $s0 killed $s0 def $q0
|
|
; CHECK-FP16-GI-NEXT: str q0, [sp] // 16-byte Folded Spill
|
|
; CHECK-FP16-GI-NEXT: bl __floattisf
|
|
; CHECK-FP16-GI-NEXT: ldr q1, [sp] // 16-byte Folded Reload
|
|
; CHECK-FP16-GI-NEXT: // kill: def $s0 killed $s0 def $q0
|
|
; CHECK-FP16-GI-NEXT: ldp x20, x19, [sp, #32] // 16-byte Folded Reload
|
|
; CHECK-FP16-GI-NEXT: ldr x30, [sp, #16] // 8-byte Folded Reload
|
|
; CHECK-FP16-GI-NEXT: mov v1.s[1], v0.s[0]
|
|
; CHECK-FP16-GI-NEXT: fmov d0, d1
|
|
; CHECK-FP16-GI-NEXT: add sp, sp, #48
|
|
; CHECK-FP16-GI-NEXT: ret
|
|
entry:
|
|
%c = sitofp <2 x i128> %a to <2 x float>
|
|
ret <2 x float> %c
|
|
}
|
|
|
|
define <2 x float> @utofp_v2i128_v2f32(<2 x i128> %a) {
|
|
; CHECK-NOFP16-SD-LABEL: utofp_v2i128_v2f32:
|
|
; CHECK-NOFP16-SD: // %bb.0: // %entry
|
|
; CHECK-NOFP16-SD-NEXT: sub sp, sp, #48
|
|
; CHECK-NOFP16-SD-NEXT: str x30, [sp, #16] // 8-byte Folded Spill
|
|
; CHECK-NOFP16-SD-NEXT: stp x20, x19, [sp, #32] // 16-byte Folded Spill
|
|
; CHECK-NOFP16-SD-NEXT: .cfi_def_cfa_offset 48
|
|
; CHECK-NOFP16-SD-NEXT: .cfi_offset w19, -8
|
|
; CHECK-NOFP16-SD-NEXT: .cfi_offset w20, -16
|
|
; CHECK-NOFP16-SD-NEXT: .cfi_offset w30, -32
|
|
; CHECK-NOFP16-SD-NEXT: mov x19, x1
|
|
; CHECK-NOFP16-SD-NEXT: mov x20, x0
|
|
; CHECK-NOFP16-SD-NEXT: mov x0, x2
|
|
; CHECK-NOFP16-SD-NEXT: mov x1, x3
|
|
; CHECK-NOFP16-SD-NEXT: bl __floatuntisf
|
|
; CHECK-NOFP16-SD-NEXT: mov x0, x20
|
|
; CHECK-NOFP16-SD-NEXT: mov x1, x19
|
|
; CHECK-NOFP16-SD-NEXT: // kill: def $s0 killed $s0 def $q0
|
|
; CHECK-NOFP16-SD-NEXT: str q0, [sp] // 16-byte Folded Spill
|
|
; CHECK-NOFP16-SD-NEXT: bl __floatuntisf
|
|
; CHECK-NOFP16-SD-NEXT: ldr q1, [sp] // 16-byte Folded Reload
|
|
; CHECK-NOFP16-SD-NEXT: // kill: def $s0 killed $s0 def $q0
|
|
; CHECK-NOFP16-SD-NEXT: ldp x20, x19, [sp, #32] // 16-byte Folded Reload
|
|
; CHECK-NOFP16-SD-NEXT: ldr x30, [sp, #16] // 8-byte Folded Reload
|
|
; CHECK-NOFP16-SD-NEXT: mov v0.s[1], v1.s[0]
|
|
; CHECK-NOFP16-SD-NEXT: // kill: def $d0 killed $d0 killed $q0
|
|
; CHECK-NOFP16-SD-NEXT: add sp, sp, #48
|
|
; CHECK-NOFP16-SD-NEXT: ret
|
|
;
|
|
; CHECK-FP16-SD-LABEL: utofp_v2i128_v2f32:
|
|
; CHECK-FP16-SD: // %bb.0: // %entry
|
|
; CHECK-FP16-SD-NEXT: sub sp, sp, #48
|
|
; CHECK-FP16-SD-NEXT: str x30, [sp, #16] // 8-byte Folded Spill
|
|
; CHECK-FP16-SD-NEXT: stp x20, x19, [sp, #32] // 16-byte Folded Spill
|
|
; CHECK-FP16-SD-NEXT: .cfi_def_cfa_offset 48
|
|
; CHECK-FP16-SD-NEXT: .cfi_offset w19, -8
|
|
; CHECK-FP16-SD-NEXT: .cfi_offset w20, -16
|
|
; CHECK-FP16-SD-NEXT: .cfi_offset w30, -32
|
|
; CHECK-FP16-SD-NEXT: mov x19, x1
|
|
; CHECK-FP16-SD-NEXT: mov x20, x0
|
|
; CHECK-FP16-SD-NEXT: mov x0, x2
|
|
; CHECK-FP16-SD-NEXT: mov x1, x3
|
|
; CHECK-FP16-SD-NEXT: bl __floatuntisf
|
|
; CHECK-FP16-SD-NEXT: mov x0, x20
|
|
; CHECK-FP16-SD-NEXT: mov x1, x19
|
|
; CHECK-FP16-SD-NEXT: // kill: def $s0 killed $s0 def $q0
|
|
; CHECK-FP16-SD-NEXT: str q0, [sp] // 16-byte Folded Spill
|
|
; CHECK-FP16-SD-NEXT: bl __floatuntisf
|
|
; CHECK-FP16-SD-NEXT: ldr q1, [sp] // 16-byte Folded Reload
|
|
; CHECK-FP16-SD-NEXT: // kill: def $s0 killed $s0 def $q0
|
|
; CHECK-FP16-SD-NEXT: ldp x20, x19, [sp, #32] // 16-byte Folded Reload
|
|
; CHECK-FP16-SD-NEXT: ldr x30, [sp, #16] // 8-byte Folded Reload
|
|
; CHECK-FP16-SD-NEXT: mov v0.s[1], v1.s[0]
|
|
; CHECK-FP16-SD-NEXT: // kill: def $d0 killed $d0 killed $q0
|
|
; CHECK-FP16-SD-NEXT: add sp, sp, #48
|
|
; CHECK-FP16-SD-NEXT: ret
|
|
;
|
|
; CHECK-NOFP16-GI-LABEL: utofp_v2i128_v2f32:
|
|
; CHECK-NOFP16-GI: // %bb.0: // %entry
|
|
; CHECK-NOFP16-GI-NEXT: sub sp, sp, #48
|
|
; CHECK-NOFP16-GI-NEXT: str x30, [sp, #16] // 8-byte Folded Spill
|
|
; CHECK-NOFP16-GI-NEXT: stp x20, x19, [sp, #32] // 16-byte Folded Spill
|
|
; CHECK-NOFP16-GI-NEXT: .cfi_def_cfa_offset 48
|
|
; CHECK-NOFP16-GI-NEXT: .cfi_offset w19, -8
|
|
; CHECK-NOFP16-GI-NEXT: .cfi_offset w20, -16
|
|
; CHECK-NOFP16-GI-NEXT: .cfi_offset w30, -32
|
|
; CHECK-NOFP16-GI-NEXT: mov x19, x2
|
|
; CHECK-NOFP16-GI-NEXT: mov x20, x3
|
|
; CHECK-NOFP16-GI-NEXT: bl __floatuntisf
|
|
; CHECK-NOFP16-GI-NEXT: mov x0, x19
|
|
; CHECK-NOFP16-GI-NEXT: mov x1, x20
|
|
; CHECK-NOFP16-GI-NEXT: // kill: def $s0 killed $s0 def $q0
|
|
; CHECK-NOFP16-GI-NEXT: str q0, [sp] // 16-byte Folded Spill
|
|
; CHECK-NOFP16-GI-NEXT: bl __floatuntisf
|
|
; CHECK-NOFP16-GI-NEXT: ldr q1, [sp] // 16-byte Folded Reload
|
|
; CHECK-NOFP16-GI-NEXT: // kill: def $s0 killed $s0 def $q0
|
|
; CHECK-NOFP16-GI-NEXT: ldp x20, x19, [sp, #32] // 16-byte Folded Reload
|
|
; CHECK-NOFP16-GI-NEXT: ldr x30, [sp, #16] // 8-byte Folded Reload
|
|
; CHECK-NOFP16-GI-NEXT: mov v1.s[1], v0.s[0]
|
|
; CHECK-NOFP16-GI-NEXT: fmov d0, d1
|
|
; CHECK-NOFP16-GI-NEXT: add sp, sp, #48
|
|
; CHECK-NOFP16-GI-NEXT: ret
|
|
;
|
|
; CHECK-FP16-GI-LABEL: utofp_v2i128_v2f32:
|
|
; CHECK-FP16-GI: // %bb.0: // %entry
|
|
; CHECK-FP16-GI-NEXT: sub sp, sp, #48
|
|
; CHECK-FP16-GI-NEXT: str x30, [sp, #16] // 8-byte Folded Spill
|
|
; CHECK-FP16-GI-NEXT: stp x20, x19, [sp, #32] // 16-byte Folded Spill
|
|
; CHECK-FP16-GI-NEXT: .cfi_def_cfa_offset 48
|
|
; CHECK-FP16-GI-NEXT: .cfi_offset w19, -8
|
|
; CHECK-FP16-GI-NEXT: .cfi_offset w20, -16
|
|
; CHECK-FP16-GI-NEXT: .cfi_offset w30, -32
|
|
; CHECK-FP16-GI-NEXT: mov x19, x2
|
|
; CHECK-FP16-GI-NEXT: mov x20, x3
|
|
; CHECK-FP16-GI-NEXT: bl __floatuntisf
|
|
; CHECK-FP16-GI-NEXT: mov x0, x19
|
|
; CHECK-FP16-GI-NEXT: mov x1, x20
|
|
; CHECK-FP16-GI-NEXT: // kill: def $s0 killed $s0 def $q0
|
|
; CHECK-FP16-GI-NEXT: str q0, [sp] // 16-byte Folded Spill
|
|
; CHECK-FP16-GI-NEXT: bl __floatuntisf
|
|
; CHECK-FP16-GI-NEXT: ldr q1, [sp] // 16-byte Folded Reload
|
|
; CHECK-FP16-GI-NEXT: // kill: def $s0 killed $s0 def $q0
|
|
; CHECK-FP16-GI-NEXT: ldp x20, x19, [sp, #32] // 16-byte Folded Reload
|
|
; CHECK-FP16-GI-NEXT: ldr x30, [sp, #16] // 8-byte Folded Reload
|
|
; CHECK-FP16-GI-NEXT: mov v1.s[1], v0.s[0]
|
|
; CHECK-FP16-GI-NEXT: fmov d0, d1
|
|
; CHECK-FP16-GI-NEXT: add sp, sp, #48
|
|
; CHECK-FP16-GI-NEXT: ret
|
|
entry:
|
|
%c = uitofp <2 x i128> %a to <2 x float>
|
|
ret <2 x float> %c
|
|
}
|
|
|
|
define <2 x half> @stofp_v2i64_v2f16(<2 x i64> %a) {
|
|
; CHECK-NOFP16-SD-LABEL: stofp_v2i64_v2f16:
|
|
; CHECK-NOFP16-SD: // %bb.0: // %entry
|
|
; CHECK-NOFP16-SD-NEXT: mov x8, v0.d[1]
|
|
; CHECK-NOFP16-SD-NEXT: fmov x9, d0
|
|
; CHECK-NOFP16-SD-NEXT: scvtf s1, x9
|
|
; CHECK-NOFP16-SD-NEXT: scvtf s0, x8
|
|
; CHECK-NOFP16-SD-NEXT: fcvt h2, s0
|
|
; CHECK-NOFP16-SD-NEXT: fcvt h0, s1
|
|
; CHECK-NOFP16-SD-NEXT: mov v0.h[1], v2.h[0]
|
|
; CHECK-NOFP16-SD-NEXT: // kill: def $d0 killed $d0 killed $q0
|
|
; CHECK-NOFP16-SD-NEXT: ret
|
|
;
|
|
; CHECK-FP16-SD-LABEL: stofp_v2i64_v2f16:
|
|
; CHECK-FP16-SD: // %bb.0: // %entry
|
|
; CHECK-FP16-SD-NEXT: mov x8, v0.d[1]
|
|
; CHECK-FP16-SD-NEXT: fmov x9, d0
|
|
; CHECK-FP16-SD-NEXT: scvtf h0, x9
|
|
; CHECK-FP16-SD-NEXT: scvtf h1, x8
|
|
; CHECK-FP16-SD-NEXT: mov v0.h[1], v1.h[0]
|
|
; CHECK-FP16-SD-NEXT: // kill: def $d0 killed $d0 killed $q0
|
|
; CHECK-FP16-SD-NEXT: ret
|
|
;
|
|
; CHECK-NOFP16-GI-LABEL: stofp_v2i64_v2f16:
|
|
; CHECK-NOFP16-GI: // %bb.0: // %entry
|
|
; CHECK-NOFP16-GI-NEXT: scvtf v0.2d, v0.2d
|
|
; CHECK-NOFP16-GI-NEXT: fcvtn v0.2s, v0.2d
|
|
; CHECK-NOFP16-GI-NEXT: mov v1.s[0], v0.s[0]
|
|
; CHECK-NOFP16-GI-NEXT: mov v1.s[1], v0.s[1]
|
|
; CHECK-NOFP16-GI-NEXT: fcvtn v0.4h, v1.4s
|
|
; CHECK-NOFP16-GI-NEXT: ret
|
|
;
|
|
; CHECK-FP16-GI-LABEL: stofp_v2i64_v2f16:
|
|
; CHECK-FP16-GI: // %bb.0: // %entry
|
|
; CHECK-FP16-GI-NEXT: scvtf v0.2d, v0.2d
|
|
; CHECK-FP16-GI-NEXT: fcvtn v0.2s, v0.2d
|
|
; CHECK-FP16-GI-NEXT: mov v1.s[0], v0.s[0]
|
|
; CHECK-FP16-GI-NEXT: mov v1.s[1], v0.s[1]
|
|
; CHECK-FP16-GI-NEXT: fcvtn v0.4h, v1.4s
|
|
; CHECK-FP16-GI-NEXT: ret
|
|
entry:
|
|
%c = sitofp <2 x i64> %a to <2 x half>
|
|
ret <2 x half> %c
|
|
}
|
|
|
|
define <2 x half> @utofp_v2i64_v2f16(<2 x i64> %a) {
|
|
; CHECK-NOFP16-SD-LABEL: utofp_v2i64_v2f16:
|
|
; CHECK-NOFP16-SD: // %bb.0: // %entry
|
|
; CHECK-NOFP16-SD-NEXT: mov x8, v0.d[1]
|
|
; CHECK-NOFP16-SD-NEXT: fmov x9, d0
|
|
; CHECK-NOFP16-SD-NEXT: ucvtf s1, x9
|
|
; CHECK-NOFP16-SD-NEXT: ucvtf s0, x8
|
|
; CHECK-NOFP16-SD-NEXT: fcvt h2, s0
|
|
; CHECK-NOFP16-SD-NEXT: fcvt h0, s1
|
|
; CHECK-NOFP16-SD-NEXT: mov v0.h[1], v2.h[0]
|
|
; CHECK-NOFP16-SD-NEXT: // kill: def $d0 killed $d0 killed $q0
|
|
; CHECK-NOFP16-SD-NEXT: ret
|
|
;
|
|
; CHECK-FP16-SD-LABEL: utofp_v2i64_v2f16:
|
|
; CHECK-FP16-SD: // %bb.0: // %entry
|
|
; CHECK-FP16-SD-NEXT: mov x8, v0.d[1]
|
|
; CHECK-FP16-SD-NEXT: fmov x9, d0
|
|
; CHECK-FP16-SD-NEXT: ucvtf h0, x9
|
|
; CHECK-FP16-SD-NEXT: ucvtf h1, x8
|
|
; CHECK-FP16-SD-NEXT: mov v0.h[1], v1.h[0]
|
|
; CHECK-FP16-SD-NEXT: // kill: def $d0 killed $d0 killed $q0
|
|
; CHECK-FP16-SD-NEXT: ret
|
|
;
|
|
; CHECK-NOFP16-GI-LABEL: utofp_v2i64_v2f16:
|
|
; CHECK-NOFP16-GI: // %bb.0: // %entry
|
|
; CHECK-NOFP16-GI-NEXT: ucvtf v0.2d, v0.2d
|
|
; CHECK-NOFP16-GI-NEXT: fcvtn v0.2s, v0.2d
|
|
; CHECK-NOFP16-GI-NEXT: mov v1.s[0], v0.s[0]
|
|
; CHECK-NOFP16-GI-NEXT: mov v1.s[1], v0.s[1]
|
|
; CHECK-NOFP16-GI-NEXT: fcvtn v0.4h, v1.4s
|
|
; CHECK-NOFP16-GI-NEXT: ret
|
|
;
|
|
; CHECK-FP16-GI-LABEL: utofp_v2i64_v2f16:
|
|
; CHECK-FP16-GI: // %bb.0: // %entry
|
|
; CHECK-FP16-GI-NEXT: ucvtf v0.2d, v0.2d
|
|
; CHECK-FP16-GI-NEXT: fcvtn v0.2s, v0.2d
|
|
; CHECK-FP16-GI-NEXT: mov v1.s[0], v0.s[0]
|
|
; CHECK-FP16-GI-NEXT: mov v1.s[1], v0.s[1]
|
|
; CHECK-FP16-GI-NEXT: fcvtn v0.4h, v1.4s
|
|
; CHECK-FP16-GI-NEXT: ret
|
|
entry:
|
|
%c = uitofp <2 x i64> %a to <2 x half>
|
|
ret <2 x half> %c
|
|
}
|
|
|
|
define <3 x half> @stofp_v3i64_v3f16(<3 x i64> %a) {
|
|
; CHECK-LABEL: stofp_v3i64_v3f16:
|
|
; CHECK: // %bb.0: // %entry
|
|
; CHECK-NEXT: // kill: def $d0 killed $d0 def $q0
|
|
; CHECK-NEXT: // kill: def $d1 killed $d1 def $q1
|
|
; CHECK-NEXT: // kill: def $d2 killed $d2 def $q2
|
|
; CHECK-NEXT: mov v0.d[1], v1.d[0]
|
|
; CHECK-NEXT: scvtf v1.2d, v2.2d
|
|
; CHECK-NEXT: scvtf v0.2d, v0.2d
|
|
; CHECK-NEXT: fcvtn v0.2s, v0.2d
|
|
; CHECK-NEXT: fcvtn2 v0.4s, v1.2d
|
|
; CHECK-NEXT: fcvtn v0.4h, v0.4s
|
|
; CHECK-NEXT: ret
|
|
entry:
|
|
%c = sitofp <3 x i64> %a to <3 x half>
|
|
ret <3 x half> %c
|
|
}
|
|
|
|
define <3 x half> @utofp_v3i64_v3f16(<3 x i64> %a) {
|
|
; CHECK-LABEL: utofp_v3i64_v3f16:
|
|
; CHECK: // %bb.0: // %entry
|
|
; CHECK-NEXT: // kill: def $d0 killed $d0 def $q0
|
|
; CHECK-NEXT: // kill: def $d1 killed $d1 def $q1
|
|
; CHECK-NEXT: // kill: def $d2 killed $d2 def $q2
|
|
; CHECK-NEXT: mov v0.d[1], v1.d[0]
|
|
; CHECK-NEXT: ucvtf v1.2d, v2.2d
|
|
; CHECK-NEXT: ucvtf v0.2d, v0.2d
|
|
; CHECK-NEXT: fcvtn v0.2s, v0.2d
|
|
; CHECK-NEXT: fcvtn2 v0.4s, v1.2d
|
|
; CHECK-NEXT: fcvtn v0.4h, v0.4s
|
|
; CHECK-NEXT: ret
|
|
entry:
|
|
%c = uitofp <3 x i64> %a to <3 x half>
|
|
ret <3 x half> %c
|
|
}
|
|
|
|
define <4 x half> @stofp_v4i64_v4f16(<4 x i64> %a) {
|
|
; CHECK-LABEL: stofp_v4i64_v4f16:
|
|
; CHECK: // %bb.0: // %entry
|
|
; CHECK-NEXT: scvtf v0.2d, v0.2d
|
|
; CHECK-NEXT: scvtf v1.2d, v1.2d
|
|
; CHECK-NEXT: fcvtn v0.2s, v0.2d
|
|
; CHECK-NEXT: fcvtn2 v0.4s, v1.2d
|
|
; CHECK-NEXT: fcvtn v0.4h, v0.4s
|
|
; CHECK-NEXT: ret
|
|
entry:
|
|
%c = sitofp <4 x i64> %a to <4 x half>
|
|
ret <4 x half> %c
|
|
}
|
|
|
|
define <4 x half> @utofp_v4i64_v4f16(<4 x i64> %a) {
|
|
; CHECK-LABEL: utofp_v4i64_v4f16:
|
|
; CHECK: // %bb.0: // %entry
|
|
; CHECK-NEXT: ucvtf v0.2d, v0.2d
|
|
; CHECK-NEXT: ucvtf v1.2d, v1.2d
|
|
; CHECK-NEXT: fcvtn v0.2s, v0.2d
|
|
; CHECK-NEXT: fcvtn2 v0.4s, v1.2d
|
|
; CHECK-NEXT: fcvtn v0.4h, v0.4s
|
|
; CHECK-NEXT: ret
|
|
entry:
|
|
%c = uitofp <4 x i64> %a to <4 x half>
|
|
ret <4 x half> %c
|
|
}
|
|
|
|
define <8 x half> @stofp_v8i64_v8f16(<8 x i64> %a) {
|
|
; CHECK-NOFP16-SD-LABEL: stofp_v8i64_v8f16:
|
|
; CHECK-NOFP16-SD: // %bb.0: // %entry
|
|
; CHECK-NOFP16-SD-NEXT: scvtf v0.2d, v0.2d
|
|
; CHECK-NOFP16-SD-NEXT: scvtf v2.2d, v2.2d
|
|
; CHECK-NOFP16-SD-NEXT: scvtf v1.2d, v1.2d
|
|
; CHECK-NOFP16-SD-NEXT: scvtf v3.2d, v3.2d
|
|
; CHECK-NOFP16-SD-NEXT: fcvtn v0.2s, v0.2d
|
|
; CHECK-NOFP16-SD-NEXT: fcvtn v2.2s, v2.2d
|
|
; CHECK-NOFP16-SD-NEXT: fcvtn2 v0.4s, v1.2d
|
|
; CHECK-NOFP16-SD-NEXT: fcvtn2 v2.4s, v3.2d
|
|
; CHECK-NOFP16-SD-NEXT: fcvtn v0.4h, v0.4s
|
|
; CHECK-NOFP16-SD-NEXT: fcvtn2 v0.8h, v2.4s
|
|
; CHECK-NOFP16-SD-NEXT: ret
|
|
;
|
|
; CHECK-FP16-SD-LABEL: stofp_v8i64_v8f16:
|
|
; CHECK-FP16-SD: // %bb.0: // %entry
|
|
; CHECK-FP16-SD-NEXT: scvtf v0.2d, v0.2d
|
|
; CHECK-FP16-SD-NEXT: scvtf v2.2d, v2.2d
|
|
; CHECK-FP16-SD-NEXT: scvtf v1.2d, v1.2d
|
|
; CHECK-FP16-SD-NEXT: scvtf v3.2d, v3.2d
|
|
; CHECK-FP16-SD-NEXT: fcvtn v0.2s, v0.2d
|
|
; CHECK-FP16-SD-NEXT: fcvtn v2.2s, v2.2d
|
|
; CHECK-FP16-SD-NEXT: fcvtn2 v0.4s, v1.2d
|
|
; CHECK-FP16-SD-NEXT: fcvtn2 v2.4s, v3.2d
|
|
; CHECK-FP16-SD-NEXT: fcvtn v0.4h, v0.4s
|
|
; CHECK-FP16-SD-NEXT: fcvtn2 v0.8h, v2.4s
|
|
; CHECK-FP16-SD-NEXT: ret
|
|
;
|
|
; CHECK-NOFP16-GI-LABEL: stofp_v8i64_v8f16:
|
|
; CHECK-NOFP16-GI: // %bb.0: // %entry
|
|
; CHECK-NOFP16-GI-NEXT: scvtf v0.2d, v0.2d
|
|
; CHECK-NOFP16-GI-NEXT: scvtf v1.2d, v1.2d
|
|
; CHECK-NOFP16-GI-NEXT: scvtf v2.2d, v2.2d
|
|
; CHECK-NOFP16-GI-NEXT: scvtf v3.2d, v3.2d
|
|
; CHECK-NOFP16-GI-NEXT: fcvtn v0.2s, v0.2d
|
|
; CHECK-NOFP16-GI-NEXT: fcvtn v2.2s, v2.2d
|
|
; CHECK-NOFP16-GI-NEXT: fcvtn2 v0.4s, v1.2d
|
|
; CHECK-NOFP16-GI-NEXT: fcvtn2 v2.4s, v3.2d
|
|
; CHECK-NOFP16-GI-NEXT: fcvtn v0.4h, v0.4s
|
|
; CHECK-NOFP16-GI-NEXT: fcvtn2 v0.8h, v2.4s
|
|
; CHECK-NOFP16-GI-NEXT: ret
|
|
;
|
|
; CHECK-FP16-GI-LABEL: stofp_v8i64_v8f16:
|
|
; CHECK-FP16-GI: // %bb.0: // %entry
|
|
; CHECK-FP16-GI-NEXT: scvtf v0.2d, v0.2d
|
|
; CHECK-FP16-GI-NEXT: scvtf v1.2d, v1.2d
|
|
; CHECK-FP16-GI-NEXT: scvtf v2.2d, v2.2d
|
|
; CHECK-FP16-GI-NEXT: scvtf v3.2d, v3.2d
|
|
; CHECK-FP16-GI-NEXT: fcvtn v0.2s, v0.2d
|
|
; CHECK-FP16-GI-NEXT: fcvtn v2.2s, v2.2d
|
|
; CHECK-FP16-GI-NEXT: fcvtn2 v0.4s, v1.2d
|
|
; CHECK-FP16-GI-NEXT: fcvtn2 v2.4s, v3.2d
|
|
; CHECK-FP16-GI-NEXT: fcvtn v0.4h, v0.4s
|
|
; CHECK-FP16-GI-NEXT: fcvtn2 v0.8h, v2.4s
|
|
; CHECK-FP16-GI-NEXT: ret
|
|
entry:
|
|
%c = sitofp <8 x i64> %a to <8 x half>
|
|
ret <8 x half> %c
|
|
}
|
|
|
|
define <8 x half> @utofp_v8i64_v8f16(<8 x i64> %a) {
|
|
; CHECK-NOFP16-SD-LABEL: utofp_v8i64_v8f16:
|
|
; CHECK-NOFP16-SD: // %bb.0: // %entry
|
|
; CHECK-NOFP16-SD-NEXT: ucvtf v0.2d, v0.2d
|
|
; CHECK-NOFP16-SD-NEXT: ucvtf v2.2d, v2.2d
|
|
; CHECK-NOFP16-SD-NEXT: ucvtf v1.2d, v1.2d
|
|
; CHECK-NOFP16-SD-NEXT: ucvtf v3.2d, v3.2d
|
|
; CHECK-NOFP16-SD-NEXT: fcvtn v0.2s, v0.2d
|
|
; CHECK-NOFP16-SD-NEXT: fcvtn v2.2s, v2.2d
|
|
; CHECK-NOFP16-SD-NEXT: fcvtn2 v0.4s, v1.2d
|
|
; CHECK-NOFP16-SD-NEXT: fcvtn2 v2.4s, v3.2d
|
|
; CHECK-NOFP16-SD-NEXT: fcvtn v0.4h, v0.4s
|
|
; CHECK-NOFP16-SD-NEXT: fcvtn2 v0.8h, v2.4s
|
|
; CHECK-NOFP16-SD-NEXT: ret
|
|
;
|
|
; CHECK-FP16-SD-LABEL: utofp_v8i64_v8f16:
|
|
; CHECK-FP16-SD: // %bb.0: // %entry
|
|
; CHECK-FP16-SD-NEXT: ucvtf v0.2d, v0.2d
|
|
; CHECK-FP16-SD-NEXT: ucvtf v2.2d, v2.2d
|
|
; CHECK-FP16-SD-NEXT: ucvtf v1.2d, v1.2d
|
|
; CHECK-FP16-SD-NEXT: ucvtf v3.2d, v3.2d
|
|
; CHECK-FP16-SD-NEXT: fcvtn v0.2s, v0.2d
|
|
; CHECK-FP16-SD-NEXT: fcvtn v2.2s, v2.2d
|
|
; CHECK-FP16-SD-NEXT: fcvtn2 v0.4s, v1.2d
|
|
; CHECK-FP16-SD-NEXT: fcvtn2 v2.4s, v3.2d
|
|
; CHECK-FP16-SD-NEXT: fcvtn v0.4h, v0.4s
|
|
; CHECK-FP16-SD-NEXT: fcvtn2 v0.8h, v2.4s
|
|
; CHECK-FP16-SD-NEXT: ret
|
|
;
|
|
; CHECK-NOFP16-GI-LABEL: utofp_v8i64_v8f16:
|
|
; CHECK-NOFP16-GI: // %bb.0: // %entry
|
|
; CHECK-NOFP16-GI-NEXT: ucvtf v0.2d, v0.2d
|
|
; CHECK-NOFP16-GI-NEXT: ucvtf v1.2d, v1.2d
|
|
; CHECK-NOFP16-GI-NEXT: ucvtf v2.2d, v2.2d
|
|
; CHECK-NOFP16-GI-NEXT: ucvtf v3.2d, v3.2d
|
|
; CHECK-NOFP16-GI-NEXT: fcvtn v0.2s, v0.2d
|
|
; CHECK-NOFP16-GI-NEXT: fcvtn v2.2s, v2.2d
|
|
; CHECK-NOFP16-GI-NEXT: fcvtn2 v0.4s, v1.2d
|
|
; CHECK-NOFP16-GI-NEXT: fcvtn2 v2.4s, v3.2d
|
|
; CHECK-NOFP16-GI-NEXT: fcvtn v0.4h, v0.4s
|
|
; CHECK-NOFP16-GI-NEXT: fcvtn2 v0.8h, v2.4s
|
|
; CHECK-NOFP16-GI-NEXT: ret
|
|
;
|
|
; CHECK-FP16-GI-LABEL: utofp_v8i64_v8f16:
|
|
; CHECK-FP16-GI: // %bb.0: // %entry
|
|
; CHECK-FP16-GI-NEXT: ucvtf v0.2d, v0.2d
|
|
; CHECK-FP16-GI-NEXT: ucvtf v1.2d, v1.2d
|
|
; CHECK-FP16-GI-NEXT: ucvtf v2.2d, v2.2d
|
|
; CHECK-FP16-GI-NEXT: ucvtf v3.2d, v3.2d
|
|
; CHECK-FP16-GI-NEXT: fcvtn v0.2s, v0.2d
|
|
; CHECK-FP16-GI-NEXT: fcvtn v2.2s, v2.2d
|
|
; CHECK-FP16-GI-NEXT: fcvtn2 v0.4s, v1.2d
|
|
; CHECK-FP16-GI-NEXT: fcvtn2 v2.4s, v3.2d
|
|
; CHECK-FP16-GI-NEXT: fcvtn v0.4h, v0.4s
|
|
; CHECK-FP16-GI-NEXT: fcvtn2 v0.8h, v2.4s
|
|
; CHECK-FP16-GI-NEXT: ret
|
|
entry:
|
|
%c = uitofp <8 x i64> %a to <8 x half>
|
|
ret <8 x half> %c
|
|
}
|
|
|
|
define <16 x half> @stofp_v16i64_v16f16(<16 x i64> %a) {
|
|
; CHECK-NOFP16-SD-LABEL: stofp_v16i64_v16f16:
|
|
; CHECK-NOFP16-SD: // %bb.0: // %entry
|
|
; CHECK-NOFP16-SD-NEXT: scvtf v0.2d, v0.2d
|
|
; CHECK-NOFP16-SD-NEXT: scvtf v4.2d, v4.2d
|
|
; CHECK-NOFP16-SD-NEXT: scvtf v2.2d, v2.2d
|
|
; CHECK-NOFP16-SD-NEXT: scvtf v1.2d, v1.2d
|
|
; CHECK-NOFP16-SD-NEXT: scvtf v6.2d, v6.2d
|
|
; CHECK-NOFP16-SD-NEXT: scvtf v5.2d, v5.2d
|
|
; CHECK-NOFP16-SD-NEXT: scvtf v3.2d, v3.2d
|
|
; CHECK-NOFP16-SD-NEXT: fcvtn v0.2s, v0.2d
|
|
; CHECK-NOFP16-SD-NEXT: fcvtn v4.2s, v4.2d
|
|
; CHECK-NOFP16-SD-NEXT: fcvtn v2.2s, v2.2d
|
|
; CHECK-NOFP16-SD-NEXT: fcvtn v6.2s, v6.2d
|
|
; CHECK-NOFP16-SD-NEXT: fcvtn2 v0.4s, v1.2d
|
|
; CHECK-NOFP16-SD-NEXT: scvtf v1.2d, v7.2d
|
|
; CHECK-NOFP16-SD-NEXT: fcvtn2 v4.4s, v5.2d
|
|
; CHECK-NOFP16-SD-NEXT: fcvtn2 v2.4s, v3.2d
|
|
; CHECK-NOFP16-SD-NEXT: fcvtn v0.4h, v0.4s
|
|
; CHECK-NOFP16-SD-NEXT: fcvtn2 v6.4s, v1.2d
|
|
; CHECK-NOFP16-SD-NEXT: fcvtn v1.4h, v4.4s
|
|
; CHECK-NOFP16-SD-NEXT: fcvtn2 v0.8h, v2.4s
|
|
; CHECK-NOFP16-SD-NEXT: fcvtn2 v1.8h, v6.4s
|
|
; CHECK-NOFP16-SD-NEXT: ret
|
|
;
|
|
; CHECK-FP16-SD-LABEL: stofp_v16i64_v16f16:
|
|
; CHECK-FP16-SD: // %bb.0: // %entry
|
|
; CHECK-FP16-SD-NEXT: scvtf v0.2d, v0.2d
|
|
; CHECK-FP16-SD-NEXT: scvtf v4.2d, v4.2d
|
|
; CHECK-FP16-SD-NEXT: scvtf v2.2d, v2.2d
|
|
; CHECK-FP16-SD-NEXT: scvtf v1.2d, v1.2d
|
|
; CHECK-FP16-SD-NEXT: scvtf v6.2d, v6.2d
|
|
; CHECK-FP16-SD-NEXT: scvtf v5.2d, v5.2d
|
|
; CHECK-FP16-SD-NEXT: scvtf v3.2d, v3.2d
|
|
; CHECK-FP16-SD-NEXT: fcvtn v0.2s, v0.2d
|
|
; CHECK-FP16-SD-NEXT: fcvtn v4.2s, v4.2d
|
|
; CHECK-FP16-SD-NEXT: fcvtn v2.2s, v2.2d
|
|
; CHECK-FP16-SD-NEXT: fcvtn v6.2s, v6.2d
|
|
; CHECK-FP16-SD-NEXT: fcvtn2 v0.4s, v1.2d
|
|
; CHECK-FP16-SD-NEXT: scvtf v1.2d, v7.2d
|
|
; CHECK-FP16-SD-NEXT: fcvtn2 v4.4s, v5.2d
|
|
; CHECK-FP16-SD-NEXT: fcvtn2 v2.4s, v3.2d
|
|
; CHECK-FP16-SD-NEXT: fcvtn v0.4h, v0.4s
|
|
; CHECK-FP16-SD-NEXT: fcvtn2 v6.4s, v1.2d
|
|
; CHECK-FP16-SD-NEXT: fcvtn v1.4h, v4.4s
|
|
; CHECK-FP16-SD-NEXT: fcvtn2 v0.8h, v2.4s
|
|
; CHECK-FP16-SD-NEXT: fcvtn2 v1.8h, v6.4s
|
|
; CHECK-FP16-SD-NEXT: ret
|
|
;
|
|
; CHECK-NOFP16-GI-LABEL: stofp_v16i64_v16f16:
|
|
; CHECK-NOFP16-GI: // %bb.0: // %entry
|
|
; CHECK-NOFP16-GI-NEXT: scvtf v0.2d, v0.2d
|
|
; CHECK-NOFP16-GI-NEXT: scvtf v4.2d, v4.2d
|
|
; CHECK-NOFP16-GI-NEXT: scvtf v1.2d, v1.2d
|
|
; CHECK-NOFP16-GI-NEXT: scvtf v2.2d, v2.2d
|
|
; CHECK-NOFP16-GI-NEXT: scvtf v5.2d, v5.2d
|
|
; CHECK-NOFP16-GI-NEXT: scvtf v6.2d, v6.2d
|
|
; CHECK-NOFP16-GI-NEXT: scvtf v3.2d, v3.2d
|
|
; CHECK-NOFP16-GI-NEXT: scvtf v7.2d, v7.2d
|
|
; CHECK-NOFP16-GI-NEXT: fcvtn v0.2s, v0.2d
|
|
; CHECK-NOFP16-GI-NEXT: fcvtn v4.2s, v4.2d
|
|
; CHECK-NOFP16-GI-NEXT: fcvtn v2.2s, v2.2d
|
|
; CHECK-NOFP16-GI-NEXT: fcvtn v6.2s, v6.2d
|
|
; CHECK-NOFP16-GI-NEXT: fcvtn2 v0.4s, v1.2d
|
|
; CHECK-NOFP16-GI-NEXT: fcvtn2 v4.4s, v5.2d
|
|
; CHECK-NOFP16-GI-NEXT: fcvtn2 v2.4s, v3.2d
|
|
; CHECK-NOFP16-GI-NEXT: fcvtn2 v6.4s, v7.2d
|
|
; CHECK-NOFP16-GI-NEXT: fcvtn v0.4h, v0.4s
|
|
; CHECK-NOFP16-GI-NEXT: fcvtn v1.4h, v4.4s
|
|
; CHECK-NOFP16-GI-NEXT: fcvtn2 v0.8h, v2.4s
|
|
; CHECK-NOFP16-GI-NEXT: fcvtn2 v1.8h, v6.4s
|
|
; CHECK-NOFP16-GI-NEXT: ret
|
|
;
|
|
; CHECK-FP16-GI-LABEL: stofp_v16i64_v16f16:
|
|
; CHECK-FP16-GI: // %bb.0: // %entry
|
|
; CHECK-FP16-GI-NEXT: scvtf v0.2d, v0.2d
|
|
; CHECK-FP16-GI-NEXT: scvtf v4.2d, v4.2d
|
|
; CHECK-FP16-GI-NEXT: scvtf v1.2d, v1.2d
|
|
; CHECK-FP16-GI-NEXT: scvtf v2.2d, v2.2d
|
|
; CHECK-FP16-GI-NEXT: scvtf v5.2d, v5.2d
|
|
; CHECK-FP16-GI-NEXT: scvtf v6.2d, v6.2d
|
|
; CHECK-FP16-GI-NEXT: scvtf v3.2d, v3.2d
|
|
; CHECK-FP16-GI-NEXT: scvtf v7.2d, v7.2d
|
|
; CHECK-FP16-GI-NEXT: fcvtn v0.2s, v0.2d
|
|
; CHECK-FP16-GI-NEXT: fcvtn v4.2s, v4.2d
|
|
; CHECK-FP16-GI-NEXT: fcvtn v2.2s, v2.2d
|
|
; CHECK-FP16-GI-NEXT: fcvtn v6.2s, v6.2d
|
|
; CHECK-FP16-GI-NEXT: fcvtn2 v0.4s, v1.2d
|
|
; CHECK-FP16-GI-NEXT: fcvtn2 v4.4s, v5.2d
|
|
; CHECK-FP16-GI-NEXT: fcvtn2 v2.4s, v3.2d
|
|
; CHECK-FP16-GI-NEXT: fcvtn2 v6.4s, v7.2d
|
|
; CHECK-FP16-GI-NEXT: fcvtn v0.4h, v0.4s
|
|
; CHECK-FP16-GI-NEXT: fcvtn v1.4h, v4.4s
|
|
; CHECK-FP16-GI-NEXT: fcvtn2 v0.8h, v2.4s
|
|
; CHECK-FP16-GI-NEXT: fcvtn2 v1.8h, v6.4s
|
|
; CHECK-FP16-GI-NEXT: ret
|
|
entry:
|
|
%c = sitofp <16 x i64> %a to <16 x half>
|
|
ret <16 x half> %c
|
|
}
|
|
|
|
define <16 x half> @utofp_v16i64_v16f16(<16 x i64> %a) {
|
|
; CHECK-NOFP16-SD-LABEL: utofp_v16i64_v16f16:
|
|
; CHECK-NOFP16-SD: // %bb.0: // %entry
|
|
; CHECK-NOFP16-SD-NEXT: ucvtf v0.2d, v0.2d
|
|
; CHECK-NOFP16-SD-NEXT: ucvtf v4.2d, v4.2d
|
|
; CHECK-NOFP16-SD-NEXT: ucvtf v2.2d, v2.2d
|
|
; CHECK-NOFP16-SD-NEXT: ucvtf v1.2d, v1.2d
|
|
; CHECK-NOFP16-SD-NEXT: ucvtf v6.2d, v6.2d
|
|
; CHECK-NOFP16-SD-NEXT: ucvtf v5.2d, v5.2d
|
|
; CHECK-NOFP16-SD-NEXT: ucvtf v3.2d, v3.2d
|
|
; CHECK-NOFP16-SD-NEXT: fcvtn v0.2s, v0.2d
|
|
; CHECK-NOFP16-SD-NEXT: fcvtn v4.2s, v4.2d
|
|
; CHECK-NOFP16-SD-NEXT: fcvtn v2.2s, v2.2d
|
|
; CHECK-NOFP16-SD-NEXT: fcvtn v6.2s, v6.2d
|
|
; CHECK-NOFP16-SD-NEXT: fcvtn2 v0.4s, v1.2d
|
|
; CHECK-NOFP16-SD-NEXT: ucvtf v1.2d, v7.2d
|
|
; CHECK-NOFP16-SD-NEXT: fcvtn2 v4.4s, v5.2d
|
|
; CHECK-NOFP16-SD-NEXT: fcvtn2 v2.4s, v3.2d
|
|
; CHECK-NOFP16-SD-NEXT: fcvtn v0.4h, v0.4s
|
|
; CHECK-NOFP16-SD-NEXT: fcvtn2 v6.4s, v1.2d
|
|
; CHECK-NOFP16-SD-NEXT: fcvtn v1.4h, v4.4s
|
|
; CHECK-NOFP16-SD-NEXT: fcvtn2 v0.8h, v2.4s
|
|
; CHECK-NOFP16-SD-NEXT: fcvtn2 v1.8h, v6.4s
|
|
; CHECK-NOFP16-SD-NEXT: ret
|
|
;
|
|
; CHECK-FP16-SD-LABEL: utofp_v16i64_v16f16:
|
|
; CHECK-FP16-SD: // %bb.0: // %entry
|
|
; CHECK-FP16-SD-NEXT: ucvtf v0.2d, v0.2d
|
|
; CHECK-FP16-SD-NEXT: ucvtf v4.2d, v4.2d
|
|
; CHECK-FP16-SD-NEXT: ucvtf v2.2d, v2.2d
|
|
; CHECK-FP16-SD-NEXT: ucvtf v1.2d, v1.2d
|
|
; CHECK-FP16-SD-NEXT: ucvtf v6.2d, v6.2d
|
|
; CHECK-FP16-SD-NEXT: ucvtf v5.2d, v5.2d
|
|
; CHECK-FP16-SD-NEXT: ucvtf v3.2d, v3.2d
|
|
; CHECK-FP16-SD-NEXT: fcvtn v0.2s, v0.2d
|
|
; CHECK-FP16-SD-NEXT: fcvtn v4.2s, v4.2d
|
|
; CHECK-FP16-SD-NEXT: fcvtn v2.2s, v2.2d
|
|
; CHECK-FP16-SD-NEXT: fcvtn v6.2s, v6.2d
|
|
; CHECK-FP16-SD-NEXT: fcvtn2 v0.4s, v1.2d
|
|
; CHECK-FP16-SD-NEXT: ucvtf v1.2d, v7.2d
|
|
; CHECK-FP16-SD-NEXT: fcvtn2 v4.4s, v5.2d
|
|
; CHECK-FP16-SD-NEXT: fcvtn2 v2.4s, v3.2d
|
|
; CHECK-FP16-SD-NEXT: fcvtn v0.4h, v0.4s
|
|
; CHECK-FP16-SD-NEXT: fcvtn2 v6.4s, v1.2d
|
|
; CHECK-FP16-SD-NEXT: fcvtn v1.4h, v4.4s
|
|
; CHECK-FP16-SD-NEXT: fcvtn2 v0.8h, v2.4s
|
|
; CHECK-FP16-SD-NEXT: fcvtn2 v1.8h, v6.4s
|
|
; CHECK-FP16-SD-NEXT: ret
|
|
;
|
|
; CHECK-NOFP16-GI-LABEL: utofp_v16i64_v16f16:
|
|
; CHECK-NOFP16-GI: // %bb.0: // %entry
|
|
; CHECK-NOFP16-GI-NEXT: ucvtf v0.2d, v0.2d
|
|
; CHECK-NOFP16-GI-NEXT: ucvtf v4.2d, v4.2d
|
|
; CHECK-NOFP16-GI-NEXT: ucvtf v1.2d, v1.2d
|
|
; CHECK-NOFP16-GI-NEXT: ucvtf v2.2d, v2.2d
|
|
; CHECK-NOFP16-GI-NEXT: ucvtf v5.2d, v5.2d
|
|
; CHECK-NOFP16-GI-NEXT: ucvtf v6.2d, v6.2d
|
|
; CHECK-NOFP16-GI-NEXT: ucvtf v3.2d, v3.2d
|
|
; CHECK-NOFP16-GI-NEXT: ucvtf v7.2d, v7.2d
|
|
; CHECK-NOFP16-GI-NEXT: fcvtn v0.2s, v0.2d
|
|
; CHECK-NOFP16-GI-NEXT: fcvtn v4.2s, v4.2d
|
|
; CHECK-NOFP16-GI-NEXT: fcvtn v2.2s, v2.2d
|
|
; CHECK-NOFP16-GI-NEXT: fcvtn v6.2s, v6.2d
|
|
; CHECK-NOFP16-GI-NEXT: fcvtn2 v0.4s, v1.2d
|
|
; CHECK-NOFP16-GI-NEXT: fcvtn2 v4.4s, v5.2d
|
|
; CHECK-NOFP16-GI-NEXT: fcvtn2 v2.4s, v3.2d
|
|
; CHECK-NOFP16-GI-NEXT: fcvtn2 v6.4s, v7.2d
|
|
; CHECK-NOFP16-GI-NEXT: fcvtn v0.4h, v0.4s
|
|
; CHECK-NOFP16-GI-NEXT: fcvtn v1.4h, v4.4s
|
|
; CHECK-NOFP16-GI-NEXT: fcvtn2 v0.8h, v2.4s
|
|
; CHECK-NOFP16-GI-NEXT: fcvtn2 v1.8h, v6.4s
|
|
; CHECK-NOFP16-GI-NEXT: ret
|
|
;
|
|
; CHECK-FP16-GI-LABEL: utofp_v16i64_v16f16:
|
|
; CHECK-FP16-GI: // %bb.0: // %entry
|
|
; CHECK-FP16-GI-NEXT: ucvtf v0.2d, v0.2d
|
|
; CHECK-FP16-GI-NEXT: ucvtf v4.2d, v4.2d
|
|
; CHECK-FP16-GI-NEXT: ucvtf v1.2d, v1.2d
|
|
; CHECK-FP16-GI-NEXT: ucvtf v2.2d, v2.2d
|
|
; CHECK-FP16-GI-NEXT: ucvtf v5.2d, v5.2d
|
|
; CHECK-FP16-GI-NEXT: ucvtf v6.2d, v6.2d
|
|
; CHECK-FP16-GI-NEXT: ucvtf v3.2d, v3.2d
|
|
; CHECK-FP16-GI-NEXT: ucvtf v7.2d, v7.2d
|
|
; CHECK-FP16-GI-NEXT: fcvtn v0.2s, v0.2d
|
|
; CHECK-FP16-GI-NEXT: fcvtn v4.2s, v4.2d
|
|
; CHECK-FP16-GI-NEXT: fcvtn v2.2s, v2.2d
|
|
; CHECK-FP16-GI-NEXT: fcvtn v6.2s, v6.2d
|
|
; CHECK-FP16-GI-NEXT: fcvtn2 v0.4s, v1.2d
|
|
; CHECK-FP16-GI-NEXT: fcvtn2 v4.4s, v5.2d
|
|
; CHECK-FP16-GI-NEXT: fcvtn2 v2.4s, v3.2d
|
|
; CHECK-FP16-GI-NEXT: fcvtn2 v6.4s, v7.2d
|
|
; CHECK-FP16-GI-NEXT: fcvtn v0.4h, v0.4s
|
|
; CHECK-FP16-GI-NEXT: fcvtn v1.4h, v4.4s
|
|
; CHECK-FP16-GI-NEXT: fcvtn2 v0.8h, v2.4s
|
|
; CHECK-FP16-GI-NEXT: fcvtn2 v1.8h, v6.4s
|
|
; CHECK-FP16-GI-NEXT: ret
|
|
entry:
|
|
%c = uitofp <16 x i64> %a to <16 x half>
|
|
ret <16 x half> %c
|
|
}
|
|
|
|
define <2 x half> @stofp_v2i32_v2f16(<2 x i32> %a) {
|
|
; CHECK-NOFP16-SD-LABEL: stofp_v2i32_v2f16:
|
|
; CHECK-NOFP16-SD: // %bb.0: // %entry
|
|
; CHECK-NOFP16-SD-NEXT: // kill: def $d0 killed $d0 def $q0
|
|
; CHECK-NOFP16-SD-NEXT: scvtf v0.4s, v0.4s
|
|
; CHECK-NOFP16-SD-NEXT: fcvtn v0.4h, v0.4s
|
|
; CHECK-NOFP16-SD-NEXT: ret
|
|
;
|
|
; CHECK-FP16-SD-LABEL: stofp_v2i32_v2f16:
|
|
; CHECK-FP16-SD: // %bb.0: // %entry
|
|
; CHECK-FP16-SD-NEXT: // kill: def $d0 killed $d0 def $q0
|
|
; CHECK-FP16-SD-NEXT: scvtf v0.4s, v0.4s
|
|
; CHECK-FP16-SD-NEXT: fcvtn v0.4h, v0.4s
|
|
; CHECK-FP16-SD-NEXT: ret
|
|
;
|
|
; CHECK-NOFP16-GI-LABEL: stofp_v2i32_v2f16:
|
|
; CHECK-NOFP16-GI: // %bb.0: // %entry
|
|
; CHECK-NOFP16-GI-NEXT: scvtf v0.2s, v0.2s
|
|
; CHECK-NOFP16-GI-NEXT: mov v1.s[0], v0.s[0]
|
|
; CHECK-NOFP16-GI-NEXT: mov v1.s[1], v0.s[1]
|
|
; CHECK-NOFP16-GI-NEXT: fcvtn v0.4h, v1.4s
|
|
; CHECK-NOFP16-GI-NEXT: ret
|
|
;
|
|
; CHECK-FP16-GI-LABEL: stofp_v2i32_v2f16:
|
|
; CHECK-FP16-GI: // %bb.0: // %entry
|
|
; CHECK-FP16-GI-NEXT: scvtf v0.2s, v0.2s
|
|
; CHECK-FP16-GI-NEXT: mov v1.s[0], v0.s[0]
|
|
; CHECK-FP16-GI-NEXT: mov v1.s[1], v0.s[1]
|
|
; CHECK-FP16-GI-NEXT: fcvtn v0.4h, v1.4s
|
|
; CHECK-FP16-GI-NEXT: ret
|
|
entry:
|
|
%c = sitofp <2 x i32> %a to <2 x half>
|
|
ret <2 x half> %c
|
|
}
|
|
|
|
define <2 x half> @utofp_v2i32_v2f16(<2 x i32> %a) {
|
|
; CHECK-NOFP16-SD-LABEL: utofp_v2i32_v2f16:
|
|
; CHECK-NOFP16-SD: // %bb.0: // %entry
|
|
; CHECK-NOFP16-SD-NEXT: // kill: def $d0 killed $d0 def $q0
|
|
; CHECK-NOFP16-SD-NEXT: ucvtf v0.4s, v0.4s
|
|
; CHECK-NOFP16-SD-NEXT: fcvtn v0.4h, v0.4s
|
|
; CHECK-NOFP16-SD-NEXT: ret
|
|
;
|
|
; CHECK-FP16-SD-LABEL: utofp_v2i32_v2f16:
|
|
; CHECK-FP16-SD: // %bb.0: // %entry
|
|
; CHECK-FP16-SD-NEXT: // kill: def $d0 killed $d0 def $q0
|
|
; CHECK-FP16-SD-NEXT: ucvtf v0.4s, v0.4s
|
|
; CHECK-FP16-SD-NEXT: fcvtn v0.4h, v0.4s
|
|
; CHECK-FP16-SD-NEXT: ret
|
|
;
|
|
; CHECK-NOFP16-GI-LABEL: utofp_v2i32_v2f16:
|
|
; CHECK-NOFP16-GI: // %bb.0: // %entry
|
|
; CHECK-NOFP16-GI-NEXT: ucvtf v0.2s, v0.2s
|
|
; CHECK-NOFP16-GI-NEXT: mov v1.s[0], v0.s[0]
|
|
; CHECK-NOFP16-GI-NEXT: mov v1.s[1], v0.s[1]
|
|
; CHECK-NOFP16-GI-NEXT: fcvtn v0.4h, v1.4s
|
|
; CHECK-NOFP16-GI-NEXT: ret
|
|
;
|
|
; CHECK-FP16-GI-LABEL: utofp_v2i32_v2f16:
|
|
; CHECK-FP16-GI: // %bb.0: // %entry
|
|
; CHECK-FP16-GI-NEXT: ucvtf v0.2s, v0.2s
|
|
; CHECK-FP16-GI-NEXT: mov v1.s[0], v0.s[0]
|
|
; CHECK-FP16-GI-NEXT: mov v1.s[1], v0.s[1]
|
|
; CHECK-FP16-GI-NEXT: fcvtn v0.4h, v1.4s
|
|
; CHECK-FP16-GI-NEXT: ret
|
|
entry:
|
|
%c = uitofp <2 x i32> %a to <2 x half>
|
|
ret <2 x half> %c
|
|
}
|
|
|
|
define <3 x half> @stofp_v3i32_v3f16(<3 x i32> %a) {
|
|
; CHECK-LABEL: stofp_v3i32_v3f16:
|
|
; CHECK: // %bb.0: // %entry
|
|
; CHECK-NEXT: scvtf v0.4s, v0.4s
|
|
; CHECK-NEXT: fcvtn v0.4h, v0.4s
|
|
; CHECK-NEXT: ret
|
|
entry:
|
|
%c = sitofp <3 x i32> %a to <3 x half>
|
|
ret <3 x half> %c
|
|
}
|
|
|
|
define <3 x half> @utofp_v3i32_v3f16(<3 x i32> %a) {
|
|
; CHECK-LABEL: utofp_v3i32_v3f16:
|
|
; CHECK: // %bb.0: // %entry
|
|
; CHECK-NEXT: ucvtf v0.4s, v0.4s
|
|
; CHECK-NEXT: fcvtn v0.4h, v0.4s
|
|
; CHECK-NEXT: ret
|
|
entry:
|
|
%c = uitofp <3 x i32> %a to <3 x half>
|
|
ret <3 x half> %c
|
|
}
|
|
|
|
define <4 x half> @stofp_v4i32_v4f16(<4 x i32> %a) {
|
|
; CHECK-LABEL: stofp_v4i32_v4f16:
|
|
; CHECK: // %bb.0: // %entry
|
|
; CHECK-NEXT: scvtf v0.4s, v0.4s
|
|
; CHECK-NEXT: fcvtn v0.4h, v0.4s
|
|
; CHECK-NEXT: ret
|
|
entry:
|
|
%c = sitofp <4 x i32> %a to <4 x half>
|
|
ret <4 x half> %c
|
|
}
|
|
|
|
define <4 x half> @utofp_v4i32_v4f16(<4 x i32> %a) {
|
|
; CHECK-LABEL: utofp_v4i32_v4f16:
|
|
; CHECK: // %bb.0: // %entry
|
|
; CHECK-NEXT: ucvtf v0.4s, v0.4s
|
|
; CHECK-NEXT: fcvtn v0.4h, v0.4s
|
|
; CHECK-NEXT: ret
|
|
entry:
|
|
%c = uitofp <4 x i32> %a to <4 x half>
|
|
ret <4 x half> %c
|
|
}
|
|
|
|
define <8 x half> @stofp_v8i32_v8f16(<8 x i32> %a) {
|
|
; CHECK-LABEL: stofp_v8i32_v8f16:
|
|
; CHECK: // %bb.0: // %entry
|
|
; CHECK-NEXT: scvtf v0.4s, v0.4s
|
|
; CHECK-NEXT: scvtf v1.4s, v1.4s
|
|
; CHECK-NEXT: fcvtn v0.4h, v0.4s
|
|
; CHECK-NEXT: fcvtn2 v0.8h, v1.4s
|
|
; CHECK-NEXT: ret
|
|
entry:
|
|
%c = sitofp <8 x i32> %a to <8 x half>
|
|
ret <8 x half> %c
|
|
}
|
|
|
|
define <8 x half> @utofp_v8i32_v8f16(<8 x i32> %a) {
|
|
; CHECK-LABEL: utofp_v8i32_v8f16:
|
|
; CHECK: // %bb.0: // %entry
|
|
; CHECK-NEXT: ucvtf v0.4s, v0.4s
|
|
; CHECK-NEXT: ucvtf v1.4s, v1.4s
|
|
; CHECK-NEXT: fcvtn v0.4h, v0.4s
|
|
; CHECK-NEXT: fcvtn2 v0.8h, v1.4s
|
|
; CHECK-NEXT: ret
|
|
entry:
|
|
%c = uitofp <8 x i32> %a to <8 x half>
|
|
ret <8 x half> %c
|
|
}
|
|
|
|
define <16 x half> @stofp_v16i32_v16f16(<16 x i32> %a) {
|
|
; CHECK-NOFP16-SD-LABEL: stofp_v16i32_v16f16:
|
|
; CHECK-NOFP16-SD: // %bb.0: // %entry
|
|
; CHECK-NOFP16-SD-NEXT: scvtf v0.4s, v0.4s
|
|
; CHECK-NOFP16-SD-NEXT: scvtf v2.4s, v2.4s
|
|
; CHECK-NOFP16-SD-NEXT: scvtf v4.4s, v1.4s
|
|
; CHECK-NOFP16-SD-NEXT: fcvtn v0.4h, v0.4s
|
|
; CHECK-NOFP16-SD-NEXT: fcvtn v1.4h, v2.4s
|
|
; CHECK-NOFP16-SD-NEXT: scvtf v2.4s, v3.4s
|
|
; CHECK-NOFP16-SD-NEXT: fcvtn2 v0.8h, v4.4s
|
|
; CHECK-NOFP16-SD-NEXT: fcvtn2 v1.8h, v2.4s
|
|
; CHECK-NOFP16-SD-NEXT: ret
|
|
;
|
|
; CHECK-FP16-SD-LABEL: stofp_v16i32_v16f16:
|
|
; CHECK-FP16-SD: // %bb.0: // %entry
|
|
; CHECK-FP16-SD-NEXT: scvtf v0.4s, v0.4s
|
|
; CHECK-FP16-SD-NEXT: scvtf v2.4s, v2.4s
|
|
; CHECK-FP16-SD-NEXT: scvtf v4.4s, v1.4s
|
|
; CHECK-FP16-SD-NEXT: fcvtn v0.4h, v0.4s
|
|
; CHECK-FP16-SD-NEXT: fcvtn v1.4h, v2.4s
|
|
; CHECK-FP16-SD-NEXT: scvtf v2.4s, v3.4s
|
|
; CHECK-FP16-SD-NEXT: fcvtn2 v0.8h, v4.4s
|
|
; CHECK-FP16-SD-NEXT: fcvtn2 v1.8h, v2.4s
|
|
; CHECK-FP16-SD-NEXT: ret
|
|
;
|
|
; CHECK-NOFP16-GI-LABEL: stofp_v16i32_v16f16:
|
|
; CHECK-NOFP16-GI: // %bb.0: // %entry
|
|
; CHECK-NOFP16-GI-NEXT: scvtf v0.4s, v0.4s
|
|
; CHECK-NOFP16-GI-NEXT: scvtf v2.4s, v2.4s
|
|
; CHECK-NOFP16-GI-NEXT: scvtf v4.4s, v1.4s
|
|
; CHECK-NOFP16-GI-NEXT: scvtf v3.4s, v3.4s
|
|
; CHECK-NOFP16-GI-NEXT: fcvtn v0.4h, v0.4s
|
|
; CHECK-NOFP16-GI-NEXT: fcvtn v1.4h, v2.4s
|
|
; CHECK-NOFP16-GI-NEXT: fcvtn2 v0.8h, v4.4s
|
|
; CHECK-NOFP16-GI-NEXT: fcvtn2 v1.8h, v3.4s
|
|
; CHECK-NOFP16-GI-NEXT: ret
|
|
;
|
|
; CHECK-FP16-GI-LABEL: stofp_v16i32_v16f16:
|
|
; CHECK-FP16-GI: // %bb.0: // %entry
|
|
; CHECK-FP16-GI-NEXT: scvtf v0.4s, v0.4s
|
|
; CHECK-FP16-GI-NEXT: scvtf v2.4s, v2.4s
|
|
; CHECK-FP16-GI-NEXT: scvtf v4.4s, v1.4s
|
|
; CHECK-FP16-GI-NEXT: scvtf v3.4s, v3.4s
|
|
; CHECK-FP16-GI-NEXT: fcvtn v0.4h, v0.4s
|
|
; CHECK-FP16-GI-NEXT: fcvtn v1.4h, v2.4s
|
|
; CHECK-FP16-GI-NEXT: fcvtn2 v0.8h, v4.4s
|
|
; CHECK-FP16-GI-NEXT: fcvtn2 v1.8h, v3.4s
|
|
; CHECK-FP16-GI-NEXT: ret
|
|
entry:
|
|
%c = sitofp <16 x i32> %a to <16 x half>
|
|
ret <16 x half> %c
|
|
}
|
|
|
|
define <16 x half> @utofp_v16i32_v16f16(<16 x i32> %a) {
|
|
; CHECK-NOFP16-SD-LABEL: utofp_v16i32_v16f16:
|
|
; CHECK-NOFP16-SD: // %bb.0: // %entry
|
|
; CHECK-NOFP16-SD-NEXT: ucvtf v0.4s, v0.4s
|
|
; CHECK-NOFP16-SD-NEXT: ucvtf v2.4s, v2.4s
|
|
; CHECK-NOFP16-SD-NEXT: ucvtf v4.4s, v1.4s
|
|
; CHECK-NOFP16-SD-NEXT: fcvtn v0.4h, v0.4s
|
|
; CHECK-NOFP16-SD-NEXT: fcvtn v1.4h, v2.4s
|
|
; CHECK-NOFP16-SD-NEXT: ucvtf v2.4s, v3.4s
|
|
; CHECK-NOFP16-SD-NEXT: fcvtn2 v0.8h, v4.4s
|
|
; CHECK-NOFP16-SD-NEXT: fcvtn2 v1.8h, v2.4s
|
|
; CHECK-NOFP16-SD-NEXT: ret
|
|
;
|
|
; CHECK-FP16-SD-LABEL: utofp_v16i32_v16f16:
|
|
; CHECK-FP16-SD: // %bb.0: // %entry
|
|
; CHECK-FP16-SD-NEXT: ucvtf v0.4s, v0.4s
|
|
; CHECK-FP16-SD-NEXT: ucvtf v2.4s, v2.4s
|
|
; CHECK-FP16-SD-NEXT: ucvtf v4.4s, v1.4s
|
|
; CHECK-FP16-SD-NEXT: fcvtn v0.4h, v0.4s
|
|
; CHECK-FP16-SD-NEXT: fcvtn v1.4h, v2.4s
|
|
; CHECK-FP16-SD-NEXT: ucvtf v2.4s, v3.4s
|
|
; CHECK-FP16-SD-NEXT: fcvtn2 v0.8h, v4.4s
|
|
; CHECK-FP16-SD-NEXT: fcvtn2 v1.8h, v2.4s
|
|
; CHECK-FP16-SD-NEXT: ret
|
|
;
|
|
; CHECK-NOFP16-GI-LABEL: utofp_v16i32_v16f16:
|
|
; CHECK-NOFP16-GI: // %bb.0: // %entry
|
|
; CHECK-NOFP16-GI-NEXT: ucvtf v0.4s, v0.4s
|
|
; CHECK-NOFP16-GI-NEXT: ucvtf v2.4s, v2.4s
|
|
; CHECK-NOFP16-GI-NEXT: ucvtf v4.4s, v1.4s
|
|
; CHECK-NOFP16-GI-NEXT: ucvtf v3.4s, v3.4s
|
|
; CHECK-NOFP16-GI-NEXT: fcvtn v0.4h, v0.4s
|
|
; CHECK-NOFP16-GI-NEXT: fcvtn v1.4h, v2.4s
|
|
; CHECK-NOFP16-GI-NEXT: fcvtn2 v0.8h, v4.4s
|
|
; CHECK-NOFP16-GI-NEXT: fcvtn2 v1.8h, v3.4s
|
|
; CHECK-NOFP16-GI-NEXT: ret
|
|
;
|
|
; CHECK-FP16-GI-LABEL: utofp_v16i32_v16f16:
|
|
; CHECK-FP16-GI: // %bb.0: // %entry
|
|
; CHECK-FP16-GI-NEXT: ucvtf v0.4s, v0.4s
|
|
; CHECK-FP16-GI-NEXT: ucvtf v2.4s, v2.4s
|
|
; CHECK-FP16-GI-NEXT: ucvtf v4.4s, v1.4s
|
|
; CHECK-FP16-GI-NEXT: ucvtf v3.4s, v3.4s
|
|
; CHECK-FP16-GI-NEXT: fcvtn v0.4h, v0.4s
|
|
; CHECK-FP16-GI-NEXT: fcvtn v1.4h, v2.4s
|
|
; CHECK-FP16-GI-NEXT: fcvtn2 v0.8h, v4.4s
|
|
; CHECK-FP16-GI-NEXT: fcvtn2 v1.8h, v3.4s
|
|
; CHECK-FP16-GI-NEXT: ret
|
|
entry:
|
|
%c = uitofp <16 x i32> %a to <16 x half>
|
|
ret <16 x half> %c
|
|
}
|
|
|
|
define <2 x half> @stofp_v2i16_v2f16(<2 x i16> %a) {
|
|
; CHECK-NOFP16-SD-LABEL: stofp_v2i16_v2f16:
|
|
; CHECK-NOFP16-SD: // %bb.0: // %entry
|
|
; CHECK-NOFP16-SD-NEXT: uzp1 v0.4h, v0.4h, v0.4h
|
|
; CHECK-NOFP16-SD-NEXT: sshll v0.4s, v0.4h, #0
|
|
; CHECK-NOFP16-SD-NEXT: scvtf v0.4s, v0.4s
|
|
; CHECK-NOFP16-SD-NEXT: fcvtn v0.4h, v0.4s
|
|
; CHECK-NOFP16-SD-NEXT: ret
|
|
;
|
|
; CHECK-FP16-LABEL: stofp_v2i16_v2f16:
|
|
; CHECK-FP16: // %bb.0: // %entry
|
|
; CHECK-FP16-NEXT: uzp1 v0.4h, v0.4h, v0.4h
|
|
; CHECK-FP16-NEXT: scvtf v0.4h, v0.4h
|
|
; CHECK-FP16-NEXT: ret
|
|
;
|
|
; CHECK-NOFP16-GI-LABEL: stofp_v2i16_v2f16:
|
|
; CHECK-NOFP16-GI: // %bb.0: // %entry
|
|
; CHECK-NOFP16-GI-NEXT: shl v0.2s, v0.2s, #16
|
|
; CHECK-NOFP16-GI-NEXT: sshr v0.2s, v0.2s, #16
|
|
; CHECK-NOFP16-GI-NEXT: scvtf v0.2s, v0.2s
|
|
; CHECK-NOFP16-GI-NEXT: mov v1.s[0], v0.s[0]
|
|
; CHECK-NOFP16-GI-NEXT: mov v1.s[1], v0.s[1]
|
|
; CHECK-NOFP16-GI-NEXT: fcvtn v0.4h, v1.4s
|
|
; CHECK-NOFP16-GI-NEXT: ret
|
|
entry:
|
|
%c = sitofp <2 x i16> %a to <2 x half>
|
|
ret <2 x half> %c
|
|
}
|
|
|
|
define <2 x half> @utofp_v2i16_v2f16(<2 x i16> %a) {
|
|
; CHECK-NOFP16-SD-LABEL: utofp_v2i16_v2f16:
|
|
; CHECK-NOFP16-SD: // %bb.0: // %entry
|
|
; CHECK-NOFP16-SD-NEXT: uzp1 v0.4h, v0.4h, v0.4h
|
|
; CHECK-NOFP16-SD-NEXT: ushll v0.4s, v0.4h, #0
|
|
; CHECK-NOFP16-SD-NEXT: ucvtf v0.4s, v0.4s
|
|
; CHECK-NOFP16-SD-NEXT: fcvtn v0.4h, v0.4s
|
|
; CHECK-NOFP16-SD-NEXT: ret
|
|
;
|
|
; CHECK-FP16-LABEL: utofp_v2i16_v2f16:
|
|
; CHECK-FP16: // %bb.0: // %entry
|
|
; CHECK-FP16-NEXT: uzp1 v0.4h, v0.4h, v0.4h
|
|
; CHECK-FP16-NEXT: ucvtf v0.4h, v0.4h
|
|
; CHECK-FP16-NEXT: ret
|
|
;
|
|
; CHECK-NOFP16-GI-LABEL: utofp_v2i16_v2f16:
|
|
; CHECK-NOFP16-GI: // %bb.0: // %entry
|
|
; CHECK-NOFP16-GI-NEXT: movi d1, #0x00ffff0000ffff
|
|
; CHECK-NOFP16-GI-NEXT: and v0.8b, v0.8b, v1.8b
|
|
; CHECK-NOFP16-GI-NEXT: ucvtf v0.2s, v0.2s
|
|
; CHECK-NOFP16-GI-NEXT: mov v1.s[0], v0.s[0]
|
|
; CHECK-NOFP16-GI-NEXT: mov v1.s[1], v0.s[1]
|
|
; CHECK-NOFP16-GI-NEXT: fcvtn v0.4h, v1.4s
|
|
; CHECK-NOFP16-GI-NEXT: ret
|
|
entry:
|
|
%c = uitofp <2 x i16> %a to <2 x half>
|
|
ret <2 x half> %c
|
|
}
|
|
|
|
define <3 x half> @stofp_v3i16_v3f16(<3 x i16> %a) {
|
|
; CHECK-NOFP16-LABEL: stofp_v3i16_v3f16:
|
|
; CHECK-NOFP16: // %bb.0: // %entry
|
|
; CHECK-NOFP16-NEXT: sshll v0.4s, v0.4h, #0
|
|
; CHECK-NOFP16-NEXT: scvtf v0.4s, v0.4s
|
|
; CHECK-NOFP16-NEXT: fcvtn v0.4h, v0.4s
|
|
; CHECK-NOFP16-NEXT: ret
|
|
;
|
|
; CHECK-FP16-LABEL: stofp_v3i16_v3f16:
|
|
; CHECK-FP16: // %bb.0: // %entry
|
|
; CHECK-FP16-NEXT: scvtf v0.4h, v0.4h
|
|
; CHECK-FP16-NEXT: ret
|
|
entry:
|
|
%c = sitofp <3 x i16> %a to <3 x half>
|
|
ret <3 x half> %c
|
|
}
|
|
|
|
define <3 x half> @utofp_v3i16_v3f16(<3 x i16> %a) {
|
|
; CHECK-NOFP16-LABEL: utofp_v3i16_v3f16:
|
|
; CHECK-NOFP16: // %bb.0: // %entry
|
|
; CHECK-NOFP16-NEXT: ushll v0.4s, v0.4h, #0
|
|
; CHECK-NOFP16-NEXT: ucvtf v0.4s, v0.4s
|
|
; CHECK-NOFP16-NEXT: fcvtn v0.4h, v0.4s
|
|
; CHECK-NOFP16-NEXT: ret
|
|
;
|
|
; CHECK-FP16-LABEL: utofp_v3i16_v3f16:
|
|
; CHECK-FP16: // %bb.0: // %entry
|
|
; CHECK-FP16-NEXT: ucvtf v0.4h, v0.4h
|
|
; CHECK-FP16-NEXT: ret
|
|
entry:
|
|
%c = uitofp <3 x i16> %a to <3 x half>
|
|
ret <3 x half> %c
|
|
}
|
|
|
|
define <4 x half> @stofp_v4i16_v4f16(<4 x i16> %a) {
|
|
; CHECK-NOFP16-LABEL: stofp_v4i16_v4f16:
|
|
; CHECK-NOFP16: // %bb.0: // %entry
|
|
; CHECK-NOFP16-NEXT: sshll v0.4s, v0.4h, #0
|
|
; CHECK-NOFP16-NEXT: scvtf v0.4s, v0.4s
|
|
; CHECK-NOFP16-NEXT: fcvtn v0.4h, v0.4s
|
|
; CHECK-NOFP16-NEXT: ret
|
|
;
|
|
; CHECK-FP16-LABEL: stofp_v4i16_v4f16:
|
|
; CHECK-FP16: // %bb.0: // %entry
|
|
; CHECK-FP16-NEXT: scvtf v0.4h, v0.4h
|
|
; CHECK-FP16-NEXT: ret
|
|
entry:
|
|
%c = sitofp <4 x i16> %a to <4 x half>
|
|
ret <4 x half> %c
|
|
}
|
|
|
|
define <4 x half> @utofp_v4i16_v4f16(<4 x i16> %a) {
|
|
; CHECK-NOFP16-LABEL: utofp_v4i16_v4f16:
|
|
; CHECK-NOFP16: // %bb.0: // %entry
|
|
; CHECK-NOFP16-NEXT: ushll v0.4s, v0.4h, #0
|
|
; CHECK-NOFP16-NEXT: ucvtf v0.4s, v0.4s
|
|
; CHECK-NOFP16-NEXT: fcvtn v0.4h, v0.4s
|
|
; CHECK-NOFP16-NEXT: ret
|
|
;
|
|
; CHECK-FP16-LABEL: utofp_v4i16_v4f16:
|
|
; CHECK-FP16: // %bb.0: // %entry
|
|
; CHECK-FP16-NEXT: ucvtf v0.4h, v0.4h
|
|
; CHECK-FP16-NEXT: ret
|
|
entry:
|
|
%c = uitofp <4 x i16> %a to <4 x half>
|
|
ret <4 x half> %c
|
|
}
|
|
|
|
define <8 x half> @stofp_v8i16_v8f16(<8 x i16> %a) {
|
|
; CHECK-NOFP16-SD-LABEL: stofp_v8i16_v8f16:
|
|
; CHECK-NOFP16-SD: // %bb.0: // %entry
|
|
; CHECK-NOFP16-SD-NEXT: sshll v1.4s, v0.4h, #0
|
|
; CHECK-NOFP16-SD-NEXT: sshll2 v2.4s, v0.8h, #0
|
|
; CHECK-NOFP16-SD-NEXT: scvtf v1.4s, v1.4s
|
|
; CHECK-NOFP16-SD-NEXT: fcvtn v0.4h, v1.4s
|
|
; CHECK-NOFP16-SD-NEXT: scvtf v1.4s, v2.4s
|
|
; CHECK-NOFP16-SD-NEXT: fcvtn2 v0.8h, v1.4s
|
|
; CHECK-NOFP16-SD-NEXT: ret
|
|
;
|
|
; CHECK-FP16-LABEL: stofp_v8i16_v8f16:
|
|
; CHECK-FP16: // %bb.0: // %entry
|
|
; CHECK-FP16-NEXT: scvtf v0.8h, v0.8h
|
|
; CHECK-FP16-NEXT: ret
|
|
;
|
|
; CHECK-NOFP16-GI-LABEL: stofp_v8i16_v8f16:
|
|
; CHECK-NOFP16-GI: // %bb.0: // %entry
|
|
; CHECK-NOFP16-GI-NEXT: sshll v1.4s, v0.4h, #0
|
|
; CHECK-NOFP16-GI-NEXT: sshll2 v0.4s, v0.8h, #0
|
|
; CHECK-NOFP16-GI-NEXT: scvtf v1.4s, v1.4s
|
|
; CHECK-NOFP16-GI-NEXT: scvtf v2.4s, v0.4s
|
|
; CHECK-NOFP16-GI-NEXT: fcvtn v0.4h, v1.4s
|
|
; CHECK-NOFP16-GI-NEXT: fcvtn2 v0.8h, v2.4s
|
|
; CHECK-NOFP16-GI-NEXT: ret
|
|
entry:
|
|
%c = sitofp <8 x i16> %a to <8 x half>
|
|
ret <8 x half> %c
|
|
}
|
|
|
|
define <8 x half> @utofp_v8i16_v8f16(<8 x i16> %a) {
|
|
; CHECK-NOFP16-SD-LABEL: utofp_v8i16_v8f16:
|
|
; CHECK-NOFP16-SD: // %bb.0: // %entry
|
|
; CHECK-NOFP16-SD-NEXT: ushll v1.4s, v0.4h, #0
|
|
; CHECK-NOFP16-SD-NEXT: ushll2 v2.4s, v0.8h, #0
|
|
; CHECK-NOFP16-SD-NEXT: ucvtf v1.4s, v1.4s
|
|
; CHECK-NOFP16-SD-NEXT: fcvtn v0.4h, v1.4s
|
|
; CHECK-NOFP16-SD-NEXT: ucvtf v1.4s, v2.4s
|
|
; CHECK-NOFP16-SD-NEXT: fcvtn2 v0.8h, v1.4s
|
|
; CHECK-NOFP16-SD-NEXT: ret
|
|
;
|
|
; CHECK-FP16-LABEL: utofp_v8i16_v8f16:
|
|
; CHECK-FP16: // %bb.0: // %entry
|
|
; CHECK-FP16-NEXT: ucvtf v0.8h, v0.8h
|
|
; CHECK-FP16-NEXT: ret
|
|
;
|
|
; CHECK-NOFP16-GI-LABEL: utofp_v8i16_v8f16:
|
|
; CHECK-NOFP16-GI: // %bb.0: // %entry
|
|
; CHECK-NOFP16-GI-NEXT: ushll v1.4s, v0.4h, #0
|
|
; CHECK-NOFP16-GI-NEXT: ushll2 v0.4s, v0.8h, #0
|
|
; CHECK-NOFP16-GI-NEXT: ucvtf v1.4s, v1.4s
|
|
; CHECK-NOFP16-GI-NEXT: ucvtf v2.4s, v0.4s
|
|
; CHECK-NOFP16-GI-NEXT: fcvtn v0.4h, v1.4s
|
|
; CHECK-NOFP16-GI-NEXT: fcvtn2 v0.8h, v2.4s
|
|
; CHECK-NOFP16-GI-NEXT: ret
|
|
entry:
|
|
%c = uitofp <8 x i16> %a to <8 x half>
|
|
ret <8 x half> %c
|
|
}
|
|
|
|
define <16 x half> @stofp_v16i16_v16f16(<16 x i16> %a) {
|
|
; CHECK-NOFP16-SD-LABEL: stofp_v16i16_v16f16:
|
|
; CHECK-NOFP16-SD: // %bb.0: // %entry
|
|
; CHECK-NOFP16-SD-NEXT: sshll v2.4s, v0.4h, #0
|
|
; CHECK-NOFP16-SD-NEXT: sshll v3.4s, v1.4h, #0
|
|
; CHECK-NOFP16-SD-NEXT: sshll2 v4.4s, v0.8h, #0
|
|
; CHECK-NOFP16-SD-NEXT: sshll2 v5.4s, v1.8h, #0
|
|
; CHECK-NOFP16-SD-NEXT: scvtf v2.4s, v2.4s
|
|
; CHECK-NOFP16-SD-NEXT: scvtf v3.4s, v3.4s
|
|
; CHECK-NOFP16-SD-NEXT: fcvtn v0.4h, v2.4s
|
|
; CHECK-NOFP16-SD-NEXT: scvtf v2.4s, v4.4s
|
|
; CHECK-NOFP16-SD-NEXT: fcvtn v1.4h, v3.4s
|
|
; CHECK-NOFP16-SD-NEXT: scvtf v3.4s, v5.4s
|
|
; CHECK-NOFP16-SD-NEXT: fcvtn2 v0.8h, v2.4s
|
|
; CHECK-NOFP16-SD-NEXT: fcvtn2 v1.8h, v3.4s
|
|
; CHECK-NOFP16-SD-NEXT: ret
|
|
;
|
|
; CHECK-FP16-LABEL: stofp_v16i16_v16f16:
|
|
; CHECK-FP16: // %bb.0: // %entry
|
|
; CHECK-FP16-NEXT: scvtf v0.8h, v0.8h
|
|
; CHECK-FP16-NEXT: scvtf v1.8h, v1.8h
|
|
; CHECK-FP16-NEXT: ret
|
|
;
|
|
; CHECK-NOFP16-GI-LABEL: stofp_v16i16_v16f16:
|
|
; CHECK-NOFP16-GI: // %bb.0: // %entry
|
|
; CHECK-NOFP16-GI-NEXT: sshll v2.4s, v0.4h, #0
|
|
; CHECK-NOFP16-GI-NEXT: sshll v3.4s, v1.4h, #0
|
|
; CHECK-NOFP16-GI-NEXT: sshll2 v0.4s, v0.8h, #0
|
|
; CHECK-NOFP16-GI-NEXT: sshll2 v1.4s, v1.8h, #0
|
|
; CHECK-NOFP16-GI-NEXT: scvtf v2.4s, v2.4s
|
|
; CHECK-NOFP16-GI-NEXT: scvtf v3.4s, v3.4s
|
|
; CHECK-NOFP16-GI-NEXT: scvtf v4.4s, v0.4s
|
|
; CHECK-NOFP16-GI-NEXT: scvtf v5.4s, v1.4s
|
|
; CHECK-NOFP16-GI-NEXT: fcvtn v0.4h, v2.4s
|
|
; CHECK-NOFP16-GI-NEXT: fcvtn v1.4h, v3.4s
|
|
; CHECK-NOFP16-GI-NEXT: fcvtn2 v0.8h, v4.4s
|
|
; CHECK-NOFP16-GI-NEXT: fcvtn2 v1.8h, v5.4s
|
|
; CHECK-NOFP16-GI-NEXT: ret
|
|
entry:
|
|
%c = sitofp <16 x i16> %a to <16 x half>
|
|
ret <16 x half> %c
|
|
}
|
|
|
|
define <16 x half> @utofp_v16i16_v16f16(<16 x i16> %a) {
|
|
; CHECK-NOFP16-SD-LABEL: utofp_v16i16_v16f16:
|
|
; CHECK-NOFP16-SD: // %bb.0: // %entry
|
|
; CHECK-NOFP16-SD-NEXT: ushll v2.4s, v0.4h, #0
|
|
; CHECK-NOFP16-SD-NEXT: ushll v3.4s, v1.4h, #0
|
|
; CHECK-NOFP16-SD-NEXT: ushll2 v4.4s, v0.8h, #0
|
|
; CHECK-NOFP16-SD-NEXT: ushll2 v5.4s, v1.8h, #0
|
|
; CHECK-NOFP16-SD-NEXT: ucvtf v2.4s, v2.4s
|
|
; CHECK-NOFP16-SD-NEXT: ucvtf v3.4s, v3.4s
|
|
; CHECK-NOFP16-SD-NEXT: fcvtn v0.4h, v2.4s
|
|
; CHECK-NOFP16-SD-NEXT: ucvtf v2.4s, v4.4s
|
|
; CHECK-NOFP16-SD-NEXT: fcvtn v1.4h, v3.4s
|
|
; CHECK-NOFP16-SD-NEXT: ucvtf v3.4s, v5.4s
|
|
; CHECK-NOFP16-SD-NEXT: fcvtn2 v0.8h, v2.4s
|
|
; CHECK-NOFP16-SD-NEXT: fcvtn2 v1.8h, v3.4s
|
|
; CHECK-NOFP16-SD-NEXT: ret
|
|
;
|
|
; CHECK-FP16-LABEL: utofp_v16i16_v16f16:
|
|
; CHECK-FP16: // %bb.0: // %entry
|
|
; CHECK-FP16-NEXT: ucvtf v0.8h, v0.8h
|
|
; CHECK-FP16-NEXT: ucvtf v1.8h, v1.8h
|
|
; CHECK-FP16-NEXT: ret
|
|
;
|
|
; CHECK-NOFP16-GI-LABEL: utofp_v16i16_v16f16:
|
|
; CHECK-NOFP16-GI: // %bb.0: // %entry
|
|
; CHECK-NOFP16-GI-NEXT: ushll v2.4s, v0.4h, #0
|
|
; CHECK-NOFP16-GI-NEXT: ushll v3.4s, v1.4h, #0
|
|
; CHECK-NOFP16-GI-NEXT: ushll2 v0.4s, v0.8h, #0
|
|
; CHECK-NOFP16-GI-NEXT: ushll2 v1.4s, v1.8h, #0
|
|
; CHECK-NOFP16-GI-NEXT: ucvtf v2.4s, v2.4s
|
|
; CHECK-NOFP16-GI-NEXT: ucvtf v3.4s, v3.4s
|
|
; CHECK-NOFP16-GI-NEXT: ucvtf v4.4s, v0.4s
|
|
; CHECK-NOFP16-GI-NEXT: ucvtf v5.4s, v1.4s
|
|
; CHECK-NOFP16-GI-NEXT: fcvtn v0.4h, v2.4s
|
|
; CHECK-NOFP16-GI-NEXT: fcvtn v1.4h, v3.4s
|
|
; CHECK-NOFP16-GI-NEXT: fcvtn2 v0.8h, v4.4s
|
|
; CHECK-NOFP16-GI-NEXT: fcvtn2 v1.8h, v5.4s
|
|
; CHECK-NOFP16-GI-NEXT: ret
|
|
entry:
|
|
%c = uitofp <16 x i16> %a to <16 x half>
|
|
ret <16 x half> %c
|
|
}
|
|
|
|
define <2 x half> @stofp_v2i8_v2f16(<2 x i8> %a) {
|
|
; CHECK-NOFP16-SD-LABEL: stofp_v2i8_v2f16:
|
|
; CHECK-NOFP16-SD: // %bb.0: // %entry
|
|
; CHECK-NOFP16-SD-NEXT: // kill: def $d0 killed $d0 def $q0
|
|
; CHECK-NOFP16-SD-NEXT: mov w8, v0.s[1]
|
|
; CHECK-NOFP16-SD-NEXT: fmov w9, s0
|
|
; CHECK-NOFP16-SD-NEXT: sxtb w9, w9
|
|
; CHECK-NOFP16-SD-NEXT: sxtb w8, w8
|
|
; CHECK-NOFP16-SD-NEXT: scvtf s1, w9
|
|
; CHECK-NOFP16-SD-NEXT: scvtf s0, w8
|
|
; CHECK-NOFP16-SD-NEXT: fcvt h2, s0
|
|
; CHECK-NOFP16-SD-NEXT: fcvt h0, s1
|
|
; CHECK-NOFP16-SD-NEXT: mov v0.h[1], v2.h[0]
|
|
; CHECK-NOFP16-SD-NEXT: // kill: def $d0 killed $d0 killed $q0
|
|
; CHECK-NOFP16-SD-NEXT: ret
|
|
;
|
|
; CHECK-FP16-SD-LABEL: stofp_v2i8_v2f16:
|
|
; CHECK-FP16-SD: // %bb.0: // %entry
|
|
; CHECK-FP16-SD-NEXT: // kill: def $d0 killed $d0 def $q0
|
|
; CHECK-FP16-SD-NEXT: mov w8, v0.s[1]
|
|
; CHECK-FP16-SD-NEXT: fmov w9, s0
|
|
; CHECK-FP16-SD-NEXT: sxtb w9, w9
|
|
; CHECK-FP16-SD-NEXT: sxtb w8, w8
|
|
; CHECK-FP16-SD-NEXT: scvtf h0, w9
|
|
; CHECK-FP16-SD-NEXT: scvtf h1, w8
|
|
; CHECK-FP16-SD-NEXT: mov v0.h[1], v1.h[0]
|
|
; CHECK-FP16-SD-NEXT: // kill: def $d0 killed $d0 killed $q0
|
|
; CHECK-FP16-SD-NEXT: ret
|
|
;
|
|
; CHECK-NOFP16-GI-LABEL: stofp_v2i8_v2f16:
|
|
; CHECK-NOFP16-GI: // %bb.0: // %entry
|
|
; CHECK-NOFP16-GI-NEXT: shl v0.2s, v0.2s, #24
|
|
; CHECK-NOFP16-GI-NEXT: sshr v0.2s, v0.2s, #24
|
|
; CHECK-NOFP16-GI-NEXT: scvtf v0.2s, v0.2s
|
|
; CHECK-NOFP16-GI-NEXT: mov v1.s[0], v0.s[0]
|
|
; CHECK-NOFP16-GI-NEXT: mov v1.s[1], v0.s[1]
|
|
; CHECK-NOFP16-GI-NEXT: fcvtn v0.4h, v1.4s
|
|
; CHECK-NOFP16-GI-NEXT: ret
|
|
;
|
|
; CHECK-FP16-GI-LABEL: stofp_v2i8_v2f16:
|
|
; CHECK-FP16-GI: // %bb.0: // %entry
|
|
; CHECK-FP16-GI-NEXT: uzp1 v0.4h, v0.4h, v0.4h
|
|
; CHECK-FP16-GI-NEXT: shl v0.4h, v0.4h, #8
|
|
; CHECK-FP16-GI-NEXT: sshr v0.4h, v0.4h, #8
|
|
; CHECK-FP16-GI-NEXT: scvtf v0.4h, v0.4h
|
|
; CHECK-FP16-GI-NEXT: ret
|
|
entry:
|
|
%c = sitofp <2 x i8> %a to <2 x half>
|
|
ret <2 x half> %c
|
|
}
|
|
|
|
define <2 x half> @utofp_v2i8_v2f16(<2 x i8> %a) {
|
|
; CHECK-NOFP16-SD-LABEL: utofp_v2i8_v2f16:
|
|
; CHECK-NOFP16-SD: // %bb.0: // %entry
|
|
; CHECK-NOFP16-SD-NEXT: // kill: def $d0 killed $d0 def $q0
|
|
; CHECK-NOFP16-SD-NEXT: mov w8, v0.s[1]
|
|
; CHECK-NOFP16-SD-NEXT: fmov w9, s0
|
|
; CHECK-NOFP16-SD-NEXT: and w9, w9, #0xff
|
|
; CHECK-NOFP16-SD-NEXT: and w8, w8, #0xff
|
|
; CHECK-NOFP16-SD-NEXT: ucvtf s1, w9
|
|
; CHECK-NOFP16-SD-NEXT: ucvtf s0, w8
|
|
; CHECK-NOFP16-SD-NEXT: fcvt h2, s0
|
|
; CHECK-NOFP16-SD-NEXT: fcvt h0, s1
|
|
; CHECK-NOFP16-SD-NEXT: mov v0.h[1], v2.h[0]
|
|
; CHECK-NOFP16-SD-NEXT: // kill: def $d0 killed $d0 killed $q0
|
|
; CHECK-NOFP16-SD-NEXT: ret
|
|
;
|
|
; CHECK-FP16-SD-LABEL: utofp_v2i8_v2f16:
|
|
; CHECK-FP16-SD: // %bb.0: // %entry
|
|
; CHECK-FP16-SD-NEXT: // kill: def $d0 killed $d0 def $q0
|
|
; CHECK-FP16-SD-NEXT: mov w8, v0.s[1]
|
|
; CHECK-FP16-SD-NEXT: fmov w9, s0
|
|
; CHECK-FP16-SD-NEXT: and w9, w9, #0xff
|
|
; CHECK-FP16-SD-NEXT: and w8, w8, #0xff
|
|
; CHECK-FP16-SD-NEXT: ucvtf h0, w9
|
|
; CHECK-FP16-SD-NEXT: ucvtf h1, w8
|
|
; CHECK-FP16-SD-NEXT: mov v0.h[1], v1.h[0]
|
|
; CHECK-FP16-SD-NEXT: // kill: def $d0 killed $d0 killed $q0
|
|
; CHECK-FP16-SD-NEXT: ret
|
|
;
|
|
; CHECK-NOFP16-GI-LABEL: utofp_v2i8_v2f16:
|
|
; CHECK-NOFP16-GI: // %bb.0: // %entry
|
|
; CHECK-NOFP16-GI-NEXT: movi d1, #0x0000ff000000ff
|
|
; CHECK-NOFP16-GI-NEXT: and v0.8b, v0.8b, v1.8b
|
|
; CHECK-NOFP16-GI-NEXT: ucvtf v0.2s, v0.2s
|
|
; CHECK-NOFP16-GI-NEXT: mov v1.s[0], v0.s[0]
|
|
; CHECK-NOFP16-GI-NEXT: mov v1.s[1], v0.s[1]
|
|
; CHECK-NOFP16-GI-NEXT: fcvtn v0.4h, v1.4s
|
|
; CHECK-NOFP16-GI-NEXT: ret
|
|
;
|
|
; CHECK-FP16-GI-LABEL: utofp_v2i8_v2f16:
|
|
; CHECK-FP16-GI: // %bb.0: // %entry
|
|
; CHECK-FP16-GI-NEXT: movi d1, #0x0000ff000000ff
|
|
; CHECK-FP16-GI-NEXT: and v0.8b, v0.8b, v1.8b
|
|
; CHECK-FP16-GI-NEXT: uzp1 v0.4h, v0.4h, v0.4h
|
|
; CHECK-FP16-GI-NEXT: ucvtf v0.4h, v0.4h
|
|
; CHECK-FP16-GI-NEXT: ret
|
|
entry:
|
|
%c = uitofp <2 x i8> %a to <2 x half>
|
|
ret <2 x half> %c
|
|
}
|
|
|
|
define <3 x half> @stofp_v3i8_v3f16(<3 x i8> %a) {
|
|
; CHECK-NOFP16-SD-LABEL: stofp_v3i8_v3f16:
|
|
; CHECK-NOFP16-SD: // %bb.0: // %entry
|
|
; CHECK-NOFP16-SD-NEXT: fmov s0, w0
|
|
; CHECK-NOFP16-SD-NEXT: mov v0.h[1], w1
|
|
; CHECK-NOFP16-SD-NEXT: mov v0.h[2], w2
|
|
; CHECK-NOFP16-SD-NEXT: shl v0.4h, v0.4h, #8
|
|
; CHECK-NOFP16-SD-NEXT: sshr v0.4h, v0.4h, #8
|
|
; CHECK-NOFP16-SD-NEXT: sshll v0.4s, v0.4h, #0
|
|
; CHECK-NOFP16-SD-NEXT: scvtf v0.4s, v0.4s
|
|
; CHECK-NOFP16-SD-NEXT: fcvtn v0.4h, v0.4s
|
|
; CHECK-NOFP16-SD-NEXT: ret
|
|
;
|
|
; CHECK-FP16-SD-LABEL: stofp_v3i8_v3f16:
|
|
; CHECK-FP16-SD: // %bb.0: // %entry
|
|
; CHECK-FP16-SD-NEXT: fmov s0, w0
|
|
; CHECK-FP16-SD-NEXT: mov v0.h[1], w1
|
|
; CHECK-FP16-SD-NEXT: mov v0.h[2], w2
|
|
; CHECK-FP16-SD-NEXT: shl v0.4h, v0.4h, #8
|
|
; CHECK-FP16-SD-NEXT: sshr v0.4h, v0.4h, #8
|
|
; CHECK-FP16-SD-NEXT: scvtf v0.4h, v0.4h
|
|
; CHECK-FP16-SD-NEXT: ret
|
|
;
|
|
; CHECK-NOFP16-GI-LABEL: stofp_v3i8_v3f16:
|
|
; CHECK-NOFP16-GI: // %bb.0: // %entry
|
|
; CHECK-NOFP16-GI-NEXT: fmov s0, w0
|
|
; CHECK-NOFP16-GI-NEXT: mov v0.h[1], w1
|
|
; CHECK-NOFP16-GI-NEXT: mov v0.h[2], w2
|
|
; CHECK-NOFP16-GI-NEXT: shl v0.4h, v0.4h, #8
|
|
; CHECK-NOFP16-GI-NEXT: sshr v0.4h, v0.4h, #8
|
|
; CHECK-NOFP16-GI-NEXT: mov v1.h[0], v0.h[2]
|
|
; CHECK-NOFP16-GI-NEXT: mov v1.h[1], v0.h[3]
|
|
; CHECK-NOFP16-GI-NEXT: sshll v0.4s, v0.4h, #0
|
|
; CHECK-NOFP16-GI-NEXT: sshll v1.4s, v1.4h, #0
|
|
; CHECK-NOFP16-GI-NEXT: mov v0.d[1], v1.d[0]
|
|
; CHECK-NOFP16-GI-NEXT: scvtf v0.4s, v0.4s
|
|
; CHECK-NOFP16-GI-NEXT: fcvtn v0.4h, v0.4s
|
|
; CHECK-NOFP16-GI-NEXT: ret
|
|
;
|
|
; CHECK-FP16-GI-LABEL: stofp_v3i8_v3f16:
|
|
; CHECK-FP16-GI: // %bb.0: // %entry
|
|
; CHECK-FP16-GI-NEXT: fmov s0, w0
|
|
; CHECK-FP16-GI-NEXT: mov v0.b[1], w1
|
|
; CHECK-FP16-GI-NEXT: mov v0.b[2], w2
|
|
; CHECK-FP16-GI-NEXT: sshll v0.8h, v0.8b, #0
|
|
; CHECK-FP16-GI-NEXT: scvtf v0.4h, v0.4h
|
|
; CHECK-FP16-GI-NEXT: ret
|
|
entry:
|
|
%c = sitofp <3 x i8> %a to <3 x half>
|
|
ret <3 x half> %c
|
|
}
|
|
|
|
define <3 x half> @utofp_v3i8_v3f16(<3 x i8> %a) {
|
|
; CHECK-NOFP16-SD-LABEL: utofp_v3i8_v3f16:
|
|
; CHECK-NOFP16-SD: // %bb.0: // %entry
|
|
; CHECK-NOFP16-SD-NEXT: fmov s0, w0
|
|
; CHECK-NOFP16-SD-NEXT: mov v0.h[1], w1
|
|
; CHECK-NOFP16-SD-NEXT: mov v0.h[2], w2
|
|
; CHECK-NOFP16-SD-NEXT: bic v0.4h, #255, lsl #8
|
|
; CHECK-NOFP16-SD-NEXT: ushll v0.4s, v0.4h, #0
|
|
; CHECK-NOFP16-SD-NEXT: ucvtf v0.4s, v0.4s
|
|
; CHECK-NOFP16-SD-NEXT: fcvtn v0.4h, v0.4s
|
|
; CHECK-NOFP16-SD-NEXT: ret
|
|
;
|
|
; CHECK-FP16-SD-LABEL: utofp_v3i8_v3f16:
|
|
; CHECK-FP16-SD: // %bb.0: // %entry
|
|
; CHECK-FP16-SD-NEXT: fmov s0, w0
|
|
; CHECK-FP16-SD-NEXT: mov v0.h[1], w1
|
|
; CHECK-FP16-SD-NEXT: mov v0.h[2], w2
|
|
; CHECK-FP16-SD-NEXT: bic v0.4h, #255, lsl #8
|
|
; CHECK-FP16-SD-NEXT: ucvtf v0.4h, v0.4h
|
|
; CHECK-FP16-SD-NEXT: ret
|
|
;
|
|
; CHECK-NOFP16-GI-LABEL: utofp_v3i8_v3f16:
|
|
; CHECK-NOFP16-GI: // %bb.0: // %entry
|
|
; CHECK-NOFP16-GI-NEXT: fmov s0, w0
|
|
; CHECK-NOFP16-GI-NEXT: movi d1, #0xff00ff00ff00ff
|
|
; CHECK-NOFP16-GI-NEXT: mov v0.h[1], w1
|
|
; CHECK-NOFP16-GI-NEXT: mov v0.h[2], w2
|
|
; CHECK-NOFP16-GI-NEXT: and v0.8b, v0.8b, v1.8b
|
|
; CHECK-NOFP16-GI-NEXT: mov v1.h[0], v0.h[2]
|
|
; CHECK-NOFP16-GI-NEXT: mov v1.h[1], v0.h[3]
|
|
; CHECK-NOFP16-GI-NEXT: ushll v0.4s, v0.4h, #0
|
|
; CHECK-NOFP16-GI-NEXT: ushll v1.4s, v1.4h, #0
|
|
; CHECK-NOFP16-GI-NEXT: mov v0.d[1], v1.d[0]
|
|
; CHECK-NOFP16-GI-NEXT: ucvtf v0.4s, v0.4s
|
|
; CHECK-NOFP16-GI-NEXT: fcvtn v0.4h, v0.4s
|
|
; CHECK-NOFP16-GI-NEXT: ret
|
|
;
|
|
; CHECK-FP16-GI-LABEL: utofp_v3i8_v3f16:
|
|
; CHECK-FP16-GI: // %bb.0: // %entry
|
|
; CHECK-FP16-GI-NEXT: fmov s0, w0
|
|
; CHECK-FP16-GI-NEXT: mov v0.b[1], w1
|
|
; CHECK-FP16-GI-NEXT: mov v0.b[2], w2
|
|
; CHECK-FP16-GI-NEXT: ushll v0.8h, v0.8b, #0
|
|
; CHECK-FP16-GI-NEXT: ucvtf v0.4h, v0.4h
|
|
; CHECK-FP16-GI-NEXT: ret
|
|
entry:
|
|
%c = uitofp <3 x i8> %a to <3 x half>
|
|
ret <3 x half> %c
|
|
}
|
|
|
|
define <4 x half> @stofp_v4i8_v4f16(<4 x i8> %a) {
|
|
; CHECK-NOFP16-SD-LABEL: stofp_v4i8_v4f16:
|
|
; CHECK-NOFP16-SD: // %bb.0: // %entry
|
|
; CHECK-NOFP16-SD-NEXT: shl v0.4h, v0.4h, #8
|
|
; CHECK-NOFP16-SD-NEXT: sshr v0.4h, v0.4h, #8
|
|
; CHECK-NOFP16-SD-NEXT: sshll v0.4s, v0.4h, #0
|
|
; CHECK-NOFP16-SD-NEXT: scvtf v0.4s, v0.4s
|
|
; CHECK-NOFP16-SD-NEXT: fcvtn v0.4h, v0.4s
|
|
; CHECK-NOFP16-SD-NEXT: ret
|
|
;
|
|
; CHECK-FP16-LABEL: stofp_v4i8_v4f16:
|
|
; CHECK-FP16: // %bb.0: // %entry
|
|
; CHECK-FP16-NEXT: shl v0.4h, v0.4h, #8
|
|
; CHECK-FP16-NEXT: sshr v0.4h, v0.4h, #8
|
|
; CHECK-FP16-NEXT: scvtf v0.4h, v0.4h
|
|
; CHECK-FP16-NEXT: ret
|
|
;
|
|
; CHECK-NOFP16-GI-LABEL: stofp_v4i8_v4f16:
|
|
; CHECK-NOFP16-GI: // %bb.0: // %entry
|
|
; CHECK-NOFP16-GI-NEXT: ushll v0.4s, v0.4h, #0
|
|
; CHECK-NOFP16-GI-NEXT: shl v0.4s, v0.4s, #24
|
|
; CHECK-NOFP16-GI-NEXT: sshr v0.4s, v0.4s, #24
|
|
; CHECK-NOFP16-GI-NEXT: scvtf v0.4s, v0.4s
|
|
; CHECK-NOFP16-GI-NEXT: fcvtn v0.4h, v0.4s
|
|
; CHECK-NOFP16-GI-NEXT: ret
|
|
entry:
|
|
%c = sitofp <4 x i8> %a to <4 x half>
|
|
ret <4 x half> %c
|
|
}
|
|
|
|
define <4 x half> @utofp_v4i8_v4f16(<4 x i8> %a) {
|
|
; CHECK-NOFP16-SD-LABEL: utofp_v4i8_v4f16:
|
|
; CHECK-NOFP16-SD: // %bb.0: // %entry
|
|
; CHECK-NOFP16-SD-NEXT: bic v0.4h, #255, lsl #8
|
|
; CHECK-NOFP16-SD-NEXT: ushll v0.4s, v0.4h, #0
|
|
; CHECK-NOFP16-SD-NEXT: ucvtf v0.4s, v0.4s
|
|
; CHECK-NOFP16-SD-NEXT: fcvtn v0.4h, v0.4s
|
|
; CHECK-NOFP16-SD-NEXT: ret
|
|
;
|
|
; CHECK-FP16-SD-LABEL: utofp_v4i8_v4f16:
|
|
; CHECK-FP16-SD: // %bb.0: // %entry
|
|
; CHECK-FP16-SD-NEXT: bic v0.4h, #255, lsl #8
|
|
; CHECK-FP16-SD-NEXT: ucvtf v0.4h, v0.4h
|
|
; CHECK-FP16-SD-NEXT: ret
|
|
;
|
|
; CHECK-NOFP16-GI-LABEL: utofp_v4i8_v4f16:
|
|
; CHECK-NOFP16-GI: // %bb.0: // %entry
|
|
; CHECK-NOFP16-GI-NEXT: movi v1.2d, #0x0000ff000000ff
|
|
; CHECK-NOFP16-GI-NEXT: ushll v0.4s, v0.4h, #0
|
|
; CHECK-NOFP16-GI-NEXT: and v0.16b, v0.16b, v1.16b
|
|
; CHECK-NOFP16-GI-NEXT: ucvtf v0.4s, v0.4s
|
|
; CHECK-NOFP16-GI-NEXT: fcvtn v0.4h, v0.4s
|
|
; CHECK-NOFP16-GI-NEXT: ret
|
|
;
|
|
; CHECK-FP16-GI-LABEL: utofp_v4i8_v4f16:
|
|
; CHECK-FP16-GI: // %bb.0: // %entry
|
|
; CHECK-FP16-GI-NEXT: movi d1, #0xff00ff00ff00ff
|
|
; CHECK-FP16-GI-NEXT: and v0.8b, v0.8b, v1.8b
|
|
; CHECK-FP16-GI-NEXT: ucvtf v0.4h, v0.4h
|
|
; CHECK-FP16-GI-NEXT: ret
|
|
entry:
|
|
%c = uitofp <4 x i8> %a to <4 x half>
|
|
ret <4 x half> %c
|
|
}
|
|
|
|
define <8 x half> @stofp_v8i8_v8f16(<8 x i8> %a) {
|
|
; CHECK-NOFP16-SD-LABEL: stofp_v8i8_v8f16:
|
|
; CHECK-NOFP16-SD: // %bb.0: // %entry
|
|
; CHECK-NOFP16-SD-NEXT: sshll v0.8h, v0.8b, #0
|
|
; CHECK-NOFP16-SD-NEXT: sshll v1.4s, v0.4h, #0
|
|
; CHECK-NOFP16-SD-NEXT: sshll2 v2.4s, v0.8h, #0
|
|
; CHECK-NOFP16-SD-NEXT: scvtf v1.4s, v1.4s
|
|
; CHECK-NOFP16-SD-NEXT: fcvtn v0.4h, v1.4s
|
|
; CHECK-NOFP16-SD-NEXT: scvtf v1.4s, v2.4s
|
|
; CHECK-NOFP16-SD-NEXT: fcvtn2 v0.8h, v1.4s
|
|
; CHECK-NOFP16-SD-NEXT: ret
|
|
;
|
|
; CHECK-FP16-LABEL: stofp_v8i8_v8f16:
|
|
; CHECK-FP16: // %bb.0: // %entry
|
|
; CHECK-FP16-NEXT: sshll v0.8h, v0.8b, #0
|
|
; CHECK-FP16-NEXT: scvtf v0.8h, v0.8h
|
|
; CHECK-FP16-NEXT: ret
|
|
;
|
|
; CHECK-NOFP16-GI-LABEL: stofp_v8i8_v8f16:
|
|
; CHECK-NOFP16-GI: // %bb.0: // %entry
|
|
; CHECK-NOFP16-GI-NEXT: sshll v0.8h, v0.8b, #0
|
|
; CHECK-NOFP16-GI-NEXT: sshll v1.4s, v0.4h, #0
|
|
; CHECK-NOFP16-GI-NEXT: sshll2 v0.4s, v0.8h, #0
|
|
; CHECK-NOFP16-GI-NEXT: scvtf v1.4s, v1.4s
|
|
; CHECK-NOFP16-GI-NEXT: scvtf v2.4s, v0.4s
|
|
; CHECK-NOFP16-GI-NEXT: fcvtn v0.4h, v1.4s
|
|
; CHECK-NOFP16-GI-NEXT: fcvtn2 v0.8h, v2.4s
|
|
; CHECK-NOFP16-GI-NEXT: ret
|
|
entry:
|
|
%c = sitofp <8 x i8> %a to <8 x half>
|
|
ret <8 x half> %c
|
|
}
|
|
|
|
define <8 x half> @utofp_v8i8_v8f16(<8 x i8> %a) {
|
|
; CHECK-NOFP16-SD-LABEL: utofp_v8i8_v8f16:
|
|
; CHECK-NOFP16-SD: // %bb.0: // %entry
|
|
; CHECK-NOFP16-SD-NEXT: ushll v0.8h, v0.8b, #0
|
|
; CHECK-NOFP16-SD-NEXT: ushll v1.4s, v0.4h, #0
|
|
; CHECK-NOFP16-SD-NEXT: ushll2 v2.4s, v0.8h, #0
|
|
; CHECK-NOFP16-SD-NEXT: ucvtf v1.4s, v1.4s
|
|
; CHECK-NOFP16-SD-NEXT: fcvtn v0.4h, v1.4s
|
|
; CHECK-NOFP16-SD-NEXT: ucvtf v1.4s, v2.4s
|
|
; CHECK-NOFP16-SD-NEXT: fcvtn2 v0.8h, v1.4s
|
|
; CHECK-NOFP16-SD-NEXT: ret
|
|
;
|
|
; CHECK-FP16-LABEL: utofp_v8i8_v8f16:
|
|
; CHECK-FP16: // %bb.0: // %entry
|
|
; CHECK-FP16-NEXT: ushll v0.8h, v0.8b, #0
|
|
; CHECK-FP16-NEXT: ucvtf v0.8h, v0.8h
|
|
; CHECK-FP16-NEXT: ret
|
|
;
|
|
; CHECK-NOFP16-GI-LABEL: utofp_v8i8_v8f16:
|
|
; CHECK-NOFP16-GI: // %bb.0: // %entry
|
|
; CHECK-NOFP16-GI-NEXT: ushll v0.8h, v0.8b, #0
|
|
; CHECK-NOFP16-GI-NEXT: ushll v1.4s, v0.4h, #0
|
|
; CHECK-NOFP16-GI-NEXT: ushll2 v0.4s, v0.8h, #0
|
|
; CHECK-NOFP16-GI-NEXT: ucvtf v1.4s, v1.4s
|
|
; CHECK-NOFP16-GI-NEXT: ucvtf v2.4s, v0.4s
|
|
; CHECK-NOFP16-GI-NEXT: fcvtn v0.4h, v1.4s
|
|
; CHECK-NOFP16-GI-NEXT: fcvtn2 v0.8h, v2.4s
|
|
; CHECK-NOFP16-GI-NEXT: ret
|
|
entry:
|
|
%c = uitofp <8 x i8> %a to <8 x half>
|
|
ret <8 x half> %c
|
|
}
|
|
|
|
define <16 x half> @stofp_v16i8_v16f16(<16 x i8> %a) {
|
|
; CHECK-NOFP16-SD-LABEL: stofp_v16i8_v16f16:
|
|
; CHECK-NOFP16-SD: // %bb.0: // %entry
|
|
; CHECK-NOFP16-SD-NEXT: sshll2 v1.8h, v0.16b, #0
|
|
; CHECK-NOFP16-SD-NEXT: sshll v0.8h, v0.8b, #0
|
|
; CHECK-NOFP16-SD-NEXT: sshll v2.4s, v1.4h, #0
|
|
; CHECK-NOFP16-SD-NEXT: sshll v3.4s, v0.4h, #0
|
|
; CHECK-NOFP16-SD-NEXT: sshll2 v4.4s, v1.8h, #0
|
|
; CHECK-NOFP16-SD-NEXT: sshll2 v5.4s, v0.8h, #0
|
|
; CHECK-NOFP16-SD-NEXT: scvtf v2.4s, v2.4s
|
|
; CHECK-NOFP16-SD-NEXT: scvtf v3.4s, v3.4s
|
|
; CHECK-NOFP16-SD-NEXT: fcvtn v1.4h, v2.4s
|
|
; CHECK-NOFP16-SD-NEXT: scvtf v2.4s, v4.4s
|
|
; CHECK-NOFP16-SD-NEXT: fcvtn v0.4h, v3.4s
|
|
; CHECK-NOFP16-SD-NEXT: scvtf v3.4s, v5.4s
|
|
; CHECK-NOFP16-SD-NEXT: fcvtn2 v1.8h, v2.4s
|
|
; CHECK-NOFP16-SD-NEXT: fcvtn2 v0.8h, v3.4s
|
|
; CHECK-NOFP16-SD-NEXT: ret
|
|
;
|
|
; CHECK-FP16-SD-LABEL: stofp_v16i8_v16f16:
|
|
; CHECK-FP16-SD: // %bb.0: // %entry
|
|
; CHECK-FP16-SD-NEXT: sshll2 v1.8h, v0.16b, #0
|
|
; CHECK-FP16-SD-NEXT: sshll v0.8h, v0.8b, #0
|
|
; CHECK-FP16-SD-NEXT: scvtf v1.8h, v1.8h
|
|
; CHECK-FP16-SD-NEXT: scvtf v0.8h, v0.8h
|
|
; CHECK-FP16-SD-NEXT: ret
|
|
;
|
|
; CHECK-NOFP16-GI-LABEL: stofp_v16i8_v16f16:
|
|
; CHECK-NOFP16-GI: // %bb.0: // %entry
|
|
; CHECK-NOFP16-GI-NEXT: sshll v1.8h, v0.8b, #0
|
|
; CHECK-NOFP16-GI-NEXT: sshll2 v0.8h, v0.16b, #0
|
|
; CHECK-NOFP16-GI-NEXT: sshll v2.4s, v1.4h, #0
|
|
; CHECK-NOFP16-GI-NEXT: sshll v3.4s, v0.4h, #0
|
|
; CHECK-NOFP16-GI-NEXT: sshll2 v1.4s, v1.8h, #0
|
|
; CHECK-NOFP16-GI-NEXT: sshll2 v0.4s, v0.8h, #0
|
|
; CHECK-NOFP16-GI-NEXT: scvtf v2.4s, v2.4s
|
|
; CHECK-NOFP16-GI-NEXT: scvtf v3.4s, v3.4s
|
|
; CHECK-NOFP16-GI-NEXT: scvtf v4.4s, v1.4s
|
|
; CHECK-NOFP16-GI-NEXT: scvtf v5.4s, v0.4s
|
|
; CHECK-NOFP16-GI-NEXT: fcvtn v0.4h, v2.4s
|
|
; CHECK-NOFP16-GI-NEXT: fcvtn v1.4h, v3.4s
|
|
; CHECK-NOFP16-GI-NEXT: fcvtn2 v0.8h, v4.4s
|
|
; CHECK-NOFP16-GI-NEXT: fcvtn2 v1.8h, v5.4s
|
|
; CHECK-NOFP16-GI-NEXT: ret
|
|
;
|
|
; CHECK-FP16-GI-LABEL: stofp_v16i8_v16f16:
|
|
; CHECK-FP16-GI: // %bb.0: // %entry
|
|
; CHECK-FP16-GI-NEXT: sshll v1.8h, v0.8b, #0
|
|
; CHECK-FP16-GI-NEXT: sshll2 v2.8h, v0.16b, #0
|
|
; CHECK-FP16-GI-NEXT: scvtf v0.8h, v1.8h
|
|
; CHECK-FP16-GI-NEXT: scvtf v1.8h, v2.8h
|
|
; CHECK-FP16-GI-NEXT: ret
|
|
entry:
|
|
%c = sitofp <16 x i8> %a to <16 x half>
|
|
ret <16 x half> %c
|
|
}
|
|
|
|
define <16 x half> @utofp_v16i8_v16f16(<16 x i8> %a) {
|
|
; CHECK-NOFP16-SD-LABEL: utofp_v16i8_v16f16:
|
|
; CHECK-NOFP16-SD: // %bb.0: // %entry
|
|
; CHECK-NOFP16-SD-NEXT: ushll2 v1.8h, v0.16b, #0
|
|
; CHECK-NOFP16-SD-NEXT: ushll v0.8h, v0.8b, #0
|
|
; CHECK-NOFP16-SD-NEXT: ushll v2.4s, v1.4h, #0
|
|
; CHECK-NOFP16-SD-NEXT: ushll v3.4s, v0.4h, #0
|
|
; CHECK-NOFP16-SD-NEXT: ushll2 v4.4s, v1.8h, #0
|
|
; CHECK-NOFP16-SD-NEXT: ushll2 v5.4s, v0.8h, #0
|
|
; CHECK-NOFP16-SD-NEXT: ucvtf v2.4s, v2.4s
|
|
; CHECK-NOFP16-SD-NEXT: ucvtf v3.4s, v3.4s
|
|
; CHECK-NOFP16-SD-NEXT: fcvtn v1.4h, v2.4s
|
|
; CHECK-NOFP16-SD-NEXT: ucvtf v2.4s, v4.4s
|
|
; CHECK-NOFP16-SD-NEXT: fcvtn v0.4h, v3.4s
|
|
; CHECK-NOFP16-SD-NEXT: ucvtf v3.4s, v5.4s
|
|
; CHECK-NOFP16-SD-NEXT: fcvtn2 v1.8h, v2.4s
|
|
; CHECK-NOFP16-SD-NEXT: fcvtn2 v0.8h, v3.4s
|
|
; CHECK-NOFP16-SD-NEXT: ret
|
|
;
|
|
; CHECK-FP16-SD-LABEL: utofp_v16i8_v16f16:
|
|
; CHECK-FP16-SD: // %bb.0: // %entry
|
|
; CHECK-FP16-SD-NEXT: ushll2 v1.8h, v0.16b, #0
|
|
; CHECK-FP16-SD-NEXT: ushll v0.8h, v0.8b, #0
|
|
; CHECK-FP16-SD-NEXT: ucvtf v1.8h, v1.8h
|
|
; CHECK-FP16-SD-NEXT: ucvtf v0.8h, v0.8h
|
|
; CHECK-FP16-SD-NEXT: ret
|
|
;
|
|
; CHECK-NOFP16-GI-LABEL: utofp_v16i8_v16f16:
|
|
; CHECK-NOFP16-GI: // %bb.0: // %entry
|
|
; CHECK-NOFP16-GI-NEXT: ushll v1.8h, v0.8b, #0
|
|
; CHECK-NOFP16-GI-NEXT: ushll2 v0.8h, v0.16b, #0
|
|
; CHECK-NOFP16-GI-NEXT: ushll v2.4s, v1.4h, #0
|
|
; CHECK-NOFP16-GI-NEXT: ushll v3.4s, v0.4h, #0
|
|
; CHECK-NOFP16-GI-NEXT: ushll2 v1.4s, v1.8h, #0
|
|
; CHECK-NOFP16-GI-NEXT: ushll2 v0.4s, v0.8h, #0
|
|
; CHECK-NOFP16-GI-NEXT: ucvtf v2.4s, v2.4s
|
|
; CHECK-NOFP16-GI-NEXT: ucvtf v3.4s, v3.4s
|
|
; CHECK-NOFP16-GI-NEXT: ucvtf v4.4s, v1.4s
|
|
; CHECK-NOFP16-GI-NEXT: ucvtf v5.4s, v0.4s
|
|
; CHECK-NOFP16-GI-NEXT: fcvtn v0.4h, v2.4s
|
|
; CHECK-NOFP16-GI-NEXT: fcvtn v1.4h, v3.4s
|
|
; CHECK-NOFP16-GI-NEXT: fcvtn2 v0.8h, v4.4s
|
|
; CHECK-NOFP16-GI-NEXT: fcvtn2 v1.8h, v5.4s
|
|
; CHECK-NOFP16-GI-NEXT: ret
|
|
;
|
|
; CHECK-FP16-GI-LABEL: utofp_v16i8_v16f16:
|
|
; CHECK-FP16-GI: // %bb.0: // %entry
|
|
; CHECK-FP16-GI-NEXT: ushll v1.8h, v0.8b, #0
|
|
; CHECK-FP16-GI-NEXT: ushll2 v2.8h, v0.16b, #0
|
|
; CHECK-FP16-GI-NEXT: ucvtf v0.8h, v1.8h
|
|
; CHECK-FP16-GI-NEXT: ucvtf v1.8h, v2.8h
|
|
; CHECK-FP16-GI-NEXT: ret
|
|
entry:
|
|
%c = uitofp <16 x i8> %a to <16 x half>
|
|
ret <16 x half> %c
|
|
}
|
|
|
|
define <32 x half> @stofp_v32i8_v32f16(<32 x i8> %a) {
|
|
; CHECK-NOFP16-SD-LABEL: stofp_v32i8_v32f16:
|
|
; CHECK-NOFP16-SD: // %bb.0: // %entry
|
|
; CHECK-NOFP16-SD-NEXT: sshll v2.8h, v0.8b, #0
|
|
; CHECK-NOFP16-SD-NEXT: sshll2 v0.8h, v0.16b, #0
|
|
; CHECK-NOFP16-SD-NEXT: sshll2 v3.8h, v1.16b, #0
|
|
; CHECK-NOFP16-SD-NEXT: sshll v1.8h, v1.8b, #0
|
|
; CHECK-NOFP16-SD-NEXT: sshll v4.4s, v2.4h, #0
|
|
; CHECK-NOFP16-SD-NEXT: sshll v5.4s, v0.4h, #0
|
|
; CHECK-NOFP16-SD-NEXT: sshll v6.4s, v3.4h, #0
|
|
; CHECK-NOFP16-SD-NEXT: sshll v7.4s, v1.4h, #0
|
|
; CHECK-NOFP16-SD-NEXT: sshll2 v0.4s, v0.8h, #0
|
|
; CHECK-NOFP16-SD-NEXT: sshll2 v3.4s, v3.8h, #0
|
|
; CHECK-NOFP16-SD-NEXT: sshll2 v2.4s, v2.8h, #0
|
|
; CHECK-NOFP16-SD-NEXT: sshll2 v1.4s, v1.8h, #0
|
|
; CHECK-NOFP16-SD-NEXT: scvtf v4.4s, v4.4s
|
|
; CHECK-NOFP16-SD-NEXT: scvtf v5.4s, v5.4s
|
|
; CHECK-NOFP16-SD-NEXT: scvtf v6.4s, v6.4s
|
|
; CHECK-NOFP16-SD-NEXT: scvtf v7.4s, v7.4s
|
|
; CHECK-NOFP16-SD-NEXT: scvtf v16.4s, v0.4s
|
|
; CHECK-NOFP16-SD-NEXT: scvtf v17.4s, v3.4s
|
|
; CHECK-NOFP16-SD-NEXT: scvtf v18.4s, v2.4s
|
|
; CHECK-NOFP16-SD-NEXT: scvtf v19.4s, v1.4s
|
|
; CHECK-NOFP16-SD-NEXT: fcvtn v0.4h, v4.4s
|
|
; CHECK-NOFP16-SD-NEXT: fcvtn v1.4h, v5.4s
|
|
; CHECK-NOFP16-SD-NEXT: fcvtn v3.4h, v6.4s
|
|
; CHECK-NOFP16-SD-NEXT: fcvtn v2.4h, v7.4s
|
|
; CHECK-NOFP16-SD-NEXT: fcvtn2 v0.8h, v18.4s
|
|
; CHECK-NOFP16-SD-NEXT: fcvtn2 v1.8h, v16.4s
|
|
; CHECK-NOFP16-SD-NEXT: fcvtn2 v3.8h, v17.4s
|
|
; CHECK-NOFP16-SD-NEXT: fcvtn2 v2.8h, v19.4s
|
|
; CHECK-NOFP16-SD-NEXT: ret
|
|
;
|
|
; CHECK-FP16-SD-LABEL: stofp_v32i8_v32f16:
|
|
; CHECK-FP16-SD: // %bb.0: // %entry
|
|
; CHECK-FP16-SD-NEXT: sshll v2.8h, v0.8b, #0
|
|
; CHECK-FP16-SD-NEXT: sshll2 v3.8h, v0.16b, #0
|
|
; CHECK-FP16-SD-NEXT: sshll2 v4.8h, v1.16b, #0
|
|
; CHECK-FP16-SD-NEXT: sshll v5.8h, v1.8b, #0
|
|
; CHECK-FP16-SD-NEXT: scvtf v0.8h, v2.8h
|
|
; CHECK-FP16-SD-NEXT: scvtf v1.8h, v3.8h
|
|
; CHECK-FP16-SD-NEXT: scvtf v3.8h, v4.8h
|
|
; CHECK-FP16-SD-NEXT: scvtf v2.8h, v5.8h
|
|
; CHECK-FP16-SD-NEXT: ret
|
|
;
|
|
; CHECK-NOFP16-GI-LABEL: stofp_v32i8_v32f16:
|
|
; CHECK-NOFP16-GI: // %bb.0: // %entry
|
|
; CHECK-NOFP16-GI-NEXT: sshll v2.8h, v0.8b, #0
|
|
; CHECK-NOFP16-GI-NEXT: sshll2 v0.8h, v0.16b, #0
|
|
; CHECK-NOFP16-GI-NEXT: sshll v3.8h, v1.8b, #0
|
|
; CHECK-NOFP16-GI-NEXT: sshll2 v1.8h, v1.16b, #0
|
|
; CHECK-NOFP16-GI-NEXT: sshll v4.4s, v2.4h, #0
|
|
; CHECK-NOFP16-GI-NEXT: sshll v5.4s, v0.4h, #0
|
|
; CHECK-NOFP16-GI-NEXT: sshll v6.4s, v3.4h, #0
|
|
; CHECK-NOFP16-GI-NEXT: sshll v7.4s, v1.4h, #0
|
|
; CHECK-NOFP16-GI-NEXT: sshll2 v2.4s, v2.8h, #0
|
|
; CHECK-NOFP16-GI-NEXT: sshll2 v0.4s, v0.8h, #0
|
|
; CHECK-NOFP16-GI-NEXT: sshll2 v3.4s, v3.8h, #0
|
|
; CHECK-NOFP16-GI-NEXT: sshll2 v1.4s, v1.8h, #0
|
|
; CHECK-NOFP16-GI-NEXT: scvtf v4.4s, v4.4s
|
|
; CHECK-NOFP16-GI-NEXT: scvtf v5.4s, v5.4s
|
|
; CHECK-NOFP16-GI-NEXT: scvtf v6.4s, v6.4s
|
|
; CHECK-NOFP16-GI-NEXT: scvtf v7.4s, v7.4s
|
|
; CHECK-NOFP16-GI-NEXT: scvtf v16.4s, v2.4s
|
|
; CHECK-NOFP16-GI-NEXT: scvtf v17.4s, v0.4s
|
|
; CHECK-NOFP16-GI-NEXT: scvtf v18.4s, v3.4s
|
|
; CHECK-NOFP16-GI-NEXT: scvtf v19.4s, v1.4s
|
|
; CHECK-NOFP16-GI-NEXT: fcvtn v0.4h, v4.4s
|
|
; CHECK-NOFP16-GI-NEXT: fcvtn v1.4h, v5.4s
|
|
; CHECK-NOFP16-GI-NEXT: fcvtn v2.4h, v6.4s
|
|
; CHECK-NOFP16-GI-NEXT: fcvtn v3.4h, v7.4s
|
|
; CHECK-NOFP16-GI-NEXT: fcvtn2 v0.8h, v16.4s
|
|
; CHECK-NOFP16-GI-NEXT: fcvtn2 v1.8h, v17.4s
|
|
; CHECK-NOFP16-GI-NEXT: fcvtn2 v2.8h, v18.4s
|
|
; CHECK-NOFP16-GI-NEXT: fcvtn2 v3.8h, v19.4s
|
|
; CHECK-NOFP16-GI-NEXT: ret
|
|
;
|
|
; CHECK-FP16-GI-LABEL: stofp_v32i8_v32f16:
|
|
; CHECK-FP16-GI: // %bb.0: // %entry
|
|
; CHECK-FP16-GI-NEXT: sshll v2.8h, v0.8b, #0
|
|
; CHECK-FP16-GI-NEXT: sshll2 v3.8h, v0.16b, #0
|
|
; CHECK-FP16-GI-NEXT: sshll v4.8h, v1.8b, #0
|
|
; CHECK-FP16-GI-NEXT: sshll2 v5.8h, v1.16b, #0
|
|
; CHECK-FP16-GI-NEXT: scvtf v0.8h, v2.8h
|
|
; CHECK-FP16-GI-NEXT: scvtf v1.8h, v3.8h
|
|
; CHECK-FP16-GI-NEXT: scvtf v2.8h, v4.8h
|
|
; CHECK-FP16-GI-NEXT: scvtf v3.8h, v5.8h
|
|
; CHECK-FP16-GI-NEXT: ret
|
|
entry:
|
|
%c = sitofp <32 x i8> %a to <32 x half>
|
|
ret <32 x half> %c
|
|
}
|
|
|
|
define <32 x half> @utofp_v32i8_v32f16(<32 x i8> %a) {
|
|
; CHECK-NOFP16-SD-LABEL: utofp_v32i8_v32f16:
|
|
; CHECK-NOFP16-SD: // %bb.0: // %entry
|
|
; CHECK-NOFP16-SD-NEXT: ushll v2.8h, v0.8b, #0
|
|
; CHECK-NOFP16-SD-NEXT: ushll2 v0.8h, v0.16b, #0
|
|
; CHECK-NOFP16-SD-NEXT: ushll2 v3.8h, v1.16b, #0
|
|
; CHECK-NOFP16-SD-NEXT: ushll v1.8h, v1.8b, #0
|
|
; CHECK-NOFP16-SD-NEXT: ushll v4.4s, v2.4h, #0
|
|
; CHECK-NOFP16-SD-NEXT: ushll v5.4s, v0.4h, #0
|
|
; CHECK-NOFP16-SD-NEXT: ushll v6.4s, v3.4h, #0
|
|
; CHECK-NOFP16-SD-NEXT: ushll v7.4s, v1.4h, #0
|
|
; CHECK-NOFP16-SD-NEXT: ushll2 v0.4s, v0.8h, #0
|
|
; CHECK-NOFP16-SD-NEXT: ushll2 v3.4s, v3.8h, #0
|
|
; CHECK-NOFP16-SD-NEXT: ushll2 v2.4s, v2.8h, #0
|
|
; CHECK-NOFP16-SD-NEXT: ushll2 v1.4s, v1.8h, #0
|
|
; CHECK-NOFP16-SD-NEXT: ucvtf v4.4s, v4.4s
|
|
; CHECK-NOFP16-SD-NEXT: ucvtf v5.4s, v5.4s
|
|
; CHECK-NOFP16-SD-NEXT: ucvtf v6.4s, v6.4s
|
|
; CHECK-NOFP16-SD-NEXT: ucvtf v7.4s, v7.4s
|
|
; CHECK-NOFP16-SD-NEXT: ucvtf v16.4s, v0.4s
|
|
; CHECK-NOFP16-SD-NEXT: ucvtf v17.4s, v3.4s
|
|
; CHECK-NOFP16-SD-NEXT: ucvtf v18.4s, v2.4s
|
|
; CHECK-NOFP16-SD-NEXT: ucvtf v19.4s, v1.4s
|
|
; CHECK-NOFP16-SD-NEXT: fcvtn v0.4h, v4.4s
|
|
; CHECK-NOFP16-SD-NEXT: fcvtn v1.4h, v5.4s
|
|
; CHECK-NOFP16-SD-NEXT: fcvtn v3.4h, v6.4s
|
|
; CHECK-NOFP16-SD-NEXT: fcvtn v2.4h, v7.4s
|
|
; CHECK-NOFP16-SD-NEXT: fcvtn2 v0.8h, v18.4s
|
|
; CHECK-NOFP16-SD-NEXT: fcvtn2 v1.8h, v16.4s
|
|
; CHECK-NOFP16-SD-NEXT: fcvtn2 v3.8h, v17.4s
|
|
; CHECK-NOFP16-SD-NEXT: fcvtn2 v2.8h, v19.4s
|
|
; CHECK-NOFP16-SD-NEXT: ret
|
|
;
|
|
; CHECK-FP16-SD-LABEL: utofp_v32i8_v32f16:
|
|
; CHECK-FP16-SD: // %bb.0: // %entry
|
|
; CHECK-FP16-SD-NEXT: ushll v2.8h, v0.8b, #0
|
|
; CHECK-FP16-SD-NEXT: ushll2 v3.8h, v0.16b, #0
|
|
; CHECK-FP16-SD-NEXT: ushll2 v4.8h, v1.16b, #0
|
|
; CHECK-FP16-SD-NEXT: ushll v5.8h, v1.8b, #0
|
|
; CHECK-FP16-SD-NEXT: ucvtf v0.8h, v2.8h
|
|
; CHECK-FP16-SD-NEXT: ucvtf v1.8h, v3.8h
|
|
; CHECK-FP16-SD-NEXT: ucvtf v3.8h, v4.8h
|
|
; CHECK-FP16-SD-NEXT: ucvtf v2.8h, v5.8h
|
|
; CHECK-FP16-SD-NEXT: ret
|
|
;
|
|
; CHECK-NOFP16-GI-LABEL: utofp_v32i8_v32f16:
|
|
; CHECK-NOFP16-GI: // %bb.0: // %entry
|
|
; CHECK-NOFP16-GI-NEXT: ushll v2.8h, v0.8b, #0
|
|
; CHECK-NOFP16-GI-NEXT: ushll2 v0.8h, v0.16b, #0
|
|
; CHECK-NOFP16-GI-NEXT: ushll v3.8h, v1.8b, #0
|
|
; CHECK-NOFP16-GI-NEXT: ushll2 v1.8h, v1.16b, #0
|
|
; CHECK-NOFP16-GI-NEXT: ushll v4.4s, v2.4h, #0
|
|
; CHECK-NOFP16-GI-NEXT: ushll v5.4s, v0.4h, #0
|
|
; CHECK-NOFP16-GI-NEXT: ushll v6.4s, v3.4h, #0
|
|
; CHECK-NOFP16-GI-NEXT: ushll v7.4s, v1.4h, #0
|
|
; CHECK-NOFP16-GI-NEXT: ushll2 v2.4s, v2.8h, #0
|
|
; CHECK-NOFP16-GI-NEXT: ushll2 v0.4s, v0.8h, #0
|
|
; CHECK-NOFP16-GI-NEXT: ushll2 v3.4s, v3.8h, #0
|
|
; CHECK-NOFP16-GI-NEXT: ushll2 v1.4s, v1.8h, #0
|
|
; CHECK-NOFP16-GI-NEXT: ucvtf v4.4s, v4.4s
|
|
; CHECK-NOFP16-GI-NEXT: ucvtf v5.4s, v5.4s
|
|
; CHECK-NOFP16-GI-NEXT: ucvtf v6.4s, v6.4s
|
|
; CHECK-NOFP16-GI-NEXT: ucvtf v7.4s, v7.4s
|
|
; CHECK-NOFP16-GI-NEXT: ucvtf v16.4s, v2.4s
|
|
; CHECK-NOFP16-GI-NEXT: ucvtf v17.4s, v0.4s
|
|
; CHECK-NOFP16-GI-NEXT: ucvtf v18.4s, v3.4s
|
|
; CHECK-NOFP16-GI-NEXT: ucvtf v19.4s, v1.4s
|
|
; CHECK-NOFP16-GI-NEXT: fcvtn v0.4h, v4.4s
|
|
; CHECK-NOFP16-GI-NEXT: fcvtn v1.4h, v5.4s
|
|
; CHECK-NOFP16-GI-NEXT: fcvtn v2.4h, v6.4s
|
|
; CHECK-NOFP16-GI-NEXT: fcvtn v3.4h, v7.4s
|
|
; CHECK-NOFP16-GI-NEXT: fcvtn2 v0.8h, v16.4s
|
|
; CHECK-NOFP16-GI-NEXT: fcvtn2 v1.8h, v17.4s
|
|
; CHECK-NOFP16-GI-NEXT: fcvtn2 v2.8h, v18.4s
|
|
; CHECK-NOFP16-GI-NEXT: fcvtn2 v3.8h, v19.4s
|
|
; CHECK-NOFP16-GI-NEXT: ret
|
|
;
|
|
; CHECK-FP16-GI-LABEL: utofp_v32i8_v32f16:
|
|
; CHECK-FP16-GI: // %bb.0: // %entry
|
|
; CHECK-FP16-GI-NEXT: ushll v2.8h, v0.8b, #0
|
|
; CHECK-FP16-GI-NEXT: ushll2 v3.8h, v0.16b, #0
|
|
; CHECK-FP16-GI-NEXT: ushll v4.8h, v1.8b, #0
|
|
; CHECK-FP16-GI-NEXT: ushll2 v5.8h, v1.16b, #0
|
|
; CHECK-FP16-GI-NEXT: ucvtf v0.8h, v2.8h
|
|
; CHECK-FP16-GI-NEXT: ucvtf v1.8h, v3.8h
|
|
; CHECK-FP16-GI-NEXT: ucvtf v2.8h, v4.8h
|
|
; CHECK-FP16-GI-NEXT: ucvtf v3.8h, v5.8h
|
|
; CHECK-FP16-GI-NEXT: ret
|
|
entry:
|
|
%c = uitofp <32 x i8> %a to <32 x half>
|
|
ret <32 x half> %c
|
|
}
|
|
|
|
define <2 x half> @stofp_v2i128_v2f16(<2 x i128> %a) {
|
|
; CHECK-NOFP16-SD-LABEL: stofp_v2i128_v2f16:
|
|
; CHECK-NOFP16-SD: // %bb.0: // %entry
|
|
; CHECK-NOFP16-SD-NEXT: sub sp, sp, #48
|
|
; CHECK-NOFP16-SD-NEXT: str x30, [sp, #16] // 8-byte Folded Spill
|
|
; CHECK-NOFP16-SD-NEXT: stp x20, x19, [sp, #32] // 16-byte Folded Spill
|
|
; CHECK-NOFP16-SD-NEXT: .cfi_def_cfa_offset 48
|
|
; CHECK-NOFP16-SD-NEXT: .cfi_offset w19, -8
|
|
; CHECK-NOFP16-SD-NEXT: .cfi_offset w20, -16
|
|
; CHECK-NOFP16-SD-NEXT: .cfi_offset w30, -32
|
|
; CHECK-NOFP16-SD-NEXT: mov x19, x1
|
|
; CHECK-NOFP16-SD-NEXT: mov x20, x0
|
|
; CHECK-NOFP16-SD-NEXT: mov x0, x2
|
|
; CHECK-NOFP16-SD-NEXT: mov x1, x3
|
|
; CHECK-NOFP16-SD-NEXT: bl __floattisf
|
|
; CHECK-NOFP16-SD-NEXT: fcvt h0, s0
|
|
; CHECK-NOFP16-SD-NEXT: mov x0, x20
|
|
; CHECK-NOFP16-SD-NEXT: mov x1, x19
|
|
; CHECK-NOFP16-SD-NEXT: str q0, [sp] // 16-byte Folded Spill
|
|
; CHECK-NOFP16-SD-NEXT: bl __floattisf
|
|
; CHECK-NOFP16-SD-NEXT: fcvt h0, s0
|
|
; CHECK-NOFP16-SD-NEXT: ldr q1, [sp] // 16-byte Folded Reload
|
|
; CHECK-NOFP16-SD-NEXT: ldr x30, [sp, #16] // 8-byte Folded Reload
|
|
; CHECK-NOFP16-SD-NEXT: ldp x20, x19, [sp, #32] // 16-byte Folded Reload
|
|
; CHECK-NOFP16-SD-NEXT: mov v0.h[1], v1.h[0]
|
|
; CHECK-NOFP16-SD-NEXT: // kill: def $d0 killed $d0 killed $q0
|
|
; CHECK-NOFP16-SD-NEXT: add sp, sp, #48
|
|
; CHECK-NOFP16-SD-NEXT: ret
|
|
;
|
|
; CHECK-FP16-SD-LABEL: stofp_v2i128_v2f16:
|
|
; CHECK-FP16-SD: // %bb.0: // %entry
|
|
; CHECK-FP16-SD-NEXT: sub sp, sp, #48
|
|
; CHECK-FP16-SD-NEXT: str x30, [sp, #16] // 8-byte Folded Spill
|
|
; CHECK-FP16-SD-NEXT: stp x20, x19, [sp, #32] // 16-byte Folded Spill
|
|
; CHECK-FP16-SD-NEXT: .cfi_def_cfa_offset 48
|
|
; CHECK-FP16-SD-NEXT: .cfi_offset w19, -8
|
|
; CHECK-FP16-SD-NEXT: .cfi_offset w20, -16
|
|
; CHECK-FP16-SD-NEXT: .cfi_offset w30, -32
|
|
; CHECK-FP16-SD-NEXT: mov x19, x1
|
|
; CHECK-FP16-SD-NEXT: mov x20, x0
|
|
; CHECK-FP16-SD-NEXT: mov x0, x2
|
|
; CHECK-FP16-SD-NEXT: mov x1, x3
|
|
; CHECK-FP16-SD-NEXT: bl __floattihf
|
|
; CHECK-FP16-SD-NEXT: mov x0, x20
|
|
; CHECK-FP16-SD-NEXT: mov x1, x19
|
|
; CHECK-FP16-SD-NEXT: // kill: def $h0 killed $h0 def $q0
|
|
; CHECK-FP16-SD-NEXT: str q0, [sp] // 16-byte Folded Spill
|
|
; CHECK-FP16-SD-NEXT: bl __floattihf
|
|
; CHECK-FP16-SD-NEXT: ldr q1, [sp] // 16-byte Folded Reload
|
|
; CHECK-FP16-SD-NEXT: // kill: def $h0 killed $h0 def $q0
|
|
; CHECK-FP16-SD-NEXT: ldp x20, x19, [sp, #32] // 16-byte Folded Reload
|
|
; CHECK-FP16-SD-NEXT: ldr x30, [sp, #16] // 8-byte Folded Reload
|
|
; CHECK-FP16-SD-NEXT: mov v0.h[1], v1.h[0]
|
|
; CHECK-FP16-SD-NEXT: // kill: def $d0 killed $d0 killed $q0
|
|
; CHECK-FP16-SD-NEXT: add sp, sp, #48
|
|
; CHECK-FP16-SD-NEXT: ret
|
|
;
|
|
; CHECK-NOFP16-GI-LABEL: stofp_v2i128_v2f16:
|
|
; CHECK-NOFP16-GI: // %bb.0: // %entry
|
|
; CHECK-NOFP16-GI-NEXT: sub sp, sp, #48
|
|
; CHECK-NOFP16-GI-NEXT: str x30, [sp, #16] // 8-byte Folded Spill
|
|
; CHECK-NOFP16-GI-NEXT: stp x20, x19, [sp, #32] // 16-byte Folded Spill
|
|
; CHECK-NOFP16-GI-NEXT: .cfi_def_cfa_offset 48
|
|
; CHECK-NOFP16-GI-NEXT: .cfi_offset w19, -8
|
|
; CHECK-NOFP16-GI-NEXT: .cfi_offset w20, -16
|
|
; CHECK-NOFP16-GI-NEXT: .cfi_offset w30, -32
|
|
; CHECK-NOFP16-GI-NEXT: mov x19, x2
|
|
; CHECK-NOFP16-GI-NEXT: mov x20, x3
|
|
; CHECK-NOFP16-GI-NEXT: bl __floattisf
|
|
; CHECK-NOFP16-GI-NEXT: fcvt h0, s0
|
|
; CHECK-NOFP16-GI-NEXT: mov x0, x19
|
|
; CHECK-NOFP16-GI-NEXT: mov x1, x20
|
|
; CHECK-NOFP16-GI-NEXT: str q0, [sp] // 16-byte Folded Spill
|
|
; CHECK-NOFP16-GI-NEXT: bl __floattisf
|
|
; CHECK-NOFP16-GI-NEXT: fcvt h1, s0
|
|
; CHECK-NOFP16-GI-NEXT: ldr q0, [sp] // 16-byte Folded Reload
|
|
; CHECK-NOFP16-GI-NEXT: ldr x30, [sp, #16] // 8-byte Folded Reload
|
|
; CHECK-NOFP16-GI-NEXT: ldp x20, x19, [sp, #32] // 16-byte Folded Reload
|
|
; CHECK-NOFP16-GI-NEXT: mov v0.h[1], v1.h[0]
|
|
; CHECK-NOFP16-GI-NEXT: // kill: def $d0 killed $d0 killed $q0
|
|
; CHECK-NOFP16-GI-NEXT: add sp, sp, #48
|
|
; CHECK-NOFP16-GI-NEXT: ret
|
|
;
|
|
; CHECK-FP16-GI-LABEL: stofp_v2i128_v2f16:
|
|
; CHECK-FP16-GI: // %bb.0: // %entry
|
|
; CHECK-FP16-GI-NEXT: sub sp, sp, #48
|
|
; CHECK-FP16-GI-NEXT: str x30, [sp, #16] // 8-byte Folded Spill
|
|
; CHECK-FP16-GI-NEXT: stp x20, x19, [sp, #32] // 16-byte Folded Spill
|
|
; CHECK-FP16-GI-NEXT: .cfi_def_cfa_offset 48
|
|
; CHECK-FP16-GI-NEXT: .cfi_offset w19, -8
|
|
; CHECK-FP16-GI-NEXT: .cfi_offset w20, -16
|
|
; CHECK-FP16-GI-NEXT: .cfi_offset w30, -32
|
|
; CHECK-FP16-GI-NEXT: mov x19, x2
|
|
; CHECK-FP16-GI-NEXT: mov x20, x3
|
|
; CHECK-FP16-GI-NEXT: bl __floattihf
|
|
; CHECK-FP16-GI-NEXT: mov x0, x19
|
|
; CHECK-FP16-GI-NEXT: mov x1, x20
|
|
; CHECK-FP16-GI-NEXT: // kill: def $h0 killed $h0 def $q0
|
|
; CHECK-FP16-GI-NEXT: str q0, [sp] // 16-byte Folded Spill
|
|
; CHECK-FP16-GI-NEXT: bl __floattihf
|
|
; CHECK-FP16-GI-NEXT: ldr q1, [sp] // 16-byte Folded Reload
|
|
; CHECK-FP16-GI-NEXT: // kill: def $h0 killed $h0 def $q0
|
|
; CHECK-FP16-GI-NEXT: ldp x20, x19, [sp, #32] // 16-byte Folded Reload
|
|
; CHECK-FP16-GI-NEXT: ldr x30, [sp, #16] // 8-byte Folded Reload
|
|
; CHECK-FP16-GI-NEXT: mov v1.h[1], v0.h[0]
|
|
; CHECK-FP16-GI-NEXT: fmov d0, d1
|
|
; CHECK-FP16-GI-NEXT: add sp, sp, #48
|
|
; CHECK-FP16-GI-NEXT: ret
|
|
entry:
|
|
%c = sitofp <2 x i128> %a to <2 x half>
|
|
ret <2 x half> %c
|
|
}
|
|
|
|
define <2 x half> @utofp_v2i128_v2f16(<2 x i128> %a) {
|
|
; CHECK-NOFP16-SD-LABEL: utofp_v2i128_v2f16:
|
|
; CHECK-NOFP16-SD: // %bb.0: // %entry
|
|
; CHECK-NOFP16-SD-NEXT: sub sp, sp, #48
|
|
; CHECK-NOFP16-SD-NEXT: str x30, [sp, #16] // 8-byte Folded Spill
|
|
; CHECK-NOFP16-SD-NEXT: stp x20, x19, [sp, #32] // 16-byte Folded Spill
|
|
; CHECK-NOFP16-SD-NEXT: .cfi_def_cfa_offset 48
|
|
; CHECK-NOFP16-SD-NEXT: .cfi_offset w19, -8
|
|
; CHECK-NOFP16-SD-NEXT: .cfi_offset w20, -16
|
|
; CHECK-NOFP16-SD-NEXT: .cfi_offset w30, -32
|
|
; CHECK-NOFP16-SD-NEXT: mov x19, x1
|
|
; CHECK-NOFP16-SD-NEXT: mov x20, x0
|
|
; CHECK-NOFP16-SD-NEXT: mov x0, x2
|
|
; CHECK-NOFP16-SD-NEXT: mov x1, x3
|
|
; CHECK-NOFP16-SD-NEXT: bl __floatuntisf
|
|
; CHECK-NOFP16-SD-NEXT: fcvt h0, s0
|
|
; CHECK-NOFP16-SD-NEXT: mov x0, x20
|
|
; CHECK-NOFP16-SD-NEXT: mov x1, x19
|
|
; CHECK-NOFP16-SD-NEXT: str q0, [sp] // 16-byte Folded Spill
|
|
; CHECK-NOFP16-SD-NEXT: bl __floatuntisf
|
|
; CHECK-NOFP16-SD-NEXT: fcvt h0, s0
|
|
; CHECK-NOFP16-SD-NEXT: ldr q1, [sp] // 16-byte Folded Reload
|
|
; CHECK-NOFP16-SD-NEXT: ldr x30, [sp, #16] // 8-byte Folded Reload
|
|
; CHECK-NOFP16-SD-NEXT: ldp x20, x19, [sp, #32] // 16-byte Folded Reload
|
|
; CHECK-NOFP16-SD-NEXT: mov v0.h[1], v1.h[0]
|
|
; CHECK-NOFP16-SD-NEXT: // kill: def $d0 killed $d0 killed $q0
|
|
; CHECK-NOFP16-SD-NEXT: add sp, sp, #48
|
|
; CHECK-NOFP16-SD-NEXT: ret
|
|
;
|
|
; CHECK-FP16-SD-LABEL: utofp_v2i128_v2f16:
|
|
; CHECK-FP16-SD: // %bb.0: // %entry
|
|
; CHECK-FP16-SD-NEXT: sub sp, sp, #48
|
|
; CHECK-FP16-SD-NEXT: str x30, [sp, #16] // 8-byte Folded Spill
|
|
; CHECK-FP16-SD-NEXT: stp x20, x19, [sp, #32] // 16-byte Folded Spill
|
|
; CHECK-FP16-SD-NEXT: .cfi_def_cfa_offset 48
|
|
; CHECK-FP16-SD-NEXT: .cfi_offset w19, -8
|
|
; CHECK-FP16-SD-NEXT: .cfi_offset w20, -16
|
|
; CHECK-FP16-SD-NEXT: .cfi_offset w30, -32
|
|
; CHECK-FP16-SD-NEXT: mov x19, x1
|
|
; CHECK-FP16-SD-NEXT: mov x20, x0
|
|
; CHECK-FP16-SD-NEXT: mov x0, x2
|
|
; CHECK-FP16-SD-NEXT: mov x1, x3
|
|
; CHECK-FP16-SD-NEXT: bl __floatuntihf
|
|
; CHECK-FP16-SD-NEXT: mov x0, x20
|
|
; CHECK-FP16-SD-NEXT: mov x1, x19
|
|
; CHECK-FP16-SD-NEXT: // kill: def $h0 killed $h0 def $q0
|
|
; CHECK-FP16-SD-NEXT: str q0, [sp] // 16-byte Folded Spill
|
|
; CHECK-FP16-SD-NEXT: bl __floatuntihf
|
|
; CHECK-FP16-SD-NEXT: ldr q1, [sp] // 16-byte Folded Reload
|
|
; CHECK-FP16-SD-NEXT: // kill: def $h0 killed $h0 def $q0
|
|
; CHECK-FP16-SD-NEXT: ldp x20, x19, [sp, #32] // 16-byte Folded Reload
|
|
; CHECK-FP16-SD-NEXT: ldr x30, [sp, #16] // 8-byte Folded Reload
|
|
; CHECK-FP16-SD-NEXT: mov v0.h[1], v1.h[0]
|
|
; CHECK-FP16-SD-NEXT: // kill: def $d0 killed $d0 killed $q0
|
|
; CHECK-FP16-SD-NEXT: add sp, sp, #48
|
|
; CHECK-FP16-SD-NEXT: ret
|
|
;
|
|
; CHECK-NOFP16-GI-LABEL: utofp_v2i128_v2f16:
|
|
; CHECK-NOFP16-GI: // %bb.0: // %entry
|
|
; CHECK-NOFP16-GI-NEXT: sub sp, sp, #48
|
|
; CHECK-NOFP16-GI-NEXT: str x30, [sp, #16] // 8-byte Folded Spill
|
|
; CHECK-NOFP16-GI-NEXT: stp x20, x19, [sp, #32] // 16-byte Folded Spill
|
|
; CHECK-NOFP16-GI-NEXT: .cfi_def_cfa_offset 48
|
|
; CHECK-NOFP16-GI-NEXT: .cfi_offset w19, -8
|
|
; CHECK-NOFP16-GI-NEXT: .cfi_offset w20, -16
|
|
; CHECK-NOFP16-GI-NEXT: .cfi_offset w30, -32
|
|
; CHECK-NOFP16-GI-NEXT: mov x19, x2
|
|
; CHECK-NOFP16-GI-NEXT: mov x20, x3
|
|
; CHECK-NOFP16-GI-NEXT: bl __floatuntisf
|
|
; CHECK-NOFP16-GI-NEXT: fcvt h0, s0
|
|
; CHECK-NOFP16-GI-NEXT: mov x0, x19
|
|
; CHECK-NOFP16-GI-NEXT: mov x1, x20
|
|
; CHECK-NOFP16-GI-NEXT: str q0, [sp] // 16-byte Folded Spill
|
|
; CHECK-NOFP16-GI-NEXT: bl __floatuntisf
|
|
; CHECK-NOFP16-GI-NEXT: fcvt h1, s0
|
|
; CHECK-NOFP16-GI-NEXT: ldr q0, [sp] // 16-byte Folded Reload
|
|
; CHECK-NOFP16-GI-NEXT: ldr x30, [sp, #16] // 8-byte Folded Reload
|
|
; CHECK-NOFP16-GI-NEXT: ldp x20, x19, [sp, #32] // 16-byte Folded Reload
|
|
; CHECK-NOFP16-GI-NEXT: mov v0.h[1], v1.h[0]
|
|
; CHECK-NOFP16-GI-NEXT: // kill: def $d0 killed $d0 killed $q0
|
|
; CHECK-NOFP16-GI-NEXT: add sp, sp, #48
|
|
; CHECK-NOFP16-GI-NEXT: ret
|
|
;
|
|
; CHECK-FP16-GI-LABEL: utofp_v2i128_v2f16:
|
|
; CHECK-FP16-GI: // %bb.0: // %entry
|
|
; CHECK-FP16-GI-NEXT: sub sp, sp, #48
|
|
; CHECK-FP16-GI-NEXT: str x30, [sp, #16] // 8-byte Folded Spill
|
|
; CHECK-FP16-GI-NEXT: stp x20, x19, [sp, #32] // 16-byte Folded Spill
|
|
; CHECK-FP16-GI-NEXT: .cfi_def_cfa_offset 48
|
|
; CHECK-FP16-GI-NEXT: .cfi_offset w19, -8
|
|
; CHECK-FP16-GI-NEXT: .cfi_offset w20, -16
|
|
; CHECK-FP16-GI-NEXT: .cfi_offset w30, -32
|
|
; CHECK-FP16-GI-NEXT: mov x19, x2
|
|
; CHECK-FP16-GI-NEXT: mov x20, x3
|
|
; CHECK-FP16-GI-NEXT: bl __floatuntihf
|
|
; CHECK-FP16-GI-NEXT: mov x0, x19
|
|
; CHECK-FP16-GI-NEXT: mov x1, x20
|
|
; CHECK-FP16-GI-NEXT: // kill: def $h0 killed $h0 def $q0
|
|
; CHECK-FP16-GI-NEXT: str q0, [sp] // 16-byte Folded Spill
|
|
; CHECK-FP16-GI-NEXT: bl __floatuntihf
|
|
; CHECK-FP16-GI-NEXT: ldr q1, [sp] // 16-byte Folded Reload
|
|
; CHECK-FP16-GI-NEXT: // kill: def $h0 killed $h0 def $q0
|
|
; CHECK-FP16-GI-NEXT: ldp x20, x19, [sp, #32] // 16-byte Folded Reload
|
|
; CHECK-FP16-GI-NEXT: ldr x30, [sp, #16] // 8-byte Folded Reload
|
|
; CHECK-FP16-GI-NEXT: mov v1.h[1], v0.h[0]
|
|
; CHECK-FP16-GI-NEXT: fmov d0, d1
|
|
; CHECK-FP16-GI-NEXT: add sp, sp, #48
|
|
; CHECK-FP16-GI-NEXT: ret
|
|
entry:
|
|
%c = uitofp <2 x i128> %a to <2 x half>
|
|
ret <2 x half> %c
|
|
}
|
|
|
|
define <2 x fp128> @stofp_v2i64_v2f128(<2 x i64> %a) {
|
|
; CHECK-NOFP16-SD-LABEL: stofp_v2i64_v2f128:
|
|
; CHECK-NOFP16-SD: // %bb.0: // %entry
|
|
; CHECK-NOFP16-SD-NEXT: sub sp, sp, #48
|
|
; CHECK-NOFP16-SD-NEXT: str x30, [sp, #32] // 8-byte Folded Spill
|
|
; CHECK-NOFP16-SD-NEXT: .cfi_def_cfa_offset 48
|
|
; CHECK-NOFP16-SD-NEXT: .cfi_offset w30, -16
|
|
; CHECK-NOFP16-SD-NEXT: fmov x0, d0
|
|
; CHECK-NOFP16-SD-NEXT: str q0, [sp] // 16-byte Folded Spill
|
|
; CHECK-NOFP16-SD-NEXT: bl __floatditf
|
|
; CHECK-NOFP16-SD-NEXT: str q0, [sp, #16] // 16-byte Folded Spill
|
|
; CHECK-NOFP16-SD-NEXT: ldr q0, [sp] // 16-byte Folded Reload
|
|
; CHECK-NOFP16-SD-NEXT: mov x0, v0.d[1]
|
|
; CHECK-NOFP16-SD-NEXT: bl __floatditf
|
|
; CHECK-NOFP16-SD-NEXT: mov v1.16b, v0.16b
|
|
; CHECK-NOFP16-SD-NEXT: ldr q0, [sp, #16] // 16-byte Folded Reload
|
|
; CHECK-NOFP16-SD-NEXT: ldr x30, [sp, #32] // 8-byte Folded Reload
|
|
; CHECK-NOFP16-SD-NEXT: add sp, sp, #48
|
|
; CHECK-NOFP16-SD-NEXT: ret
|
|
;
|
|
; CHECK-FP16-SD-LABEL: stofp_v2i64_v2f128:
|
|
; CHECK-FP16-SD: // %bb.0: // %entry
|
|
; CHECK-FP16-SD-NEXT: sub sp, sp, #48
|
|
; CHECK-FP16-SD-NEXT: str x30, [sp, #32] // 8-byte Folded Spill
|
|
; CHECK-FP16-SD-NEXT: .cfi_def_cfa_offset 48
|
|
; CHECK-FP16-SD-NEXT: .cfi_offset w30, -16
|
|
; CHECK-FP16-SD-NEXT: fmov x0, d0
|
|
; CHECK-FP16-SD-NEXT: str q0, [sp] // 16-byte Folded Spill
|
|
; CHECK-FP16-SD-NEXT: bl __floatditf
|
|
; CHECK-FP16-SD-NEXT: str q0, [sp, #16] // 16-byte Folded Spill
|
|
; CHECK-FP16-SD-NEXT: ldr q0, [sp] // 16-byte Folded Reload
|
|
; CHECK-FP16-SD-NEXT: mov x0, v0.d[1]
|
|
; CHECK-FP16-SD-NEXT: bl __floatditf
|
|
; CHECK-FP16-SD-NEXT: mov v1.16b, v0.16b
|
|
; CHECK-FP16-SD-NEXT: ldr q0, [sp, #16] // 16-byte Folded Reload
|
|
; CHECK-FP16-SD-NEXT: ldr x30, [sp, #32] // 8-byte Folded Reload
|
|
; CHECK-FP16-SD-NEXT: add sp, sp, #48
|
|
; CHECK-FP16-SD-NEXT: ret
|
|
;
|
|
; CHECK-NOFP16-GI-LABEL: stofp_v2i64_v2f128:
|
|
; CHECK-NOFP16-GI: // %bb.0: // %entry
|
|
; CHECK-NOFP16-GI-NEXT: sub sp, sp, #32
|
|
; CHECK-NOFP16-GI-NEXT: str d8, [sp, #16] // 8-byte Folded Spill
|
|
; CHECK-NOFP16-GI-NEXT: str x30, [sp, #24] // 8-byte Folded Spill
|
|
; CHECK-NOFP16-GI-NEXT: .cfi_def_cfa_offset 32
|
|
; CHECK-NOFP16-GI-NEXT: .cfi_offset w30, -8
|
|
; CHECK-NOFP16-GI-NEXT: .cfi_offset b8, -16
|
|
; CHECK-NOFP16-GI-NEXT: fmov x0, d0
|
|
; CHECK-NOFP16-GI-NEXT: mov d8, v0.d[1]
|
|
; CHECK-NOFP16-GI-NEXT: bl __floatditf
|
|
; CHECK-NOFP16-GI-NEXT: fmov x0, d8
|
|
; CHECK-NOFP16-GI-NEXT: str q0, [sp] // 16-byte Folded Spill
|
|
; CHECK-NOFP16-GI-NEXT: bl __floatditf
|
|
; CHECK-NOFP16-GI-NEXT: mov v1.16b, v0.16b
|
|
; CHECK-NOFP16-GI-NEXT: ldr q0, [sp] // 16-byte Folded Reload
|
|
; CHECK-NOFP16-GI-NEXT: ldr x30, [sp, #24] // 8-byte Folded Reload
|
|
; CHECK-NOFP16-GI-NEXT: ldr d8, [sp, #16] // 8-byte Folded Reload
|
|
; CHECK-NOFP16-GI-NEXT: add sp, sp, #32
|
|
; CHECK-NOFP16-GI-NEXT: ret
|
|
;
|
|
; CHECK-FP16-GI-LABEL: stofp_v2i64_v2f128:
|
|
; CHECK-FP16-GI: // %bb.0: // %entry
|
|
; CHECK-FP16-GI-NEXT: sub sp, sp, #32
|
|
; CHECK-FP16-GI-NEXT: str d8, [sp, #16] // 8-byte Folded Spill
|
|
; CHECK-FP16-GI-NEXT: str x30, [sp, #24] // 8-byte Folded Spill
|
|
; CHECK-FP16-GI-NEXT: .cfi_def_cfa_offset 32
|
|
; CHECK-FP16-GI-NEXT: .cfi_offset w30, -8
|
|
; CHECK-FP16-GI-NEXT: .cfi_offset b8, -16
|
|
; CHECK-FP16-GI-NEXT: fmov x0, d0
|
|
; CHECK-FP16-GI-NEXT: mov d8, v0.d[1]
|
|
; CHECK-FP16-GI-NEXT: bl __floatditf
|
|
; CHECK-FP16-GI-NEXT: fmov x0, d8
|
|
; CHECK-FP16-GI-NEXT: str q0, [sp] // 16-byte Folded Spill
|
|
; CHECK-FP16-GI-NEXT: bl __floatditf
|
|
; CHECK-FP16-GI-NEXT: mov v1.16b, v0.16b
|
|
; CHECK-FP16-GI-NEXT: ldr q0, [sp] // 16-byte Folded Reload
|
|
; CHECK-FP16-GI-NEXT: ldr x30, [sp, #24] // 8-byte Folded Reload
|
|
; CHECK-FP16-GI-NEXT: ldr d8, [sp, #16] // 8-byte Folded Reload
|
|
; CHECK-FP16-GI-NEXT: add sp, sp, #32
|
|
; CHECK-FP16-GI-NEXT: ret
|
|
entry:
|
|
%c = sitofp <2 x i64> %a to <2 x fp128>
|
|
ret <2 x fp128> %c
|
|
}
|
|
|
|
define <2 x fp128> @utofp_v2i64_v2f128(<2 x i64> %a) {
|
|
; CHECK-NOFP16-SD-LABEL: utofp_v2i64_v2f128:
|
|
; CHECK-NOFP16-SD: // %bb.0: // %entry
|
|
; CHECK-NOFP16-SD-NEXT: sub sp, sp, #48
|
|
; CHECK-NOFP16-SD-NEXT: str x30, [sp, #32] // 8-byte Folded Spill
|
|
; CHECK-NOFP16-SD-NEXT: .cfi_def_cfa_offset 48
|
|
; CHECK-NOFP16-SD-NEXT: .cfi_offset w30, -16
|
|
; CHECK-NOFP16-SD-NEXT: fmov x0, d0
|
|
; CHECK-NOFP16-SD-NEXT: str q0, [sp] // 16-byte Folded Spill
|
|
; CHECK-NOFP16-SD-NEXT: bl __floatunditf
|
|
; CHECK-NOFP16-SD-NEXT: str q0, [sp, #16] // 16-byte Folded Spill
|
|
; CHECK-NOFP16-SD-NEXT: ldr q0, [sp] // 16-byte Folded Reload
|
|
; CHECK-NOFP16-SD-NEXT: mov x0, v0.d[1]
|
|
; CHECK-NOFP16-SD-NEXT: bl __floatunditf
|
|
; CHECK-NOFP16-SD-NEXT: mov v1.16b, v0.16b
|
|
; CHECK-NOFP16-SD-NEXT: ldr q0, [sp, #16] // 16-byte Folded Reload
|
|
; CHECK-NOFP16-SD-NEXT: ldr x30, [sp, #32] // 8-byte Folded Reload
|
|
; CHECK-NOFP16-SD-NEXT: add sp, sp, #48
|
|
; CHECK-NOFP16-SD-NEXT: ret
|
|
;
|
|
; CHECK-FP16-SD-LABEL: utofp_v2i64_v2f128:
|
|
; CHECK-FP16-SD: // %bb.0: // %entry
|
|
; CHECK-FP16-SD-NEXT: sub sp, sp, #48
|
|
; CHECK-FP16-SD-NEXT: str x30, [sp, #32] // 8-byte Folded Spill
|
|
; CHECK-FP16-SD-NEXT: .cfi_def_cfa_offset 48
|
|
; CHECK-FP16-SD-NEXT: .cfi_offset w30, -16
|
|
; CHECK-FP16-SD-NEXT: fmov x0, d0
|
|
; CHECK-FP16-SD-NEXT: str q0, [sp] // 16-byte Folded Spill
|
|
; CHECK-FP16-SD-NEXT: bl __floatunditf
|
|
; CHECK-FP16-SD-NEXT: str q0, [sp, #16] // 16-byte Folded Spill
|
|
; CHECK-FP16-SD-NEXT: ldr q0, [sp] // 16-byte Folded Reload
|
|
; CHECK-FP16-SD-NEXT: mov x0, v0.d[1]
|
|
; CHECK-FP16-SD-NEXT: bl __floatunditf
|
|
; CHECK-FP16-SD-NEXT: mov v1.16b, v0.16b
|
|
; CHECK-FP16-SD-NEXT: ldr q0, [sp, #16] // 16-byte Folded Reload
|
|
; CHECK-FP16-SD-NEXT: ldr x30, [sp, #32] // 8-byte Folded Reload
|
|
; CHECK-FP16-SD-NEXT: add sp, sp, #48
|
|
; CHECK-FP16-SD-NEXT: ret
|
|
;
|
|
; CHECK-NOFP16-GI-LABEL: utofp_v2i64_v2f128:
|
|
; CHECK-NOFP16-GI: // %bb.0: // %entry
|
|
; CHECK-NOFP16-GI-NEXT: sub sp, sp, #32
|
|
; CHECK-NOFP16-GI-NEXT: str d8, [sp, #16] // 8-byte Folded Spill
|
|
; CHECK-NOFP16-GI-NEXT: str x30, [sp, #24] // 8-byte Folded Spill
|
|
; CHECK-NOFP16-GI-NEXT: .cfi_def_cfa_offset 32
|
|
; CHECK-NOFP16-GI-NEXT: .cfi_offset w30, -8
|
|
; CHECK-NOFP16-GI-NEXT: .cfi_offset b8, -16
|
|
; CHECK-NOFP16-GI-NEXT: fmov x0, d0
|
|
; CHECK-NOFP16-GI-NEXT: mov d8, v0.d[1]
|
|
; CHECK-NOFP16-GI-NEXT: bl __floatunditf
|
|
; CHECK-NOFP16-GI-NEXT: fmov x0, d8
|
|
; CHECK-NOFP16-GI-NEXT: str q0, [sp] // 16-byte Folded Spill
|
|
; CHECK-NOFP16-GI-NEXT: bl __floatunditf
|
|
; CHECK-NOFP16-GI-NEXT: mov v1.16b, v0.16b
|
|
; CHECK-NOFP16-GI-NEXT: ldr q0, [sp] // 16-byte Folded Reload
|
|
; CHECK-NOFP16-GI-NEXT: ldr x30, [sp, #24] // 8-byte Folded Reload
|
|
; CHECK-NOFP16-GI-NEXT: ldr d8, [sp, #16] // 8-byte Folded Reload
|
|
; CHECK-NOFP16-GI-NEXT: add sp, sp, #32
|
|
; CHECK-NOFP16-GI-NEXT: ret
|
|
;
|
|
; CHECK-FP16-GI-LABEL: utofp_v2i64_v2f128:
|
|
; CHECK-FP16-GI: // %bb.0: // %entry
|
|
; CHECK-FP16-GI-NEXT: sub sp, sp, #32
|
|
; CHECK-FP16-GI-NEXT: str d8, [sp, #16] // 8-byte Folded Spill
|
|
; CHECK-FP16-GI-NEXT: str x30, [sp, #24] // 8-byte Folded Spill
|
|
; CHECK-FP16-GI-NEXT: .cfi_def_cfa_offset 32
|
|
; CHECK-FP16-GI-NEXT: .cfi_offset w30, -8
|
|
; CHECK-FP16-GI-NEXT: .cfi_offset b8, -16
|
|
; CHECK-FP16-GI-NEXT: fmov x0, d0
|
|
; CHECK-FP16-GI-NEXT: mov d8, v0.d[1]
|
|
; CHECK-FP16-GI-NEXT: bl __floatunditf
|
|
; CHECK-FP16-GI-NEXT: fmov x0, d8
|
|
; CHECK-FP16-GI-NEXT: str q0, [sp] // 16-byte Folded Spill
|
|
; CHECK-FP16-GI-NEXT: bl __floatunditf
|
|
; CHECK-FP16-GI-NEXT: mov v1.16b, v0.16b
|
|
; CHECK-FP16-GI-NEXT: ldr q0, [sp] // 16-byte Folded Reload
|
|
; CHECK-FP16-GI-NEXT: ldr x30, [sp, #24] // 8-byte Folded Reload
|
|
; CHECK-FP16-GI-NEXT: ldr d8, [sp, #16] // 8-byte Folded Reload
|
|
; CHECK-FP16-GI-NEXT: add sp, sp, #32
|
|
; CHECK-FP16-GI-NEXT: ret
|
|
entry:
|
|
%c = uitofp <2 x i64> %a to <2 x fp128>
|
|
ret <2 x fp128> %c
|
|
}
|
|
|
|
define <2 x fp128> @stofp_v2i32_v2f128(<2 x i32> %a) {
|
|
; CHECK-NOFP16-SD-LABEL: stofp_v2i32_v2f128:
|
|
; CHECK-NOFP16-SD: // %bb.0: // %entry
|
|
; CHECK-NOFP16-SD-NEXT: sub sp, sp, #32
|
|
; CHECK-NOFP16-SD-NEXT: str x30, [sp, #16] // 8-byte Folded Spill
|
|
; CHECK-NOFP16-SD-NEXT: .cfi_def_cfa_offset 32
|
|
; CHECK-NOFP16-SD-NEXT: .cfi_offset w30, -16
|
|
; CHECK-NOFP16-SD-NEXT: // kill: def $d0 killed $d0 def $q0
|
|
; CHECK-NOFP16-SD-NEXT: fmov w0, s0
|
|
; CHECK-NOFP16-SD-NEXT: str q0, [sp] // 16-byte Folded Spill
|
|
; CHECK-NOFP16-SD-NEXT: bl __floatsitf
|
|
; CHECK-NOFP16-SD-NEXT: ldr q1, [sp] // 16-byte Folded Reload
|
|
; CHECK-NOFP16-SD-NEXT: str q0, [sp] // 16-byte Folded Spill
|
|
; CHECK-NOFP16-SD-NEXT: mov w0, v1.s[1]
|
|
; CHECK-NOFP16-SD-NEXT: bl __floatsitf
|
|
; CHECK-NOFP16-SD-NEXT: mov v1.16b, v0.16b
|
|
; CHECK-NOFP16-SD-NEXT: ldr q0, [sp] // 16-byte Folded Reload
|
|
; CHECK-NOFP16-SD-NEXT: ldr x30, [sp, #16] // 8-byte Folded Reload
|
|
; CHECK-NOFP16-SD-NEXT: add sp, sp, #32
|
|
; CHECK-NOFP16-SD-NEXT: ret
|
|
;
|
|
; CHECK-FP16-SD-LABEL: stofp_v2i32_v2f128:
|
|
; CHECK-FP16-SD: // %bb.0: // %entry
|
|
; CHECK-FP16-SD-NEXT: sub sp, sp, #32
|
|
; CHECK-FP16-SD-NEXT: str x30, [sp, #16] // 8-byte Folded Spill
|
|
; CHECK-FP16-SD-NEXT: .cfi_def_cfa_offset 32
|
|
; CHECK-FP16-SD-NEXT: .cfi_offset w30, -16
|
|
; CHECK-FP16-SD-NEXT: // kill: def $d0 killed $d0 def $q0
|
|
; CHECK-FP16-SD-NEXT: fmov w0, s0
|
|
; CHECK-FP16-SD-NEXT: str q0, [sp] // 16-byte Folded Spill
|
|
; CHECK-FP16-SD-NEXT: bl __floatsitf
|
|
; CHECK-FP16-SD-NEXT: ldr q1, [sp] // 16-byte Folded Reload
|
|
; CHECK-FP16-SD-NEXT: str q0, [sp] // 16-byte Folded Spill
|
|
; CHECK-FP16-SD-NEXT: mov w0, v1.s[1]
|
|
; CHECK-FP16-SD-NEXT: bl __floatsitf
|
|
; CHECK-FP16-SD-NEXT: mov v1.16b, v0.16b
|
|
; CHECK-FP16-SD-NEXT: ldr q0, [sp] // 16-byte Folded Reload
|
|
; CHECK-FP16-SD-NEXT: ldr x30, [sp, #16] // 8-byte Folded Reload
|
|
; CHECK-FP16-SD-NEXT: add sp, sp, #32
|
|
; CHECK-FP16-SD-NEXT: ret
|
|
;
|
|
; CHECK-NOFP16-GI-LABEL: stofp_v2i32_v2f128:
|
|
; CHECK-NOFP16-GI: // %bb.0: // %entry
|
|
; CHECK-NOFP16-GI-NEXT: sub sp, sp, #32
|
|
; CHECK-NOFP16-GI-NEXT: str d8, [sp, #16] // 8-byte Folded Spill
|
|
; CHECK-NOFP16-GI-NEXT: str x30, [sp, #24] // 8-byte Folded Spill
|
|
; CHECK-NOFP16-GI-NEXT: .cfi_def_cfa_offset 32
|
|
; CHECK-NOFP16-GI-NEXT: .cfi_offset w30, -8
|
|
; CHECK-NOFP16-GI-NEXT: .cfi_offset b8, -16
|
|
; CHECK-NOFP16-GI-NEXT: // kill: def $d0 killed $d0 def $q0
|
|
; CHECK-NOFP16-GI-NEXT: fmov w0, s0
|
|
; CHECK-NOFP16-GI-NEXT: mov s8, v0.s[1]
|
|
; CHECK-NOFP16-GI-NEXT: bl __floatsitf
|
|
; CHECK-NOFP16-GI-NEXT: fmov w0, s8
|
|
; CHECK-NOFP16-GI-NEXT: str q0, [sp] // 16-byte Folded Spill
|
|
; CHECK-NOFP16-GI-NEXT: bl __floatsitf
|
|
; CHECK-NOFP16-GI-NEXT: mov v1.16b, v0.16b
|
|
; CHECK-NOFP16-GI-NEXT: ldr q0, [sp] // 16-byte Folded Reload
|
|
; CHECK-NOFP16-GI-NEXT: ldr x30, [sp, #24] // 8-byte Folded Reload
|
|
; CHECK-NOFP16-GI-NEXT: ldr d8, [sp, #16] // 8-byte Folded Reload
|
|
; CHECK-NOFP16-GI-NEXT: add sp, sp, #32
|
|
; CHECK-NOFP16-GI-NEXT: ret
|
|
;
|
|
; CHECK-FP16-GI-LABEL: stofp_v2i32_v2f128:
|
|
; CHECK-FP16-GI: // %bb.0: // %entry
|
|
; CHECK-FP16-GI-NEXT: sub sp, sp, #32
|
|
; CHECK-FP16-GI-NEXT: str d8, [sp, #16] // 8-byte Folded Spill
|
|
; CHECK-FP16-GI-NEXT: str x30, [sp, #24] // 8-byte Folded Spill
|
|
; CHECK-FP16-GI-NEXT: .cfi_def_cfa_offset 32
|
|
; CHECK-FP16-GI-NEXT: .cfi_offset w30, -8
|
|
; CHECK-FP16-GI-NEXT: .cfi_offset b8, -16
|
|
; CHECK-FP16-GI-NEXT: // kill: def $d0 killed $d0 def $q0
|
|
; CHECK-FP16-GI-NEXT: fmov w0, s0
|
|
; CHECK-FP16-GI-NEXT: mov s8, v0.s[1]
|
|
; CHECK-FP16-GI-NEXT: bl __floatsitf
|
|
; CHECK-FP16-GI-NEXT: fmov w0, s8
|
|
; CHECK-FP16-GI-NEXT: str q0, [sp] // 16-byte Folded Spill
|
|
; CHECK-FP16-GI-NEXT: bl __floatsitf
|
|
; CHECK-FP16-GI-NEXT: mov v1.16b, v0.16b
|
|
; CHECK-FP16-GI-NEXT: ldr q0, [sp] // 16-byte Folded Reload
|
|
; CHECK-FP16-GI-NEXT: ldr x30, [sp, #24] // 8-byte Folded Reload
|
|
; CHECK-FP16-GI-NEXT: ldr d8, [sp, #16] // 8-byte Folded Reload
|
|
; CHECK-FP16-GI-NEXT: add sp, sp, #32
|
|
; CHECK-FP16-GI-NEXT: ret
|
|
entry:
|
|
%c = sitofp <2 x i32> %a to <2 x fp128>
|
|
ret <2 x fp128> %c
|
|
}
|
|
|
|
define <2 x fp128> @utofp_v2i32_v2f128(<2 x i32> %a) {
|
|
; CHECK-NOFP16-SD-LABEL: utofp_v2i32_v2f128:
|
|
; CHECK-NOFP16-SD: // %bb.0: // %entry
|
|
; CHECK-NOFP16-SD-NEXT: sub sp, sp, #32
|
|
; CHECK-NOFP16-SD-NEXT: str x30, [sp, #16] // 8-byte Folded Spill
|
|
; CHECK-NOFP16-SD-NEXT: .cfi_def_cfa_offset 32
|
|
; CHECK-NOFP16-SD-NEXT: .cfi_offset w30, -16
|
|
; CHECK-NOFP16-SD-NEXT: // kill: def $d0 killed $d0 def $q0
|
|
; CHECK-NOFP16-SD-NEXT: fmov w0, s0
|
|
; CHECK-NOFP16-SD-NEXT: str q0, [sp] // 16-byte Folded Spill
|
|
; CHECK-NOFP16-SD-NEXT: bl __floatunsitf
|
|
; CHECK-NOFP16-SD-NEXT: ldr q1, [sp] // 16-byte Folded Reload
|
|
; CHECK-NOFP16-SD-NEXT: str q0, [sp] // 16-byte Folded Spill
|
|
; CHECK-NOFP16-SD-NEXT: mov w0, v1.s[1]
|
|
; CHECK-NOFP16-SD-NEXT: bl __floatunsitf
|
|
; CHECK-NOFP16-SD-NEXT: mov v1.16b, v0.16b
|
|
; CHECK-NOFP16-SD-NEXT: ldr q0, [sp] // 16-byte Folded Reload
|
|
; CHECK-NOFP16-SD-NEXT: ldr x30, [sp, #16] // 8-byte Folded Reload
|
|
; CHECK-NOFP16-SD-NEXT: add sp, sp, #32
|
|
; CHECK-NOFP16-SD-NEXT: ret
|
|
;
|
|
; CHECK-FP16-SD-LABEL: utofp_v2i32_v2f128:
|
|
; CHECK-FP16-SD: // %bb.0: // %entry
|
|
; CHECK-FP16-SD-NEXT: sub sp, sp, #32
|
|
; CHECK-FP16-SD-NEXT: str x30, [sp, #16] // 8-byte Folded Spill
|
|
; CHECK-FP16-SD-NEXT: .cfi_def_cfa_offset 32
|
|
; CHECK-FP16-SD-NEXT: .cfi_offset w30, -16
|
|
; CHECK-FP16-SD-NEXT: // kill: def $d0 killed $d0 def $q0
|
|
; CHECK-FP16-SD-NEXT: fmov w0, s0
|
|
; CHECK-FP16-SD-NEXT: str q0, [sp] // 16-byte Folded Spill
|
|
; CHECK-FP16-SD-NEXT: bl __floatunsitf
|
|
; CHECK-FP16-SD-NEXT: ldr q1, [sp] // 16-byte Folded Reload
|
|
; CHECK-FP16-SD-NEXT: str q0, [sp] // 16-byte Folded Spill
|
|
; CHECK-FP16-SD-NEXT: mov w0, v1.s[1]
|
|
; CHECK-FP16-SD-NEXT: bl __floatunsitf
|
|
; CHECK-FP16-SD-NEXT: mov v1.16b, v0.16b
|
|
; CHECK-FP16-SD-NEXT: ldr q0, [sp] // 16-byte Folded Reload
|
|
; CHECK-FP16-SD-NEXT: ldr x30, [sp, #16] // 8-byte Folded Reload
|
|
; CHECK-FP16-SD-NEXT: add sp, sp, #32
|
|
; CHECK-FP16-SD-NEXT: ret
|
|
;
|
|
; CHECK-NOFP16-GI-LABEL: utofp_v2i32_v2f128:
|
|
; CHECK-NOFP16-GI: // %bb.0: // %entry
|
|
; CHECK-NOFP16-GI-NEXT: sub sp, sp, #32
|
|
; CHECK-NOFP16-GI-NEXT: str d8, [sp, #16] // 8-byte Folded Spill
|
|
; CHECK-NOFP16-GI-NEXT: str x30, [sp, #24] // 8-byte Folded Spill
|
|
; CHECK-NOFP16-GI-NEXT: .cfi_def_cfa_offset 32
|
|
; CHECK-NOFP16-GI-NEXT: .cfi_offset w30, -8
|
|
; CHECK-NOFP16-GI-NEXT: .cfi_offset b8, -16
|
|
; CHECK-NOFP16-GI-NEXT: // kill: def $d0 killed $d0 def $q0
|
|
; CHECK-NOFP16-GI-NEXT: fmov w0, s0
|
|
; CHECK-NOFP16-GI-NEXT: mov s8, v0.s[1]
|
|
; CHECK-NOFP16-GI-NEXT: bl __floatunsitf
|
|
; CHECK-NOFP16-GI-NEXT: fmov w0, s8
|
|
; CHECK-NOFP16-GI-NEXT: str q0, [sp] // 16-byte Folded Spill
|
|
; CHECK-NOFP16-GI-NEXT: bl __floatunsitf
|
|
; CHECK-NOFP16-GI-NEXT: mov v1.16b, v0.16b
|
|
; CHECK-NOFP16-GI-NEXT: ldr q0, [sp] // 16-byte Folded Reload
|
|
; CHECK-NOFP16-GI-NEXT: ldr x30, [sp, #24] // 8-byte Folded Reload
|
|
; CHECK-NOFP16-GI-NEXT: ldr d8, [sp, #16] // 8-byte Folded Reload
|
|
; CHECK-NOFP16-GI-NEXT: add sp, sp, #32
|
|
; CHECK-NOFP16-GI-NEXT: ret
|
|
;
|
|
; CHECK-FP16-GI-LABEL: utofp_v2i32_v2f128:
|
|
; CHECK-FP16-GI: // %bb.0: // %entry
|
|
; CHECK-FP16-GI-NEXT: sub sp, sp, #32
|
|
; CHECK-FP16-GI-NEXT: str d8, [sp, #16] // 8-byte Folded Spill
|
|
; CHECK-FP16-GI-NEXT: str x30, [sp, #24] // 8-byte Folded Spill
|
|
; CHECK-FP16-GI-NEXT: .cfi_def_cfa_offset 32
|
|
; CHECK-FP16-GI-NEXT: .cfi_offset w30, -8
|
|
; CHECK-FP16-GI-NEXT: .cfi_offset b8, -16
|
|
; CHECK-FP16-GI-NEXT: // kill: def $d0 killed $d0 def $q0
|
|
; CHECK-FP16-GI-NEXT: fmov w0, s0
|
|
; CHECK-FP16-GI-NEXT: mov s8, v0.s[1]
|
|
; CHECK-FP16-GI-NEXT: bl __floatunsitf
|
|
; CHECK-FP16-GI-NEXT: fmov w0, s8
|
|
; CHECK-FP16-GI-NEXT: str q0, [sp] // 16-byte Folded Spill
|
|
; CHECK-FP16-GI-NEXT: bl __floatunsitf
|
|
; CHECK-FP16-GI-NEXT: mov v1.16b, v0.16b
|
|
; CHECK-FP16-GI-NEXT: ldr q0, [sp] // 16-byte Folded Reload
|
|
; CHECK-FP16-GI-NEXT: ldr x30, [sp, #24] // 8-byte Folded Reload
|
|
; CHECK-FP16-GI-NEXT: ldr d8, [sp, #16] // 8-byte Folded Reload
|
|
; CHECK-FP16-GI-NEXT: add sp, sp, #32
|
|
; CHECK-FP16-GI-NEXT: ret
|
|
entry:
|
|
%c = uitofp <2 x i32> %a to <2 x fp128>
|
|
ret <2 x fp128> %c
|
|
}
|
|
|
|
define <2 x fp128> @stofp_v2i16_v2f128(<2 x i16> %a) {
|
|
; CHECK-LABEL: stofp_v2i16_v2f128:
|
|
; CHECK: // %bb.0: // %entry
|
|
; CHECK-NEXT: sub sp, sp, #32
|
|
; CHECK-NEXT: str x30, [sp, #16] // 8-byte Folded Spill
|
|
; CHECK-NEXT: .cfi_def_cfa_offset 32
|
|
; CHECK-NEXT: .cfi_offset w30, -16
|
|
; CHECK-NEXT: // kill: def $d0 killed $d0 def $q0
|
|
; CHECK-NEXT: fmov w8, s0
|
|
; CHECK-NEXT: str q0, [sp] // 16-byte Folded Spill
|
|
; CHECK-NEXT: sxth w0, w8
|
|
; CHECK-NEXT: bl __floatsitf
|
|
; CHECK-NEXT: ldr q1, [sp] // 16-byte Folded Reload
|
|
; CHECK-NEXT: str q0, [sp] // 16-byte Folded Spill
|
|
; CHECK-NEXT: mov w8, v1.s[1]
|
|
; CHECK-NEXT: sxth w0, w8
|
|
; CHECK-NEXT: bl __floatsitf
|
|
; CHECK-NEXT: mov v1.16b, v0.16b
|
|
; CHECK-NEXT: ldr q0, [sp] // 16-byte Folded Reload
|
|
; CHECK-NEXT: ldr x30, [sp, #16] // 8-byte Folded Reload
|
|
; CHECK-NEXT: add sp, sp, #32
|
|
; CHECK-NEXT: ret
|
|
entry:
|
|
%c = sitofp <2 x i16> %a to <2 x fp128>
|
|
ret <2 x fp128> %c
|
|
}
|
|
|
|
define <2 x fp128> @utofp_v2i16_v2f128(<2 x i16> %a) {
|
|
; CHECK-LABEL: utofp_v2i16_v2f128:
|
|
; CHECK: // %bb.0: // %entry
|
|
; CHECK-NEXT: sub sp, sp, #32
|
|
; CHECK-NEXT: str x30, [sp, #16] // 8-byte Folded Spill
|
|
; CHECK-NEXT: .cfi_def_cfa_offset 32
|
|
; CHECK-NEXT: .cfi_offset w30, -16
|
|
; CHECK-NEXT: // kill: def $d0 killed $d0 def $q0
|
|
; CHECK-NEXT: fmov w8, s0
|
|
; CHECK-NEXT: str q0, [sp] // 16-byte Folded Spill
|
|
; CHECK-NEXT: and w0, w8, #0xffff
|
|
; CHECK-NEXT: bl __floatunsitf
|
|
; CHECK-NEXT: ldr q1, [sp] // 16-byte Folded Reload
|
|
; CHECK-NEXT: str q0, [sp] // 16-byte Folded Spill
|
|
; CHECK-NEXT: mov w8, v1.s[1]
|
|
; CHECK-NEXT: and w0, w8, #0xffff
|
|
; CHECK-NEXT: bl __floatunsitf
|
|
; CHECK-NEXT: mov v1.16b, v0.16b
|
|
; CHECK-NEXT: ldr q0, [sp] // 16-byte Folded Reload
|
|
; CHECK-NEXT: ldr x30, [sp, #16] // 8-byte Folded Reload
|
|
; CHECK-NEXT: add sp, sp, #32
|
|
; CHECK-NEXT: ret
|
|
entry:
|
|
%c = uitofp <2 x i16> %a to <2 x fp128>
|
|
ret <2 x fp128> %c
|
|
}
|
|
|
|
define <2 x fp128> @stofp_v2i8_v2f128(<2 x i8> %a) {
|
|
; CHECK-LABEL: stofp_v2i8_v2f128:
|
|
; CHECK: // %bb.0: // %entry
|
|
; CHECK-NEXT: sub sp, sp, #32
|
|
; CHECK-NEXT: str x30, [sp, #16] // 8-byte Folded Spill
|
|
; CHECK-NEXT: .cfi_def_cfa_offset 32
|
|
; CHECK-NEXT: .cfi_offset w30, -16
|
|
; CHECK-NEXT: // kill: def $d0 killed $d0 def $q0
|
|
; CHECK-NEXT: fmov w8, s0
|
|
; CHECK-NEXT: str q0, [sp] // 16-byte Folded Spill
|
|
; CHECK-NEXT: sxtb w0, w8
|
|
; CHECK-NEXT: bl __floatsitf
|
|
; CHECK-NEXT: ldr q1, [sp] // 16-byte Folded Reload
|
|
; CHECK-NEXT: str q0, [sp] // 16-byte Folded Spill
|
|
; CHECK-NEXT: mov w8, v1.s[1]
|
|
; CHECK-NEXT: sxtb w0, w8
|
|
; CHECK-NEXT: bl __floatsitf
|
|
; CHECK-NEXT: mov v1.16b, v0.16b
|
|
; CHECK-NEXT: ldr q0, [sp] // 16-byte Folded Reload
|
|
; CHECK-NEXT: ldr x30, [sp, #16] // 8-byte Folded Reload
|
|
; CHECK-NEXT: add sp, sp, #32
|
|
; CHECK-NEXT: ret
|
|
entry:
|
|
%c = sitofp <2 x i8> %a to <2 x fp128>
|
|
ret <2 x fp128> %c
|
|
}
|
|
|
|
define <2 x fp128> @utofp_v2i8_v2f128(<2 x i8> %a) {
|
|
; CHECK-LABEL: utofp_v2i8_v2f128:
|
|
; CHECK: // %bb.0: // %entry
|
|
; CHECK-NEXT: sub sp, sp, #32
|
|
; CHECK-NEXT: str x30, [sp, #16] // 8-byte Folded Spill
|
|
; CHECK-NEXT: .cfi_def_cfa_offset 32
|
|
; CHECK-NEXT: .cfi_offset w30, -16
|
|
; CHECK-NEXT: // kill: def $d0 killed $d0 def $q0
|
|
; CHECK-NEXT: fmov w8, s0
|
|
; CHECK-NEXT: str q0, [sp] // 16-byte Folded Spill
|
|
; CHECK-NEXT: and w0, w8, #0xff
|
|
; CHECK-NEXT: bl __floatunsitf
|
|
; CHECK-NEXT: ldr q1, [sp] // 16-byte Folded Reload
|
|
; CHECK-NEXT: str q0, [sp] // 16-byte Folded Spill
|
|
; CHECK-NEXT: mov w8, v1.s[1]
|
|
; CHECK-NEXT: and w0, w8, #0xff
|
|
; CHECK-NEXT: bl __floatunsitf
|
|
; CHECK-NEXT: mov v1.16b, v0.16b
|
|
; CHECK-NEXT: ldr q0, [sp] // 16-byte Folded Reload
|
|
; CHECK-NEXT: ldr x30, [sp, #16] // 8-byte Folded Reload
|
|
; CHECK-NEXT: add sp, sp, #32
|
|
; CHECK-NEXT: ret
|
|
entry:
|
|
%c = uitofp <2 x i8> %a to <2 x fp128>
|
|
ret <2 x fp128> %c
|
|
}
|
|
|
|
define <2 x fp128> @stofp_v2i128_v2f128(<2 x i128> %a) {
|
|
; CHECK-NOFP16-SD-LABEL: stofp_v2i128_v2f128:
|
|
; CHECK-NOFP16-SD: // %bb.0: // %entry
|
|
; CHECK-NOFP16-SD-NEXT: sub sp, sp, #48
|
|
; CHECK-NOFP16-SD-NEXT: str x30, [sp, #16] // 8-byte Folded Spill
|
|
; CHECK-NOFP16-SD-NEXT: stp x20, x19, [sp, #32] // 16-byte Folded Spill
|
|
; CHECK-NOFP16-SD-NEXT: .cfi_def_cfa_offset 48
|
|
; CHECK-NOFP16-SD-NEXT: .cfi_offset w19, -8
|
|
; CHECK-NOFP16-SD-NEXT: .cfi_offset w20, -16
|
|
; CHECK-NOFP16-SD-NEXT: .cfi_offset w30, -32
|
|
; CHECK-NOFP16-SD-NEXT: mov x19, x3
|
|
; CHECK-NOFP16-SD-NEXT: mov x20, x2
|
|
; CHECK-NOFP16-SD-NEXT: bl __floattitf
|
|
; CHECK-NOFP16-SD-NEXT: mov x0, x20
|
|
; CHECK-NOFP16-SD-NEXT: mov x1, x19
|
|
; CHECK-NOFP16-SD-NEXT: str q0, [sp] // 16-byte Folded Spill
|
|
; CHECK-NOFP16-SD-NEXT: bl __floattitf
|
|
; CHECK-NOFP16-SD-NEXT: ldp x20, x19, [sp, #32] // 16-byte Folded Reload
|
|
; CHECK-NOFP16-SD-NEXT: mov v1.16b, v0.16b
|
|
; CHECK-NOFP16-SD-NEXT: ldr q0, [sp] // 16-byte Folded Reload
|
|
; CHECK-NOFP16-SD-NEXT: ldr x30, [sp, #16] // 8-byte Folded Reload
|
|
; CHECK-NOFP16-SD-NEXT: add sp, sp, #48
|
|
; CHECK-NOFP16-SD-NEXT: ret
|
|
;
|
|
; CHECK-FP16-SD-LABEL: stofp_v2i128_v2f128:
|
|
; CHECK-FP16-SD: // %bb.0: // %entry
|
|
; CHECK-FP16-SD-NEXT: sub sp, sp, #48
|
|
; CHECK-FP16-SD-NEXT: str x30, [sp, #16] // 8-byte Folded Spill
|
|
; CHECK-FP16-SD-NEXT: stp x20, x19, [sp, #32] // 16-byte Folded Spill
|
|
; CHECK-FP16-SD-NEXT: .cfi_def_cfa_offset 48
|
|
; CHECK-FP16-SD-NEXT: .cfi_offset w19, -8
|
|
; CHECK-FP16-SD-NEXT: .cfi_offset w20, -16
|
|
; CHECK-FP16-SD-NEXT: .cfi_offset w30, -32
|
|
; CHECK-FP16-SD-NEXT: mov x19, x3
|
|
; CHECK-FP16-SD-NEXT: mov x20, x2
|
|
; CHECK-FP16-SD-NEXT: bl __floattitf
|
|
; CHECK-FP16-SD-NEXT: mov x0, x20
|
|
; CHECK-FP16-SD-NEXT: mov x1, x19
|
|
; CHECK-FP16-SD-NEXT: str q0, [sp] // 16-byte Folded Spill
|
|
; CHECK-FP16-SD-NEXT: bl __floattitf
|
|
; CHECK-FP16-SD-NEXT: ldp x20, x19, [sp, #32] // 16-byte Folded Reload
|
|
; CHECK-FP16-SD-NEXT: mov v1.16b, v0.16b
|
|
; CHECK-FP16-SD-NEXT: ldr q0, [sp] // 16-byte Folded Reload
|
|
; CHECK-FP16-SD-NEXT: ldr x30, [sp, #16] // 8-byte Folded Reload
|
|
; CHECK-FP16-SD-NEXT: add sp, sp, #48
|
|
; CHECK-FP16-SD-NEXT: ret
|
|
;
|
|
; CHECK-NOFP16-GI-LABEL: stofp_v2i128_v2f128:
|
|
; CHECK-NOFP16-GI: // %bb.0: // %entry
|
|
; CHECK-NOFP16-GI-NEXT: sub sp, sp, #48
|
|
; CHECK-NOFP16-GI-NEXT: str x30, [sp, #16] // 8-byte Folded Spill
|
|
; CHECK-NOFP16-GI-NEXT: stp x20, x19, [sp, #32] // 16-byte Folded Spill
|
|
; CHECK-NOFP16-GI-NEXT: .cfi_def_cfa_offset 48
|
|
; CHECK-NOFP16-GI-NEXT: .cfi_offset w19, -8
|
|
; CHECK-NOFP16-GI-NEXT: .cfi_offset w20, -16
|
|
; CHECK-NOFP16-GI-NEXT: .cfi_offset w30, -32
|
|
; CHECK-NOFP16-GI-NEXT: mov x19, x2
|
|
; CHECK-NOFP16-GI-NEXT: mov x20, x3
|
|
; CHECK-NOFP16-GI-NEXT: bl __floattitf
|
|
; CHECK-NOFP16-GI-NEXT: mov x0, x19
|
|
; CHECK-NOFP16-GI-NEXT: mov x1, x20
|
|
; CHECK-NOFP16-GI-NEXT: str q0, [sp] // 16-byte Folded Spill
|
|
; CHECK-NOFP16-GI-NEXT: bl __floattitf
|
|
; CHECK-NOFP16-GI-NEXT: ldp x20, x19, [sp, #32] // 16-byte Folded Reload
|
|
; CHECK-NOFP16-GI-NEXT: mov v1.16b, v0.16b
|
|
; CHECK-NOFP16-GI-NEXT: ldr q0, [sp] // 16-byte Folded Reload
|
|
; CHECK-NOFP16-GI-NEXT: ldr x30, [sp, #16] // 8-byte Folded Reload
|
|
; CHECK-NOFP16-GI-NEXT: add sp, sp, #48
|
|
; CHECK-NOFP16-GI-NEXT: ret
|
|
;
|
|
; CHECK-FP16-GI-LABEL: stofp_v2i128_v2f128:
|
|
; CHECK-FP16-GI: // %bb.0: // %entry
|
|
; CHECK-FP16-GI-NEXT: sub sp, sp, #48
|
|
; CHECK-FP16-GI-NEXT: str x30, [sp, #16] // 8-byte Folded Spill
|
|
; CHECK-FP16-GI-NEXT: stp x20, x19, [sp, #32] // 16-byte Folded Spill
|
|
; CHECK-FP16-GI-NEXT: .cfi_def_cfa_offset 48
|
|
; CHECK-FP16-GI-NEXT: .cfi_offset w19, -8
|
|
; CHECK-FP16-GI-NEXT: .cfi_offset w20, -16
|
|
; CHECK-FP16-GI-NEXT: .cfi_offset w30, -32
|
|
; CHECK-FP16-GI-NEXT: mov x19, x2
|
|
; CHECK-FP16-GI-NEXT: mov x20, x3
|
|
; CHECK-FP16-GI-NEXT: bl __floattitf
|
|
; CHECK-FP16-GI-NEXT: mov x0, x19
|
|
; CHECK-FP16-GI-NEXT: mov x1, x20
|
|
; CHECK-FP16-GI-NEXT: str q0, [sp] // 16-byte Folded Spill
|
|
; CHECK-FP16-GI-NEXT: bl __floattitf
|
|
; CHECK-FP16-GI-NEXT: ldp x20, x19, [sp, #32] // 16-byte Folded Reload
|
|
; CHECK-FP16-GI-NEXT: mov v1.16b, v0.16b
|
|
; CHECK-FP16-GI-NEXT: ldr q0, [sp] // 16-byte Folded Reload
|
|
; CHECK-FP16-GI-NEXT: ldr x30, [sp, #16] // 8-byte Folded Reload
|
|
; CHECK-FP16-GI-NEXT: add sp, sp, #48
|
|
; CHECK-FP16-GI-NEXT: ret
|
|
entry:
|
|
%c = sitofp <2 x i128> %a to <2 x fp128>
|
|
ret <2 x fp128> %c
|
|
}
|
|
|
|
define <2 x fp128> @utofp_v2i128_v2f128(<2 x i128> %a) {
|
|
; CHECK-NOFP16-SD-LABEL: utofp_v2i128_v2f128:
|
|
; CHECK-NOFP16-SD: // %bb.0: // %entry
|
|
; CHECK-NOFP16-SD-NEXT: sub sp, sp, #48
|
|
; CHECK-NOFP16-SD-NEXT: str x30, [sp, #16] // 8-byte Folded Spill
|
|
; CHECK-NOFP16-SD-NEXT: stp x20, x19, [sp, #32] // 16-byte Folded Spill
|
|
; CHECK-NOFP16-SD-NEXT: .cfi_def_cfa_offset 48
|
|
; CHECK-NOFP16-SD-NEXT: .cfi_offset w19, -8
|
|
; CHECK-NOFP16-SD-NEXT: .cfi_offset w20, -16
|
|
; CHECK-NOFP16-SD-NEXT: .cfi_offset w30, -32
|
|
; CHECK-NOFP16-SD-NEXT: mov x19, x3
|
|
; CHECK-NOFP16-SD-NEXT: mov x20, x2
|
|
; CHECK-NOFP16-SD-NEXT: bl __floatuntitf
|
|
; CHECK-NOFP16-SD-NEXT: mov x0, x20
|
|
; CHECK-NOFP16-SD-NEXT: mov x1, x19
|
|
; CHECK-NOFP16-SD-NEXT: str q0, [sp] // 16-byte Folded Spill
|
|
; CHECK-NOFP16-SD-NEXT: bl __floatuntitf
|
|
; CHECK-NOFP16-SD-NEXT: ldp x20, x19, [sp, #32] // 16-byte Folded Reload
|
|
; CHECK-NOFP16-SD-NEXT: mov v1.16b, v0.16b
|
|
; CHECK-NOFP16-SD-NEXT: ldr q0, [sp] // 16-byte Folded Reload
|
|
; CHECK-NOFP16-SD-NEXT: ldr x30, [sp, #16] // 8-byte Folded Reload
|
|
; CHECK-NOFP16-SD-NEXT: add sp, sp, #48
|
|
; CHECK-NOFP16-SD-NEXT: ret
|
|
;
|
|
; CHECK-FP16-SD-LABEL: utofp_v2i128_v2f128:
|
|
; CHECK-FP16-SD: // %bb.0: // %entry
|
|
; CHECK-FP16-SD-NEXT: sub sp, sp, #48
|
|
; CHECK-FP16-SD-NEXT: str x30, [sp, #16] // 8-byte Folded Spill
|
|
; CHECK-FP16-SD-NEXT: stp x20, x19, [sp, #32] // 16-byte Folded Spill
|
|
; CHECK-FP16-SD-NEXT: .cfi_def_cfa_offset 48
|
|
; CHECK-FP16-SD-NEXT: .cfi_offset w19, -8
|
|
; CHECK-FP16-SD-NEXT: .cfi_offset w20, -16
|
|
; CHECK-FP16-SD-NEXT: .cfi_offset w30, -32
|
|
; CHECK-FP16-SD-NEXT: mov x19, x3
|
|
; CHECK-FP16-SD-NEXT: mov x20, x2
|
|
; CHECK-FP16-SD-NEXT: bl __floatuntitf
|
|
; CHECK-FP16-SD-NEXT: mov x0, x20
|
|
; CHECK-FP16-SD-NEXT: mov x1, x19
|
|
; CHECK-FP16-SD-NEXT: str q0, [sp] // 16-byte Folded Spill
|
|
; CHECK-FP16-SD-NEXT: bl __floatuntitf
|
|
; CHECK-FP16-SD-NEXT: ldp x20, x19, [sp, #32] // 16-byte Folded Reload
|
|
; CHECK-FP16-SD-NEXT: mov v1.16b, v0.16b
|
|
; CHECK-FP16-SD-NEXT: ldr q0, [sp] // 16-byte Folded Reload
|
|
; CHECK-FP16-SD-NEXT: ldr x30, [sp, #16] // 8-byte Folded Reload
|
|
; CHECK-FP16-SD-NEXT: add sp, sp, #48
|
|
; CHECK-FP16-SD-NEXT: ret
|
|
;
|
|
; CHECK-NOFP16-GI-LABEL: utofp_v2i128_v2f128:
|
|
; CHECK-NOFP16-GI: // %bb.0: // %entry
|
|
; CHECK-NOFP16-GI-NEXT: sub sp, sp, #48
|
|
; CHECK-NOFP16-GI-NEXT: str x30, [sp, #16] // 8-byte Folded Spill
|
|
; CHECK-NOFP16-GI-NEXT: stp x20, x19, [sp, #32] // 16-byte Folded Spill
|
|
; CHECK-NOFP16-GI-NEXT: .cfi_def_cfa_offset 48
|
|
; CHECK-NOFP16-GI-NEXT: .cfi_offset w19, -8
|
|
; CHECK-NOFP16-GI-NEXT: .cfi_offset w20, -16
|
|
; CHECK-NOFP16-GI-NEXT: .cfi_offset w30, -32
|
|
; CHECK-NOFP16-GI-NEXT: mov x19, x2
|
|
; CHECK-NOFP16-GI-NEXT: mov x20, x3
|
|
; CHECK-NOFP16-GI-NEXT: bl __floatuntitf
|
|
; CHECK-NOFP16-GI-NEXT: mov x0, x19
|
|
; CHECK-NOFP16-GI-NEXT: mov x1, x20
|
|
; CHECK-NOFP16-GI-NEXT: str q0, [sp] // 16-byte Folded Spill
|
|
; CHECK-NOFP16-GI-NEXT: bl __floatuntitf
|
|
; CHECK-NOFP16-GI-NEXT: ldp x20, x19, [sp, #32] // 16-byte Folded Reload
|
|
; CHECK-NOFP16-GI-NEXT: mov v1.16b, v0.16b
|
|
; CHECK-NOFP16-GI-NEXT: ldr q0, [sp] // 16-byte Folded Reload
|
|
; CHECK-NOFP16-GI-NEXT: ldr x30, [sp, #16] // 8-byte Folded Reload
|
|
; CHECK-NOFP16-GI-NEXT: add sp, sp, #48
|
|
; CHECK-NOFP16-GI-NEXT: ret
|
|
;
|
|
; CHECK-FP16-GI-LABEL: utofp_v2i128_v2f128:
|
|
; CHECK-FP16-GI: // %bb.0: // %entry
|
|
; CHECK-FP16-GI-NEXT: sub sp, sp, #48
|
|
; CHECK-FP16-GI-NEXT: str x30, [sp, #16] // 8-byte Folded Spill
|
|
; CHECK-FP16-GI-NEXT: stp x20, x19, [sp, #32] // 16-byte Folded Spill
|
|
; CHECK-FP16-GI-NEXT: .cfi_def_cfa_offset 48
|
|
; CHECK-FP16-GI-NEXT: .cfi_offset w19, -8
|
|
; CHECK-FP16-GI-NEXT: .cfi_offset w20, -16
|
|
; CHECK-FP16-GI-NEXT: .cfi_offset w30, -32
|
|
; CHECK-FP16-GI-NEXT: mov x19, x2
|
|
; CHECK-FP16-GI-NEXT: mov x20, x3
|
|
; CHECK-FP16-GI-NEXT: bl __floatuntitf
|
|
; CHECK-FP16-GI-NEXT: mov x0, x19
|
|
; CHECK-FP16-GI-NEXT: mov x1, x20
|
|
; CHECK-FP16-GI-NEXT: str q0, [sp] // 16-byte Folded Spill
|
|
; CHECK-FP16-GI-NEXT: bl __floatuntitf
|
|
; CHECK-FP16-GI-NEXT: ldp x20, x19, [sp, #32] // 16-byte Folded Reload
|
|
; CHECK-FP16-GI-NEXT: mov v1.16b, v0.16b
|
|
; CHECK-FP16-GI-NEXT: ldr q0, [sp] // 16-byte Folded Reload
|
|
; CHECK-FP16-GI-NEXT: ldr x30, [sp, #16] // 8-byte Folded Reload
|
|
; CHECK-FP16-GI-NEXT: add sp, sp, #48
|
|
; CHECK-FP16-GI-NEXT: ret
|
|
entry:
|
|
%c = uitofp <2 x i128> %a to <2 x fp128>
|
|
ret <2 x fp128> %c
|
|
}
|