; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5
; RUN: llc -verify-machineinstrs -mtriple=aarch64 < %s | FileCheck %s

define void @f32_to_u8(float %f, ptr %dst) {
; CHECK-LABEL: f32_to_u8:
; CHECK:       // %bb.0: // %entry
; CHECK-NEXT:    fcvtzu s0, s0
; CHECK-NEXT:    str b0, [x0]
; CHECK-NEXT:    ret
entry:
  %conv = fptoui float %f to i32
  %trunc = trunc i32 %conv to i8
  store i8 %trunc, ptr %dst
  ret void
}

define void @f32_to_s8(float %f, ptr %dst) {
; CHECK-LABEL: f32_to_s8:
; CHECK:       // %bb.0: // %entry
; CHECK-NEXT:    fcvtzs s0, s0
; CHECK-NEXT:    str b0, [x0]
; CHECK-NEXT:    ret
entry:
  %conv = fptosi float %f to i32
  %trunc = trunc i32 %conv to i8
  store i8 %trunc, ptr %dst
  ret void
}

define void @f32_to_u16(float %f, ptr %dst) {
; CHECK-LABEL: f32_to_u16:
; CHECK:       // %bb.0: // %entry
; CHECK-NEXT:    fcvtzu s0, s0
; CHECK-NEXT:    str h0, [x0]
; CHECK-NEXT:    ret
entry:
  %conv = fptoui float %f to i32
  %trunc = trunc i32 %conv to i16
  store i16 %trunc, ptr %dst
  ret void
}

define void @f32_to_s16(float %f, ptr %dst) {
; CHECK-LABEL: f32_to_s16:
; CHECK:       // %bb.0: // %entry
; CHECK-NEXT:    fcvtzs s0, s0
; CHECK-NEXT:    str h0, [x0]
; CHECK-NEXT:    ret
entry:
  %conv = fptosi float %f to i32
  %trunc = trunc i32 %conv to i16
  store i16 %trunc, ptr %dst
  ret void
}

define void @f32_to_u32(float %f, ptr %dst) {
; CHECK-LABEL: f32_to_u32:
; CHECK:       // %bb.0: // %entry
; CHECK-NEXT:    fcvtzu s0, s0
; CHECK-NEXT:    str s0, [x0]
; CHECK-NEXT:    ret
entry:
  %conv = fptoui float %f to i32
  store i32 %conv, ptr %dst
  ret void
}

define void @f32_to_s32(float %f, ptr %dst) {
; CHECK-LABEL: f32_to_s32:
; CHECK:       // %bb.0: // %entry
; CHECK-NEXT:    fcvtzs s0, s0
; CHECK-NEXT:    str s0, [x0]
; CHECK-NEXT:    ret
entry:
  %conv = fptosi float %f to i32
  store i32 %conv, ptr %dst
  ret void
}

define void @f32_to_s64(float %f, ptr %dst) {
; CHECK-LABEL: f32_to_s64:
; CHECK:       // %bb.0: // %entry
; CHECK-NEXT:    fcvtzs w8, s0
; CHECK-NEXT:    sxtw x8, w8
; CHECK-NEXT:    str x8, [x0]
; CHECK-NEXT:    ret
entry:
  %conv = fptosi float %f to i32
  %ext = sext i32 %conv to i64
  store i64 %ext, ptr %dst
  ret void
}

define void @f64_to_u64(double %d, ptr %dst) {
; CHECK-LABEL: f64_to_u64:
; CHECK:       // %bb.0: // %entry
; CHECK-NEXT:    fcvtzu d0, d0
; CHECK-NEXT:    str d0, [x0]
; CHECK-NEXT:    ret
entry:
  %conv = fptoui double %d to i64
  store i64 %conv, ptr %dst
  ret void
}

define void @f64_to_s64(double %d, ptr %dst) {
; CHECK-LABEL: f64_to_s64:
; CHECK:       // %bb.0: // %entry
; CHECK-NEXT:    fcvtzs d0, d0
; CHECK-NEXT:    str d0, [x0]
; CHECK-NEXT:    ret
entry:
  %conv = fptosi double %d to i64
  store i64 %conv, ptr %dst
  ret void
}

define i32 @f32_to_i32_multiple_uses(float %f, ptr %dst) {
; CHECK-LABEL: f32_to_i32_multiple_uses:
; CHECK:       // %bb.0: // %entry
; CHECK-NEXT:    fcvtzs w8, s0
; CHECK-NEXT:    mov x9, x0
; CHECK-NEXT:    mov w0, w8
; CHECK-NEXT:    strb w8, [x9]
; CHECK-NEXT:    ret
entry:
  %conv = fptosi float %f to i32
  %trunc = trunc i32 %conv to i8
  store i8 %trunc, ptr %dst
  ret i32 %conv
}
