Minor changes
[libfirm] / ir / tv / strcalc.c
index 698483e..10bf885 100644 (file)
@@ -924,10 +924,11 @@ int sc_get_buffer_length(void) {
 /**
  * Do sign extension if the mode is signed, otherwise to zero extension.
  */
-void sign_extend(char *calc_buffer, ir_mode *mode) {
-       int bits    = get_mode_size_bits(mode) - 1;
-       int nibble  = bits >> 2;
-       int max     = max_digit[bits & 3];
+void sign_extend(void *buffer, ir_mode *mode) {
+       char *calc_buffer = buffer;
+       int bits          = get_mode_size_bits(mode) - 1;
+       int nibble        = bits >> 2;
+       int max           = max_digit[bits & 3];
        int i;
 
        if (mode_is_signed(mode)) {
@@ -1267,13 +1268,17 @@ unsigned char sc_sub_bits(const void *value, int len, unsigned byte_ofs) {
        unsigned char res;
 
        /* the current scheme uses one byte to store a nibble */
-       if (nibble_ofs >= len)
+       if (4 * nibble_ofs >= len)
                return 0;
 
        res = _val(val[nibble_ofs]);
-       if (len > nibble_ofs + 1)
+       if (len > 4 * (nibble_ofs + 1))
                res |= _val(val[nibble_ofs + 1]) << 4;
 
+       /* kick bits outsize */
+       if (len < 8*byte_ofs) {
+               res &= 0xFF >> (8*byte_ofs - len);
+       }
        return res;
 }