shithub: scc

Download patch

ref: 4d2efcd9e1fb32a723e0ed9222c12d07cf782f0b
parent: 24e2f336e79216f6c8d91a74eb4cdf88a5749434
author: Roberto E. Vargas Caballero <k0ga@shike2.com>
date: Tue Sep 26 06:56:48 EDT 2017

[as] Reduce the number of calls to casecmp()

In both cases the common case is to have a different first letter,
so this small optimize improves a lot the performance in both cases.

--- a/as/main.c
+++ b/as/main.c
@@ -1,5 +1,6 @@
 static char sccsid[] = "@(#) ./as/main.c";
 
+#include <ctype.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
@@ -17,8 +18,14 @@
 cmp(const void *f1, const void *f2)
 {
 	const Ins *ins = f2;
+	const char *s = f1;
+	int d;
 
-	return casecmp(f1, ins->str);
+	d = toupper(*ins->str) - toupper(*s);
+	if (d != 0)
+		return d;
+
+	return casecmp(s, ins->str);
 }
 
 static void
--- a/as/symbol.c
+++ b/as/symbol.c
@@ -56,11 +56,11 @@
 		h = h*33 ^ c;
 	h &= HASHSIZ-1;
 
-	c = *name;
+	c = toupper(*name);
 	list = &hashtbl[h];
 	for (sym = *list; sym; sym = sym->next) {
 		t = sym->name;
-		if (c == *t && !casecmp(t, name))
+		if (c == toupper(*t) && !casecmp(t, name))
 			return sym;
 	}