| ; NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py UTC_ARGS: --version 6 | |
| ; RUN: llc -mtriple=mips64el-linux-gnu -mcpu=mips64r6 -stop-after=finalize-isel < %s | FileCheck %s | |
| ; Non-strict rint is selected with nofpexcept; strict rint keeps its FP | |
| ; exception semantics. | |
| define float @rint_f32(float %x) { | |
| ; CHECK-LABEL: name: rint_f32 | |
| ; CHECK: bb.0 (%ir-block.0): | |
| ; CHECK-NEXT: liveins: $f12 | |
| ; CHECK-NEXT: {{ $}} | |
| ; CHECK-NEXT: [[COPY:%[0-9]+]]:fgr32 = COPY $f12 | |
| ; CHECK-NEXT: [[RINT_S:%[0-9]+]]:fgr32 = nofpexcept RINT_S [[COPY]], implicit $fcr31 | |
| ; CHECK-NEXT: $f0 = COPY [[RINT_S]] | |
| ; CHECK-NEXT: RetRA implicit $f0 | |
| %r = call float @llvm.rint.f32(float %x) | |
| ret float %r | |
| } | |
| define double @rint_f64(double %x) { | |
| ; CHECK-LABEL: name: rint_f64 | |
| ; CHECK: bb.0 (%ir-block.0): | |
| ; CHECK-NEXT: liveins: $d12_64 | |
| ; CHECK-NEXT: {{ $}} | |
| ; CHECK-NEXT: [[COPY:%[0-9]+]]:fgr64 = COPY $d12_64 | |
| ; CHECK-NEXT: [[RINT_D:%[0-9]+]]:fgr64 = nofpexcept RINT_D [[COPY]], implicit $fcr31 | |
| ; CHECK-NEXT: $d0_64 = COPY [[RINT_D]] | |
| ; CHECK-NEXT: RetRA implicit $d0_64 | |
| %r = call double @llvm.rint.f64(double %x) | |
| ret double %r | |
| } | |
| define float @strict_rint_f32(float %x) #0 { | |
| ; CHECK-LABEL: name: strict_rint_f32 | |
| ; CHECK: bb.0 (%ir-block.0): | |
| ; CHECK-NEXT: liveins: $f12 | |
| ; CHECK-NEXT: {{ $}} | |
| ; CHECK-NEXT: [[COPY:%[0-9]+]]:fgr32 = COPY $f12 | |
| ; CHECK-NEXT: [[RINT_S:%[0-9]+]]:fgr32 = RINT_S [[COPY]], implicit $fcr31 | |
| ; CHECK-NEXT: $f0 = COPY [[RINT_S]] | |
| ; CHECK-NEXT: RetRA implicit $f0 | |
| %r = call float @llvm.experimental.constrained.rint.f32(float %x, metadata !"round.dynamic", metadata !"fpexcept.strict") #0 | |
| ret float %r | |
| } | |
| define double @strict_rint_f64(double %x) #0 { | |
| ; CHECK-LABEL: name: strict_rint_f64 | |
| ; CHECK: bb.0 (%ir-block.0): | |
| ; CHECK-NEXT: liveins: $d12_64 | |
| ; CHECK-NEXT: {{ $}} | |
| ; CHECK-NEXT: [[COPY:%[0-9]+]]:fgr64 = COPY $d12_64 | |
| ; CHECK-NEXT: [[RINT_D:%[0-9]+]]:fgr64 = RINT_D [[COPY]], implicit $fcr31 | |
| ; CHECK-NEXT: $d0_64 = COPY [[RINT_D]] | |
| ; CHECK-NEXT: RetRA implicit $d0_64 | |
| %r = call double @llvm.experimental.constrained.rint.f64(double %x, metadata !"round.dynamic", metadata !"fpexcept.strict") #0 | |
| ret double %r | |
| } | |
| attributes #0 = { strictfp } |