/* IP2K opcode support. -*- C -*-
Copyright (C) 2000 Red Hat, Inc.
- Copyright (C) 2002 Free Software Foundation, Inc.
+ Copyright (C) 2002, 2005 Free Software Foundation, Inc.
This file is part of CGEN. */
/*
/* -- asm.c */
#define PARSE_FUNC_DECL(name) \
-static const char *name PARAMS ((CGEN_CPU_DESC, const char **, int, long *))
+ static const char *name (CGEN_CPU_DESC, const char **, int, long *)
+#define PARSE_UFUNC_DECL(name) \
+ static const char *name (CGEN_CPU_DESC, const char **, int, unsigned long *)
-PARSE_FUNC_DECL (parse_fr);
-PARSE_FUNC_DECL (parse_addr16);
-PARSE_FUNC_DECL (parse_addr16_cjp);
+PARSE_UFUNC_DECL (parse_fr);
+PARSE_UFUNC_DECL (parse_addr16);
+PARSE_UFUNC_DECL (parse_addr16_cjp);
PARSE_FUNC_DECL (parse_lit8);
-PARSE_FUNC_DECL (parse_bit3);
+PARSE_UFUNC_DECL (parse_bit3);
static const char *
CGEN_CPU_DESC cd;
const char **strp;
int opindex;
- long *valuep;
+ unsigned long *valuep;
{
const char *errmsg;
const char *old_strp;
old_strp = *strp;
afteroffset = NULL;
-
- /* Check here to see if you're about to try parsing a w as the first arg */
- /* and return an error if you are. */
- if ( (strncmp(*strp,"w",1)==0) || (strncmp(*strp,"W",1)==0) )
+ /* Check here to see if you're about to try parsing a w as the first arg
+ and return an error if you are. */
+ if ((strncmp (*strp, "w", 1) == 0) || (strncmp (*strp, "W", 1) == 0))
{
(*strp)++;
- if ( (strncmp(*strp,",",1)==0) || ISSPACE(**strp) )
+ if ((strncmp (*strp, ",", 1) == 0) || ISSPACE (**strp))
{
- /* We've been passed a w. Return with an error message so that */
- /* cgen will try the next parsing option. */
+ /* We've been passed a w. Return with an error message so that
+ cgen will try the next parsing option. */
errmsg = _("W keyword invalid in FR operand slot.");
return errmsg;
}
*strp = old_strp;
}
-
/* Attempt parse as register keyword. */
- /* old_strp = *strp; */
-
errmsg = cgen_parse_keyword (cd, strp, & ip2k_cgen_opval_register_names,
- valuep);
- if ( *strp != NULL )
- if (errmsg == NULL)
- return errmsg;
+ (long *) valuep);
+ if (*strp != NULL
+ && errmsg == NULL)
+ return errmsg;
- /* Attempt to parse for "(IP)" */
- afteroffset = strstr(*strp,"(IP)");
+ /* Attempt to parse for "(IP)". */
+ afteroffset = strstr (*strp, "(IP)");
- if ( afteroffset == NULL)
- {
- /* Make sure it's not in lower case */
- afteroffset = strstr(*strp,"(ip)");
- }
+ if (afteroffset == NULL)
+ /* Make sure it's not in lower case. */
+ afteroffset = strstr (*strp, "(ip)");
- if ( afteroffset != NULL )
+ if (afteroffset != NULL)
{
- if ( afteroffset != *strp )
+ if (afteroffset != *strp)
{
- /* Invalid offset present.*/
+ /* Invalid offset present. */
errmsg = _("offset(IP) is not a valid form");
return errmsg;
}
}
}
- /* Attempt to parse for DP. ex: mov w, offset(DP) */
- /* mov offset(DP),w */
-
- /* Try parsing it as an address and see what comes back */
+ /* Attempt to parse for DP. ex: mov w, offset(DP)
+ mov offset(DP),w */
- afteroffset = strstr(*strp,"(DP)");
+ /* Try parsing it as an address and see what comes back. */
+ afteroffset = strstr (*strp, "(DP)");
- if ( afteroffset == NULL)
- {
- /* Maybe it's in lower case */
- afteroffset = strstr(*strp,"(dp)");
- }
+ if (afteroffset == NULL)
+ /* Maybe it's in lower case. */
+ afteroffset = strstr (*strp, "(dp)");
- if ( afteroffset != NULL )
+ if (afteroffset != NULL)
{
- if ( afteroffset == *strp )
+ if (afteroffset == *strp)
{
- /* No offset present. Use 0 by default. */
+ /* No offset present. Use 0 by default. */
tempvalue = 0;
errmsg = NULL;
}
else
- {
- errmsg = cgen_parse_address (cd, strp, opindex,
- BFD_RELOC_IP2K_FR_OFFSET,
- & result_type, & tempvalue);
- }
+ errmsg = cgen_parse_address (cd, strp, opindex,
+ BFD_RELOC_IP2K_FR_OFFSET,
+ & result_type, & tempvalue);
if (errmsg == NULL)
{
if (tempvalue <= 127)
{
- /* Value is ok. Fix up the first 2 bits and return */
+ /* Value is ok. Fix up the first 2 bits and return. */
*valuep = 0x0100 | tempvalue;
- *strp += 4; /* skip over the (DP) in *strp */
+ *strp += 4; /* skip over the (DP) in *strp. */
return errmsg;
}
else
{
/* Found something there in front of (DP) but it's out
- of range. */
+ of range. */
errmsg = _("(DP) offset out of range.");
return errmsg;
}
}
- /* Attempt to parse for SP. ex: mov w, offset(SP) */
- /* mov offset(SP), w */
-
-
- afteroffset = strstr(*strp,"(SP)");
+ /* Attempt to parse for SP. ex: mov w, offset(SP)
+ mov offset(SP), w. */
+ afteroffset = strstr (*strp, "(SP)");
if (afteroffset == NULL)
- {
- /* Maybe it's in lower case. */
- afteroffset = strstr(*strp, "(sp)");
- }
+ /* Maybe it's in lower case. */
+ afteroffset = strstr (*strp, "(sp)");
- if ( afteroffset != NULL )
+ if (afteroffset != NULL)
{
- if ( afteroffset == *strp )
+ if (afteroffset == *strp)
{
- /* No offset present. Use 0 by default. */
+ /* No offset present. Use 0 by default. */
tempvalue = 0;
errmsg = NULL;
}
else
- {
- errmsg = cgen_parse_address (cd, strp, opindex,
- BFD_RELOC_IP2K_FR_OFFSET,
- & result_type, & tempvalue);
- }
+ errmsg = cgen_parse_address (cd, strp, opindex,
+ BFD_RELOC_IP2K_FR_OFFSET,
+ & result_type, & tempvalue);
+
if (errmsg == NULL)
{
if (tempvalue <= 127)
{
- /* Value is ok. Fix up the first 2 bits and return */
+ /* Value is ok. Fix up the first 2 bits and return. */
*valuep = 0x0180 | tempvalue;
- *strp += 4; /* skip over the (SP) in *strp */
+ *strp += 4; /* skip over the (SP) in *strp. */
return errmsg;
}
else
{
/* Found something there in front of (SP) but it's out
- of range. */
+ of range. */
errmsg = _("(SP) offset out of range.");
return errmsg;
}
-
}
}
-
- /* Attempt to parse as an address. */
+ /* Attempt to parse as an address. */
*strp = old_strp;
errmsg = cgen_parse_address (cd, strp, opindex, BFD_RELOC_IP2K_FR9,
& result_type, & value);
{
*valuep = value;
- /* if a parenthesis is found, warn about invalid form */
-
+ /* if a parenthesis is found, warn about invalid form. */
if (**strp == '(')
- {
- errmsg = _("illegal use of parentheses");
- }
+ errmsg = _("illegal use of parentheses");
+
/* if a numeric value is specified, ensure that it is between
- 1 and 255 */
+ 1 and 255. */
else if (result_type == CGEN_PARSE_OPERAND_RESULT_NUMBER)
{
if (value < 0x1 || value > 0xff)
CGEN_CPU_DESC cd;
const char **strp;
int opindex;
- long *valuep;
+ unsigned long *valuep;
{
const char *errmsg;
enum cgen_parse_operand_result result_type;
bfd_reloc_code_real_type code = BFD_RELOC_NONE;
bfd_vma value;
- if ( opindex == (CGEN_OPERAND_TYPE)IP2K_OPERAND_ADDR16H )
+ if (opindex == (CGEN_OPERAND_TYPE) IP2K_OPERAND_ADDR16H)
code = BFD_RELOC_IP2K_HI8DATA;
- else if ( opindex == (CGEN_OPERAND_TYPE)IP2K_OPERAND_ADDR16L )
+ else if (opindex == (CGEN_OPERAND_TYPE) IP2K_OPERAND_ADDR16L)
code = BFD_RELOC_IP2K_LO8DATA;
else
{
if (errmsg == NULL)
{
/* We either have a relocation or a number now. */
- if ( result_type == CGEN_PARSE_OPERAND_RESULT_NUMBER )
+ if (result_type == CGEN_PARSE_OPERAND_RESULT_NUMBER)
{
/* We got a number back. */
- if ( code == BFD_RELOC_IP2K_HI8DATA )
+ if (code == BFD_RELOC_IP2K_HI8DATA)
value >>= 8;
else /* code = BFD_RELOC_IP2K_LOW8DATA */
value &= 0x00FF;
CGEN_CPU_DESC cd;
const char **strp;
int opindex;
- long *valuep;
+ unsigned long *valuep;
{
const char *errmsg;
enum cgen_parse_operand_result result_type;
bfd_reloc_code_real_type code = BFD_RELOC_NONE;
bfd_vma value;
- if ( opindex == (CGEN_OPERAND_TYPE)IP2K_OPERAND_ADDR16CJP )
+ if (opindex == (CGEN_OPERAND_TYPE) IP2K_OPERAND_ADDR16CJP)
code = BFD_RELOC_IP2K_ADDR16CJP;
- else if ( opindex == (CGEN_OPERAND_TYPE)IP2K_OPERAND_ADDR16P )
+ else if (opindex == (CGEN_OPERAND_TYPE) IP2K_OPERAND_ADDR16P)
code = BFD_RELOC_IP2K_PAGE3;
errmsg = cgen_parse_address (cd, strp, opindex, code,
& result_type, & value);
if (errmsg == NULL)
{
- if ( result_type == CGEN_PARSE_OPERAND_RESULT_NUMBER )
+ if (result_type == CGEN_PARSE_OPERAND_RESULT_NUMBER)
{
- if ( (value & 0x1) == 0) /* If the address is even .... */
+ if ((value & 0x1) == 0) /* If the address is even .... */
{
- if ( opindex == (CGEN_OPERAND_TYPE)IP2K_OPERAND_ADDR16CJP )
+ if (opindex == (CGEN_OPERAND_TYPE) IP2K_OPERAND_ADDR16CJP)
*valuep = (value >> 1) & 0x1FFF; /* Should mask be 1FFF? */
- else if ( opindex == (CGEN_OPERAND_TYPE)IP2K_OPERAND_ADDR16P )
+ else if (opindex == (CGEN_OPERAND_TYPE) IP2K_OPERAND_ADDR16P)
*valuep = (value >> 14) & 0x7;
}
else
errmsg = _("Byte address required. - must be even.");
}
- else if ( result_type == CGEN_PARSE_OPERAND_RESULT_QUEUED )
+ else if (result_type == CGEN_PARSE_OPERAND_RESULT_QUEUED)
{
/* This will happen for things like (s2-s1) where s2 and s1
are labels. */
CGEN_CPU_DESC cd;
const char **strp;
int opindex;
- long *valuep;
+ unsigned long *valuep;
{
const char *errmsg;
char mode = 0;
mode = 2;
}
- errmsg = cgen_parse_signed_integer (cd, strp, opindex, valuep);
+ errmsg = cgen_parse_unsigned_integer (cd, strp, opindex, valuep);
if (errmsg)
return errmsg;
if (mode)
{
- value = (unsigned long) *valuep;
+ value = * valuep;
if (value == 0)
{
errmsg = _("Attempt to find bit index of 0");
/* IQ2000 opcode support. -*- C -*-
- Copyright (C) 1996, 1997, 1998, 2001, 2002 Red Hat Inc.
+ Copyright (C) 1996, 1997, 1998, 2001, 2002, 2005 Red Hat Inc.
This file is part of CGEN. */
/* This file is an addendum to iq2000.cpu. Heavy use of C code isn't
static int iq2000_cgen_isa_register PARAMS ((const char **));
static const char * parse_jtargq10 PARAMS ((CGEN_CPU_DESC, const char **, int, int, enum cgen_parse_operand_result *, bfd_vma *));
-static const char * parse_mimm PARAMS ((CGEN_CPU_DESC, const char **, int, long *));
+static const char * parse_mimm PARAMS ((CGEN_CPU_DESC, const char **, int, unsigned long *));
static const char * parse_imm PARAMS ((CGEN_CPU_DESC, const char **, int, unsigned long *));
static const char * parse_hi16 PARAMS ((CGEN_CPU_DESC, const char **, int, unsigned long *));
-static const char * parse_lo16 PARAMS ((CGEN_CPU_DESC, const char **, int, long *));
-static const char * parse_mlo16 PARAMS ((CGEN_CPU_DESC, const char **, int, long *));
+static const char * parse_lo16 PARAMS ((CGEN_CPU_DESC, const char **, int, unsigned long *));
+static const char * parse_mlo16 PARAMS ((CGEN_CPU_DESC, const char **, int, unsigned long *));
/* Special check to ensure that instruction exists for given machine */
int
CGEN_CPU_DESC cd;
const char **strp;
int opindex;
- long *valuep;
+ unsigned long *valuep;
{
const char *errmsg;
- /* Verify this isn't a register */
+ /* Verify this isn't a register. */
if (iq2000_cgen_isa_register (strp))
errmsg = _("immediate value cannot be register");
else
if (errmsg == NULL)
{
long x = (-value) & 0xFFFF0000;
+
if (x != 0 && x != (long) 0xFFFF0000)
errmsg = _("immediate value out of range");
else
CGEN_CPU_DESC cd;
const char **strp;
int opindex;
- long *valuep;
+ unsigned long *valuep;
{
if (strncasecmp (*strp, "%lo(", 4) == 0)
{
CGEN_CPU_DESC cd;
const char **strp;
int opindex;
- long *valuep;
+ unsigned long *valuep;
{
if (strncasecmp (*strp, "%lo(", 4) == 0)
{
/* OpenRISC opcode support. -*- C -*-
- Copyright (C) 2000, 2001, 2003 Free Software Foundation
+ Copyright (C) 2000, 2001, 2003, 2005 Free Software Foundation
Based upon work by Red Hat, Inc.
This file is part of CGEN. */
#define CGEN_VERBOSE_ASSEMBLER_ERRORS
static const char * parse_hi16
- PARAMS ((CGEN_CPU_DESC, const char **, int, unsigned long *));
+ PARAMS ((CGEN_CPU_DESC, const char **, int, long *));
static const char * parse_lo16
- PARAMS ((CGEN_CPU_DESC, const char **, int, unsigned long *));
+ PARAMS ((CGEN_CPU_DESC, const char **, int, long *));
long
openrisc_sign_extend_16bit (value)
CGEN_CPU_DESC cd;
const char **strp;
int opindex;
- unsigned long *valuep;
+ long *valuep;
{
const char *errmsg;
enum cgen_parse_operand_result result_type;
bfd_vma value;
*strp += 3;
-#if 0
- errmsg = cgen_parse_signed_integer (cd, strp, opindex, valuep);
- if (errmsg != NULL)
- fprintf (stderr, "parse_hi: %s\n", errmsg);
- if (errmsg != NULL)
-#endif
- errmsg = cgen_parse_address (cd, strp, opindex, BFD_RELOC_HI16,
+ errmsg = cgen_parse_address (cd, strp, opindex, BFD_RELOC_HI16,
&result_type, &value);
if (**strp != ')')
return _("missing `)'");
if (**strp == '-')
{
long value;
+
errmsg = cgen_parse_signed_integer (cd, strp, opindex, &value);
ret = value;
}
else
{
unsigned long value;
+
errmsg = cgen_parse_unsigned_integer (cd, strp, opindex, &value);
ret = value;
}
CGEN_CPU_DESC cd;
const char **strp;
int opindex;
- unsigned long *valuep;
+ long *valuep;
{
const char *errmsg;
enum cgen_parse_operand_result result_type;
bfd_vma value;
*strp += 3;
-#if 0
- errmsg = cgen_parse_signed_integer (cd, strp, opindex, valuep);
- if (errmsg != NULL)
- fprintf (stderr, "parse_lo: %s\n", errmsg);
-
- if (errmsg != NULL)
-#endif
- errmsg = cgen_parse_address (cd, strp, opindex, BFD_RELOC_LO16,
- &result_type, &value);
+ errmsg = cgen_parse_address (cd, strp, opindex, BFD_RELOC_LO16,
+ &result_type, &value);
if (**strp != ')')
return _("missing `)'");
if (**strp == '-')
{
long value;
+
errmsg = cgen_parse_signed_integer (cd, strp, opindex, &value);
ret = value;
}
else
{
unsigned long value;
+
errmsg = cgen_parse_unsigned_integer (cd, strp, opindex, &value);
ret = value;
}