summaryrefslogtreecommitdiffstats
path: root/tinySIGCOMP/asm/deflate.asm
diff options
context:
space:
mode:
Diffstat (limited to 'tinySIGCOMP/asm/deflate.asm')
-rw-r--r--tinySIGCOMP/asm/deflate.asm131
1 files changed, 131 insertions, 0 deletions
diff --git a/tinySIGCOMP/asm/deflate.asm b/tinySIGCOMP/asm/deflate.asm
new file mode 100644
index 0000000..041b5ea
--- /dev/null
+++ b/tinySIGCOMP/asm/deflate.asm
@@ -0,0 +1,131 @@
+at (32)
+readonly (0)
+
+:index pad (2)
+:extra_length_bits pad (2)
+:len_value pad (2)
+:extra_dist_bits pad (2)
+:dist_value pad (2)
+
+
+at (42)
+
+:req_feed_loc pad (1)
+:req_feed_len pad (1)
+:req_feed_field pad (12)
+:hash_start pad (8)
+
+at (64)
+
+:byte_copy_left pad (2)
+:byte_copy_right pad (2)
+:input_bit_order pad (2)
+:decompressed_ptr pad (2)
+:length_table pad (116)
+:distance_table pad (120)
+
+:hash_len_loc pad (2)
+:state_len_loc pad (2)
+:ret_params_loc pad (1)
+:sigcomp_version pad (1)
+
+align (64)
+
+
+readonly (1)
+:initialize_memory
+
+set (udvm_memory_size, 8192)
+set (length_table_start, (((length_table - 4) / 4) + 16384))
+set (length_table_mid, (length_table_start + 24))
+set (dist_table_start, (distance_table / 4))
+
+MULTILOAD (64, 122, circular_buffer, udvm_memory_size, 5,
+circular_buffer,
+
+0, 3, 0, 4, 0, 5,
+0, 6, 0, 7, 0, 8,
+0, 9, 0, 10, 1, 11,
+1, 13, 1, 15, 1, 17,
+2, 19, 2, 23, 2, 27,
+2, 31, 3, 35, 3, 43,
+3, 51, 3, 59, 4, 67,
+4, 83, 4, 99, 4, 115,
+5, 131, 5, 163, 5, 195,
+5, 227, 0, 258,
+
+0, 1, 0, 2, 0, 3,
+0, 4, 1, 5, 1, 7,
+2, 9, 2, 13, 3, 17,
+3, 25, 4, 33, 4, 49,
+5, 65, 5, 97, 6, 129,
+6, 193, 7, 257, 7, 385,
+8, 513, 8, 769, 9, 1025,
+9, 1537, 10, 2049, 10, 3073,
+11, 4097, 11, 6145, 12, 8193,
+12, 12289, 13, 16385, 13, 24577)
+
+; -- hash_len, state_len, params, version, dicts
+INPUT-BYTES (6, hash_len_loc, !)
+LOAD (66, $state_len_loc)
+ADD(66, 64)
+
+
+:decompress_sigcomp_msg
+
+:start_decomp
+
+INPUT-BITS (3, extra_length_bits, !)
+
+:next_char
+
+INPUT-HUFFMAN (index, end_of_msg, 4,
+ 7, 0, 23, length_table_start,
+ 1, 48, 191, 0,
+ 0, 192, 199, length_table_mid,
+ 1, 400, 511, 144)
+COMPARE ($index, length_table_start, literal, end_of_msg,
+length_distance)
+
+:literal
+
+set (index_lsb, (index + 1))
+
+OUTPUT (index_lsb, 1)
+COPY-LITERAL (index_lsb, 1, $decompressed_ptr)
+JUMP (next_char)
+
+:length_distance
+
+; this is the length part
+
+MULTIPLY ($index, 4)
+COPY ($index, 4, extra_length_bits)
+INPUT-BITS ($extra_length_bits, extra_length_bits, !)
+ADD ($len_value, $extra_length_bits)
+
+; this is the distance part
+
+INPUT-HUFFMAN (index, !, 1, 5, 0, 31, dist_table_start)
+MULTIPLY ($index, 4)
+COPY ($index, 4, extra_dist_bits)
+
+
+INPUT-BITS ($extra_dist_bits, extra_dist_bits, !)
+ADD ($dist_value, $extra_dist_bits)
+LOAD (index, $decompressed_ptr)
+COPY-OFFSET ($dist_value, $len_value, $decompressed_ptr)
+OUTPUT ($index, $len_value)
+JUMP (next_char)
+
+:end_of_msg
+
+
+LOAD (req_feed_loc, 1158)
+MULTILOAD (hash_start, 4, $state_len_loc, 64, decompress_sigcomp_msg, 6)
+SHA-1 (hash_start, $hash_len_loc, req_feed_field)
+
+END-MESSAGE (req_feed_loc, ret_params_loc, $state_len_loc, 64, decompress_sigcomp_msg, 6, 0)
+
+readonly (0)
+:circular_buffer \ No newline at end of file
OpenPOWER on IntegriCloud