bzip2: code size shrink
authorDenis Vlasenko <vda.linux@googlemail.com>
Sun, 14 Oct 2007 01:37:53 +0000 (01:37 -0000)
committerDenis Vlasenko <vda.linux@googlemail.com>
Sun, 14 Oct 2007 01:37:53 +0000 (01:37 -0000)
archival/bz/huffman.c

index 89e54604b94b6ce964340be6ea550a7dc81d072b..f016c968caa8130e73acf6308b1c51f13fc90fd1 100644 (file)
@@ -46,10 +46,16 @@ in the file LICENSE.
        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,6 +71,30 @@ in the file LICENSE.
        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
@@ -105,8 +135,8 @@ void BZ2_hbMakeCodeLengths(uint8_t *len,
                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]);