- BugFix: value_param_tp must always exist
[libfirm] / ir / tv / strcalc.c
index ac54d0a..0ea940a 100644 (file)
 
 #include "config.h"
 
-#ifdef HAVE_STDLIB_H
-# include <stdlib.h>
-#endif
-#ifdef HAVE_STRING_H
-# include <string.h>  /* memset/memcmp */
-#endif
+#include <stdlib.h>
+#include <string.h>   /* memset/memcmp */
 #include <assert.h>   /* assertions */
 #include <stdio.h>    /* output for error messages */
 #include <limits.h>   /* definition of LONG_MIN, used in sc_get_val_from_long */
@@ -703,7 +699,7 @@ static void do_divmod(const char *rDividend, const char *divisor, char *quot, ch
                goto end;
 
        case -1: /* dividend < divisor */
-               memcpy(rem, rDividend, calc_buffer_size);
+               memcpy(rem, dividend, calc_buffer_size);
                goto end;
 
        default: /* unluckily division is necessary :( */
@@ -851,15 +847,11 @@ static void do_shr(const char *val1, char *buffer, long shift_cnt, int bitsize,
                carry_flag = 1;
 
        /* shift digits to the right with offset, carry and all */
-       counter = 0;
-       if ((bitsize >> 2) > shift_nib) {
-               buffer[counter] = shrs_table[_val(val1[shift_nib])][shift_mod][0];
-               counter = 1;
-       }
-       for (; counter < bitsize/4 - shift_nib; counter++) {
+       buffer[0] = shrs_table[_val(val1[shift_nib])][shift_mod][0];
+       for (counter = 1; counter < ((bitsize + 3) >> 2) - shift_nib; counter++) {
                shrs = shrs_table[_val(val1[counter + shift_nib])][shift_mod];
-               buffer[counter] = shrs[0];
-               buffer[counter-1] = or_table[_val(buffer[counter-1])][_val(shrs[1])];
+               buffer[counter]     = shrs[0];
+               buffer[counter - 1] = or_table[_val(buffer[counter-1])][_val(shrs[1])];
        }
 
        /* the last digit is special in regard of signed/unsigned shift */
@@ -1284,6 +1276,14 @@ int sc_get_bit_at(const void *value, unsigned pos) {
        return 0;
 }
 
+void sc_set_bit_at(void *value, unsigned pos)
+{
+       char *val = value;
+       unsigned nibble = pos >> 2;
+
+       val[nibble] = or_table[(int)val[nibble]][(int)shift_table[pos & 3]];
+}
+
 int sc_is_zero(const void *value) {
        const char* val = (const char *)value;
        int counter;