summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKaz Kylheku <kaz@kylheku.com>2018-11-25 15:41:31 -0800
committerKaz Kylheku <kaz@kylheku.com>2018-11-25 15:41:31 -0800
commit038ce16ff301caddbbeb6ea15cbbd43ced7d973d (patch)
tree47fd2c5dc76ba9d02ce502802739a33a28322f5c
parent6395346bee2382d0e800ce28593c48ad3bab9792 (diff)
downloadtxr-038ce16ff301caddbbeb6ea15cbbd43ced7d973d.tar.gz
txr-038ce16ff301caddbbeb6ea15cbbd43ced7d973d.tar.bz2
txr-038ce16ff301caddbbeb6ea15cbbd43ced7d973d.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.c22
1 files 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);