-/* XXX doesn't check for overflows */
-void sc_val_from_str(const char *str, unsigned int len)
+/**
+ * Do sign extension if the mode is signed, expects all upper bits
+ * cleared.
+ */
+void sign_extend(char *calc_buffer, ir_mode *mode) {
+ if (mode_is_signed(mode)) {
+ int bits = get_mode_size_bits(mode) - 1;
+ int ofs = bits >> 2;
+ int max = max_digit[bits & 3];
+ int i;
+
+ if (calc_buffer[ofs] > max) {
+ /* sign bit is set, we need sign expansion */
+
+ for (i = ofs + 1; i < calc_buffer_size; ++i)
+ calc_buffer[i] = SC_F;
+ calc_buffer[ofs] = or_table[(int) calc_buffer[ofs]][(int) sex_digit[bits & 3]];
+ }
+ }
+}
+
+/* FIXME doesn't check for overflows */
+void sc_val_from_str(const char *str, unsigned int len, void *buffer, ir_mode *mode)