14e98e3e1Schristos/* Morpho Technologies mRISC opcode support, for GNU Binutils. -*- C -*- 2*a2e2270fSchristos Copyright 2001, 2007, 2008, 2009, 2012 Free Software Foundation, Inc. 34e98e3e1Schristos 44e98e3e1Schristos Contributed by Red Hat Inc; developed under contract from 54e98e3e1Schristos Morpho Technologies. 64e98e3e1Schristos 74e98e3e1Schristos This file is part of the GNU Binutils. 84e98e3e1Schristos 94e98e3e1Schristos This program is free software; you can redistribute it and/or modify 104e98e3e1Schristos it under the terms of the GNU General Public License as published by 114e98e3e1Schristos the Free Software Foundation; either version 3 of the License, or 124e98e3e1Schristos (at your option) any later version. 134e98e3e1Schristos 144e98e3e1Schristos This program is distributed in the hope that it will be useful, 154e98e3e1Schristos but WITHOUT ANY WARRANTY; without even the implied warranty of 164e98e3e1Schristos MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 174e98e3e1Schristos GNU General Public License for more details. 184e98e3e1Schristos 194e98e3e1Schristos You should have received a copy of the GNU General Public License 204e98e3e1Schristos along with this program; if not, write to the Free Software 214e98e3e1Schristos Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, 224e98e3e1Schristos MA 02110-1301, USA. */ 234e98e3e1Schristos 244e98e3e1Schristos 254e98e3e1Schristos/* Each section is delimited with start and end markers. 264e98e3e1Schristos 274e98e3e1Schristos <arch>-opc.h additions use: "-- opc.h" 284e98e3e1Schristos <arch>-opc.c additions use: "-- opc.c" 294e98e3e1Schristos <arch>-asm.c additions use: "-- asm.c" 304e98e3e1Schristos <arch>-dis.c additions use: "-- dis.c" 314e98e3e1Schristos <arch>-ibd.h additions use: "-- ibd.h" */ 324e98e3e1Schristos 334e98e3e1Schristos/* -- opc.h */ 344e98e3e1Schristos 354e98e3e1Schristos/* Check applicability of instructions against machines. */ 364e98e3e1Schristos#define CGEN_VALIDATE_INSN_SUPPORTED 374e98e3e1Schristos 384e98e3e1Schristos/* Allows reason codes to be output when assembler errors occur. */ 394e98e3e1Schristos#define CGEN_VERBOSE_ASSEMBLER_ERRORS 404e98e3e1Schristos 414e98e3e1Schristos/* Override disassembly hashing - there are variable bits in the top 424e98e3e1Schristos byte of these instructions. */ 434e98e3e1Schristos#define CGEN_DIS_HASH_SIZE 8 444e98e3e1Schristos#define CGEN_DIS_HASH(buf, value) (((* (unsigned char *) (buf)) >> 5) % CGEN_DIS_HASH_SIZE) 454e98e3e1Schristos 464e98e3e1Schristos#define CGEN_ASM_HASH_SIZE 127 474e98e3e1Schristos#define CGEN_ASM_HASH(insn) mt_asm_hash (insn) 484e98e3e1Schristos 494e98e3e1Schristosextern unsigned int mt_asm_hash (const char *); 504e98e3e1Schristos 514e98e3e1Schristosextern int mt_cgen_insn_supported (CGEN_CPU_DESC, const CGEN_INSN *); 524e98e3e1Schristos 534e98e3e1Schristos 544e98e3e1Schristos/* -- opc.c */ 554e98e3e1Schristos#include "safe-ctype.h" 564e98e3e1Schristos 574e98e3e1Schristos/* Special check to ensure that instruction exists for given machine. */ 584e98e3e1Schristos 594e98e3e1Schristosint 604e98e3e1Schristosmt_cgen_insn_supported (CGEN_CPU_DESC cd, const CGEN_INSN *insn) 614e98e3e1Schristos{ 624e98e3e1Schristos int machs = CGEN_INSN_ATTR_VALUE (insn, CGEN_INSN_MACH); 634e98e3e1Schristos 644e98e3e1Schristos /* No mach attribute? Assume it's supported for all machs. */ 654e98e3e1Schristos if (machs == 0) 664e98e3e1Schristos return 1; 674e98e3e1Schristos 684e98e3e1Schristos return ((machs & cd->machs) != 0); 694e98e3e1Schristos} 704e98e3e1Schristos 714e98e3e1Schristos/* A better hash function for instruction mnemonics. */ 724e98e3e1Schristos 734e98e3e1Schristosunsigned int 744e98e3e1Schristosmt_asm_hash (const char* insn) 754e98e3e1Schristos{ 764e98e3e1Schristos unsigned int hash; 774e98e3e1Schristos const char* m = insn; 784e98e3e1Schristos 794e98e3e1Schristos for (hash = 0; *m && ! ISSPACE (*m); m++) 804e98e3e1Schristos hash = (hash * 23) ^ (0x1F & TOLOWER (*m)); 814e98e3e1Schristos 824e98e3e1Schristos /* printf ("%s %d\n", insn, (hash % CGEN_ASM_HASH_SIZE)); */ 834e98e3e1Schristos 844e98e3e1Schristos return hash % CGEN_ASM_HASH_SIZE; 854e98e3e1Schristos} 864e98e3e1Schristos 874e98e3e1Schristos 884e98e3e1Schristos/* -- asm.c */ 894e98e3e1Schristos/* Range checking for signed numbers. Returns 0 if acceptable 904e98e3e1Schristos and 1 if the value is out of bounds for a signed quantity. */ 914e98e3e1Schristos 924e98e3e1Schristosstatic int 934e98e3e1Schristossigned_out_of_bounds (long val) 944e98e3e1Schristos{ 954e98e3e1Schristos if ((val < -32768) || (val > 32767)) 964e98e3e1Schristos return 1; 974e98e3e1Schristos return 0; 984e98e3e1Schristos} 994e98e3e1Schristos 1004e98e3e1Schristosstatic const char * 1014e98e3e1Schristosparse_loopsize (CGEN_CPU_DESC cd, 1024e98e3e1Schristos const char **strp, 1034e98e3e1Schristos int opindex, 1044e98e3e1Schristos void *arg) 1054e98e3e1Schristos{ 1064e98e3e1Schristos signed long * valuep = (signed long *) arg; 1074e98e3e1Schristos const char *errmsg; 1084e98e3e1Schristos bfd_reloc_code_real_type code = BFD_RELOC_NONE; 1094e98e3e1Schristos enum cgen_parse_operand_result result_type; 1104e98e3e1Schristos bfd_vma value; 1114e98e3e1Schristos 1124e98e3e1Schristos /* Is it a control transfer instructions? */ 1134e98e3e1Schristos if (opindex == (CGEN_OPERAND_TYPE) MT_OPERAND_LOOPSIZE) 1144e98e3e1Schristos { 1154e98e3e1Schristos code = BFD_RELOC_MT_PCINSN8; 1164e98e3e1Schristos errmsg = cgen_parse_address (cd, strp, opindex, code, 1174e98e3e1Schristos & result_type, & value); 1184e98e3e1Schristos *valuep = value; 1194e98e3e1Schristos return errmsg; 1204e98e3e1Schristos } 1214e98e3e1Schristos 1224e98e3e1Schristos abort (); 1234e98e3e1Schristos} 1244e98e3e1Schristos 1254e98e3e1Schristosstatic const char * 1264e98e3e1Schristosparse_imm16 (CGEN_CPU_DESC cd, 1274e98e3e1Schristos const char **strp, 1284e98e3e1Schristos int opindex, 1294e98e3e1Schristos void *arg) 1304e98e3e1Schristos{ 1314e98e3e1Schristos signed long * valuep = (signed long *) arg; 1324e98e3e1Schristos const char *errmsg; 1334e98e3e1Schristos enum cgen_parse_operand_result result_type; 1344e98e3e1Schristos bfd_reloc_code_real_type code = BFD_RELOC_NONE; 1354e98e3e1Schristos bfd_vma value; 1364e98e3e1Schristos 1374e98e3e1Schristos /* Is it a control transfer instructions? */ 1384e98e3e1Schristos if (opindex == (CGEN_OPERAND_TYPE) MT_OPERAND_IMM16O) 1394e98e3e1Schristos { 1404e98e3e1Schristos code = BFD_RELOC_16_PCREL; 1414e98e3e1Schristos errmsg = cgen_parse_address (cd, strp, opindex, code, 1424e98e3e1Schristos & result_type, & value); 1434e98e3e1Schristos if (errmsg == NULL) 1444e98e3e1Schristos { 1454e98e3e1Schristos if (signed_out_of_bounds (value)) 1464e98e3e1Schristos errmsg = _("Operand out of range. Must be between -32768 and 32767."); 1474e98e3e1Schristos } 1484e98e3e1Schristos *valuep = value; 1494e98e3e1Schristos return errmsg; 1504e98e3e1Schristos } 1514e98e3e1Schristos 1524e98e3e1Schristos /* If it's not a control transfer instruction, then 1534e98e3e1Schristos we have to check for %OP relocating operators. */ 1544e98e3e1Schristos if (opindex == (CGEN_OPERAND_TYPE) MT_OPERAND_IMM16L) 1554e98e3e1Schristos ; 1564e98e3e1Schristos else if (strncmp (*strp, "%hi16", 5) == 0) 1574e98e3e1Schristos { 1584e98e3e1Schristos *strp += 5; 1594e98e3e1Schristos code = BFD_RELOC_HI16; 1604e98e3e1Schristos } 1614e98e3e1Schristos else if (strncmp (*strp, "%lo16", 5) == 0) 1624e98e3e1Schristos { 1634e98e3e1Schristos *strp += 5; 1644e98e3e1Schristos code = BFD_RELOC_LO16; 1654e98e3e1Schristos } 1664e98e3e1Schristos 1674e98e3e1Schristos /* If we found a %OP relocating operator, then parse it as an address. 1684e98e3e1Schristos If not, we need to parse it as an integer, either signed or unsigned 1694e98e3e1Schristos depending on which operand type we have. */ 1704e98e3e1Schristos if (code != BFD_RELOC_NONE) 1714e98e3e1Schristos { 1724e98e3e1Schristos /* %OP relocating operator found. */ 1734e98e3e1Schristos errmsg = cgen_parse_address (cd, strp, opindex, code, 1744e98e3e1Schristos & result_type, & value); 1754e98e3e1Schristos if (errmsg == NULL) 1764e98e3e1Schristos { 1774e98e3e1Schristos switch (result_type) 1784e98e3e1Schristos { 1794e98e3e1Schristos case (CGEN_PARSE_OPERAND_RESULT_NUMBER): 1804e98e3e1Schristos if (code == BFD_RELOC_HI16) 1814e98e3e1Schristos value = (value >> 16) & 0xFFFF; 1824e98e3e1Schristos else if (code == BFD_RELOC_LO16) 1834e98e3e1Schristos value = value & 0xFFFF; 1844e98e3e1Schristos else 1854e98e3e1Schristos errmsg = _("Biiiig Trouble in parse_imm16!"); 1864e98e3e1Schristos break; 1874e98e3e1Schristos 1884e98e3e1Schristos case (CGEN_PARSE_OPERAND_RESULT_QUEUED): 1894e98e3e1Schristos /* No special processing for this case. */ 1904e98e3e1Schristos break; 1914e98e3e1Schristos 1924e98e3e1Schristos default: 1934e98e3e1Schristos errmsg = _("The percent-operator's operand is not a symbol"); 1944e98e3e1Schristos break; 1954e98e3e1Schristos } 1964e98e3e1Schristos } 1974e98e3e1Schristos *valuep = value; 1984e98e3e1Schristos } 1994e98e3e1Schristos else 2004e98e3e1Schristos { 2014e98e3e1Schristos /* Parse hex values like 0xffff as unsigned, and sign extend 2024e98e3e1Schristos them manually. */ 2034e98e3e1Schristos int parse_signed = (opindex == (CGEN_OPERAND_TYPE)MT_OPERAND_IMM16); 2044e98e3e1Schristos 2054e98e3e1Schristos if ((*strp)[0] == '0' 2064e98e3e1Schristos && ((*strp)[1] == 'x' || (*strp)[1] == 'X')) 2074e98e3e1Schristos parse_signed = 0; 2084e98e3e1Schristos 2094e98e3e1Schristos /* No relocating operator. Parse as an number. */ 2104e98e3e1Schristos if (parse_signed) 2114e98e3e1Schristos { 2124e98e3e1Schristos /* Parse as as signed integer. */ 2134e98e3e1Schristos 2144e98e3e1Schristos errmsg = cgen_parse_signed_integer (cd, strp, opindex, valuep); 2154e98e3e1Schristos 2164e98e3e1Schristos if (errmsg == NULL) 2174e98e3e1Schristos { 2184e98e3e1Schristos#if 0 2194e98e3e1Schristos /* Manual range checking is needed for the signed case. */ 2204e98e3e1Schristos if (*valuep & 0x8000) 2214e98e3e1Schristos value = 0xffff0000 | *valuep; 2224e98e3e1Schristos else 2234e98e3e1Schristos value = *valuep; 2244e98e3e1Schristos 2254e98e3e1Schristos if (signed_out_of_bounds (value)) 2264e98e3e1Schristos errmsg = _("Operand out of range. Must be between -32768 and 32767."); 2274e98e3e1Schristos /* Truncate to 16 bits. This is necessary 2284e98e3e1Schristos because cgen will have sign extended *valuep. */ 2294e98e3e1Schristos *valuep &= 0xFFFF; 2304e98e3e1Schristos#endif 2314e98e3e1Schristos } 2324e98e3e1Schristos } 2334e98e3e1Schristos else 2344e98e3e1Schristos { 2354e98e3e1Schristos /* MT_OPERAND_IMM16Z. Parse as an unsigned integer. */ 2364e98e3e1Schristos errmsg = cgen_parse_unsigned_integer (cd, strp, opindex, (unsigned long *) valuep); 2374e98e3e1Schristos 2384e98e3e1Schristos if (opindex == (CGEN_OPERAND_TYPE) MT_OPERAND_IMM16 2394e98e3e1Schristos && *valuep >= 0x8000 2404e98e3e1Schristos && *valuep <= 0xffff) 2414e98e3e1Schristos *valuep -= 0x10000; 2424e98e3e1Schristos } 2434e98e3e1Schristos } 2444e98e3e1Schristos 2454e98e3e1Schristos return errmsg; 2464e98e3e1Schristos} 2474e98e3e1Schristos 2484e98e3e1Schristos 2494e98e3e1Schristosstatic const char * 2504e98e3e1Schristosparse_dup (CGEN_CPU_DESC cd, 2514e98e3e1Schristos const char **strp, 2524e98e3e1Schristos int opindex, 2534e98e3e1Schristos unsigned long *valuep) 2544e98e3e1Schristos{ 2554e98e3e1Schristos const char *errmsg = NULL; 2564e98e3e1Schristos 2574e98e3e1Schristos if (strncmp (*strp, "dup", 3) == 0 || strncmp (*strp, "DUP", 3) == 0) 2584e98e3e1Schristos { 2594e98e3e1Schristos *strp += 3; 2604e98e3e1Schristos *valuep = 1; 2614e98e3e1Schristos } 2624e98e3e1Schristos else if (strncmp (*strp, "xx", 2) == 0 || strncmp (*strp, "XX", 2) == 0) 2634e98e3e1Schristos { 2644e98e3e1Schristos *strp += 2; 2654e98e3e1Schristos *valuep = 0; 2664e98e3e1Schristos } 2674e98e3e1Schristos else 2684e98e3e1Schristos errmsg = cgen_parse_unsigned_integer (cd, strp, opindex, valuep); 2694e98e3e1Schristos 2704e98e3e1Schristos return errmsg; 2714e98e3e1Schristos} 2724e98e3e1Schristos 2734e98e3e1Schristos 2744e98e3e1Schristosstatic const char * 2754e98e3e1Schristosparse_ball (CGEN_CPU_DESC cd, 2764e98e3e1Schristos const char **strp, 2774e98e3e1Schristos int opindex, 2784e98e3e1Schristos unsigned long *valuep) 2794e98e3e1Schristos{ 2804e98e3e1Schristos const char *errmsg = NULL; 2814e98e3e1Schristos 2824e98e3e1Schristos if (strncmp (*strp, "all", 3) == 0 || strncmp (*strp, "ALL", 3) == 0) 2834e98e3e1Schristos { 2844e98e3e1Schristos *strp += 3; 2854e98e3e1Schristos *valuep = 1; 2864e98e3e1Schristos } 2874e98e3e1Schristos else if (strncmp (*strp, "one", 3) == 0 || strncmp (*strp, "ONE", 3) == 0) 2884e98e3e1Schristos { 2894e98e3e1Schristos *strp += 3; 2904e98e3e1Schristos *valuep = 0; 2914e98e3e1Schristos } 2924e98e3e1Schristos else 2934e98e3e1Schristos errmsg = cgen_parse_unsigned_integer (cd, strp, opindex, valuep); 2944e98e3e1Schristos 2954e98e3e1Schristos return errmsg; 2964e98e3e1Schristos} 2974e98e3e1Schristos 2984e98e3e1Schristosstatic const char * 2994e98e3e1Schristosparse_xmode (CGEN_CPU_DESC cd, 3004e98e3e1Schristos const char **strp, 3014e98e3e1Schristos int opindex, 3024e98e3e1Schristos unsigned long *valuep) 3034e98e3e1Schristos{ 3044e98e3e1Schristos const char *errmsg = NULL; 3054e98e3e1Schristos 3064e98e3e1Schristos if (strncmp (*strp, "pm", 2) == 0 || strncmp (*strp, "PM", 2) == 0) 3074e98e3e1Schristos { 3084e98e3e1Schristos *strp += 2; 3094e98e3e1Schristos *valuep = 1; 3104e98e3e1Schristos } 3114e98e3e1Schristos else if (strncmp (*strp, "xm", 2) == 0 || strncmp (*strp, "XM", 2) == 0) 3124e98e3e1Schristos { 3134e98e3e1Schristos *strp += 2; 3144e98e3e1Schristos *valuep = 0; 3154e98e3e1Schristos } 3164e98e3e1Schristos else 3174e98e3e1Schristos errmsg = cgen_parse_unsigned_integer (cd, strp, opindex, valuep); 3184e98e3e1Schristos 3194e98e3e1Schristos return errmsg; 3204e98e3e1Schristos} 3214e98e3e1Schristos 3224e98e3e1Schristosstatic const char * 3234e98e3e1Schristosparse_rc (CGEN_CPU_DESC cd, 3244e98e3e1Schristos const char **strp, 3254e98e3e1Schristos int opindex, 3264e98e3e1Schristos unsigned long *valuep) 3274e98e3e1Schristos{ 3284e98e3e1Schristos const char *errmsg = NULL; 3294e98e3e1Schristos 3304e98e3e1Schristos if (strncmp (*strp, "r", 1) == 0 || strncmp (*strp, "R", 1) == 0) 3314e98e3e1Schristos { 3324e98e3e1Schristos *strp += 1; 3334e98e3e1Schristos *valuep = 1; 3344e98e3e1Schristos } 3354e98e3e1Schristos else if (strncmp (*strp, "c", 1) == 0 || strncmp (*strp, "C", 1) == 0) 3364e98e3e1Schristos { 3374e98e3e1Schristos *strp += 1; 3384e98e3e1Schristos *valuep = 0; 3394e98e3e1Schristos } 3404e98e3e1Schristos else 3414e98e3e1Schristos errmsg = cgen_parse_unsigned_integer (cd, strp, opindex, valuep); 3424e98e3e1Schristos 3434e98e3e1Schristos return errmsg; 3444e98e3e1Schristos} 3454e98e3e1Schristos 3464e98e3e1Schristosstatic const char * 3474e98e3e1Schristosparse_cbrb (CGEN_CPU_DESC cd, 3484e98e3e1Schristos const char **strp, 3494e98e3e1Schristos int opindex, 3504e98e3e1Schristos unsigned long *valuep) 3514e98e3e1Schristos{ 3524e98e3e1Schristos const char *errmsg = NULL; 3534e98e3e1Schristos 3544e98e3e1Schristos if (strncmp (*strp, "rb", 2) == 0 || strncmp (*strp, "RB", 2) == 0) 3554e98e3e1Schristos { 3564e98e3e1Schristos *strp += 2; 3574e98e3e1Schristos *valuep = 1; 3584e98e3e1Schristos } 3594e98e3e1Schristos else if (strncmp (*strp, "cb", 2) == 0 || strncmp (*strp, "CB", 2) == 0) 3604e98e3e1Schristos { 3614e98e3e1Schristos *strp += 2; 3624e98e3e1Schristos *valuep = 0; 3634e98e3e1Schristos } 3644e98e3e1Schristos else 3654e98e3e1Schristos errmsg = cgen_parse_unsigned_integer (cd, strp, opindex, valuep); 3664e98e3e1Schristos 3674e98e3e1Schristos return errmsg; 3684e98e3e1Schristos} 3694e98e3e1Schristos 3704e98e3e1Schristosstatic const char * 3714e98e3e1Schristosparse_rbbc (CGEN_CPU_DESC cd, 3724e98e3e1Schristos const char **strp, 3734e98e3e1Schristos int opindex, 3744e98e3e1Schristos unsigned long *valuep) 3754e98e3e1Schristos{ 3764e98e3e1Schristos const char *errmsg = NULL; 3774e98e3e1Schristos 3784e98e3e1Schristos if (strncmp (*strp, "rt", 2) == 0 || strncmp (*strp, "RT", 2) == 0) 3794e98e3e1Schristos { 3804e98e3e1Schristos *strp += 2; 3814e98e3e1Schristos *valuep = 0; 3824e98e3e1Schristos } 3834e98e3e1Schristos else if (strncmp (*strp, "br1", 3) == 0 || strncmp (*strp, "BR1", 3) == 0) 3844e98e3e1Schristos { 3854e98e3e1Schristos *strp += 3; 3864e98e3e1Schristos *valuep = 1; 3874e98e3e1Schristos } 3884e98e3e1Schristos else if (strncmp (*strp, "br2", 3) == 0 || strncmp (*strp, "BR2", 3) == 0) 3894e98e3e1Schristos { 3904e98e3e1Schristos *strp += 3; 3914e98e3e1Schristos *valuep = 2; 3924e98e3e1Schristos } 3934e98e3e1Schristos else if (strncmp (*strp, "cs", 2) == 0 || strncmp (*strp, "CS", 2) == 0) 3944e98e3e1Schristos { 3954e98e3e1Schristos *strp += 2; 3964e98e3e1Schristos *valuep = 3; 3974e98e3e1Schristos } 3984e98e3e1Schristos else 3994e98e3e1Schristos errmsg = cgen_parse_unsigned_integer (cd, strp, opindex, valuep); 4004e98e3e1Schristos 4014e98e3e1Schristos return errmsg; 4024e98e3e1Schristos} 4034e98e3e1Schristos 4044e98e3e1Schristosstatic const char * 4054e98e3e1Schristosparse_type (CGEN_CPU_DESC cd, 4064e98e3e1Schristos const char **strp, 4074e98e3e1Schristos int opindex, 4084e98e3e1Schristos unsigned long *valuep) 4094e98e3e1Schristos{ 4104e98e3e1Schristos const char *errmsg = NULL; 4114e98e3e1Schristos 4124e98e3e1Schristos if (strncmp (*strp, "odd", 3) == 0 || strncmp (*strp, "ODD", 3) == 0) 4134e98e3e1Schristos { 4144e98e3e1Schristos *strp += 3; 4154e98e3e1Schristos *valuep = 0; 4164e98e3e1Schristos } 4174e98e3e1Schristos else if (strncmp (*strp, "even", 4) == 0 || strncmp (*strp, "EVEN", 4) == 0) 4184e98e3e1Schristos { 4194e98e3e1Schristos *strp += 4; 4204e98e3e1Schristos *valuep = 1; 4214e98e3e1Schristos } 4224e98e3e1Schristos else if (strncmp (*strp, "oe", 2) == 0 || strncmp (*strp, "OE", 2) == 0) 4234e98e3e1Schristos { 4244e98e3e1Schristos *strp += 2; 4254e98e3e1Schristos *valuep = 2; 4264e98e3e1Schristos } 4274e98e3e1Schristos else 4284e98e3e1Schristos errmsg = cgen_parse_unsigned_integer (cd, strp, opindex, valuep); 4294e98e3e1Schristos 4304e98e3e1Schristos if ((errmsg == NULL) && (*valuep == 3)) 4314e98e3e1Schristos errmsg = _("invalid operand. type may have values 0,1,2 only."); 4324e98e3e1Schristos 4334e98e3e1Schristos return errmsg; 4344e98e3e1Schristos} 4354e98e3e1Schristos 4364e98e3e1Schristos/* -- dis.c */ 4374e98e3e1Schristosstatic void 4384e98e3e1Schristosprint_dollarhex (CGEN_CPU_DESC cd ATTRIBUTE_UNUSED, 4394e98e3e1Schristos void * dis_info, 4404e98e3e1Schristos long value, 4414e98e3e1Schristos unsigned int attrs ATTRIBUTE_UNUSED, 4424e98e3e1Schristos bfd_vma pc ATTRIBUTE_UNUSED, 4434e98e3e1Schristos int length ATTRIBUTE_UNUSED) 4444e98e3e1Schristos{ 4454e98e3e1Schristos disassemble_info *info = (disassemble_info *) dis_info; 4464e98e3e1Schristos 447*a2e2270fSchristos info->fprintf_func (info->stream, "$%lx", value & 0xffffffff); 4484e98e3e1Schristos 4494e98e3e1Schristos if (0) 4504e98e3e1Schristos print_normal (cd, dis_info, value, attrs, pc, length); 4514e98e3e1Schristos} 4524e98e3e1Schristos 4534e98e3e1Schristosstatic void 4544e98e3e1Schristosprint_pcrel (CGEN_CPU_DESC cd ATTRIBUTE_UNUSED, 4554e98e3e1Schristos void * dis_info, 4564e98e3e1Schristos long value, 4574e98e3e1Schristos unsigned int attrs ATTRIBUTE_UNUSED, 4584e98e3e1Schristos bfd_vma pc ATTRIBUTE_UNUSED, 4594e98e3e1Schristos int length ATTRIBUTE_UNUSED) 4604e98e3e1Schristos{ 4614e98e3e1Schristos print_address (cd, dis_info, value + pc, attrs, pc, length); 4624e98e3e1Schristos} 4634e98e3e1Schristos 4644e98e3e1Schristos/* -- */ 4654e98e3e1Schristos 4664e98e3e1Schristos 4674e98e3e1Schristos 4684e98e3e1Schristos 4694e98e3e1Schristos 470