diff options
author | Kaz Kylheku <kaz@kylheku.com> | 2018-11-25 15:41:31 -0800 |
---|---|---|
committer | Kaz Kylheku <kaz@kylheku.com> | 2018-11-25 15:41:31 -0800 |
commit | 4626a69d3dfd9af15c36e6cb6ef7cb881acf8819 (patch) | |
tree | 47fd2c5dc76ba9d02ce502802739a33a28322f5c | |
parent | 78f26161e1d3d75d496e7e83a0490d6d9155b2db (diff) | |
download | txr-4626a69d3dfd9af15c36e6cb6ef7cb881acf8819.tar.gz txr-4626a69d3dfd9af15c36e6cb6ef7cb881acf8819.tar.bz2 txr-4626a69d3dfd9af15c36e6cb6ef7cb881acf8819.zip |
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.
-rw-r--r-- | arith.c | 22 |
1 files changed, 4 insertions, 18 deletions
@@ -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); |