summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlexei Podtelezhnikov <apodtele@gmail.com>2021-08-26 16:49:59 +0000
committerAlexei Podtelezhnikov <apodtele@gmail.com>2021-08-29 21:55:19 +0000
commit930140e919a10a732738fae7cfc1ec8210cf5079 (patch)
tree1c083c94b429e7c64afb968741e44e7ac0fc21f9
parentd1c20005042a31fba7e86603b0f65fcbf21fe51c (diff)
downloadfreetype2-multiply-shift.tar.gz
[smooth] Reduce shift in multiply-shift optimization. multiply-shift
Smaller shifts that keep the division operands of FT_UDIVPREP within 32 bits result in slightly faster divisions, which is noticeable in the overall performance. The loss of precision is tolerable until the divisors (the components dx and dy) approach 32 - PIXEL_BITS. With PIXEL_BITS = 8, this corresponds to 65,000 pixels or the bitmap size that we refuse to render anyway. Using `ftbench -p -s60 -t5 -bc timesi.ttf`, Before: 8.52 us/op After: 8.32 us/op
-rw-r--r--src/smooth/ftgrays.c9
1 files changed, 4 insertions, 5 deletions
diff --git a/src/smooth/ftgrays.c b/src/smooth/ftgrays.c
index 576dbb325..2c0c1ba32 100644
--- a/src/smooth/ftgrays.c
+++ b/src/smooth/ftgrays.c
@@ -386,12 +386,11 @@ typedef ptrdiff_t FT_PtrDist;
/* divisors to provide sufficient accuracy of the multiply-shift. */
/* It should not exceed (64 - PIXEL_BITS) to prevent overflowing and */
/* leave enough room for 64-bit unsigned multiplication however. */
-#define FT_UDIVPREP( c, b ) \
- FT_Int64 b ## _r = c ? (FT_Int64)( ~(FT_UInt64)0 >> PIXEL_BITS ) / ( b ) \
+#define FT_UDIVPREP( c, b ) \
+ FT_Int64 b ## _r = c ? (FT_Int64)0xFFFFFFFF / ( b ) \
: 0
-#define FT_UDIV( a, b ) \
- (TCoord)( ( (FT_UInt64)( a ) * (FT_UInt64)( b ## _r ) ) >> \
- ( sizeof( FT_UInt64 ) * FT_CHAR_BIT - PIXEL_BITS ) )
+#define FT_UDIV( a, b ) \
+ (TCoord)( ( (FT_UInt64)( a ) * (FT_UInt64)( b ## _r ) ) >> 32 )
/* Scale area and apply fill rule to calculate the coverage byte. */