| ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py |
| ; RUN: llc -verify-machineinstrs -o - %s -mtriple=arm64-apple-ios7.0 | FileCheck %s |
| |
| declare float @fabsf(float) readonly |
| declare double @fabs(double) readonly |
| |
| declare float @llvm.sqrt.f32(float %Val) |
| declare double @llvm.sqrt.f64(double %Val) |
| |
| declare float @ceilf(float) readonly |
| declare double @ceil(double) readonly |
| |
| declare float @floorf(float) readonly |
| declare double @floor(double) readonly |
| |
| declare float @truncf(float) readonly |
| declare double @trunc(double) readonly |
| |
| declare float @rintf(float) readonly |
| declare double @rint(double) readonly |
| |
| declare float @nearbyintf(float) readonly |
| declare double @nearbyint(double) readonly |
| |
| define float @fabs_f(float %v) { |
| ; CHECK-LABEL: fabs_f: |
| ; CHECK: ; %bb.0: |
| ; CHECK-NEXT: fabs s0, s0 |
| ; CHECK-NEXT: ret |
| %r = call float @fabsf(float %v) |
| ret float %r |
| } |
| |
| define float @fsub_f(float %v) { |
| ; CHECK-LABEL: fsub_f: |
| ; CHECK: ; %bb.0: |
| ; CHECK-NEXT: fneg s0, s0 |
| ; CHECK-NEXT: ret |
| %r = fsub float -0.0, %v |
| ret float %r |
| } |
| |
| define float @sqrt_f(float %v) { |
| ; CHECK-LABEL: sqrt_f: |
| ; CHECK: ; %bb.0: |
| ; CHECK-NEXT: fsqrt s0, s0 |
| ; CHECK-NEXT: ret |
| %r = call float @llvm.sqrt.f32(float %v) |
| ret float %r |
| } |
| |
| define float @ceil_f(float %v) { |
| ; CHECK-LABEL: ceil_f: |
| ; CHECK: ; %bb.0: |
| ; CHECK-NEXT: frintp s0, s0 |
| ; CHECK-NEXT: ret |
| %r = call float @ceilf(float %v) |
| ret float %r |
| } |
| |
| define float @floor_f(float %v) { |
| ; CHECK-LABEL: floor_f: |
| ; CHECK: ; %bb.0: |
| ; CHECK-NEXT: frintm s0, s0 |
| ; CHECK-NEXT: ret |
| %r = call float @floorf(float %v) |
| ret float %r |
| } |
| |
| define float @trunc_f(float %v) { |
| ; CHECK-LABEL: trunc_f: |
| ; CHECK: ; %bb.0: |
| ; CHECK-NEXT: frintz s0, s0 |
| ; CHECK-NEXT: ret |
| %r = call float @truncf(float %v) |
| ret float %r |
| } |
| |
| define float @rint_f(float %v) { |
| ; CHECK-LABEL: rint_f: |
| ; CHECK: ; %bb.0: |
| ; CHECK-NEXT: frintx s0, s0 |
| ; CHECK-NEXT: ret |
| %r = call float @rintf(float %v) |
| ret float %r |
| } |
| |
| define float @nearbyint_f(float %v) { |
| ; CHECK-LABEL: nearbyint_f: |
| ; CHECK: ; %bb.0: |
| ; CHECK-NEXT: frinti s0, s0 |
| ; CHECK-NEXT: ret |
| %r = call float @nearbyintf(float %v) |
| ret float %r |
| } |
| |
| define double @fabs_d(double %v) { |
| ; CHECK-LABEL: fabs_d: |
| ; CHECK: ; %bb.0: |
| ; CHECK-NEXT: fabs d0, d0 |
| ; CHECK-NEXT: ret |
| %r = call double @fabs(double %v) |
| ret double %r |
| } |
| |
| define double @fsub_d(double %v) { |
| ; CHECK-LABEL: fsub_d: |
| ; CHECK: ; %bb.0: |
| ; CHECK-NEXT: fneg d0, d0 |
| ; CHECK-NEXT: ret |
| %r = fsub double -0.0, %v |
| ret double %r |
| } |
| |
| define double @sqrt_d(double %v) { |
| ; CHECK-LABEL: sqrt_d: |
| ; CHECK: ; %bb.0: |
| ; CHECK-NEXT: fsqrt d0, d0 |
| ; CHECK-NEXT: ret |
| %r = call double @llvm.sqrt.f64(double %v) |
| ret double %r |
| } |
| |
| define double @ceil_d(double %v) { |
| ; CHECK-LABEL: ceil_d: |
| ; CHECK: ; %bb.0: |
| ; CHECK-NEXT: frintp d0, d0 |
| ; CHECK-NEXT: ret |
| %r = call double @ceil(double %v) |
| ret double %r |
| } |
| |
| define double @floor_d(double %v) { |
| ; CHECK-LABEL: floor_d: |
| ; CHECK: ; %bb.0: |
| ; CHECK-NEXT: frintm d0, d0 |
| ; CHECK-NEXT: ret |
| %r = call double @floor(double %v) |
| ret double %r |
| } |
| |
| define double @trunc_d(double %v) { |
| ; CHECK-LABEL: trunc_d: |
| ; CHECK: ; %bb.0: |
| ; CHECK-NEXT: frintz d0, d0 |
| ; CHECK-NEXT: ret |
| %r = call double @trunc(double %v) |
| ret double %r |
| } |
| |
| define double @rint_d(double %v) { |
| ; CHECK-LABEL: rint_d: |
| ; CHECK: ; %bb.0: |
| ; CHECK-NEXT: frintx d0, d0 |
| ; CHECK-NEXT: ret |
| %r = call double @rint(double %v) |
| ret double %r |
| } |
| |
| define double @nearbyint_d(double %v) { |
| ; CHECK-LABEL: nearbyint_d: |
| ; CHECK: ; %bb.0: |
| ; CHECK-NEXT: frinti d0, d0 |
| ; CHECK-NEXT: ret |
| %r = call double @nearbyint(double %v) |
| ret double %r |
| } |
| |
| define float @conv_h_f(half %v) { |
| ; CHECK-LABEL: conv_h_f: |
| ; CHECK: ; %bb.0: |
| ; CHECK-NEXT: fcvt s0, h0 |
| ; CHECK-NEXT: ret |
| %r = fpext half %v to float |
| ret float %r |
| } |
| |
| define double @conv_h_d(half %v) { |
| ; CHECK-LABEL: conv_h_d: |
| ; CHECK: ; %bb.0: |
| ; CHECK-NEXT: fcvt d0, h0 |
| ; CHECK-NEXT: ret |
| %r = fpext half %v to double |
| ret double %r |
| } |
| |
| define half @conv_f_h(float %v) { |
| ; CHECK-LABEL: conv_f_h: |
| ; CHECK: ; %bb.0: |
| ; CHECK-NEXT: fcvt h0, s0 |
| ; CHECK-NEXT: ret |
| %r = fptrunc float %v to half |
| ret half %r |
| } |
| |
| define double @conv_f_d(float %v) { |
| ; CHECK-LABEL: conv_f_d: |
| ; CHECK: ; %bb.0: |
| ; CHECK-NEXT: fcvt d0, s0 |
| ; CHECK-NEXT: ret |
| %r = fpext float %v to double |
| ret double %r |
| } |
| |
| define half @conv_d_h(double %v) { |
| ; CHECK-LABEL: conv_d_h: |
| ; CHECK: ; %bb.0: |
| ; CHECK-NEXT: fcvt h0, d0 |
| ; CHECK-NEXT: ret |
| %r = fptrunc double %v to half |
| ret half %r |
| } |
| |
| define float @conv_d_f(double %v) { |
| ; CHECK-LABEL: conv_d_f: |
| ; CHECK: ; %bb.0: |
| ; CHECK-NEXT: fcvt s0, d0 |
| ; CHECK-NEXT: ret |
| %r = fptrunc double %v to float |
| ret float %r |
| } |