pp_divide: use modulo instead of multiplication
authorTomasz Konojacki <me@xenu.pl>
Mon, 15 Oct 2018 03:24:27 +0000 (05:24 +0200)
committerTony Cook <tony@develop-help.com>
Fri, 2 Nov 2018 03:53:42 +0000 (14:53 +1100)
On most architectures with hardware integer division (like
x86 or aarch64), division instruction returns both the remainder
and the quotient. It means that performing modulo operation
immediately after division using the same operands is 100% free.

Essentially this commit changes "div" and "mul" into a single "div"
instruction, which results in minor speed up.

[perl #133511]

pp.c

diff --git a/pp.c b/pp.c
index 33eac60..cfa343f 100644 (file)
--- a/pp.c
+++ b/pp.c
@@ -1503,8 +1503,11 @@ PP(pp_divide)
 #endif
                 ) {
                 /* Integer division can't overflow, but it can be imprecise.  */
+
+                /* Modern compilers optimize division followed by
+                 * modulo into a single div instruction */
                const UV result = left / right;
-                if (result * right == left) {
+                if (left % right == 0) {
                     SP--; /* result is valid */
                     if (left_non_neg == right_non_neg) {
                         /* signs identical, result is positive.  */