reference, declarationdefinition
definition → references, declarations, derived classes, virtual overrides
reference to multiple definitions → definitions
unreferenced
    1
    2
    3
    4
    5
    6
    7
    8
    9
   10
   11
   12
   13
   14
   15
   16
   17
   18
   19
   20
   21
   22
   23
   24
   25
   26
   27
   28
   29
   30
   31
   32
   33
   34
   35
   36
   37
   38
   39
   40
   41
   42
   43
   44
   45
   46
   47
   48
   49
   50
   51
   52
   53
   54
   55
   56
   57
   58
   59
   60
   61
   62
   63
   64
   65
   66
   67
   68
   69
   70
   71
   72
   73
   74
   75
   76
   77
   78
   79
   80
   81
   82
   83
   84
   85
   86
   87
   88
   89
   90
   91
   92
   93
   94
   95
   96
   97
   98
   99
  100
  101
  102
  103
  104
  105
  106
  107
  108
  109
  110
  111
  112
  113
  114
  115
  116
  117
  118
  119
  120
  121
  122
  123
  124
  125
  126
  127
  128
  129
  130
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
; RUN: llc -mtriple=riscv64 -mattr=+d -verify-machineinstrs < %s \
; RUN:   | FileCheck %s -check-prefix=RV64ID

; This file exhaustively checks double<->i32 conversions. In general,
; fcvt.l[u].d can be selected instead of fcvt.w[u].d because poison is
; generated for an fpto[s|u]i conversion if the result doesn't fit in the
; target type.

define i32 @aext_fptosi(double %a) nounwind {
; RV64ID-LABEL: aext_fptosi:
; RV64ID:       # %bb.0:
; RV64ID-NEXT:    fmv.d.x ft0, a0
; RV64ID-NEXT:    fcvt.l.d a0, ft0, rtz
; RV64ID-NEXT:    ret
  %1 = fptosi double %a to i32
  ret i32 %1
}

define signext i32 @sext_fptosi(double %a) nounwind {
; RV64ID-LABEL: sext_fptosi:
; RV64ID:       # %bb.0:
; RV64ID-NEXT:    fmv.d.x ft0, a0
; RV64ID-NEXT:    fcvt.l.d a0, ft0, rtz
; RV64ID-NEXT:    ret
  %1 = fptosi double %a to i32
  ret i32 %1
}

define zeroext i32 @zext_fptosi(double %a) nounwind {
; RV64ID-LABEL: zext_fptosi:
; RV64ID:       # %bb.0:
; RV64ID-NEXT:    fmv.d.x ft0, a0
; RV64ID-NEXT:    fcvt.l.d a0, ft0, rtz
; RV64ID-NEXT:    slli a0, a0, 32
; RV64ID-NEXT:    srli a0, a0, 32
; RV64ID-NEXT:    ret
  %1 = fptosi double %a to i32
  ret i32 %1
}

define i32 @aext_fptoui(double %a) nounwind {
; RV64ID-LABEL: aext_fptoui:
; RV64ID:       # %bb.0:
; RV64ID-NEXT:    fmv.d.x ft0, a0
; RV64ID-NEXT:    fcvt.lu.d a0, ft0, rtz
; RV64ID-NEXT:    ret
  %1 = fptoui double %a to i32
  ret i32 %1
}

define signext i32 @sext_fptoui(double %a) nounwind {
; RV64ID-LABEL: sext_fptoui:
; RV64ID:       # %bb.0:
; RV64ID-NEXT:    fmv.d.x ft0, a0
; RV64ID-NEXT:    fcvt.wu.d a0, ft0, rtz
; RV64ID-NEXT:    ret
  %1 = fptoui double %a to i32
  ret i32 %1
}

define zeroext i32 @zext_fptoui(double %a) nounwind {
; RV64ID-LABEL: zext_fptoui:
; RV64ID:       # %bb.0:
; RV64ID-NEXT:    fmv.d.x ft0, a0
; RV64ID-NEXT:    fcvt.lu.d a0, ft0, rtz
; RV64ID-NEXT:    ret
  %1 = fptoui double %a to i32
  ret i32 %1
}

define double @uitofp_aext_i32_to_f64(i32 %a) nounwind {
; RV64ID-LABEL: uitofp_aext_i32_to_f64:
; RV64ID:       # %bb.0:
; RV64ID-NEXT:    fcvt.d.wu ft0, a0
; RV64ID-NEXT:    fmv.x.d a0, ft0
; RV64ID-NEXT:    ret
  %1 = uitofp i32 %a to double
  ret double %1
}

define double @uitofp_sext_i32_to_f64(i32 signext %a) nounwind {
; RV64ID-LABEL: uitofp_sext_i32_to_f64:
; RV64ID:       # %bb.0:
; RV64ID-NEXT:    fcvt.d.wu ft0, a0
; RV64ID-NEXT:    fmv.x.d a0, ft0
; RV64ID-NEXT:    ret
  %1 = uitofp i32 %a to double
  ret double %1
}

define double @uitofp_zext_i32_to_f64(i32 zeroext %a) nounwind {
; RV64ID-LABEL: uitofp_zext_i32_to_f64:
; RV64ID:       # %bb.0:
; RV64ID-NEXT:    fcvt.d.wu ft0, a0
; RV64ID-NEXT:    fmv.x.d a0, ft0
; RV64ID-NEXT:    ret
  %1 = uitofp i32 %a to double
  ret double %1
}

define double @sitofp_aext_i32_to_f64(i32 %a) nounwind {
; RV64ID-LABEL: sitofp_aext_i32_to_f64:
; RV64ID:       # %bb.0:
; RV64ID-NEXT:    fcvt.d.w ft0, a0
; RV64ID-NEXT:    fmv.x.d a0, ft0
; RV64ID-NEXT:    ret
  %1 = sitofp i32 %a to double
  ret double %1
}

define double @sitofp_sext_i32_to_f64(i32 signext %a) nounwind {
; RV64ID-LABEL: sitofp_sext_i32_to_f64:
; RV64ID:       # %bb.0:
; RV64ID-NEXT:    fcvt.d.l ft0, a0
; RV64ID-NEXT:    fmv.x.d a0, ft0
; RV64ID-NEXT:    ret
  %1 = sitofp i32 %a to double
  ret double %1
}

define double @sitofp_zext_i32_to_f64(i32 zeroext %a) nounwind {
; RV64ID-LABEL: sitofp_zext_i32_to_f64:
; RV64ID:       # %bb.0:
; RV64ID-NEXT:    fcvt.d.w ft0, a0
; RV64ID-NEXT:    fmv.x.d a0, ft0
; RV64ID-NEXT:    ret
  %1 = sitofp i32 %a to double
  ret double %1
}