FIXED_WIDE_INT(128) i
= FIXED_WIDE_INT(128)::from (real_to_integer (&value, &fail, 128), SIGNED);
- /* ??? Use native_encode_* below. */
retval = (char *)xmalloc(field->data.capacity);
switch(field->data.capacity)
{
+ tree type;
case 1:
- *(signed char *)retval = (signed char)i.slow ();
- break;
case 2:
- *(signed short *)retval = (signed short)i.slow ();
- break;
case 4:
- *(signed int *)retval = (signed int)i.slow ();
- break;
case 8:
- *(signed long *)retval = (signed long)i.slow ();
- break;
case 16:
- *(unsigned long *)retval = (unsigned long)i.ulow ();
- *((signed long *)retval + 1) = (signed long)i.shigh ();
+ type = build_nonstandard_integer_type (field->data.capacity
+ * BITS_PER_UNIT, 0);
+ native_encode_wide_int (type, i, (unsigned char *)retval,
+ field->data.capacity);
break;
default:
fprintf(stderr,
return NULL_TREE;
}
-/* Subroutine of native_encode_expr. Encode the INTEGER_CST
- specified by EXPR into the buffer PTR of length LEN bytes.
+
+/* Subroutine of native_encode_int. Encode the integer VAL with type TYPE
+ into the buffer PTR of length LEN bytes.
Return the number of bytes placed in the buffer, or zero
upon failure. */
-static int
-native_encode_int (const_tree expr, unsigned char *ptr, int len, int off)
+int
+native_encode_wide_int (tree type, const wide_int_ref &val,
+ unsigned char *ptr, int len, int off)
{
- tree type = TREE_TYPE (expr);
int total_bytes;
if (TREE_CODE (type) == BITINT_TYPE)
{
int bitpos = byte * BITS_PER_UNIT;
/* Extend EXPR according to TYPE_SIGN if the precision isn't a whole
number of bytes. */
- value = wi::extract_uhwi (wi::to_widest (expr), bitpos, BITS_PER_UNIT);
+ value = wi::extract_uhwi (val, bitpos, BITS_PER_UNIT);
if (total_bytes > UNITS_PER_WORD)
{
return MIN (len, total_bytes - off);
}
+/* Subroutine of native_encode_expr. Encode the INTEGER_CST
+ specified by EXPR into the buffer PTR of length LEN bytes.
+ Return the number of bytes placed in the buffer, or zero
+ upon failure. */
+
+static int
+native_encode_int (const_tree expr, unsigned char *ptr, int len, int off)
+{
+ return native_encode_wide_int (TREE_TYPE (expr), wi::to_widest (expr),
+ ptr, len, off);
+}
+
/* Subroutine of native_encode_expr. Encode the FIXED_CST
specified by EXPR into the buffer PTR of length LEN bytes.
extern int native_encode_expr (const_tree, unsigned char *, int, int off = -1);
extern int native_encode_initializer (tree, unsigned char *, int,
int off = -1, unsigned char * = nullptr);
+extern int native_encode_wide_int (tree, const wide_int_ref &,
+ unsigned char *, int, int off = -1);
extern int native_encode_real (scalar_float_mode, const REAL_VALUE_TYPE *,
unsigned char *, int, int off = -1);
extern tree native_interpret_expr (tree, const unsigned char *, int);