From 038ce16ff301caddbbeb6ea15cbbd43ced7d973d Mon Sep 17 00:00:00 2001 From: Kaz Kylheku Date: Sun, 25 Nov 2018 15:41:31 -0800 Subject: Streamline logand and logior slightly. * arith.c (logand, logior): Remove wasteful zerop tests which involve a type check. Also don't check for a == b equivalence in CHR and NUM cases; this is a rare case that just adds to the cycles and instruction count. Blindly copying and pasting this code is what led to the bug in logxor. --- arith.c | 22 ++++------------------ 1 file changed, 4 insertions(+), 18 deletions(-) diff --git a/arith.c b/arith.c index badc5d84..0f72bf24 100644 --- a/arith.c +++ b/arith.c @@ -2361,23 +2361,16 @@ val logand(val a, val b) { val c; - if (zerop(a) || zerop(b)) - return zero; - switch (TYPE_PAIR(type(a), type(b))) { case TYPE_PAIR(NUM, CHR): case TYPE_PAIR(CHR, NUM): - if (a == b) { - return a; - } else { + { cnum ac = c_n(a); cnum bc = c_n(b); return chr(ac & bc); } case TYPE_PAIR(NUM, NUM): - if (a == b) { - return a; - } else { + { cnum ac = c_n(a); cnum bc = c_n(b); return num_fast(ac & bc); @@ -2411,23 +2404,16 @@ val logior(val a, val b) { val c; - if (zerop(a) && zerop(b)) - return zero; - switch (TYPE_PAIR(type(a), type(b))) { case TYPE_PAIR(NUM, CHR): case TYPE_PAIR(CHR, NUM): - if (a == b) { - return a; - } else { + { cnum ac = c_n(a); cnum bc = c_n(b); return chr(ac | bc); } case TYPE_PAIR(NUM, NUM): - if (a == b) { - return a; - } else { + { cnum ac = c_n(a); cnum bc = c_n(b); return num_fast(ac | bc); -- cgit v1.2.3