URL
https://opencores.org/ocsvn/or1k/or1k/trunk
Subversion Repositories or1k
[/] [or1k/] [tags/] [nog_patch_45/] [or1ksim/] [cuc/] [insn.c] - Rev 879
Go to most recent revision | Compare with Previous | Blame | View Log
/* insn.c -- OpenRISC Custom Unit Compiler, instruction support * Copyright (C) 2002 Marko Mlinar, markom@opencores.org * * This file is part of OpenRISC 1000 Architectural Simulator. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #include <stdio.h> #include <stdlib.h> #include <stdarg.h> #include <assert.h> #include "cuc.h" #include "insn.h" /* Table of known instructions. Watch out for indexes I_*! */ const cuc_known_insn known[II_LAST + 1] = { {"add", 1, "assign \1 = \2 + \3;"}, {"sub", 0, "assign \1 = \2 - \3;"}, {"and", 1, "assign \1 = \2 & \3;"}, {"or", 1, "assign \1 = \2 | \3;"}, {"xor", 1, "assign \1 = \2 ^ \3;"}, {"mul", 1, "assign \1 = \2 * \3;"}, {"srl", 0, "assign \1 = \2 >> \3;"}, {"sll", 0, "assign \1 = \2 << \3;"}, {"sra", 0, "assign \1 = ({32{\2[31]}} << (6'd32-{1'b0, \3}))\n\ | \2 >> \3;"}, {"lb", 0, "always @(posedge clk or posedge rst)"}, {"lh", 0, "always @(posedge clk or posedge rst)"}, {"lw", 0, "always @(posedge clk or posedge rst)"}, {"sb", 0, "/* mem8[\2] = \1 */"}, {"sh", 0, "/* mem16[\2] = \1 */"}, {"sw", 0, "/* mem32[\2] = \1 */"}, {"sfeq", 1, "assign \1 = \2 == \3;"}, {"sfne", 1, "assign \1 = \2 != \3;"}, {"sfle", 0, "assign \1 = \2 <= \3;"}, {"sflt", 0, "assign \1 = \2 < \3;"}, {"sfgt", 0, "assign \1 = \2 > \3;"}, {"sfge", 0, "assign \1 = \2 >= \3;"}, {"sfor", 1, "assign \1 = \2 || \3;"}, {"bf", 0, ""}, {"lrbb", 0,"always @(posedge clk or posedge rst)"}, {"cmov", 0,"assign \1 = \4 ? \2 : \3;"}, {"reg", 0, "always @(posedge clk or posedge rst)"}, {"nop", 0, NULL}}; /* Find known instruction and attach them to insn */ void change_insn_type (cuc_insn *i, int index) { int j; assert (index >= 0 && index <= II_LAST); i->index = index; if (i->index == II_NOP) { for (j = 0; j < MAX_OPERANDS; j++) i->opt[j] = OPT_NONE; i->type = 0; i->dep = NULL; } } /* Returns instruction name */ const char *cuc_insn_name (cuc_insn *ii) { if (ii->index < 0 || ii->index > II_LAST) return "???"; else return known[ii->index].name; }
Go to most recent revision | Compare with Previous | Blame | View Log