1 1.1.1.5 christos /* DO NOT EDIT! -*- buffer-read-only: t -*- vi:set ro: */ 2 1.1 skrll /* CPU data for m32r. 3 1.1 skrll 4 1.1 skrll THIS FILE IS MACHINE GENERATED WITH CGEN. 5 1.1 skrll 6 1.1.1.11 christos Copyright (C) 1996-2026 Free Software Foundation, Inc. 7 1.1 skrll 8 1.1 skrll This file is part of the GNU Binutils and/or GDB, the GNU debugger. 9 1.1 skrll 10 1.1 skrll This file is free software; you can redistribute it and/or modify 11 1.1 skrll it under the terms of the GNU General Public License as published by 12 1.1 skrll the Free Software Foundation; either version 3, or (at your option) 13 1.1 skrll any later version. 14 1.1 skrll 15 1.1 skrll It is distributed in the hope that it will be useful, but WITHOUT 16 1.1 skrll ANY WARRANTY; without even the implied warranty of MERCHANTABILITY 17 1.1 skrll or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public 18 1.1 skrll License for more details. 19 1.1 skrll 20 1.1 skrll You should have received a copy of the GNU General Public License along 21 1.1 skrll with this program; if not, write to the Free Software Foundation, Inc., 22 1.1 skrll 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. 23 1.1 skrll 24 1.1 skrll */ 25 1.1 skrll 26 1.1 skrll #include "sysdep.h" 27 1.1 skrll #include <stdio.h> 28 1.1 skrll #include <stdarg.h> 29 1.1.1.8 christos #include <stdlib.h> 30 1.1 skrll #include "ansidecl.h" 31 1.1 skrll #include "bfd.h" 32 1.1 skrll #include "symcat.h" 33 1.1 skrll #include "m32r-desc.h" 34 1.1 skrll #include "m32r-opc.h" 35 1.1 skrll #include "opintl.h" 36 1.1 skrll #include "libiberty.h" 37 1.1 skrll #include "xregex.h" 38 1.1 skrll 39 1.1 skrll /* Attributes. */ 40 1.1 skrll 41 1.1 skrll static const CGEN_ATTR_ENTRY bool_attr[] = 42 1.1 skrll { 43 1.1 skrll { "#f", 0 }, 44 1.1 skrll { "#t", 1 }, 45 1.1 skrll { 0, 0 } 46 1.1 skrll }; 47 1.1 skrll 48 1.1 skrll static const CGEN_ATTR_ENTRY MACH_attr[] ATTRIBUTE_UNUSED = 49 1.1 skrll { 50 1.1 skrll { "base", MACH_BASE }, 51 1.1 skrll { "m32r", MACH_M32R }, 52 1.1 skrll { "m32rx", MACH_M32RX }, 53 1.1 skrll { "m32r2", MACH_M32R2 }, 54 1.1 skrll { "max", MACH_MAX }, 55 1.1 skrll { 0, 0 } 56 1.1 skrll }; 57 1.1 skrll 58 1.1 skrll static const CGEN_ATTR_ENTRY ISA_attr[] ATTRIBUTE_UNUSED = 59 1.1 skrll { 60 1.1 skrll { "m32r", ISA_M32R }, 61 1.1 skrll { "max", ISA_MAX }, 62 1.1 skrll { 0, 0 } 63 1.1 skrll }; 64 1.1 skrll 65 1.1 skrll static const CGEN_ATTR_ENTRY PIPE_attr[] ATTRIBUTE_UNUSED = 66 1.1 skrll { 67 1.1 skrll { "NONE", PIPE_NONE }, 68 1.1 skrll { "O", PIPE_O }, 69 1.1 skrll { "S", PIPE_S }, 70 1.1 skrll { "OS", PIPE_OS }, 71 1.1 skrll { "O_OS", PIPE_O_OS }, 72 1.1 skrll { 0, 0 } 73 1.1 skrll }; 74 1.1 skrll 75 1.1 skrll const CGEN_ATTR_TABLE m32r_cgen_ifield_attr_table[] = 76 1.1 skrll { 77 1.1 skrll { "MACH", & MACH_attr[0], & MACH_attr[0] }, 78 1.1 skrll { "VIRTUAL", &bool_attr[0], &bool_attr[0] }, 79 1.1 skrll { "PCREL-ADDR", &bool_attr[0], &bool_attr[0] }, 80 1.1 skrll { "ABS-ADDR", &bool_attr[0], &bool_attr[0] }, 81 1.1 skrll { "RESERVED", &bool_attr[0], &bool_attr[0] }, 82 1.1 skrll { "SIGN-OPT", &bool_attr[0], &bool_attr[0] }, 83 1.1 skrll { "SIGNED", &bool_attr[0], &bool_attr[0] }, 84 1.1 skrll { "RELOC", &bool_attr[0], &bool_attr[0] }, 85 1.1 skrll { 0, 0, 0 } 86 1.1 skrll }; 87 1.1 skrll 88 1.1 skrll const CGEN_ATTR_TABLE m32r_cgen_hardware_attr_table[] = 89 1.1 skrll { 90 1.1 skrll { "MACH", & MACH_attr[0], & MACH_attr[0] }, 91 1.1 skrll { "VIRTUAL", &bool_attr[0], &bool_attr[0] }, 92 1.1 skrll { "CACHE-ADDR", &bool_attr[0], &bool_attr[0] }, 93 1.1 skrll { "PC", &bool_attr[0], &bool_attr[0] }, 94 1.1 skrll { "PROFILE", &bool_attr[0], &bool_attr[0] }, 95 1.1 skrll { 0, 0, 0 } 96 1.1 skrll }; 97 1.1 skrll 98 1.1 skrll const CGEN_ATTR_TABLE m32r_cgen_operand_attr_table[] = 99 1.1 skrll { 100 1.1 skrll { "MACH", & MACH_attr[0], & MACH_attr[0] }, 101 1.1 skrll { "VIRTUAL", &bool_attr[0], &bool_attr[0] }, 102 1.1 skrll { "PCREL-ADDR", &bool_attr[0], &bool_attr[0] }, 103 1.1 skrll { "ABS-ADDR", &bool_attr[0], &bool_attr[0] }, 104 1.1 skrll { "SIGN-OPT", &bool_attr[0], &bool_attr[0] }, 105 1.1 skrll { "SIGNED", &bool_attr[0], &bool_attr[0] }, 106 1.1 skrll { "NEGATIVE", &bool_attr[0], &bool_attr[0] }, 107 1.1 skrll { "RELAX", &bool_attr[0], &bool_attr[0] }, 108 1.1 skrll { "SEM-ONLY", &bool_attr[0], &bool_attr[0] }, 109 1.1 skrll { "RELOC", &bool_attr[0], &bool_attr[0] }, 110 1.1 skrll { 0, 0, 0 } 111 1.1 skrll }; 112 1.1 skrll 113 1.1 skrll const CGEN_ATTR_TABLE m32r_cgen_insn_attr_table[] = 114 1.1 skrll { 115 1.1 skrll { "MACH", & MACH_attr[0], & MACH_attr[0] }, 116 1.1 skrll { "PIPE", & PIPE_attr[0], & PIPE_attr[0] }, 117 1.1 skrll { "ALIAS", &bool_attr[0], &bool_attr[0] }, 118 1.1 skrll { "VIRTUAL", &bool_attr[0], &bool_attr[0] }, 119 1.1 skrll { "UNCOND-CTI", &bool_attr[0], &bool_attr[0] }, 120 1.1 skrll { "COND-CTI", &bool_attr[0], &bool_attr[0] }, 121 1.1 skrll { "SKIP-CTI", &bool_attr[0], &bool_attr[0] }, 122 1.1 skrll { "DELAY-SLOT", &bool_attr[0], &bool_attr[0] }, 123 1.1 skrll { "RELAXABLE", &bool_attr[0], &bool_attr[0] }, 124 1.1 skrll { "RELAXED", &bool_attr[0], &bool_attr[0] }, 125 1.1 skrll { "NO-DIS", &bool_attr[0], &bool_attr[0] }, 126 1.1 skrll { "PBB", &bool_attr[0], &bool_attr[0] }, 127 1.1 skrll { "FILL-SLOT", &bool_attr[0], &bool_attr[0] }, 128 1.1 skrll { "SPECIAL", &bool_attr[0], &bool_attr[0] }, 129 1.1 skrll { "SPECIAL_M32R", &bool_attr[0], &bool_attr[0] }, 130 1.1 skrll { "SPECIAL_FLOAT", &bool_attr[0], &bool_attr[0] }, 131 1.1 skrll { 0, 0, 0 } 132 1.1 skrll }; 133 1.1 skrll 134 1.1 skrll /* Instruction set variants. */ 135 1.1 skrll 136 1.1 skrll static const CGEN_ISA m32r_cgen_isa_table[] = { 137 1.1 skrll { "m32r", 32, 32, 16, 32 }, 138 1.1 skrll { 0, 0, 0, 0, 0 } 139 1.1 skrll }; 140 1.1 skrll 141 1.1 skrll /* Machine variants. */ 142 1.1 skrll 143 1.1 skrll static const CGEN_MACH m32r_cgen_mach_table[] = { 144 1.1 skrll { "m32r", "m32r", MACH_M32R, 0 }, 145 1.1 skrll { "m32rx", "m32rx", MACH_M32RX, 0 }, 146 1.1 skrll { "m32r2", "m32r2", MACH_M32R2, 0 }, 147 1.1 skrll { 0, 0, 0, 0 } 148 1.1 skrll }; 149 1.1 skrll 150 1.1 skrll static CGEN_KEYWORD_ENTRY m32r_cgen_opval_gr_names_entries[] = 151 1.1 skrll { 152 1.1 skrll { "fp", 13, {0, {{{0, 0}}}}, 0, 0 }, 153 1.1 skrll { "lr", 14, {0, {{{0, 0}}}}, 0, 0 }, 154 1.1 skrll { "sp", 15, {0, {{{0, 0}}}}, 0, 0 }, 155 1.1 skrll { "r0", 0, {0, {{{0, 0}}}}, 0, 0 }, 156 1.1 skrll { "r1", 1, {0, {{{0, 0}}}}, 0, 0 }, 157 1.1 skrll { "r2", 2, {0, {{{0, 0}}}}, 0, 0 }, 158 1.1 skrll { "r3", 3, {0, {{{0, 0}}}}, 0, 0 }, 159 1.1 skrll { "r4", 4, {0, {{{0, 0}}}}, 0, 0 }, 160 1.1 skrll { "r5", 5, {0, {{{0, 0}}}}, 0, 0 }, 161 1.1 skrll { "r6", 6, {0, {{{0, 0}}}}, 0, 0 }, 162 1.1 skrll { "r7", 7, {0, {{{0, 0}}}}, 0, 0 }, 163 1.1 skrll { "r8", 8, {0, {{{0, 0}}}}, 0, 0 }, 164 1.1 skrll { "r9", 9, {0, {{{0, 0}}}}, 0, 0 }, 165 1.1 skrll { "r10", 10, {0, {{{0, 0}}}}, 0, 0 }, 166 1.1 skrll { "r11", 11, {0, {{{0, 0}}}}, 0, 0 }, 167 1.1 skrll { "r12", 12, {0, {{{0, 0}}}}, 0, 0 }, 168 1.1 skrll { "r13", 13, {0, {{{0, 0}}}}, 0, 0 }, 169 1.1 skrll { "r14", 14, {0, {{{0, 0}}}}, 0, 0 }, 170 1.1 skrll { "r15", 15, {0, {{{0, 0}}}}, 0, 0 } 171 1.1 skrll }; 172 1.1 skrll 173 1.1 skrll CGEN_KEYWORD m32r_cgen_opval_gr_names = 174 1.1 skrll { 175 1.1 skrll & m32r_cgen_opval_gr_names_entries[0], 176 1.1 skrll 19, 177 1.1 skrll 0, 0, 0, 0, "" 178 1.1 skrll }; 179 1.1 skrll 180 1.1 skrll static CGEN_KEYWORD_ENTRY m32r_cgen_opval_cr_names_entries[] = 181 1.1 skrll { 182 1.1 skrll { "psw", 0, {0, {{{0, 0}}}}, 0, 0 }, 183 1.1 skrll { "cbr", 1, {0, {{{0, 0}}}}, 0, 0 }, 184 1.1 skrll { "spi", 2, {0, {{{0, 0}}}}, 0, 0 }, 185 1.1 skrll { "spu", 3, {0, {{{0, 0}}}}, 0, 0 }, 186 1.1 skrll { "bpc", 6, {0, {{{0, 0}}}}, 0, 0 }, 187 1.1 skrll { "bbpsw", 8, {0, {{{0, 0}}}}, 0, 0 }, 188 1.1 skrll { "bbpc", 14, {0, {{{0, 0}}}}, 0, 0 }, 189 1.1 skrll { "evb", 5, {0, {{{0, 0}}}}, 0, 0 }, 190 1.1 skrll { "cr0", 0, {0, {{{0, 0}}}}, 0, 0 }, 191 1.1 skrll { "cr1", 1, {0, {{{0, 0}}}}, 0, 0 }, 192 1.1 skrll { "cr2", 2, {0, {{{0, 0}}}}, 0, 0 }, 193 1.1 skrll { "cr3", 3, {0, {{{0, 0}}}}, 0, 0 }, 194 1.1 skrll { "cr4", 4, {0, {{{0, 0}}}}, 0, 0 }, 195 1.1 skrll { "cr5", 5, {0, {{{0, 0}}}}, 0, 0 }, 196 1.1 skrll { "cr6", 6, {0, {{{0, 0}}}}, 0, 0 }, 197 1.1 skrll { "cr7", 7, {0, {{{0, 0}}}}, 0, 0 }, 198 1.1 skrll { "cr8", 8, {0, {{{0, 0}}}}, 0, 0 }, 199 1.1 skrll { "cr9", 9, {0, {{{0, 0}}}}, 0, 0 }, 200 1.1 skrll { "cr10", 10, {0, {{{0, 0}}}}, 0, 0 }, 201 1.1 skrll { "cr11", 11, {0, {{{0, 0}}}}, 0, 0 }, 202 1.1 skrll { "cr12", 12, {0, {{{0, 0}}}}, 0, 0 }, 203 1.1 skrll { "cr13", 13, {0, {{{0, 0}}}}, 0, 0 }, 204 1.1 skrll { "cr14", 14, {0, {{{0, 0}}}}, 0, 0 }, 205 1.1 skrll { "cr15", 15, {0, {{{0, 0}}}}, 0, 0 } 206 1.1 skrll }; 207 1.1 skrll 208 1.1 skrll CGEN_KEYWORD m32r_cgen_opval_cr_names = 209 1.1 skrll { 210 1.1 skrll & m32r_cgen_opval_cr_names_entries[0], 211 1.1 skrll 24, 212 1.1 skrll 0, 0, 0, 0, "" 213 1.1 skrll }; 214 1.1 skrll 215 1.1 skrll static CGEN_KEYWORD_ENTRY m32r_cgen_opval_h_accums_entries[] = 216 1.1 skrll { 217 1.1 skrll { "a0", 0, {0, {{{0, 0}}}}, 0, 0 }, 218 1.1 skrll { "a1", 1, {0, {{{0, 0}}}}, 0, 0 } 219 1.1 skrll }; 220 1.1 skrll 221 1.1 skrll CGEN_KEYWORD m32r_cgen_opval_h_accums = 222 1.1 skrll { 223 1.1 skrll & m32r_cgen_opval_h_accums_entries[0], 224 1.1 skrll 2, 225 1.1 skrll 0, 0, 0, 0, "" 226 1.1 skrll }; 227 1.1 skrll 228 1.1 skrll 229 1.1 skrll /* The hardware table. */ 230 1.1 skrll 231 1.1 skrll #define A(a) (1 << CGEN_HW_##a) 232 1.1 skrll 233 1.1 skrll const CGEN_HW_ENTRY m32r_cgen_hw_table[] = 234 1.1 skrll { 235 1.1 skrll { "h-memory", HW_H_MEMORY, CGEN_ASM_NONE, 0, { 0, { { { (1<<MACH_BASE), 0 } } } } }, 236 1.1 skrll { "h-sint", HW_H_SINT, CGEN_ASM_NONE, 0, { 0, { { { (1<<MACH_BASE), 0 } } } } }, 237 1.1 skrll { "h-uint", HW_H_UINT, CGEN_ASM_NONE, 0, { 0, { { { (1<<MACH_BASE), 0 } } } } }, 238 1.1 skrll { "h-addr", HW_H_ADDR, CGEN_ASM_NONE, 0, { 0, { { { (1<<MACH_BASE), 0 } } } } }, 239 1.1 skrll { "h-iaddr", HW_H_IADDR, CGEN_ASM_NONE, 0, { 0, { { { (1<<MACH_BASE), 0 } } } } }, 240 1.1 skrll { "h-pc", HW_H_PC, CGEN_ASM_NONE, 0, { 0|A(PROFILE)|A(PC), { { { (1<<MACH_BASE), 0 } } } } }, 241 1.1 skrll { "h-hi16", HW_H_HI16, CGEN_ASM_NONE, 0, { 0, { { { (1<<MACH_BASE), 0 } } } } }, 242 1.1 skrll { "h-slo16", HW_H_SLO16, CGEN_ASM_NONE, 0, { 0, { { { (1<<MACH_BASE), 0 } } } } }, 243 1.1 skrll { "h-ulo16", HW_H_ULO16, CGEN_ASM_NONE, 0, { 0, { { { (1<<MACH_BASE), 0 } } } } }, 244 1.1.1.8 christos { "h-gr", HW_H_GR, CGEN_ASM_KEYWORD, & m32r_cgen_opval_gr_names, { 0|A(CACHE_ADDR)|A(PROFILE), { { { (1<<MACH_BASE), 0 } } } } }, 245 1.1.1.8 christos { "h-cr", HW_H_CR, CGEN_ASM_KEYWORD, & m32r_cgen_opval_cr_names, { 0, { { { (1<<MACH_BASE), 0 } } } } }, 246 1.1 skrll { "h-accum", HW_H_ACCUM, CGEN_ASM_NONE, 0, { 0, { { { (1<<MACH_BASE), 0 } } } } }, 247 1.1.1.8 christos { "h-accums", HW_H_ACCUMS, CGEN_ASM_KEYWORD, & m32r_cgen_opval_h_accums, { 0, { { { (1<<MACH_M32RX)|(1<<MACH_M32R2), 0 } } } } }, 248 1.1 skrll { "h-cond", HW_H_COND, CGEN_ASM_NONE, 0, { 0, { { { (1<<MACH_BASE), 0 } } } } }, 249 1.1 skrll { "h-psw", HW_H_PSW, CGEN_ASM_NONE, 0, { 0, { { { (1<<MACH_BASE), 0 } } } } }, 250 1.1 skrll { "h-bpsw", HW_H_BPSW, CGEN_ASM_NONE, 0, { 0, { { { (1<<MACH_BASE), 0 } } } } }, 251 1.1 skrll { "h-bbpsw", HW_H_BBPSW, CGEN_ASM_NONE, 0, { 0, { { { (1<<MACH_BASE), 0 } } } } }, 252 1.1 skrll { "h-lock", HW_H_LOCK, CGEN_ASM_NONE, 0, { 0, { { { (1<<MACH_BASE), 0 } } } } }, 253 1.1 skrll { 0, 0, CGEN_ASM_NONE, 0, { 0, { { { (1<<MACH_BASE), 0 } } } } } 254 1.1 skrll }; 255 1.1 skrll 256 1.1 skrll #undef A 257 1.1 skrll 258 1.1 skrll 259 1.1 skrll /* The instruction field table. */ 260 1.1 skrll 261 1.1 skrll #define A(a) (1 << CGEN_IFLD_##a) 262 1.1 skrll 263 1.1 skrll const CGEN_IFLD m32r_cgen_ifld_table[] = 264 1.1 skrll { 265 1.1 skrll { M32R_F_NIL, "f-nil", 0, 0, 0, 0, { 0, { { { (1<<MACH_BASE), 0 } } } } }, 266 1.1 skrll { M32R_F_ANYOF, "f-anyof", 0, 0, 0, 0, { 0, { { { (1<<MACH_BASE), 0 } } } } }, 267 1.1 skrll { M32R_F_OP1, "f-op1", 0, 32, 0, 4, { 0, { { { (1<<MACH_BASE), 0 } } } } }, 268 1.1 skrll { M32R_F_OP2, "f-op2", 0, 32, 8, 4, { 0, { { { (1<<MACH_BASE), 0 } } } } }, 269 1.1 skrll { M32R_F_COND, "f-cond", 0, 32, 4, 4, { 0, { { { (1<<MACH_BASE), 0 } } } } }, 270 1.1 skrll { M32R_F_R1, "f-r1", 0, 32, 4, 4, { 0, { { { (1<<MACH_BASE), 0 } } } } }, 271 1.1 skrll { M32R_F_R2, "f-r2", 0, 32, 12, 4, { 0, { { { (1<<MACH_BASE), 0 } } } } }, 272 1.1 skrll { M32R_F_SIMM8, "f-simm8", 0, 32, 8, 8, { 0, { { { (1<<MACH_BASE), 0 } } } } }, 273 1.1 skrll { M32R_F_SIMM16, "f-simm16", 0, 32, 16, 16, { 0, { { { (1<<MACH_BASE), 0 } } } } }, 274 1.1 skrll { M32R_F_SHIFT_OP2, "f-shift-op2", 0, 32, 8, 3, { 0, { { { (1<<MACH_BASE), 0 } } } } }, 275 1.1 skrll { M32R_F_UIMM3, "f-uimm3", 0, 32, 5, 3, { 0, { { { (1<<MACH_BASE), 0 } } } } }, 276 1.1 skrll { M32R_F_UIMM4, "f-uimm4", 0, 32, 12, 4, { 0, { { { (1<<MACH_BASE), 0 } } } } }, 277 1.1 skrll { M32R_F_UIMM5, "f-uimm5", 0, 32, 11, 5, { 0, { { { (1<<MACH_BASE), 0 } } } } }, 278 1.1 skrll { M32R_F_UIMM8, "f-uimm8", 0, 32, 8, 8, { 0, { { { (1<<MACH_BASE), 0 } } } } }, 279 1.1 skrll { M32R_F_UIMM16, "f-uimm16", 0, 32, 16, 16, { 0, { { { (1<<MACH_BASE), 0 } } } } }, 280 1.1 skrll { M32R_F_UIMM24, "f-uimm24", 0, 32, 8, 24, { 0|A(RELOC)|A(ABS_ADDR), { { { (1<<MACH_BASE), 0 } } } } }, 281 1.1 skrll { M32R_F_HI16, "f-hi16", 0, 32, 16, 16, { 0|A(SIGN_OPT), { { { (1<<MACH_BASE), 0 } } } } }, 282 1.1 skrll { M32R_F_DISP8, "f-disp8", 0, 32, 8, 8, { 0|A(RELOC)|A(PCREL_ADDR), { { { (1<<MACH_BASE), 0 } } } } }, 283 1.1 skrll { M32R_F_DISP16, "f-disp16", 0, 32, 16, 16, { 0|A(RELOC)|A(PCREL_ADDR), { { { (1<<MACH_BASE), 0 } } } } }, 284 1.1 skrll { M32R_F_DISP24, "f-disp24", 0, 32, 8, 24, { 0|A(RELOC)|A(PCREL_ADDR), { { { (1<<MACH_BASE), 0 } } } } }, 285 1.1 skrll { M32R_F_OP23, "f-op23", 0, 32, 9, 3, { 0, { { { (1<<MACH_BASE), 0 } } } } }, 286 1.1 skrll { M32R_F_OP3, "f-op3", 0, 32, 14, 2, { 0, { { { (1<<MACH_BASE), 0 } } } } }, 287 1.1 skrll { M32R_F_ACC, "f-acc", 0, 32, 8, 1, { 0, { { { (1<<MACH_BASE), 0 } } } } }, 288 1.1 skrll { M32R_F_ACCS, "f-accs", 0, 32, 12, 2, { 0, { { { (1<<MACH_BASE), 0 } } } } }, 289 1.1 skrll { M32R_F_ACCD, "f-accd", 0, 32, 4, 2, { 0, { { { (1<<MACH_BASE), 0 } } } } }, 290 1.1 skrll { M32R_F_BITS67, "f-bits67", 0, 32, 6, 2, { 0, { { { (1<<MACH_BASE), 0 } } } } }, 291 1.1 skrll { M32R_F_BIT4, "f-bit4", 0, 32, 4, 1, { 0, { { { (1<<MACH_BASE), 0 } } } } }, 292 1.1 skrll { M32R_F_BIT14, "f-bit14", 0, 32, 14, 1, { 0, { { { (1<<MACH_BASE), 0 } } } } }, 293 1.1 skrll { M32R_F_IMM1, "f-imm1", 0, 32, 15, 1, { 0, { { { (1<<MACH_BASE), 0 } } } } }, 294 1.1 skrll { 0, 0, 0, 0, 0, 0, { 0, { { { (1<<MACH_BASE), 0 } } } } } 295 1.1 skrll }; 296 1.1 skrll 297 1.1 skrll #undef A 298 1.1 skrll 299 1.1 skrll 300 1.1 skrll 301 1.1 skrll /* multi ifield declarations */ 302 1.1 skrll 303 1.1 skrll 304 1.1 skrll 305 1.1 skrll /* multi ifield definitions */ 306 1.1 skrll 307 1.1 skrll 308 1.1 skrll /* The operand table. */ 309 1.1 skrll 310 1.1 skrll #define A(a) (1 << CGEN_OPERAND_##a) 311 1.1 skrll #define OPERAND(op) M32R_OPERAND_##op 312 1.1 skrll 313 1.1 skrll const CGEN_OPERAND m32r_cgen_operand_table[] = 314 1.1 skrll { 315 1.1 skrll /* pc: program counter */ 316 1.1 skrll { "pc", M32R_OPERAND_PC, HW_H_PC, 0, 0, 317 1.1.1.8 christos { 0, { &m32r_cgen_ifld_table[M32R_F_NIL] } }, 318 1.1 skrll { 0|A(SEM_ONLY), { { { (1<<MACH_BASE), 0 } } } } }, 319 1.1 skrll /* sr: source register */ 320 1.1 skrll { "sr", M32R_OPERAND_SR, HW_H_GR, 12, 4, 321 1.1.1.8 christos { 0, { &m32r_cgen_ifld_table[M32R_F_R2] } }, 322 1.1 skrll { 0, { { { (1<<MACH_BASE), 0 } } } } }, 323 1.1 skrll /* dr: destination register */ 324 1.1 skrll { "dr", M32R_OPERAND_DR, HW_H_GR, 4, 4, 325 1.1.1.8 christos { 0, { &m32r_cgen_ifld_table[M32R_F_R1] } }, 326 1.1 skrll { 0, { { { (1<<MACH_BASE), 0 } } } } }, 327 1.1 skrll /* src1: source register 1 */ 328 1.1 skrll { "src1", M32R_OPERAND_SRC1, HW_H_GR, 4, 4, 329 1.1.1.8 christos { 0, { &m32r_cgen_ifld_table[M32R_F_R1] } }, 330 1.1 skrll { 0, { { { (1<<MACH_BASE), 0 } } } } }, 331 1.1 skrll /* src2: source register 2 */ 332 1.1 skrll { "src2", M32R_OPERAND_SRC2, HW_H_GR, 12, 4, 333 1.1.1.8 christos { 0, { &m32r_cgen_ifld_table[M32R_F_R2] } }, 334 1.1 skrll { 0, { { { (1<<MACH_BASE), 0 } } } } }, 335 1.1 skrll /* scr: source control register */ 336 1.1 skrll { "scr", M32R_OPERAND_SCR, HW_H_CR, 12, 4, 337 1.1.1.8 christos { 0, { &m32r_cgen_ifld_table[M32R_F_R2] } }, 338 1.1 skrll { 0, { { { (1<<MACH_BASE), 0 } } } } }, 339 1.1 skrll /* dcr: destination control register */ 340 1.1 skrll { "dcr", M32R_OPERAND_DCR, HW_H_CR, 4, 4, 341 1.1.1.8 christos { 0, { &m32r_cgen_ifld_table[M32R_F_R1] } }, 342 1.1 skrll { 0, { { { (1<<MACH_BASE), 0 } } } } }, 343 1.1 skrll /* simm8: 8 bit signed immediate */ 344 1.1 skrll { "simm8", M32R_OPERAND_SIMM8, HW_H_SINT, 8, 8, 345 1.1.1.8 christos { 0, { &m32r_cgen_ifld_table[M32R_F_SIMM8] } }, 346 1.1.1.2 christos { 0, { { { (1<<MACH_BASE), 0 } } } } }, 347 1.1 skrll /* simm16: 16 bit signed immediate */ 348 1.1 skrll { "simm16", M32R_OPERAND_SIMM16, HW_H_SINT, 16, 16, 349 1.1.1.8 christos { 0, { &m32r_cgen_ifld_table[M32R_F_SIMM16] } }, 350 1.1.1.2 christos { 0, { { { (1<<MACH_BASE), 0 } } } } }, 351 1.1 skrll /* uimm3: 3 bit unsigned number */ 352 1.1 skrll { "uimm3", M32R_OPERAND_UIMM3, HW_H_UINT, 5, 3, 353 1.1.1.8 christos { 0, { &m32r_cgen_ifld_table[M32R_F_UIMM3] } }, 354 1.1.1.2 christos { 0, { { { (1<<MACH_BASE), 0 } } } } }, 355 1.1 skrll /* uimm4: 4 bit trap number */ 356 1.1 skrll { "uimm4", M32R_OPERAND_UIMM4, HW_H_UINT, 12, 4, 357 1.1.1.8 christos { 0, { &m32r_cgen_ifld_table[M32R_F_UIMM4] } }, 358 1.1.1.2 christos { 0, { { { (1<<MACH_BASE), 0 } } } } }, 359 1.1 skrll /* uimm5: 5 bit shift count */ 360 1.1 skrll { "uimm5", M32R_OPERAND_UIMM5, HW_H_UINT, 11, 5, 361 1.1.1.8 christos { 0, { &m32r_cgen_ifld_table[M32R_F_UIMM5] } }, 362 1.1.1.2 christos { 0, { { { (1<<MACH_BASE), 0 } } } } }, 363 1.1 skrll /* uimm8: 8 bit unsigned immediate */ 364 1.1 skrll { "uimm8", M32R_OPERAND_UIMM8, HW_H_UINT, 8, 8, 365 1.1.1.8 christos { 0, { &m32r_cgen_ifld_table[M32R_F_UIMM8] } }, 366 1.1.1.2 christos { 0, { { { (1<<MACH_BASE), 0 } } } } }, 367 1.1 skrll /* uimm16: 16 bit unsigned immediate */ 368 1.1 skrll { "uimm16", M32R_OPERAND_UIMM16, HW_H_UINT, 16, 16, 369 1.1.1.8 christos { 0, { &m32r_cgen_ifld_table[M32R_F_UIMM16] } }, 370 1.1.1.2 christos { 0, { { { (1<<MACH_BASE), 0 } } } } }, 371 1.1 skrll /* imm1: 1 bit immediate */ 372 1.1 skrll { "imm1", M32R_OPERAND_IMM1, HW_H_UINT, 15, 1, 373 1.1.1.8 christos { 0, { &m32r_cgen_ifld_table[M32R_F_IMM1] } }, 374 1.1.1.2 christos { 0, { { { (1<<MACH_M32RX)|(1<<MACH_M32R2), 0 } } } } }, 375 1.1 skrll /* accd: accumulator destination register */ 376 1.1 skrll { "accd", M32R_OPERAND_ACCD, HW_H_ACCUMS, 4, 2, 377 1.1.1.8 christos { 0, { &m32r_cgen_ifld_table[M32R_F_ACCD] } }, 378 1.1 skrll { 0, { { { (1<<MACH_M32RX)|(1<<MACH_M32R2), 0 } } } } }, 379 1.1 skrll /* accs: accumulator source register */ 380 1.1 skrll { "accs", M32R_OPERAND_ACCS, HW_H_ACCUMS, 12, 2, 381 1.1.1.8 christos { 0, { &m32r_cgen_ifld_table[M32R_F_ACCS] } }, 382 1.1 skrll { 0, { { { (1<<MACH_M32RX)|(1<<MACH_M32R2), 0 } } } } }, 383 1.1 skrll /* acc: accumulator reg (d) */ 384 1.1 skrll { "acc", M32R_OPERAND_ACC, HW_H_ACCUMS, 8, 1, 385 1.1.1.8 christos { 0, { &m32r_cgen_ifld_table[M32R_F_ACC] } }, 386 1.1 skrll { 0, { { { (1<<MACH_M32RX)|(1<<MACH_M32R2), 0 } } } } }, 387 1.1 skrll /* hash: # prefix */ 388 1.1 skrll { "hash", M32R_OPERAND_HASH, HW_H_SINT, 0, 0, 389 1.1.1.8 christos { 0, { 0 } }, 390 1.1 skrll { 0, { { { (1<<MACH_BASE), 0 } } } } }, 391 1.1 skrll /* hi16: high 16 bit immediate, sign optional */ 392 1.1 skrll { "hi16", M32R_OPERAND_HI16, HW_H_HI16, 16, 16, 393 1.1.1.8 christos { 0, { &m32r_cgen_ifld_table[M32R_F_HI16] } }, 394 1.1 skrll { 0|A(SIGN_OPT), { { { (1<<MACH_BASE), 0 } } } } }, 395 1.1 skrll /* slo16: 16 bit signed immediate, for low() */ 396 1.1 skrll { "slo16", M32R_OPERAND_SLO16, HW_H_SLO16, 16, 16, 397 1.1.1.8 christos { 0, { &m32r_cgen_ifld_table[M32R_F_SIMM16] } }, 398 1.1 skrll { 0, { { { (1<<MACH_BASE), 0 } } } } }, 399 1.1 skrll /* ulo16: 16 bit unsigned immediate, for low() */ 400 1.1 skrll { "ulo16", M32R_OPERAND_ULO16, HW_H_ULO16, 16, 16, 401 1.1.1.8 christos { 0, { &m32r_cgen_ifld_table[M32R_F_UIMM16] } }, 402 1.1 skrll { 0, { { { (1<<MACH_BASE), 0 } } } } }, 403 1.1 skrll /* uimm24: 24 bit address */ 404 1.1 skrll { "uimm24", M32R_OPERAND_UIMM24, HW_H_ADDR, 8, 24, 405 1.1.1.8 christos { 0, { &m32r_cgen_ifld_table[M32R_F_UIMM24] } }, 406 1.1.1.2 christos { 0|A(RELOC)|A(ABS_ADDR), { { { (1<<MACH_BASE), 0 } } } } }, 407 1.1 skrll /* disp8: 8 bit displacement */ 408 1.1 skrll { "disp8", M32R_OPERAND_DISP8, HW_H_IADDR, 8, 8, 409 1.1.1.8 christos { 0, { &m32r_cgen_ifld_table[M32R_F_DISP8] } }, 410 1.1 skrll { 0|A(RELAX)|A(RELOC)|A(PCREL_ADDR), { { { (1<<MACH_BASE), 0 } } } } }, 411 1.1 skrll /* disp16: 16 bit displacement */ 412 1.1 skrll { "disp16", M32R_OPERAND_DISP16, HW_H_IADDR, 16, 16, 413 1.1.1.8 christos { 0, { &m32r_cgen_ifld_table[M32R_F_DISP16] } }, 414 1.1 skrll { 0|A(RELOC)|A(PCREL_ADDR), { { { (1<<MACH_BASE), 0 } } } } }, 415 1.1 skrll /* disp24: 24 bit displacement */ 416 1.1 skrll { "disp24", M32R_OPERAND_DISP24, HW_H_IADDR, 8, 24, 417 1.1.1.8 christos { 0, { &m32r_cgen_ifld_table[M32R_F_DISP24] } }, 418 1.1 skrll { 0|A(RELAX)|A(RELOC)|A(PCREL_ADDR), { { { (1<<MACH_BASE), 0 } } } } }, 419 1.1 skrll /* condbit: condition bit */ 420 1.1 skrll { "condbit", M32R_OPERAND_CONDBIT, HW_H_COND, 0, 0, 421 1.1.1.8 christos { 0, { 0 } }, 422 1.1 skrll { 0|A(SEM_ONLY), { { { (1<<MACH_BASE), 0 } } } } }, 423 1.1 skrll /* accum: accumulator */ 424 1.1 skrll { "accum", M32R_OPERAND_ACCUM, HW_H_ACCUM, 0, 0, 425 1.1.1.8 christos { 0, { 0 } }, 426 1.1 skrll { 0|A(SEM_ONLY), { { { (1<<MACH_BASE), 0 } } } } }, 427 1.1 skrll /* sentinel */ 428 1.1 skrll { 0, 0, 0, 0, 0, 429 1.1.1.8 christos { 0, { 0 } }, 430 1.1 skrll { 0, { { { (1<<MACH_BASE), 0 } } } } } 431 1.1 skrll }; 432 1.1 skrll 433 1.1 skrll #undef A 434 1.1 skrll 435 1.1 skrll 436 1.1 skrll /* The instruction table. */ 437 1.1 skrll 438 1.1 skrll #define OP(field) CGEN_SYNTAX_MAKE_FIELD (OPERAND (field)) 439 1.1 skrll #define A(a) (1 << CGEN_INSN_##a) 440 1.1 skrll 441 1.1 skrll static const CGEN_IBASE m32r_cgen_insn_table[MAX_INSNS] = 442 1.1 skrll { 443 1.1 skrll /* Special null first entry. 444 1.1 skrll A `num' value of zero is thus invalid. 445 1.1 skrll Also, the special `invalid' insn resides here. */ 446 1.1 skrll { 0, 0, 0, 0, { 0, { { { (1<<MACH_BASE), 0 } }, { { PIPE_NONE, 0 } } } } }, 447 1.1 skrll /* add $dr,$sr */ 448 1.1 skrll { 449 1.1 skrll M32R_INSN_ADD, "add", "add", 16, 450 1.1 skrll { 0, { { { (1<<MACH_BASE), 0 } }, { { PIPE_OS, 0 } } } } 451 1.1 skrll }, 452 1.1 skrll /* add3 $dr,$sr,$hash$slo16 */ 453 1.1 skrll { 454 1.1 skrll M32R_INSN_ADD3, "add3", "add3", 32, 455 1.1 skrll { 0, { { { (1<<MACH_BASE), 0 } }, { { PIPE_NONE, 0 } } } } 456 1.1 skrll }, 457 1.1 skrll /* and $dr,$sr */ 458 1.1 skrll { 459 1.1 skrll M32R_INSN_AND, "and", "and", 16, 460 1.1 skrll { 0, { { { (1<<MACH_BASE), 0 } }, { { PIPE_OS, 0 } } } } 461 1.1 skrll }, 462 1.1 skrll /* and3 $dr,$sr,$uimm16 */ 463 1.1 skrll { 464 1.1 skrll M32R_INSN_AND3, "and3", "and3", 32, 465 1.1 skrll { 0, { { { (1<<MACH_BASE), 0 } }, { { PIPE_NONE, 0 } } } } 466 1.1 skrll }, 467 1.1 skrll /* or $dr,$sr */ 468 1.1 skrll { 469 1.1 skrll M32R_INSN_OR, "or", "or", 16, 470 1.1 skrll { 0, { { { (1<<MACH_BASE), 0 } }, { { PIPE_OS, 0 } } } } 471 1.1 skrll }, 472 1.1 skrll /* or3 $dr,$sr,$hash$ulo16 */ 473 1.1 skrll { 474 1.1 skrll M32R_INSN_OR3, "or3", "or3", 32, 475 1.1 skrll { 0, { { { (1<<MACH_BASE), 0 } }, { { PIPE_NONE, 0 } } } } 476 1.1 skrll }, 477 1.1 skrll /* xor $dr,$sr */ 478 1.1 skrll { 479 1.1 skrll M32R_INSN_XOR, "xor", "xor", 16, 480 1.1 skrll { 0, { { { (1<<MACH_BASE), 0 } }, { { PIPE_OS, 0 } } } } 481 1.1 skrll }, 482 1.1 skrll /* xor3 $dr,$sr,$uimm16 */ 483 1.1 skrll { 484 1.1 skrll M32R_INSN_XOR3, "xor3", "xor3", 32, 485 1.1 skrll { 0, { { { (1<<MACH_BASE), 0 } }, { { PIPE_NONE, 0 } } } } 486 1.1 skrll }, 487 1.1 skrll /* addi $dr,$simm8 */ 488 1.1 skrll { 489 1.1 skrll M32R_INSN_ADDI, "addi", "addi", 16, 490 1.1 skrll { 0, { { { (1<<MACH_BASE), 0 } }, { { PIPE_OS, 0 } } } } 491 1.1 skrll }, 492 1.1 skrll /* addv $dr,$sr */ 493 1.1 skrll { 494 1.1 skrll M32R_INSN_ADDV, "addv", "addv", 16, 495 1.1 skrll { 0, { { { (1<<MACH_BASE), 0 } }, { { PIPE_OS, 0 } } } } 496 1.1 skrll }, 497 1.1 skrll /* addv3 $dr,$sr,$simm16 */ 498 1.1 skrll { 499 1.1 skrll M32R_INSN_ADDV3, "addv3", "addv3", 32, 500 1.1 skrll { 0, { { { (1<<MACH_BASE), 0 } }, { { PIPE_NONE, 0 } } } } 501 1.1 skrll }, 502 1.1 skrll /* addx $dr,$sr */ 503 1.1 skrll { 504 1.1 skrll M32R_INSN_ADDX, "addx", "addx", 16, 505 1.1 skrll { 0, { { { (1<<MACH_BASE), 0 } }, { { PIPE_OS, 0 } } } } 506 1.1 skrll }, 507 1.1 skrll /* bc.s $disp8 */ 508 1.1 skrll { 509 1.1 skrll M32R_INSN_BC8, "bc8", "bc.s", 16, 510 1.1 skrll { 0|A(COND_CTI), { { { (1<<MACH_BASE), 0 } }, { { PIPE_O, 0 } } } } 511 1.1 skrll }, 512 1.1 skrll /* bc.l $disp24 */ 513 1.1 skrll { 514 1.1 skrll M32R_INSN_BC24, "bc24", "bc.l", 32, 515 1.1 skrll { 0|A(COND_CTI), { { { (1<<MACH_BASE), 0 } }, { { PIPE_NONE, 0 } } } } 516 1.1 skrll }, 517 1.1 skrll /* beq $src1,$src2,$disp16 */ 518 1.1 skrll { 519 1.1 skrll M32R_INSN_BEQ, "beq", "beq", 32, 520 1.1 skrll { 0|A(COND_CTI), { { { (1<<MACH_BASE), 0 } }, { { PIPE_NONE, 0 } } } } 521 1.1 skrll }, 522 1.1 skrll /* beqz $src2,$disp16 */ 523 1.1 skrll { 524 1.1 skrll M32R_INSN_BEQZ, "beqz", "beqz", 32, 525 1.1 skrll { 0|A(COND_CTI), { { { (1<<MACH_BASE), 0 } }, { { PIPE_NONE, 0 } } } } 526 1.1 skrll }, 527 1.1 skrll /* bgez $src2,$disp16 */ 528 1.1 skrll { 529 1.1 skrll M32R_INSN_BGEZ, "bgez", "bgez", 32, 530 1.1 skrll { 0|A(COND_CTI), { { { (1<<MACH_BASE), 0 } }, { { PIPE_NONE, 0 } } } } 531 1.1 skrll }, 532 1.1 skrll /* bgtz $src2,$disp16 */ 533 1.1 skrll { 534 1.1 skrll M32R_INSN_BGTZ, "bgtz", "bgtz", 32, 535 1.1 skrll { 0|A(COND_CTI), { { { (1<<MACH_BASE), 0 } }, { { PIPE_NONE, 0 } } } } 536 1.1 skrll }, 537 1.1 skrll /* blez $src2,$disp16 */ 538 1.1 skrll { 539 1.1 skrll M32R_INSN_BLEZ, "blez", "blez", 32, 540 1.1 skrll { 0|A(COND_CTI), { { { (1<<MACH_BASE), 0 } }, { { PIPE_NONE, 0 } } } } 541 1.1 skrll }, 542 1.1 skrll /* bltz $src2,$disp16 */ 543 1.1 skrll { 544 1.1 skrll M32R_INSN_BLTZ, "bltz", "bltz", 32, 545 1.1 skrll { 0|A(COND_CTI), { { { (1<<MACH_BASE), 0 } }, { { PIPE_NONE, 0 } } } } 546 1.1 skrll }, 547 1.1 skrll /* bnez $src2,$disp16 */ 548 1.1 skrll { 549 1.1 skrll M32R_INSN_BNEZ, "bnez", "bnez", 32, 550 1.1 skrll { 0|A(COND_CTI), { { { (1<<MACH_BASE), 0 } }, { { PIPE_NONE, 0 } } } } 551 1.1 skrll }, 552 1.1 skrll /* bl.s $disp8 */ 553 1.1 skrll { 554 1.1 skrll M32R_INSN_BL8, "bl8", "bl.s", 16, 555 1.1 skrll { 0|A(FILL_SLOT)|A(UNCOND_CTI), { { { (1<<MACH_BASE), 0 } }, { { PIPE_O, 0 } } } } 556 1.1 skrll }, 557 1.1 skrll /* bl.l $disp24 */ 558 1.1 skrll { 559 1.1 skrll M32R_INSN_BL24, "bl24", "bl.l", 32, 560 1.1 skrll { 0|A(UNCOND_CTI), { { { (1<<MACH_BASE), 0 } }, { { PIPE_NONE, 0 } } } } 561 1.1 skrll }, 562 1.1 skrll /* bcl.s $disp8 */ 563 1.1 skrll { 564 1.1 skrll M32R_INSN_BCL8, "bcl8", "bcl.s", 16, 565 1.1 skrll { 0|A(FILL_SLOT)|A(COND_CTI), { { { (1<<MACH_M32RX)|(1<<MACH_M32R2), 0 } }, { { PIPE_O, 0 } } } } 566 1.1 skrll }, 567 1.1 skrll /* bcl.l $disp24 */ 568 1.1 skrll { 569 1.1 skrll M32R_INSN_BCL24, "bcl24", "bcl.l", 32, 570 1.1 skrll { 0|A(COND_CTI), { { { (1<<MACH_M32RX)|(1<<MACH_M32R2), 0 } }, { { PIPE_NONE, 0 } } } } 571 1.1 skrll }, 572 1.1 skrll /* bnc.s $disp8 */ 573 1.1 skrll { 574 1.1 skrll M32R_INSN_BNC8, "bnc8", "bnc.s", 16, 575 1.1 skrll { 0|A(COND_CTI), { { { (1<<MACH_BASE), 0 } }, { { PIPE_O, 0 } } } } 576 1.1 skrll }, 577 1.1 skrll /* bnc.l $disp24 */ 578 1.1 skrll { 579 1.1 skrll M32R_INSN_BNC24, "bnc24", "bnc.l", 32, 580 1.1 skrll { 0|A(COND_CTI), { { { (1<<MACH_BASE), 0 } }, { { PIPE_NONE, 0 } } } } 581 1.1 skrll }, 582 1.1 skrll /* bne $src1,$src2,$disp16 */ 583 1.1 skrll { 584 1.1 skrll M32R_INSN_BNE, "bne", "bne", 32, 585 1.1 skrll { 0|A(COND_CTI), { { { (1<<MACH_BASE), 0 } }, { { PIPE_NONE, 0 } } } } 586 1.1 skrll }, 587 1.1 skrll /* bra.s $disp8 */ 588 1.1 skrll { 589 1.1 skrll M32R_INSN_BRA8, "bra8", "bra.s", 16, 590 1.1 skrll { 0|A(FILL_SLOT)|A(UNCOND_CTI), { { { (1<<MACH_BASE), 0 } }, { { PIPE_O, 0 } } } } 591 1.1 skrll }, 592 1.1 skrll /* bra.l $disp24 */ 593 1.1 skrll { 594 1.1 skrll M32R_INSN_BRA24, "bra24", "bra.l", 32, 595 1.1 skrll { 0|A(UNCOND_CTI), { { { (1<<MACH_BASE), 0 } }, { { PIPE_NONE, 0 } } } } 596 1.1 skrll }, 597 1.1 skrll /* bncl.s $disp8 */ 598 1.1 skrll { 599 1.1 skrll M32R_INSN_BNCL8, "bncl8", "bncl.s", 16, 600 1.1 skrll { 0|A(FILL_SLOT)|A(COND_CTI), { { { (1<<MACH_M32RX)|(1<<MACH_M32R2), 0 } }, { { PIPE_O, 0 } } } } 601 1.1 skrll }, 602 1.1 skrll /* bncl.l $disp24 */ 603 1.1 skrll { 604 1.1 skrll M32R_INSN_BNCL24, "bncl24", "bncl.l", 32, 605 1.1 skrll { 0|A(COND_CTI), { { { (1<<MACH_M32RX)|(1<<MACH_M32R2), 0 } }, { { PIPE_NONE, 0 } } } } 606 1.1 skrll }, 607 1.1 skrll /* cmp $src1,$src2 */ 608 1.1 skrll { 609 1.1 skrll M32R_INSN_CMP, "cmp", "cmp", 16, 610 1.1 skrll { 0, { { { (1<<MACH_BASE), 0 } }, { { PIPE_OS, 0 } } } } 611 1.1 skrll }, 612 1.1 skrll /* cmpi $src2,$simm16 */ 613 1.1 skrll { 614 1.1 skrll M32R_INSN_CMPI, "cmpi", "cmpi", 32, 615 1.1 skrll { 0, { { { (1<<MACH_BASE), 0 } }, { { PIPE_NONE, 0 } } } } 616 1.1 skrll }, 617 1.1 skrll /* cmpu $src1,$src2 */ 618 1.1 skrll { 619 1.1 skrll M32R_INSN_CMPU, "cmpu", "cmpu", 16, 620 1.1 skrll { 0, { { { (1<<MACH_BASE), 0 } }, { { PIPE_OS, 0 } } } } 621 1.1 skrll }, 622 1.1 skrll /* cmpui $src2,$simm16 */ 623 1.1 skrll { 624 1.1 skrll M32R_INSN_CMPUI, "cmpui", "cmpui", 32, 625 1.1 skrll { 0, { { { (1<<MACH_BASE), 0 } }, { { PIPE_NONE, 0 } } } } 626 1.1 skrll }, 627 1.1 skrll /* cmpeq $src1,$src2 */ 628 1.1 skrll { 629 1.1 skrll M32R_INSN_CMPEQ, "cmpeq", "cmpeq", 16, 630 1.1 skrll { 0, { { { (1<<MACH_M32RX)|(1<<MACH_M32R2), 0 } }, { { PIPE_OS, 0 } } } } 631 1.1 skrll }, 632 1.1 skrll /* cmpz $src2 */ 633 1.1 skrll { 634 1.1 skrll M32R_INSN_CMPZ, "cmpz", "cmpz", 16, 635 1.1 skrll { 0, { { { (1<<MACH_M32RX)|(1<<MACH_M32R2), 0 } }, { { PIPE_OS, 0 } } } } 636 1.1 skrll }, 637 1.1 skrll /* div $dr,$sr */ 638 1.1 skrll { 639 1.1 skrll M32R_INSN_DIV, "div", "div", 32, 640 1.1 skrll { 0, { { { (1<<MACH_BASE), 0 } }, { { PIPE_NONE, 0 } } } } 641 1.1 skrll }, 642 1.1 skrll /* divu $dr,$sr */ 643 1.1 skrll { 644 1.1 skrll M32R_INSN_DIVU, "divu", "divu", 32, 645 1.1 skrll { 0, { { { (1<<MACH_BASE), 0 } }, { { PIPE_NONE, 0 } } } } 646 1.1 skrll }, 647 1.1 skrll /* rem $dr,$sr */ 648 1.1 skrll { 649 1.1 skrll M32R_INSN_REM, "rem", "rem", 32, 650 1.1 skrll { 0, { { { (1<<MACH_BASE), 0 } }, { { PIPE_NONE, 0 } } } } 651 1.1 skrll }, 652 1.1 skrll /* remu $dr,$sr */ 653 1.1 skrll { 654 1.1 skrll M32R_INSN_REMU, "remu", "remu", 32, 655 1.1 skrll { 0, { { { (1<<MACH_BASE), 0 } }, { { PIPE_NONE, 0 } } } } 656 1.1 skrll }, 657 1.1 skrll /* remh $dr,$sr */ 658 1.1 skrll { 659 1.1 skrll M32R_INSN_REMH, "remh", "remh", 32, 660 1.1 skrll { 0, { { { (1<<MACH_M32R2), 0 } }, { { PIPE_NONE, 0 } } } } 661 1.1 skrll }, 662 1.1 skrll /* remuh $dr,$sr */ 663 1.1 skrll { 664 1.1 skrll M32R_INSN_REMUH, "remuh", "remuh", 32, 665 1.1 skrll { 0, { { { (1<<MACH_M32R2), 0 } }, { { PIPE_NONE, 0 } } } } 666 1.1 skrll }, 667 1.1 skrll /* remb $dr,$sr */ 668 1.1 skrll { 669 1.1 skrll M32R_INSN_REMB, "remb", "remb", 32, 670 1.1 skrll { 0, { { { (1<<MACH_M32R2), 0 } }, { { PIPE_NONE, 0 } } } } 671 1.1 skrll }, 672 1.1 skrll /* remub $dr,$sr */ 673 1.1 skrll { 674 1.1 skrll M32R_INSN_REMUB, "remub", "remub", 32, 675 1.1 skrll { 0, { { { (1<<MACH_M32R2), 0 } }, { { PIPE_NONE, 0 } } } } 676 1.1 skrll }, 677 1.1 skrll /* divuh $dr,$sr */ 678 1.1 skrll { 679 1.1 skrll M32R_INSN_DIVUH, "divuh", "divuh", 32, 680 1.1 skrll { 0, { { { (1<<MACH_M32R2), 0 } }, { { PIPE_NONE, 0 } } } } 681 1.1 skrll }, 682 1.1 skrll /* divb $dr,$sr */ 683 1.1 skrll { 684 1.1 skrll M32R_INSN_DIVB, "divb", "divb", 32, 685 1.1 skrll { 0, { { { (1<<MACH_M32R2), 0 } }, { { PIPE_NONE, 0 } } } } 686 1.1 skrll }, 687 1.1 skrll /* divub $dr,$sr */ 688 1.1 skrll { 689 1.1 skrll M32R_INSN_DIVUB, "divub", "divub", 32, 690 1.1 skrll { 0, { { { (1<<MACH_M32R2), 0 } }, { { PIPE_NONE, 0 } } } } 691 1.1 skrll }, 692 1.1 skrll /* divh $dr,$sr */ 693 1.1 skrll { 694 1.1 skrll M32R_INSN_DIVH, "divh", "divh", 32, 695 1.1 skrll { 0, { { { (1<<MACH_M32RX)|(1<<MACH_M32R2), 0 } }, { { PIPE_NONE, 0 } } } } 696 1.1 skrll }, 697 1.1 skrll /* jc $sr */ 698 1.1 skrll { 699 1.1 skrll M32R_INSN_JC, "jc", "jc", 16, 700 1.1 skrll { 0|A(SPECIAL)|A(COND_CTI), { { { (1<<MACH_M32RX)|(1<<MACH_M32R2), 0 } }, { { PIPE_O, 0 } } } } 701 1.1 skrll }, 702 1.1 skrll /* jnc $sr */ 703 1.1 skrll { 704 1.1 skrll M32R_INSN_JNC, "jnc", "jnc", 16, 705 1.1 skrll { 0|A(SPECIAL)|A(COND_CTI), { { { (1<<MACH_M32RX)|(1<<MACH_M32R2), 0 } }, { { PIPE_O, 0 } } } } 706 1.1 skrll }, 707 1.1 skrll /* jl $sr */ 708 1.1 skrll { 709 1.1 skrll M32R_INSN_JL, "jl", "jl", 16, 710 1.1 skrll { 0|A(FILL_SLOT)|A(UNCOND_CTI), { { { (1<<MACH_BASE), 0 } }, { { PIPE_O, 0 } } } } 711 1.1 skrll }, 712 1.1 skrll /* jmp $sr */ 713 1.1 skrll { 714 1.1 skrll M32R_INSN_JMP, "jmp", "jmp", 16, 715 1.1 skrll { 0|A(UNCOND_CTI), { { { (1<<MACH_BASE), 0 } }, { { PIPE_O, 0 } } } } 716 1.1 skrll }, 717 1.1 skrll /* ld $dr,@$sr */ 718 1.1 skrll { 719 1.1 skrll M32R_INSN_LD, "ld", "ld", 16, 720 1.1 skrll { 0, { { { (1<<MACH_BASE), 0 } }, { { PIPE_O, 0 } } } } 721 1.1 skrll }, 722 1.1 skrll /* ld $dr,@($slo16,$sr) */ 723 1.1 skrll { 724 1.1 skrll M32R_INSN_LD_D, "ld-d", "ld", 32, 725 1.1 skrll { 0, { { { (1<<MACH_BASE), 0 } }, { { PIPE_NONE, 0 } } } } 726 1.1 skrll }, 727 1.1 skrll /* ldb $dr,@$sr */ 728 1.1 skrll { 729 1.1 skrll M32R_INSN_LDB, "ldb", "ldb", 16, 730 1.1 skrll { 0, { { { (1<<MACH_BASE), 0 } }, { { PIPE_O, 0 } } } } 731 1.1 skrll }, 732 1.1 skrll /* ldb $dr,@($slo16,$sr) */ 733 1.1 skrll { 734 1.1 skrll M32R_INSN_LDB_D, "ldb-d", "ldb", 32, 735 1.1 skrll { 0, { { { (1<<MACH_BASE), 0 } }, { { PIPE_NONE, 0 } } } } 736 1.1 skrll }, 737 1.1 skrll /* ldh $dr,@$sr */ 738 1.1 skrll { 739 1.1 skrll M32R_INSN_LDH, "ldh", "ldh", 16, 740 1.1 skrll { 0, { { { (1<<MACH_BASE), 0 } }, { { PIPE_O, 0 } } } } 741 1.1 skrll }, 742 1.1 skrll /* ldh $dr,@($slo16,$sr) */ 743 1.1 skrll { 744 1.1 skrll M32R_INSN_LDH_D, "ldh-d", "ldh", 32, 745 1.1 skrll { 0, { { { (1<<MACH_BASE), 0 } }, { { PIPE_NONE, 0 } } } } 746 1.1 skrll }, 747 1.1 skrll /* ldub $dr,@$sr */ 748 1.1 skrll { 749 1.1 skrll M32R_INSN_LDUB, "ldub", "ldub", 16, 750 1.1 skrll { 0, { { { (1<<MACH_BASE), 0 } }, { { PIPE_O, 0 } } } } 751 1.1 skrll }, 752 1.1 skrll /* ldub $dr,@($slo16,$sr) */ 753 1.1 skrll { 754 1.1 skrll M32R_INSN_LDUB_D, "ldub-d", "ldub", 32, 755 1.1 skrll { 0, { { { (1<<MACH_BASE), 0 } }, { { PIPE_NONE, 0 } } } } 756 1.1 skrll }, 757 1.1 skrll /* lduh $dr,@$sr */ 758 1.1 skrll { 759 1.1 skrll M32R_INSN_LDUH, "lduh", "lduh", 16, 760 1.1 skrll { 0, { { { (1<<MACH_BASE), 0 } }, { { PIPE_O, 0 } } } } 761 1.1 skrll }, 762 1.1 skrll /* lduh $dr,@($slo16,$sr) */ 763 1.1 skrll { 764 1.1 skrll M32R_INSN_LDUH_D, "lduh-d", "lduh", 32, 765 1.1 skrll { 0, { { { (1<<MACH_BASE), 0 } }, { { PIPE_NONE, 0 } } } } 766 1.1 skrll }, 767 1.1 skrll /* ld $dr,@$sr+ */ 768 1.1 skrll { 769 1.1 skrll M32R_INSN_LD_PLUS, "ld-plus", "ld", 16, 770 1.1 skrll { 0, { { { (1<<MACH_BASE), 0 } }, { { PIPE_O, 0 } } } } 771 1.1 skrll }, 772 1.1 skrll /* ld24 $dr,$uimm24 */ 773 1.1 skrll { 774 1.1 skrll M32R_INSN_LD24, "ld24", "ld24", 32, 775 1.1 skrll { 0, { { { (1<<MACH_BASE), 0 } }, { { PIPE_NONE, 0 } } } } 776 1.1 skrll }, 777 1.1 skrll /* ldi8 $dr,$simm8 */ 778 1.1 skrll { 779 1.1 skrll M32R_INSN_LDI8, "ldi8", "ldi8", 16, 780 1.1 skrll { 0, { { { (1<<MACH_BASE), 0 } }, { { PIPE_OS, 0 } } } } 781 1.1 skrll }, 782 1.1 skrll /* ldi16 $dr,$hash$slo16 */ 783 1.1 skrll { 784 1.1 skrll M32R_INSN_LDI16, "ldi16", "ldi16", 32, 785 1.1 skrll { 0, { { { (1<<MACH_BASE), 0 } }, { { PIPE_NONE, 0 } } } } 786 1.1 skrll }, 787 1.1 skrll /* lock $dr,@$sr */ 788 1.1 skrll { 789 1.1 skrll M32R_INSN_LOCK, "lock", "lock", 16, 790 1.1 skrll { 0, { { { (1<<MACH_BASE), 0 } }, { { PIPE_O, 0 } } } } 791 1.1 skrll }, 792 1.1 skrll /* machi $src1,$src2 */ 793 1.1 skrll { 794 1.1 skrll M32R_INSN_MACHI, "machi", "machi", 16, 795 1.1 skrll { 0, { { { (1<<MACH_M32R), 0 } }, { { PIPE_S, 0 } } } } 796 1.1 skrll }, 797 1.1 skrll /* machi $src1,$src2,$acc */ 798 1.1 skrll { 799 1.1 skrll M32R_INSN_MACHI_A, "machi-a", "machi", 16, 800 1.1 skrll { 0, { { { (1<<MACH_M32RX)|(1<<MACH_M32R2), 0 } }, { { PIPE_S, 0 } } } } 801 1.1 skrll }, 802 1.1 skrll /* maclo $src1,$src2 */ 803 1.1 skrll { 804 1.1 skrll M32R_INSN_MACLO, "maclo", "maclo", 16, 805 1.1 skrll { 0, { { { (1<<MACH_M32R), 0 } }, { { PIPE_S, 0 } } } } 806 1.1 skrll }, 807 1.1 skrll /* maclo $src1,$src2,$acc */ 808 1.1 skrll { 809 1.1 skrll M32R_INSN_MACLO_A, "maclo-a", "maclo", 16, 810 1.1 skrll { 0, { { { (1<<MACH_M32RX)|(1<<MACH_M32R2), 0 } }, { { PIPE_S, 0 } } } } 811 1.1 skrll }, 812 1.1 skrll /* macwhi $src1,$src2 */ 813 1.1 skrll { 814 1.1 skrll M32R_INSN_MACWHI, "macwhi", "macwhi", 16, 815 1.1 skrll { 0, { { { (1<<MACH_M32R), 0 } }, { { PIPE_S, 0 } } } } 816 1.1 skrll }, 817 1.1 skrll /* macwhi $src1,$src2,$acc */ 818 1.1 skrll { 819 1.1 skrll M32R_INSN_MACWHI_A, "macwhi-a", "macwhi", 16, 820 1.1 skrll { 0|A(SPECIAL), { { { (1<<MACH_M32RX)|(1<<MACH_M32R2), 0 } }, { { PIPE_S, 0 } } } } 821 1.1 skrll }, 822 1.1 skrll /* macwlo $src1,$src2 */ 823 1.1 skrll { 824 1.1 skrll M32R_INSN_MACWLO, "macwlo", "macwlo", 16, 825 1.1 skrll { 0, { { { (1<<MACH_M32R), 0 } }, { { PIPE_S, 0 } } } } 826 1.1 skrll }, 827 1.1 skrll /* macwlo $src1,$src2,$acc */ 828 1.1 skrll { 829 1.1 skrll M32R_INSN_MACWLO_A, "macwlo-a", "macwlo", 16, 830 1.1 skrll { 0|A(SPECIAL), { { { (1<<MACH_M32RX)|(1<<MACH_M32R2), 0 } }, { { PIPE_S, 0 } } } } 831 1.1 skrll }, 832 1.1 skrll /* mul $dr,$sr */ 833 1.1 skrll { 834 1.1 skrll M32R_INSN_MUL, "mul", "mul", 16, 835 1.1 skrll { 0, { { { (1<<MACH_BASE), 0 } }, { { PIPE_S, 0 } } } } 836 1.1 skrll }, 837 1.1 skrll /* mulhi $src1,$src2 */ 838 1.1 skrll { 839 1.1 skrll M32R_INSN_MULHI, "mulhi", "mulhi", 16, 840 1.1 skrll { 0, { { { (1<<MACH_M32R), 0 } }, { { PIPE_S, 0 } } } } 841 1.1 skrll }, 842 1.1 skrll /* mulhi $src1,$src2,$acc */ 843 1.1 skrll { 844 1.1 skrll M32R_INSN_MULHI_A, "mulhi-a", "mulhi", 16, 845 1.1 skrll { 0, { { { (1<<MACH_M32RX)|(1<<MACH_M32R2), 0 } }, { { PIPE_S, 0 } } } } 846 1.1 skrll }, 847 1.1 skrll /* mullo $src1,$src2 */ 848 1.1 skrll { 849 1.1 skrll M32R_INSN_MULLO, "mullo", "mullo", 16, 850 1.1 skrll { 0, { { { (1<<MACH_M32R), 0 } }, { { PIPE_S, 0 } } } } 851 1.1 skrll }, 852 1.1 skrll /* mullo $src1,$src2,$acc */ 853 1.1 skrll { 854 1.1 skrll M32R_INSN_MULLO_A, "mullo-a", "mullo", 16, 855 1.1 skrll { 0, { { { (1<<MACH_M32RX)|(1<<MACH_M32R2), 0 } }, { { PIPE_S, 0 } } } } 856 1.1 skrll }, 857 1.1 skrll /* mulwhi $src1,$src2 */ 858 1.1 skrll { 859 1.1 skrll M32R_INSN_MULWHI, "mulwhi", "mulwhi", 16, 860 1.1 skrll { 0, { { { (1<<MACH_M32R), 0 } }, { { PIPE_S, 0 } } } } 861 1.1 skrll }, 862 1.1 skrll /* mulwhi $src1,$src2,$acc */ 863 1.1 skrll { 864 1.1 skrll M32R_INSN_MULWHI_A, "mulwhi-a", "mulwhi", 16, 865 1.1 skrll { 0|A(SPECIAL), { { { (1<<MACH_M32RX)|(1<<MACH_M32R2), 0 } }, { { PIPE_S, 0 } } } } 866 1.1 skrll }, 867 1.1 skrll /* mulwlo $src1,$src2 */ 868 1.1 skrll { 869 1.1 skrll M32R_INSN_MULWLO, "mulwlo", "mulwlo", 16, 870 1.1 skrll { 0, { { { (1<<MACH_M32R), 0 } }, { { PIPE_S, 0 } } } } 871 1.1 skrll }, 872 1.1 skrll /* mulwlo $src1,$src2,$acc */ 873 1.1 skrll { 874 1.1 skrll M32R_INSN_MULWLO_A, "mulwlo-a", "mulwlo", 16, 875 1.1 skrll { 0|A(SPECIAL), { { { (1<<MACH_M32RX)|(1<<MACH_M32R2), 0 } }, { { PIPE_S, 0 } } } } 876 1.1 skrll }, 877 1.1 skrll /* mv $dr,$sr */ 878 1.1 skrll { 879 1.1 skrll M32R_INSN_MV, "mv", "mv", 16, 880 1.1 skrll { 0, { { { (1<<MACH_BASE), 0 } }, { { PIPE_OS, 0 } } } } 881 1.1 skrll }, 882 1.1 skrll /* mvfachi $dr */ 883 1.1 skrll { 884 1.1 skrll M32R_INSN_MVFACHI, "mvfachi", "mvfachi", 16, 885 1.1 skrll { 0, { { { (1<<MACH_M32R), 0 } }, { { PIPE_S, 0 } } } } 886 1.1 skrll }, 887 1.1 skrll /* mvfachi $dr,$accs */ 888 1.1 skrll { 889 1.1 skrll M32R_INSN_MVFACHI_A, "mvfachi-a", "mvfachi", 16, 890 1.1 skrll { 0, { { { (1<<MACH_M32RX)|(1<<MACH_M32R2), 0 } }, { { PIPE_S, 0 } } } } 891 1.1 skrll }, 892 1.1 skrll /* mvfaclo $dr */ 893 1.1 skrll { 894 1.1 skrll M32R_INSN_MVFACLO, "mvfaclo", "mvfaclo", 16, 895 1.1 skrll { 0, { { { (1<<MACH_M32R), 0 } }, { { PIPE_S, 0 } } } } 896 1.1 skrll }, 897 1.1 skrll /* mvfaclo $dr,$accs */ 898 1.1 skrll { 899 1.1 skrll M32R_INSN_MVFACLO_A, "mvfaclo-a", "mvfaclo", 16, 900 1.1 skrll { 0, { { { (1<<MACH_M32RX)|(1<<MACH_M32R2), 0 } }, { { PIPE_S, 0 } } } } 901 1.1 skrll }, 902 1.1 skrll /* mvfacmi $dr */ 903 1.1 skrll { 904 1.1 skrll M32R_INSN_MVFACMI, "mvfacmi", "mvfacmi", 16, 905 1.1 skrll { 0, { { { (1<<MACH_M32R), 0 } }, { { PIPE_S, 0 } } } } 906 1.1 skrll }, 907 1.1 skrll /* mvfacmi $dr,$accs */ 908 1.1 skrll { 909 1.1 skrll M32R_INSN_MVFACMI_A, "mvfacmi-a", "mvfacmi", 16, 910 1.1 skrll { 0, { { { (1<<MACH_M32RX)|(1<<MACH_M32R2), 0 } }, { { PIPE_S, 0 } } } } 911 1.1 skrll }, 912 1.1 skrll /* mvfc $dr,$scr */ 913 1.1 skrll { 914 1.1 skrll M32R_INSN_MVFC, "mvfc", "mvfc", 16, 915 1.1 skrll { 0, { { { (1<<MACH_BASE), 0 } }, { { PIPE_O, 0 } } } } 916 1.1 skrll }, 917 1.1 skrll /* mvtachi $src1 */ 918 1.1 skrll { 919 1.1 skrll M32R_INSN_MVTACHI, "mvtachi", "mvtachi", 16, 920 1.1 skrll { 0, { { { (1<<MACH_M32R), 0 } }, { { PIPE_S, 0 } } } } 921 1.1 skrll }, 922 1.1 skrll /* mvtachi $src1,$accs */ 923 1.1 skrll { 924 1.1 skrll M32R_INSN_MVTACHI_A, "mvtachi-a", "mvtachi", 16, 925 1.1 skrll { 0, { { { (1<<MACH_M32RX)|(1<<MACH_M32R2), 0 } }, { { PIPE_S, 0 } } } } 926 1.1 skrll }, 927 1.1 skrll /* mvtaclo $src1 */ 928 1.1 skrll { 929 1.1 skrll M32R_INSN_MVTACLO, "mvtaclo", "mvtaclo", 16, 930 1.1 skrll { 0, { { { (1<<MACH_M32R), 0 } }, { { PIPE_S, 0 } } } } 931 1.1 skrll }, 932 1.1 skrll /* mvtaclo $src1,$accs */ 933 1.1 skrll { 934 1.1 skrll M32R_INSN_MVTACLO_A, "mvtaclo-a", "mvtaclo", 16, 935 1.1 skrll { 0, { { { (1<<MACH_M32RX)|(1<<MACH_M32R2), 0 } }, { { PIPE_S, 0 } } } } 936 1.1 skrll }, 937 1.1 skrll /* mvtc $sr,$dcr */ 938 1.1 skrll { 939 1.1 skrll M32R_INSN_MVTC, "mvtc", "mvtc", 16, 940 1.1 skrll { 0, { { { (1<<MACH_BASE), 0 } }, { { PIPE_O, 0 } } } } 941 1.1 skrll }, 942 1.1 skrll /* neg $dr,$sr */ 943 1.1 skrll { 944 1.1 skrll M32R_INSN_NEG, "neg", "neg", 16, 945 1.1 skrll { 0, { { { (1<<MACH_BASE), 0 } }, { { PIPE_OS, 0 } } } } 946 1.1 skrll }, 947 1.1 skrll /* nop */ 948 1.1 skrll { 949 1.1 skrll M32R_INSN_NOP, "nop", "nop", 16, 950 1.1 skrll { 0, { { { (1<<MACH_BASE), 0 } }, { { PIPE_OS, 0 } } } } 951 1.1 skrll }, 952 1.1 skrll /* not $dr,$sr */ 953 1.1 skrll { 954 1.1 skrll M32R_INSN_NOT, "not", "not", 16, 955 1.1 skrll { 0, { { { (1<<MACH_BASE), 0 } }, { { PIPE_OS, 0 } } } } 956 1.1 skrll }, 957 1.1 skrll /* rac */ 958 1.1 skrll { 959 1.1 skrll M32R_INSN_RAC, "rac", "rac", 16, 960 1.1 skrll { 0, { { { (1<<MACH_M32R), 0 } }, { { PIPE_S, 0 } } } } 961 1.1 skrll }, 962 1.1 skrll /* rac $accd,$accs,$imm1 */ 963 1.1 skrll { 964 1.1 skrll M32R_INSN_RAC_DSI, "rac-dsi", "rac", 16, 965 1.1 skrll { 0, { { { (1<<MACH_M32RX)|(1<<MACH_M32R2), 0 } }, { { PIPE_S, 0 } } } } 966 1.1 skrll }, 967 1.1 skrll /* rach */ 968 1.1 skrll { 969 1.1 skrll M32R_INSN_RACH, "rach", "rach", 16, 970 1.1 skrll { 0, { { { (1<<MACH_M32R), 0 } }, { { PIPE_S, 0 } } } } 971 1.1 skrll }, 972 1.1 skrll /* rach $accd,$accs,$imm1 */ 973 1.1 skrll { 974 1.1 skrll M32R_INSN_RACH_DSI, "rach-dsi", "rach", 16, 975 1.1 skrll { 0, { { { (1<<MACH_M32RX)|(1<<MACH_M32R2), 0 } }, { { PIPE_S, 0 } } } } 976 1.1 skrll }, 977 1.1 skrll /* rte */ 978 1.1 skrll { 979 1.1 skrll M32R_INSN_RTE, "rte", "rte", 16, 980 1.1 skrll { 0|A(UNCOND_CTI), { { { (1<<MACH_BASE), 0 } }, { { PIPE_O, 0 } } } } 981 1.1 skrll }, 982 1.1 skrll /* seth $dr,$hash$hi16 */ 983 1.1 skrll { 984 1.1 skrll M32R_INSN_SETH, "seth", "seth", 32, 985 1.1 skrll { 0, { { { (1<<MACH_BASE), 0 } }, { { PIPE_NONE, 0 } } } } 986 1.1 skrll }, 987 1.1 skrll /* sll $dr,$sr */ 988 1.1 skrll { 989 1.1 skrll M32R_INSN_SLL, "sll", "sll", 16, 990 1.1 skrll { 0, { { { (1<<MACH_BASE), 0 } }, { { PIPE_O_OS, 0 } } } } 991 1.1 skrll }, 992 1.1 skrll /* sll3 $dr,$sr,$simm16 */ 993 1.1 skrll { 994 1.1 skrll M32R_INSN_SLL3, "sll3", "sll3", 32, 995 1.1 skrll { 0, { { { (1<<MACH_BASE), 0 } }, { { PIPE_NONE, 0 } } } } 996 1.1 skrll }, 997 1.1 skrll /* slli $dr,$uimm5 */ 998 1.1 skrll { 999 1.1 skrll M32R_INSN_SLLI, "slli", "slli", 16, 1000 1.1 skrll { 0, { { { (1<<MACH_BASE), 0 } }, { { PIPE_O_OS, 0 } } } } 1001 1.1 skrll }, 1002 1.1 skrll /* sra $dr,$sr */ 1003 1.1 skrll { 1004 1.1 skrll M32R_INSN_SRA, "sra", "sra", 16, 1005 1.1 skrll { 0, { { { (1<<MACH_BASE), 0 } }, { { PIPE_O_OS, 0 } } } } 1006 1.1 skrll }, 1007 1.1 skrll /* sra3 $dr,$sr,$simm16 */ 1008 1.1 skrll { 1009 1.1 skrll M32R_INSN_SRA3, "sra3", "sra3", 32, 1010 1.1 skrll { 0, { { { (1<<MACH_BASE), 0 } }, { { PIPE_NONE, 0 } } } } 1011 1.1 skrll }, 1012 1.1 skrll /* srai $dr,$uimm5 */ 1013 1.1 skrll { 1014 1.1 skrll M32R_INSN_SRAI, "srai", "srai", 16, 1015 1.1 skrll { 0, { { { (1<<MACH_BASE), 0 } }, { { PIPE_O_OS, 0 } } } } 1016 1.1 skrll }, 1017 1.1 skrll /* srl $dr,$sr */ 1018 1.1 skrll { 1019 1.1 skrll M32R_INSN_SRL, "srl", "srl", 16, 1020 1.1 skrll { 0, { { { (1<<MACH_BASE), 0 } }, { { PIPE_O_OS, 0 } } } } 1021 1.1 skrll }, 1022 1.1 skrll /* srl3 $dr,$sr,$simm16 */ 1023 1.1 skrll { 1024 1.1 skrll M32R_INSN_SRL3, "srl3", "srl3", 32, 1025 1.1 skrll { 0, { { { (1<<MACH_BASE), 0 } }, { { PIPE_NONE, 0 } } } } 1026 1.1 skrll }, 1027 1.1 skrll /* srli $dr,$uimm5 */ 1028 1.1 skrll { 1029 1.1 skrll M32R_INSN_SRLI, "srli", "srli", 16, 1030 1.1 skrll { 0, { { { (1<<MACH_BASE), 0 } }, { { PIPE_O_OS, 0 } } } } 1031 1.1 skrll }, 1032 1.1 skrll /* st $src1,@$src2 */ 1033 1.1 skrll { 1034 1.1 skrll M32R_INSN_ST, "st", "st", 16, 1035 1.1 skrll { 0, { { { (1<<MACH_BASE), 0 } }, { { PIPE_O, 0 } } } } 1036 1.1 skrll }, 1037 1.1 skrll /* st $src1,@($slo16,$src2) */ 1038 1.1 skrll { 1039 1.1 skrll M32R_INSN_ST_D, "st-d", "st", 32, 1040 1.1 skrll { 0, { { { (1<<MACH_BASE), 0 } }, { { PIPE_NONE, 0 } } } } 1041 1.1 skrll }, 1042 1.1 skrll /* stb $src1,@$src2 */ 1043 1.1 skrll { 1044 1.1 skrll M32R_INSN_STB, "stb", "stb", 16, 1045 1.1 skrll { 0, { { { (1<<MACH_BASE), 0 } }, { { PIPE_O, 0 } } } } 1046 1.1 skrll }, 1047 1.1 skrll /* stb $src1,@($slo16,$src2) */ 1048 1.1 skrll { 1049 1.1 skrll M32R_INSN_STB_D, "stb-d", "stb", 32, 1050 1.1 skrll { 0, { { { (1<<MACH_BASE), 0 } }, { { PIPE_NONE, 0 } } } } 1051 1.1 skrll }, 1052 1.1 skrll /* sth $src1,@$src2 */ 1053 1.1 skrll { 1054 1.1 skrll M32R_INSN_STH, "sth", "sth", 16, 1055 1.1 skrll { 0, { { { (1<<MACH_BASE), 0 } }, { { PIPE_O, 0 } } } } 1056 1.1 skrll }, 1057 1.1 skrll /* sth $src1,@($slo16,$src2) */ 1058 1.1 skrll { 1059 1.1 skrll M32R_INSN_STH_D, "sth-d", "sth", 32, 1060 1.1 skrll { 0, { { { (1<<MACH_BASE), 0 } }, { { PIPE_NONE, 0 } } } } 1061 1.1 skrll }, 1062 1.1 skrll /* st $src1,@+$src2 */ 1063 1.1 skrll { 1064 1.1 skrll M32R_INSN_ST_PLUS, "st-plus", "st", 16, 1065 1.1 skrll { 0, { { { (1<<MACH_BASE), 0 } }, { { PIPE_O, 0 } } } } 1066 1.1 skrll }, 1067 1.1 skrll /* sth $src1,@$src2+ */ 1068 1.1 skrll { 1069 1.1 skrll M32R_INSN_STH_PLUS, "sth-plus", "sth", 16, 1070 1.1 skrll { 0|A(SPECIAL), { { { (1<<MACH_M32RX)|(1<<MACH_M32R2), 0 } }, { { PIPE_O, 0 } } } } 1071 1.1 skrll }, 1072 1.1 skrll /* stb $src1,@$src2+ */ 1073 1.1 skrll { 1074 1.1 skrll M32R_INSN_STB_PLUS, "stb-plus", "stb", 16, 1075 1.1 skrll { 0|A(SPECIAL), { { { (1<<MACH_M32RX)|(1<<MACH_M32R2), 0 } }, { { PIPE_O, 0 } } } } 1076 1.1 skrll }, 1077 1.1 skrll /* st $src1,@-$src2 */ 1078 1.1 skrll { 1079 1.1 skrll M32R_INSN_ST_MINUS, "st-minus", "st", 16, 1080 1.1 skrll { 0, { { { (1<<MACH_BASE), 0 } }, { { PIPE_O, 0 } } } } 1081 1.1 skrll }, 1082 1.1 skrll /* sub $dr,$sr */ 1083 1.1 skrll { 1084 1.1 skrll M32R_INSN_SUB, "sub", "sub", 16, 1085 1.1 skrll { 0, { { { (1<<MACH_BASE), 0 } }, { { PIPE_OS, 0 } } } } 1086 1.1 skrll }, 1087 1.1 skrll /* subv $dr,$sr */ 1088 1.1 skrll { 1089 1.1 skrll M32R_INSN_SUBV, "subv", "subv", 16, 1090 1.1 skrll { 0, { { { (1<<MACH_BASE), 0 } }, { { PIPE_OS, 0 } } } } 1091 1.1 skrll }, 1092 1.1 skrll /* subx $dr,$sr */ 1093 1.1 skrll { 1094 1.1 skrll M32R_INSN_SUBX, "subx", "subx", 16, 1095 1.1 skrll { 0, { { { (1<<MACH_BASE), 0 } }, { { PIPE_OS, 0 } } } } 1096 1.1 skrll }, 1097 1.1 skrll /* trap $uimm4 */ 1098 1.1 skrll { 1099 1.1 skrll M32R_INSN_TRAP, "trap", "trap", 16, 1100 1.1 skrll { 0|A(FILL_SLOT)|A(UNCOND_CTI), { { { (1<<MACH_BASE), 0 } }, { { PIPE_O, 0 } } } } 1101 1.1 skrll }, 1102 1.1 skrll /* unlock $src1,@$src2 */ 1103 1.1 skrll { 1104 1.1 skrll M32R_INSN_UNLOCK, "unlock", "unlock", 16, 1105 1.1 skrll { 0, { { { (1<<MACH_BASE), 0 } }, { { PIPE_O, 0 } } } } 1106 1.1 skrll }, 1107 1.1 skrll /* satb $dr,$sr */ 1108 1.1 skrll { 1109 1.1 skrll M32R_INSN_SATB, "satb", "satb", 32, 1110 1.1 skrll { 0, { { { (1<<MACH_M32RX)|(1<<MACH_M32R2), 0 } }, { { PIPE_NONE, 0 } } } } 1111 1.1 skrll }, 1112 1.1 skrll /* sath $dr,$sr */ 1113 1.1 skrll { 1114 1.1 skrll M32R_INSN_SATH, "sath", "sath", 32, 1115 1.1 skrll { 0, { { { (1<<MACH_M32RX)|(1<<MACH_M32R2), 0 } }, { { PIPE_NONE, 0 } } } } 1116 1.1 skrll }, 1117 1.1 skrll /* sat $dr,$sr */ 1118 1.1 skrll { 1119 1.1 skrll M32R_INSN_SAT, "sat", "sat", 32, 1120 1.1 skrll { 0|A(SPECIAL), { { { (1<<MACH_M32RX)|(1<<MACH_M32R2), 0 } }, { { PIPE_NONE, 0 } } } } 1121 1.1 skrll }, 1122 1.1 skrll /* pcmpbz $src2 */ 1123 1.1 skrll { 1124 1.1 skrll M32R_INSN_PCMPBZ, "pcmpbz", "pcmpbz", 16, 1125 1.1 skrll { 0|A(SPECIAL), { { { (1<<MACH_M32RX)|(1<<MACH_M32R2), 0 } }, { { PIPE_OS, 0 } } } } 1126 1.1 skrll }, 1127 1.1 skrll /* sadd */ 1128 1.1 skrll { 1129 1.1 skrll M32R_INSN_SADD, "sadd", "sadd", 16, 1130 1.1 skrll { 0, { { { (1<<MACH_M32RX)|(1<<MACH_M32R2), 0 } }, { { PIPE_S, 0 } } } } 1131 1.1 skrll }, 1132 1.1 skrll /* macwu1 $src1,$src2 */ 1133 1.1 skrll { 1134 1.1 skrll M32R_INSN_MACWU1, "macwu1", "macwu1", 16, 1135 1.1 skrll { 0, { { { (1<<MACH_M32RX)|(1<<MACH_M32R2), 0 } }, { { PIPE_S, 0 } } } } 1136 1.1 skrll }, 1137 1.1 skrll /* msblo $src1,$src2 */ 1138 1.1 skrll { 1139 1.1 skrll M32R_INSN_MSBLO, "msblo", "msblo", 16, 1140 1.1 skrll { 0, { { { (1<<MACH_M32RX)|(1<<MACH_M32R2), 0 } }, { { PIPE_S, 0 } } } } 1141 1.1 skrll }, 1142 1.1 skrll /* mulwu1 $src1,$src2 */ 1143 1.1 skrll { 1144 1.1 skrll M32R_INSN_MULWU1, "mulwu1", "mulwu1", 16, 1145 1.1 skrll { 0, { { { (1<<MACH_M32RX)|(1<<MACH_M32R2), 0 } }, { { PIPE_S, 0 } } } } 1146 1.1 skrll }, 1147 1.1 skrll /* maclh1 $src1,$src2 */ 1148 1.1 skrll { 1149 1.1 skrll M32R_INSN_MACLH1, "maclh1", "maclh1", 16, 1150 1.1 skrll { 0, { { { (1<<MACH_M32RX)|(1<<MACH_M32R2), 0 } }, { { PIPE_S, 0 } } } } 1151 1.1 skrll }, 1152 1.1 skrll /* sc */ 1153 1.1 skrll { 1154 1.1 skrll M32R_INSN_SC, "sc", "sc", 16, 1155 1.1 skrll { 0|A(SPECIAL)|A(SKIP_CTI), { { { (1<<MACH_M32RX)|(1<<MACH_M32R2), 0 } }, { { PIPE_O, 0 } } } } 1156 1.1 skrll }, 1157 1.1 skrll /* snc */ 1158 1.1 skrll { 1159 1.1 skrll M32R_INSN_SNC, "snc", "snc", 16, 1160 1.1 skrll { 0|A(SPECIAL)|A(SKIP_CTI), { { { (1<<MACH_M32RX)|(1<<MACH_M32R2), 0 } }, { { PIPE_O, 0 } } } } 1161 1.1 skrll }, 1162 1.1 skrll /* clrpsw $uimm8 */ 1163 1.1 skrll { 1164 1.1 skrll M32R_INSN_CLRPSW, "clrpsw", "clrpsw", 16, 1165 1.1 skrll { 0|A(SPECIAL_M32R), { { { (1<<MACH_BASE), 0 } }, { { PIPE_O, 0 } } } } 1166 1.1 skrll }, 1167 1.1 skrll /* setpsw $uimm8 */ 1168 1.1 skrll { 1169 1.1 skrll M32R_INSN_SETPSW, "setpsw", "setpsw", 16, 1170 1.1 skrll { 0|A(SPECIAL_M32R), { { { (1<<MACH_BASE), 0 } }, { { PIPE_O, 0 } } } } 1171 1.1 skrll }, 1172 1.1 skrll /* bset $uimm3,@($slo16,$sr) */ 1173 1.1 skrll { 1174 1.1 skrll M32R_INSN_BSET, "bset", "bset", 32, 1175 1.1 skrll { 0|A(SPECIAL_M32R), { { { (1<<MACH_BASE), 0 } }, { { PIPE_NONE, 0 } } } } 1176 1.1 skrll }, 1177 1.1 skrll /* bclr $uimm3,@($slo16,$sr) */ 1178 1.1 skrll { 1179 1.1 skrll M32R_INSN_BCLR, "bclr", "bclr", 32, 1180 1.1 skrll { 0|A(SPECIAL_M32R), { { { (1<<MACH_BASE), 0 } }, { { PIPE_NONE, 0 } } } } 1181 1.1 skrll }, 1182 1.1 skrll /* btst $uimm3,$sr */ 1183 1.1 skrll { 1184 1.1 skrll M32R_INSN_BTST, "btst", "btst", 16, 1185 1.1 skrll { 0|A(SPECIAL_M32R), { { { (1<<MACH_BASE), 0 } }, { { PIPE_O, 0 } } } } 1186 1.1 skrll }, 1187 1.1 skrll }; 1188 1.1 skrll 1189 1.1 skrll #undef OP 1190 1.1 skrll #undef A 1191 1.1 skrll 1192 1.1 skrll /* Initialize anything needed to be done once, before any cpu_open call. */ 1193 1.1 skrll 1194 1.1 skrll static void 1195 1.1 skrll init_tables (void) 1196 1.1 skrll { 1197 1.1 skrll } 1198 1.1 skrll 1199 1.1.1.6 christos #ifndef opcodes_error_handler 1200 1.1.1.6 christos #define opcodes_error_handler(...) \ 1201 1.1.1.6 christos fprintf (stderr, __VA_ARGS__); fputc ('\n', stderr) 1202 1.1.1.6 christos #endif 1203 1.1.1.6 christos 1204 1.1 skrll static const CGEN_MACH * lookup_mach_via_bfd_name (const CGEN_MACH *, const char *); 1205 1.1 skrll static void build_hw_table (CGEN_CPU_TABLE *); 1206 1.1 skrll static void build_ifield_table (CGEN_CPU_TABLE *); 1207 1.1 skrll static void build_operand_table (CGEN_CPU_TABLE *); 1208 1.1 skrll static void build_insn_table (CGEN_CPU_TABLE *); 1209 1.1 skrll static void m32r_cgen_rebuild_tables (CGEN_CPU_TABLE *); 1210 1.1 skrll 1211 1.1 skrll /* Subroutine of m32r_cgen_cpu_open to look up a mach via its bfd name. */ 1212 1.1 skrll 1213 1.1 skrll static const CGEN_MACH * 1214 1.1 skrll lookup_mach_via_bfd_name (const CGEN_MACH *table, const char *name) 1215 1.1 skrll { 1216 1.1 skrll while (table->name) 1217 1.1 skrll { 1218 1.1 skrll if (strcmp (name, table->bfd_name) == 0) 1219 1.1 skrll return table; 1220 1.1 skrll ++table; 1221 1.1 skrll } 1222 1.1.1.5 christos return NULL; 1223 1.1 skrll } 1224 1.1 skrll 1225 1.1 skrll /* Subroutine of m32r_cgen_cpu_open to build the hardware table. */ 1226 1.1 skrll 1227 1.1 skrll static void 1228 1.1 skrll build_hw_table (CGEN_CPU_TABLE *cd) 1229 1.1 skrll { 1230 1.1 skrll int i; 1231 1.1 skrll int machs = cd->machs; 1232 1.1 skrll const CGEN_HW_ENTRY *init = & m32r_cgen_hw_table[0]; 1233 1.1 skrll /* MAX_HW is only an upper bound on the number of selected entries. 1234 1.1 skrll However each entry is indexed by it's enum so there can be holes in 1235 1.1 skrll the table. */ 1236 1.1 skrll const CGEN_HW_ENTRY **selected = 1237 1.1 skrll (const CGEN_HW_ENTRY **) xmalloc (MAX_HW * sizeof (CGEN_HW_ENTRY *)); 1238 1.1 skrll 1239 1.1 skrll cd->hw_table.init_entries = init; 1240 1.1 skrll cd->hw_table.entry_size = sizeof (CGEN_HW_ENTRY); 1241 1.1 skrll memset (selected, 0, MAX_HW * sizeof (CGEN_HW_ENTRY *)); 1242 1.1 skrll /* ??? For now we just use machs to determine which ones we want. */ 1243 1.1 skrll for (i = 0; init[i].name != NULL; ++i) 1244 1.1 skrll if (CGEN_HW_ATTR_VALUE (&init[i], CGEN_HW_MACH) 1245 1.1 skrll & machs) 1246 1.1 skrll selected[init[i].type] = &init[i]; 1247 1.1 skrll cd->hw_table.entries = selected; 1248 1.1 skrll cd->hw_table.num_entries = MAX_HW; 1249 1.1 skrll } 1250 1.1 skrll 1251 1.1 skrll /* Subroutine of m32r_cgen_cpu_open to build the hardware table. */ 1252 1.1 skrll 1253 1.1 skrll static void 1254 1.1 skrll build_ifield_table (CGEN_CPU_TABLE *cd) 1255 1.1 skrll { 1256 1.1 skrll cd->ifld_table = & m32r_cgen_ifld_table[0]; 1257 1.1 skrll } 1258 1.1 skrll 1259 1.1 skrll /* Subroutine of m32r_cgen_cpu_open to build the hardware table. */ 1260 1.1 skrll 1261 1.1 skrll static void 1262 1.1 skrll build_operand_table (CGEN_CPU_TABLE *cd) 1263 1.1 skrll { 1264 1.1 skrll int i; 1265 1.1 skrll int machs = cd->machs; 1266 1.1 skrll const CGEN_OPERAND *init = & m32r_cgen_operand_table[0]; 1267 1.1 skrll /* MAX_OPERANDS is only an upper bound on the number of selected entries. 1268 1.1 skrll However each entry is indexed by it's enum so there can be holes in 1269 1.1 skrll the table. */ 1270 1.1 skrll const CGEN_OPERAND **selected = xmalloc (MAX_OPERANDS * sizeof (* selected)); 1271 1.1 skrll 1272 1.1 skrll cd->operand_table.init_entries = init; 1273 1.1 skrll cd->operand_table.entry_size = sizeof (CGEN_OPERAND); 1274 1.1 skrll memset (selected, 0, MAX_OPERANDS * sizeof (CGEN_OPERAND *)); 1275 1.1 skrll /* ??? For now we just use mach to determine which ones we want. */ 1276 1.1 skrll for (i = 0; init[i].name != NULL; ++i) 1277 1.1 skrll if (CGEN_OPERAND_ATTR_VALUE (&init[i], CGEN_OPERAND_MACH) 1278 1.1 skrll & machs) 1279 1.1 skrll selected[init[i].type] = &init[i]; 1280 1.1 skrll cd->operand_table.entries = selected; 1281 1.1 skrll cd->operand_table.num_entries = MAX_OPERANDS; 1282 1.1 skrll } 1283 1.1 skrll 1284 1.1 skrll /* Subroutine of m32r_cgen_cpu_open to build the hardware table. 1285 1.1 skrll ??? This could leave out insns not supported by the specified mach/isa, 1286 1.1 skrll but that would cause errors like "foo only supported by bar" to become 1287 1.1 skrll "unknown insn", so for now we include all insns and require the app to 1288 1.1 skrll do the checking later. 1289 1.1 skrll ??? On the other hand, parsing of such insns may require their hardware or 1290 1.1 skrll operand elements to be in the table [which they mightn't be]. */ 1291 1.1 skrll 1292 1.1 skrll static void 1293 1.1 skrll build_insn_table (CGEN_CPU_TABLE *cd) 1294 1.1 skrll { 1295 1.1 skrll int i; 1296 1.1 skrll const CGEN_IBASE *ib = & m32r_cgen_insn_table[0]; 1297 1.1 skrll CGEN_INSN *insns = xmalloc (MAX_INSNS * sizeof (CGEN_INSN)); 1298 1.1 skrll 1299 1.1 skrll memset (insns, 0, MAX_INSNS * sizeof (CGEN_INSN)); 1300 1.1 skrll for (i = 0; i < MAX_INSNS; ++i) 1301 1.1 skrll insns[i].base = &ib[i]; 1302 1.1 skrll cd->insn_table.init_entries = insns; 1303 1.1 skrll cd->insn_table.entry_size = sizeof (CGEN_IBASE); 1304 1.1 skrll cd->insn_table.num_init_entries = MAX_INSNS; 1305 1.1 skrll } 1306 1.1 skrll 1307 1.1 skrll /* Subroutine of m32r_cgen_cpu_open to rebuild the tables. */ 1308 1.1 skrll 1309 1.1 skrll static void 1310 1.1 skrll m32r_cgen_rebuild_tables (CGEN_CPU_TABLE *cd) 1311 1.1 skrll { 1312 1.1 skrll int i; 1313 1.1 skrll CGEN_BITSET *isas = cd->isas; 1314 1.1 skrll unsigned int machs = cd->machs; 1315 1.1 skrll 1316 1.1 skrll cd->int_insn_p = CGEN_INT_INSN_P; 1317 1.1 skrll 1318 1.1 skrll /* Data derived from the isa spec. */ 1319 1.1 skrll #define UNSET (CGEN_SIZE_UNKNOWN + 1) 1320 1.1 skrll cd->default_insn_bitsize = UNSET; 1321 1.1 skrll cd->base_insn_bitsize = UNSET; 1322 1.1 skrll cd->min_insn_bitsize = 65535; /* Some ridiculously big number. */ 1323 1.1 skrll cd->max_insn_bitsize = 0; 1324 1.1 skrll for (i = 0; i < MAX_ISAS; ++i) 1325 1.1 skrll if (cgen_bitset_contains (isas, i)) 1326 1.1 skrll { 1327 1.1 skrll const CGEN_ISA *isa = & m32r_cgen_isa_table[i]; 1328 1.1 skrll 1329 1.1 skrll /* Default insn sizes of all selected isas must be 1330 1.1 skrll equal or we set the result to 0, meaning "unknown". */ 1331 1.1 skrll if (cd->default_insn_bitsize == UNSET) 1332 1.1 skrll cd->default_insn_bitsize = isa->default_insn_bitsize; 1333 1.1 skrll else if (isa->default_insn_bitsize == cd->default_insn_bitsize) 1334 1.1 skrll ; /* This is ok. */ 1335 1.1 skrll else 1336 1.1 skrll cd->default_insn_bitsize = CGEN_SIZE_UNKNOWN; 1337 1.1 skrll 1338 1.1 skrll /* Base insn sizes of all selected isas must be equal 1339 1.1 skrll or we set the result to 0, meaning "unknown". */ 1340 1.1 skrll if (cd->base_insn_bitsize == UNSET) 1341 1.1 skrll cd->base_insn_bitsize = isa->base_insn_bitsize; 1342 1.1 skrll else if (isa->base_insn_bitsize == cd->base_insn_bitsize) 1343 1.1 skrll ; /* This is ok. */ 1344 1.1 skrll else 1345 1.1 skrll cd->base_insn_bitsize = CGEN_SIZE_UNKNOWN; 1346 1.1 skrll 1347 1.1 skrll /* Set min,max insn sizes. */ 1348 1.1 skrll if (isa->min_insn_bitsize < cd->min_insn_bitsize) 1349 1.1 skrll cd->min_insn_bitsize = isa->min_insn_bitsize; 1350 1.1 skrll if (isa->max_insn_bitsize > cd->max_insn_bitsize) 1351 1.1 skrll cd->max_insn_bitsize = isa->max_insn_bitsize; 1352 1.1 skrll } 1353 1.1 skrll 1354 1.1 skrll /* Data derived from the mach spec. */ 1355 1.1 skrll for (i = 0; i < MAX_MACHS; ++i) 1356 1.1 skrll if (((1 << i) & machs) != 0) 1357 1.1 skrll { 1358 1.1 skrll const CGEN_MACH *mach = & m32r_cgen_mach_table[i]; 1359 1.1 skrll 1360 1.1 skrll if (mach->insn_chunk_bitsize != 0) 1361 1.1 skrll { 1362 1.1 skrll if (cd->insn_chunk_bitsize != 0 && cd->insn_chunk_bitsize != mach->insn_chunk_bitsize) 1363 1.1 skrll { 1364 1.1.1.6 christos opcodes_error_handler 1365 1.1.1.6 christos (/* xgettext:c-format */ 1366 1.1.1.6 christos _("internal error: m32r_cgen_rebuild_tables: " 1367 1.1.1.6 christos "conflicting insn-chunk-bitsize values: `%d' vs. `%d'"), 1368 1.1.1.6 christos cd->insn_chunk_bitsize, mach->insn_chunk_bitsize); 1369 1.1 skrll abort (); 1370 1.1 skrll } 1371 1.1 skrll 1372 1.1 skrll cd->insn_chunk_bitsize = mach->insn_chunk_bitsize; 1373 1.1 skrll } 1374 1.1 skrll } 1375 1.1 skrll 1376 1.1 skrll /* Determine which hw elements are used by MACH. */ 1377 1.1 skrll build_hw_table (cd); 1378 1.1 skrll 1379 1.1 skrll /* Build the ifield table. */ 1380 1.1 skrll build_ifield_table (cd); 1381 1.1 skrll 1382 1.1 skrll /* Determine which operands are used by MACH/ISA. */ 1383 1.1 skrll build_operand_table (cd); 1384 1.1 skrll 1385 1.1 skrll /* Build the instruction table. */ 1386 1.1 skrll build_insn_table (cd); 1387 1.1 skrll } 1388 1.1 skrll 1389 1.1 skrll /* Initialize a cpu table and return a descriptor. 1390 1.1 skrll It's much like opening a file, and must be the first function called. 1391 1.1 skrll The arguments are a set of (type/value) pairs, terminated with 1392 1.1 skrll CGEN_CPU_OPEN_END. 1393 1.1 skrll 1394 1.1 skrll Currently supported values: 1395 1.1 skrll CGEN_CPU_OPEN_ISAS: bitmap of values in enum isa_attr 1396 1.1 skrll CGEN_CPU_OPEN_MACHS: bitmap of values in enum mach_attr 1397 1.1 skrll CGEN_CPU_OPEN_BFDMACH: specify 1 mach using bfd name 1398 1.1 skrll CGEN_CPU_OPEN_ENDIAN: specify endian choice 1399 1.1.1.8 christos CGEN_CPU_OPEN_INSN_ENDIAN: specify instruction endian choice 1400 1.1 skrll CGEN_CPU_OPEN_END: terminates arguments 1401 1.1 skrll 1402 1.1 skrll ??? Simultaneous multiple isas might not make sense, but it's not (yet) 1403 1.1.1.2 christos precluded. */ 1404 1.1 skrll 1405 1.1 skrll CGEN_CPU_DESC 1406 1.1 skrll m32r_cgen_cpu_open (enum cgen_cpu_open_arg arg_type, ...) 1407 1.1 skrll { 1408 1.1 skrll CGEN_CPU_TABLE *cd = (CGEN_CPU_TABLE *) xmalloc (sizeof (CGEN_CPU_TABLE)); 1409 1.1 skrll static int init_p; 1410 1.1 skrll CGEN_BITSET *isas = 0; /* 0 = "unspecified" */ 1411 1.1 skrll unsigned int machs = 0; /* 0 = "unspecified" */ 1412 1.1 skrll enum cgen_endian endian = CGEN_ENDIAN_UNKNOWN; 1413 1.1.1.8 christos enum cgen_endian insn_endian = CGEN_ENDIAN_UNKNOWN; 1414 1.1 skrll va_list ap; 1415 1.1 skrll 1416 1.1 skrll if (! init_p) 1417 1.1 skrll { 1418 1.1 skrll init_tables (); 1419 1.1 skrll init_p = 1; 1420 1.1 skrll } 1421 1.1 skrll 1422 1.1 skrll memset (cd, 0, sizeof (*cd)); 1423 1.1 skrll 1424 1.1 skrll va_start (ap, arg_type); 1425 1.1 skrll while (arg_type != CGEN_CPU_OPEN_END) 1426 1.1 skrll { 1427 1.1 skrll switch (arg_type) 1428 1.1 skrll { 1429 1.1 skrll case CGEN_CPU_OPEN_ISAS : 1430 1.1 skrll isas = va_arg (ap, CGEN_BITSET *); 1431 1.1 skrll break; 1432 1.1 skrll case CGEN_CPU_OPEN_MACHS : 1433 1.1 skrll machs = va_arg (ap, unsigned int); 1434 1.1 skrll break; 1435 1.1 skrll case CGEN_CPU_OPEN_BFDMACH : 1436 1.1 skrll { 1437 1.1 skrll const char *name = va_arg (ap, const char *); 1438 1.1 skrll const CGEN_MACH *mach = 1439 1.1 skrll lookup_mach_via_bfd_name (m32r_cgen_mach_table, name); 1440 1.1 skrll 1441 1.1.1.5 christos if (mach != NULL) 1442 1.1.1.5 christos machs |= 1 << mach->num; 1443 1.1 skrll break; 1444 1.1 skrll } 1445 1.1 skrll case CGEN_CPU_OPEN_ENDIAN : 1446 1.1 skrll endian = va_arg (ap, enum cgen_endian); 1447 1.1 skrll break; 1448 1.1.1.8 christos case CGEN_CPU_OPEN_INSN_ENDIAN : 1449 1.1.1.8 christos insn_endian = va_arg (ap, enum cgen_endian); 1450 1.1.1.8 christos break; 1451 1.1 skrll default : 1452 1.1.1.6 christos opcodes_error_handler 1453 1.1.1.6 christos (/* xgettext:c-format */ 1454 1.1.1.6 christos _("internal error: m32r_cgen_cpu_open: " 1455 1.1.1.6 christos "unsupported argument `%d'"), 1456 1.1.1.6 christos arg_type); 1457 1.1 skrll abort (); /* ??? return NULL? */ 1458 1.1 skrll } 1459 1.1 skrll arg_type = va_arg (ap, enum cgen_cpu_open_arg); 1460 1.1 skrll } 1461 1.1 skrll va_end (ap); 1462 1.1 skrll 1463 1.1 skrll /* Mach unspecified means "all". */ 1464 1.1 skrll if (machs == 0) 1465 1.1 skrll machs = (1 << MAX_MACHS) - 1; 1466 1.1 skrll /* Base mach is always selected. */ 1467 1.1 skrll machs |= 1; 1468 1.1 skrll if (endian == CGEN_ENDIAN_UNKNOWN) 1469 1.1 skrll { 1470 1.1 skrll /* ??? If target has only one, could have a default. */ 1471 1.1.1.6 christos opcodes_error_handler 1472 1.1.1.6 christos (/* xgettext:c-format */ 1473 1.1.1.6 christos _("internal error: m32r_cgen_cpu_open: no endianness specified")); 1474 1.1 skrll abort (); 1475 1.1 skrll } 1476 1.1 skrll 1477 1.1 skrll cd->isas = cgen_bitset_copy (isas); 1478 1.1 skrll cd->machs = machs; 1479 1.1 skrll cd->endian = endian; 1480 1.1.1.8 christos cd->insn_endian 1481 1.1.1.8 christos = (insn_endian == CGEN_ENDIAN_UNKNOWN ? endian : insn_endian); 1482 1.1 skrll 1483 1.1 skrll /* Table (re)builder. */ 1484 1.1 skrll cd->rebuild_tables = m32r_cgen_rebuild_tables; 1485 1.1 skrll m32r_cgen_rebuild_tables (cd); 1486 1.1 skrll 1487 1.1 skrll /* Default to not allowing signed overflow. */ 1488 1.1 skrll cd->signed_overflow_ok_p = 0; 1489 1.1.1.3 christos 1490 1.1 skrll return (CGEN_CPU_DESC) cd; 1491 1.1 skrll } 1492 1.1 skrll 1493 1.1 skrll /* Cover fn to m32r_cgen_cpu_open to handle the simple case of 1 isa, 1 mach. 1494 1.1 skrll MACH_NAME is the bfd name of the mach. */ 1495 1.1 skrll 1496 1.1 skrll CGEN_CPU_DESC 1497 1.1 skrll m32r_cgen_cpu_open_1 (const char *mach_name, enum cgen_endian endian) 1498 1.1 skrll { 1499 1.1 skrll return m32r_cgen_cpu_open (CGEN_CPU_OPEN_BFDMACH, mach_name, 1500 1.1 skrll CGEN_CPU_OPEN_ENDIAN, endian, 1501 1.1 skrll CGEN_CPU_OPEN_END); 1502 1.1 skrll } 1503 1.1 skrll 1504 1.1 skrll /* Close a cpu table. 1505 1.1 skrll ??? This can live in a machine independent file, but there's currently 1506 1.1 skrll no place to put this file (there's no libcgen). libopcodes is the wrong 1507 1.1 skrll place as some simulator ports use this but they don't use libopcodes. */ 1508 1.1 skrll 1509 1.1 skrll void 1510 1.1 skrll m32r_cgen_cpu_close (CGEN_CPU_DESC cd) 1511 1.1 skrll { 1512 1.1 skrll unsigned int i; 1513 1.1 skrll const CGEN_INSN *insns; 1514 1.1 skrll 1515 1.1 skrll if (cd->macro_insn_table.init_entries) 1516 1.1 skrll { 1517 1.1 skrll insns = cd->macro_insn_table.init_entries; 1518 1.1 skrll for (i = 0; i < cd->macro_insn_table.num_init_entries; ++i, ++insns) 1519 1.1 skrll if (CGEN_INSN_RX ((insns))) 1520 1.1 skrll regfree (CGEN_INSN_RX (insns)); 1521 1.1 skrll } 1522 1.1 skrll 1523 1.1 skrll if (cd->insn_table.init_entries) 1524 1.1 skrll { 1525 1.1 skrll insns = cd->insn_table.init_entries; 1526 1.1 skrll for (i = 0; i < cd->insn_table.num_init_entries; ++i, ++insns) 1527 1.1 skrll if (CGEN_INSN_RX (insns)) 1528 1.1 skrll regfree (CGEN_INSN_RX (insns)); 1529 1.1.1.3 christos } 1530 1.1 skrll 1531 1.1.1.8 christos free ((CGEN_INSN *) cd->macro_insn_table.init_entries); 1532 1.1.1.8 christos free ((CGEN_INSN *) cd->insn_table.init_entries); 1533 1.1.1.8 christos free ((CGEN_HW_ENTRY *) cd->hw_table.entries); 1534 1.1.1.8 christos free ((CGEN_HW_ENTRY *) cd->operand_table.entries); 1535 1.1 skrll free (cd); 1536 1.1 skrll } 1537 1.1 skrll 1538