aboutsummaryrefslogtreecommitdiffhomepage
path: root/include/private/SkFixed.h
diff options
context:
space:
mode:
Diffstat (limited to 'include/private/SkFixed.h')
-rw-r--r--include/private/SkFixed.h16
1 files changed, 13 insertions, 3 deletions
diff --git a/include/private/SkFixed.h b/include/private/SkFixed.h
index 526b7d4509..b2eea5f624 100644
--- a/include/private/SkFixed.h
+++ b/include/private/SkFixed.h
@@ -102,9 +102,19 @@ inline SkFixed SkFixedMul_longlong(SkFixed a, SkFixed b) {
*/
SK_ALWAYS_INLINE SkFixed SkFloatToFixed_arm(float x)
{
- int32_t y;
- asm("vcvt.s32.f32 %0, %0, #16": "+t"(x));
- memcpy(&y, &x, sizeof(y));
+ int32_t y, z;
+ asm("movs %1, %3, lsl #1 \n"
+ "mov %2, #0x8E \n"
+ "sub %1, %2, %1, lsr #24 \n"
+ "mov %2, %3, lsl #8 \n"
+ "orr %2, %2, #0x80000000 \n"
+ "mov %1, %2, lsr %1 \n"
+ "it cs \n"
+ "rsbcs %1, %1, #0 \n"
+ : "=r"(x), "=&r"(y), "=&r"(z)
+ : "r"(x)
+ : "cc"
+ );
return y;
}
inline SkFixed SkFixedMul_arm(SkFixed x, SkFixed y)