|
|
|
@ -608,13 +608,14 @@ parse_Bitno16R (CGEN_CPU_DESC cd, const char **strp, |
|
|
|
static const char * |
|
|
|
parse_unsigned_bitbase (CGEN_CPU_DESC cd, const char **strp, |
|
|
|
int opindex, unsigned long *valuep, |
|
|
|
unsigned bits) |
|
|
|
unsigned bits, int allow_syms) |
|
|
|
{ |
|
|
|
const char *errmsg = 0; |
|
|
|
unsigned long bit; |
|
|
|
unsigned long base; |
|
|
|
const char *newp = *strp; |
|
|
|
unsigned long long bitbase; |
|
|
|
long have_zero = 0; |
|
|
|
|
|
|
|
errmsg = cgen_parse_unsigned_integer (cd, & newp, opindex, & bit); |
|
|
|
if (errmsg) |
|
|
|
@ -624,6 +625,11 @@ parse_unsigned_bitbase (CGEN_CPU_DESC cd, const char **strp, |
|
|
|
return "Missing base for bit,base:8"; |
|
|
|
|
|
|
|
++newp; |
|
|
|
|
|
|
|
if (strncmp (newp, "0x0", 3) == 0 |
|
|
|
|| (newp[0] == '0' && newp[1] != 'x')) |
|
|
|
have_zero = 1; |
|
|
|
|
|
|
|
errmsg = cgen_parse_unsigned_integer (cd, & newp, opindex, & base); |
|
|
|
if (errmsg) |
|
|
|
return errmsg; |
|
|
|
@ -633,6 +639,21 @@ parse_unsigned_bitbase (CGEN_CPU_DESC cd, const char **strp, |
|
|
|
if (bitbase >= (1ull << bits)) |
|
|
|
return _("bit,base is out of range"); |
|
|
|
|
|
|
|
/* If this field may require a relocation then use larger displacement. */ |
|
|
|
if (! have_zero && base == 0) |
|
|
|
{ |
|
|
|
switch (allow_syms) { |
|
|
|
case 0: |
|
|
|
return _("bit,base out of range for symbol"); |
|
|
|
case 1: |
|
|
|
break; |
|
|
|
case 2: |
|
|
|
if (strncmp (newp, "[sb]", 4) != 0) |
|
|
|
return _("bit,base out of range for symbol"); |
|
|
|
break; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
*valuep = bitbase; |
|
|
|
*strp = newp; |
|
|
|
return 0; |
|
|
|
@ -641,7 +662,7 @@ parse_unsigned_bitbase (CGEN_CPU_DESC cd, const char **strp, |
|
|
|
static const char * |
|
|
|
parse_signed_bitbase (CGEN_CPU_DESC cd, const char **strp, |
|
|
|
int opindex, signed long *valuep, |
|
|
|
unsigned bits) |
|
|
|
unsigned bits, int allow_syms) |
|
|
|
{ |
|
|
|
const char *errmsg = 0; |
|
|
|
unsigned long bit; |
|
|
|
@ -649,6 +670,7 @@ parse_signed_bitbase (CGEN_CPU_DESC cd, const char **strp, |
|
|
|
const char *newp = *strp; |
|
|
|
long long bitbase; |
|
|
|
long long limit; |
|
|
|
long have_zero = 0; |
|
|
|
|
|
|
|
errmsg = cgen_parse_unsigned_integer (cd, & newp, opindex, & bit); |
|
|
|
if (errmsg) |
|
|
|
@ -658,6 +680,11 @@ parse_signed_bitbase (CGEN_CPU_DESC cd, const char **strp, |
|
|
|
return "Missing base for bit,base:8"; |
|
|
|
|
|
|
|
++newp; |
|
|
|
|
|
|
|
if (strncmp (newp, "0x0", 3) == 0 |
|
|
|
|| (newp[0] == '0' && newp[1] != 'x')) |
|
|
|
have_zero = 1; |
|
|
|
|
|
|
|
errmsg = cgen_parse_signed_integer (cd, & newp, opindex, & base); |
|
|
|
if (errmsg) |
|
|
|
return errmsg; |
|
|
|
@ -668,6 +695,10 @@ parse_signed_bitbase (CGEN_CPU_DESC cd, const char **strp, |
|
|
|
if (bitbase < -limit || bitbase >= limit) |
|
|
|
return _("bit,base is out of range"); |
|
|
|
|
|
|
|
/* If this field may require a relocation then use larger displacement. */ |
|
|
|
if (! have_zero && base == 0 && ! allow_syms) |
|
|
|
return _("bit,base out of range for symbol"); |
|
|
|
|
|
|
|
*valuep = bitbase; |
|
|
|
*strp = newp; |
|
|
|
return 0; |
|
|
|
@ -677,56 +708,56 @@ static const char * |
|
|
|
parse_unsigned_bitbase8 (CGEN_CPU_DESC cd, const char **strp, |
|
|
|
int opindex, unsigned long *valuep) |
|
|
|
{ |
|
|
|
return parse_unsigned_bitbase (cd, strp, opindex, valuep, 8); |
|
|
|
return parse_unsigned_bitbase (cd, strp, opindex, valuep, 8, 0); |
|
|
|
} |
|
|
|
|
|
|
|
static const char * |
|
|
|
parse_unsigned_bitbase11 (CGEN_CPU_DESC cd, const char **strp, |
|
|
|
int opindex, unsigned long *valuep) |
|
|
|
{ |
|
|
|
return parse_unsigned_bitbase (cd, strp, opindex, valuep, 11); |
|
|
|
return parse_unsigned_bitbase (cd, strp, opindex, valuep, 11, 0); |
|
|
|
} |
|
|
|
|
|
|
|
static const char * |
|
|
|
parse_unsigned_bitbase16 (CGEN_CPU_DESC cd, const char **strp, |
|
|
|
int opindex, unsigned long *valuep) |
|
|
|
{ |
|
|
|
return parse_unsigned_bitbase (cd, strp, opindex, valuep, 16); |
|
|
|
return parse_unsigned_bitbase (cd, strp, opindex, valuep, 16, 1); |
|
|
|
} |
|
|
|
|
|
|
|
static const char * |
|
|
|
parse_unsigned_bitbase19 (CGEN_CPU_DESC cd, const char **strp, |
|
|
|
int opindex, unsigned long *valuep) |
|
|
|
{ |
|
|
|
return parse_unsigned_bitbase (cd, strp, opindex, valuep, 19); |
|
|
|
return parse_unsigned_bitbase (cd, strp, opindex, valuep, 19, 2); |
|
|
|
} |
|
|
|
|
|
|
|
static const char * |
|
|
|
parse_unsigned_bitbase27 (CGEN_CPU_DESC cd, const char **strp, |
|
|
|
int opindex, unsigned long *valuep) |
|
|
|
{ |
|
|
|
return parse_unsigned_bitbase (cd, strp, opindex, valuep, 27); |
|
|
|
return parse_unsigned_bitbase (cd, strp, opindex, valuep, 27, 1); |
|
|
|
} |
|
|
|
|
|
|
|
static const char * |
|
|
|
parse_signed_bitbase8 (CGEN_CPU_DESC cd, const char **strp, |
|
|
|
int opindex, signed long *valuep) |
|
|
|
{ |
|
|
|
return parse_signed_bitbase (cd, strp, opindex, valuep, 8); |
|
|
|
return parse_signed_bitbase (cd, strp, opindex, valuep, 8, 1); |
|
|
|
} |
|
|
|
|
|
|
|
static const char * |
|
|
|
parse_signed_bitbase11 (CGEN_CPU_DESC cd, const char **strp, |
|
|
|
int opindex, signed long *valuep) |
|
|
|
{ |
|
|
|
return parse_signed_bitbase (cd, strp, opindex, valuep, 11); |
|
|
|
return parse_signed_bitbase (cd, strp, opindex, valuep, 11, 0); |
|
|
|
} |
|
|
|
|
|
|
|
static const char * |
|
|
|
parse_signed_bitbase19 (CGEN_CPU_DESC cd, const char **strp, |
|
|
|
int opindex, signed long *valuep) |
|
|
|
{ |
|
|
|
return parse_signed_bitbase (cd, strp, opindex, valuep, 19); |
|
|
|
return parse_signed_bitbase (cd, strp, opindex, valuep, 19, 1); |
|
|
|
} |
|
|
|
|
|
|
|
/* Parse the suffix as :<char> or as nothing followed by a whitespace. */ |
|
|
|
|