125428Speter//===-- fixunssfsivfp.S - Implement fixunssfsivfp -------------------------===//
250477Speter//
325428Speter// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
425428Speter// See https://llvm.org/LICENSE.txt for license information.
525428Speter// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
625428Speter//
725428Speter//===----------------------------------------------------------------------===//
825428Speter
925428Speter#include "../assembly.h"
1025428Speter
1125428Speter//
1225428Speter// extern unsigned int __fixunssfsivfp(float a);
1325428Speter//
1425428Speter// Converts single precision float to a 32-bit unsigned int rounding towards
1525428Speter// zero. All negative values become zero.
1625428Speter// Uses Darwin calling convention where a single precision parameter is
1725428Speter// passed in a GPR..
1825428Speter//
1925428Speter	.syntax unified
2025428Speter	.p2align 2
2125428SpeterDEFINE_COMPILERRT_FUNCTION(__fixunssfsivfp)
2225428Speter#if defined(COMPILER_RT_ARMHF_TARGET)
2325428Speter	vcvt.u32.f32 s0, s0
2425428Speter	vmov r0, s0
2525428Speter#else
2625428Speter	vmov	s15, r0        // load float register from R0
2725428Speter	vcvt.u32.f32 s15, s15  // convert single to 32-bit unsigned into s15
2825428Speter	vmov	r0, s15	       // move s15 to result register
2925428Speter#endif
3025428Speter	bx	lr
3125428SpeterEND_COMPILERRT_FUNCTION(__fixunssfsivfp)
3225428Speter
3325428SpeterNO_EXEC_STACK_DIRECTIVE
3425428Speter
3525428Speter