svn commit: trunk/busybox/archival/bz

vda at busybox.net vda at busybox.net
Sun Oct 14 01:37:54 UTC 2007


Author: vda
Date: 2007-10-13 18:37:53 -0700 (Sat, 13 Oct 2007)
New Revision: 20253

Log:
bzip2: code size shrink



Modified:
   trunk/busybox/archival/bz/huffman.c


Changeset:
Modified: trunk/busybox/archival/bz/huffman.c
===================================================================
--- trunk/busybox/archival/bz/huffman.c	2007-10-14 00:44:10 UTC (rev 20252)
+++ trunk/busybox/archival/bz/huffman.c	2007-10-14 01:37:53 UTC (rev 20253)
@@ -46,10 +46,16 @@
 	heap[zz] = tmp; \
 }
 
-#define DOWNHEAP(z) \
+
+/* 90 bytes, 0.3% of overall compress speed */
+#if CONFIG_BZIP2_FEATURE_SPEED >= 1
+
+/* macro works better than inline (gcc 4.2.1) */
+#define DOWNHEAP1(heap, weight, Heap) \
 { \
 	int32_t zz, yy, tmp; \
-	zz = z; tmp = heap[zz]; \
+	zz = 1; \
+	tmp = heap[zz]; \
 	while (1) { \
 		yy = zz << 1; \
 		if (yy > nHeap) \
@@ -65,7 +71,31 @@
 	heap[zz] = tmp; \
 }
 
+#else
 
+static
+void DOWNHEAP1(int32_t *heap, int32_t *weight, int32_t nHeap)
+{
+	int32_t zz, yy, tmp;
+	zz = 1;
+	tmp = heap[zz];
+	while (1) {
+		yy = zz << 1;
+		if (yy > nHeap)
+			break;
+		if (yy < nHeap
+		 && weight[heap[yy + 1]] < weight[heap[yy]])
+			yy++;
+		if (weight[tmp] < weight[heap[yy]])
+			break;
+		heap[zz] = heap[yy];
+		zz = yy;
+	}
+	heap[zz] = tmp;
+}
+
+#endif
+
 /*---------------------------------------------------*/
 static
 void BZ2_hbMakeCodeLengths(uint8_t *len,
@@ -105,8 +135,8 @@
 		AssertH(nHeap < (BZ_MAX_ALPHA_SIZE+2), 2001);
 	
 		while (nHeap > 1) {
-			n1 = heap[1]; heap[1] = heap[nHeap]; nHeap--; DOWNHEAP(1);
-			n2 = heap[1]; heap[1] = heap[nHeap]; nHeap--; DOWNHEAP(1);
+			n1 = heap[1]; heap[1] = heap[nHeap]; nHeap--; DOWNHEAP1(heap, weight, nHeap);
+			n2 = heap[1]; heap[1] = heap[nHeap]; nHeap--; DOWNHEAP1(heap, weight, nHeap);
 			nNodes++;
 			parent[n1] = parent[n2] = nNodes;
 			weight[nNodes] = ADDWEIGHTS(weight[n1], weight[n2]);




More information about the busybox-cvs mailing list