OpenCores
no use no use 1/1 no use no use
Re: [or1ksim] Mark destination operand in or32.c
by Unknown on Jan 24, 2005
Not available!
On 0, György 'nog' Jeney nog@sdf.lonestar.org> wrote:
Hi,

I have changed the architechture definition in or32.c such that the rD register
is always a destination register. This has the great advantage that this
information is computed when the operand tables are generated and not when the
instructions themselves are executed. I have also added some documentation of
the OPTYPE_ flags.

ChangeLog:
Mark wich operand is the destination operand in the architechture definition.

This time with the patch.

nog.
-------------- next part --------------
Index: cpu/or1k/opcode/or32.h
===================================================================
RCS file: /home/oc/cvs/or1k/or1ksim/cpu/or1k/opcode/or32.h,v
retrieving revision 1.18
diff -u -p -r1.18 or32.h
--- cpu/or1k/opcode/or32.h 11 Jan 2005 15:41:54 -0000 1.18
+++ cpu/or1k/opcode/or32.h 24 Jan 2005 15:18:08 -0000
@@ -61,7 +61,7 @@ struct or32_opcode {
,() Itself. Characters appears in the assembly code.
rA Register operand.
rB Register operand.
- rD Register operand.
+ rD Register operand (destination).
I An immediate operand, range -32768 to 32767.
J An immediate operand, range . (unused)
K An immediate operand, range 0 to 65535.
@@ -74,7 +74,7 @@ struct or32_opcode {
/* Opcode and operand encoding. */
char *encoding;

-#if defined HAS_EXECUTION && !SIMPLE_EXECUTION
+#if defined(HAS_EXECUTION) && !SIMPLE_EXECUTION
char *function_name;
#else /* defined HAS_EXECUTION && !SIMPLE_EXECUTION */
void (*exec)();
@@ -83,13 +83,21 @@ struct or32_opcode {
unsigned int flags;
};

+/* This operand is the last in the list */
#define OPTYPE_LAST (0x80000000)
+/* This operand marks the end of the operand sequence (for things like I(rD)) */
#define OPTYPE_OP (0x40000000)
+/* The operand specifies a register index */
#define OPTYPE_REG (0x20000000)
+/* The operand must be sign extended */
#define OPTYPE_SIG (0x10000000)
+/* Operand is a relative address, the `I' in `I(rD)' */
#define OPTYPE_DIS (0x08000000)
+/* The operand is a destination */
#define OPTYPE_DST (0x04000000)
+/* Which bit of the operand is the sign bit */
#define OPTYPE_SBIT (0x00001F00)
+/* Amount to shift the instruction word right to get the operand */
#define OPTYPE_SHR (0x0000001F)
#define OPTYPE_SBIT_SHR (8)

Index: cpu/or32/or32.c
===================================================================
RCS file: /home/oc/cvs/or1k/or1ksim/cpu/or32/or32.c,v
retrieving revision 1.37
diff -u -p -r1.37 or32.c
--- cpu/or32/or32.c 11 Jan 2005 15:41:58 -0000 1.37
+++ cpu/or32/or32.c 24 Jan 2005 15:18:34 -0000
@@ -85,26 +85,24 @@ CONST struct or32_letter or32_letters[]
code (when assembling).
*/

-#if defined HAS_EXECUTION && SIMPLE_EXECUTION
-#define EFN &l_none
-#define EF(func) &(func)
-#define EFI &l_invalid
-#else /* HAS_EXECUTION */
-
-#ifndef HAS_EXECUTION
-#define EFN &l_none
-#define EF(func) EFN
-#define EFI EFN
-#else /* !HAS_EXECUTION */
-#define EFN "l_none"
-#define EFI "l_invalid"
-#ifdef __GNUC__
-#define EF(func) #func
-#else
-#define EF(func) "func"
-#endif
-#endif /* !HAS_EXECUTION */
-
+#ifdef HAS_EXECUTION
+# if SIMPLE_EXECUTION
+# define EFN &l_none
+# define EF(func) &(func)
+# define EFI &l_invalid
+# else /* SIMPLE_EXECUTION */
+# define EFN "l_none"
+# define EFI "l_invalid"
+# ifdef __GNUC__
+# define EF(func) #func
+# else
+# define EF(func) "func"
+# endif
+# endif /* SIMPLE_EXECUTION */
+#else /* HAS_EXECUTION */
+# define EFN &l_none
+# define EF(func) EFN
+# define EFI EFN
#endif /* HAS_EXECUTION */

CONST struct or32_opcode or32_opcodes[] =
@@ -292,10 +290,10 @@ CONST struct or32_opcode or32_opcodes[]
{ "lf.sfle.d", "rA,rB", "11 0x2 ----- AAAAA BBBB B--- 0x1 0xD", EFI, 0 },
{ "lf.cust1.d", "rA,rB", "11 0x2 ----- AAAAA BBBB B--- 0xE ----", EFI, 0 },

-{ "l.sd", "I(rA),rB", "11 0x4 IIIII AAAAA BBBB BIII IIII IIII", EFI, 0 },
-{ "l.sw", "I(rA),rB", "11 0x5 IIIII AAAAA BBBB BIII IIII IIII", EF(l_sw), 0 },
-{ "l.sb", "I(rA),rB", "11 0x6 IIIII AAAAA BBBB BIII IIII IIII", EF(l_sb), 0 },
-{ "l.sh", "I(rA),rB", "11 0x7 IIIII AAAAA BBBB BIII IIII IIII", EF(l_sh), 0 },
+{ "l.sd", "I(rD),rB", "11 0x4 IIIII DDDDD BBBB BIII IIII IIII", EFI, 0 },
+{ "l.sw", "I(rD),rB", "11 0x5 IIIII DDDDD BBBB BIII IIII IIII", EF(l_sw), 0 },
+{ "l.sb", "I(rD),rB", "11 0x6 IIIII DDDDD BBBB BIII IIII IIII", EF(l_sb), 0 },
+{ "l.sh", "I(rD),rB", "11 0x7 IIIII DDDDD BBBB BIII IIII IIII", EF(l_sh), 0 },

{ "l.add", "rD,rA,rB", "11 0x8 DDDDD AAAAA BBBB B-00 ---- 0x0", EF(l_add), OR32_W_FLAG },
{ "l.addc", "rD,rA,rB", "11 0x8 DDDDD AAAAA BBBB B-00 ---- 0x1", EF(l_addc), OR32_W_FLAG },
@@ -369,12 +367,8 @@ CONST struct or32_opcode or32_opcodes[]
/* **INDENT-ON** */

/* Define dummy, if debug is not defined. */
-#if !defined HAS_DEBUG
-void debug(int level, const char *format, ...)
-{
- /* Just to get rid of warnings. */
- format = level = 0;
-}
+#ifndef HAS_DEBUG
+#define debug(l, fmt...) ;
#endif

CONST int num_opcodes = ((sizeof(or32_opcodes)) / (sizeof(struct or32_opcode))) - 1;
@@ -463,7 +457,7 @@ l_none()

/*** Finite automata for instruction decoding building code ***/

-/* Find simbols in encoding. */
+/* Find symbols in encoding. */
unsigned long
insn_extract(param_ch, enc_initial)
char param_ch;
@@ -511,7 +505,7 @@ unsigned long *automata;
int nuncovered;
int curpass = 0;

-/* MM: Struct that hold runtime build information about instructions. */
+/* MM: Struct that holds runtime build information about instructions. */
struct temp_insn_struct
{
unsigned long insn;
@@ -658,6 +652,8 @@ parse_params (CONST struct or32_opcode *
{
args++;
type |= OPTYPE_REG;
+ if(args[1] == 'D')
+ type |= OPTYPE_DST;
}
else if (isalpha (*args))
{

Re: [or1ksim] Mark destination operand in or32.c
by Unknown on Jan 25, 2005
Not available!
* György 'nog' Jeney (nog@sdf.lonestar.org) wrote:
On 0, György 'nog' Jeney nog@sdf.lonestar.org> wrote:
> Hi,
>
> I have changed the architechture definition in or32.c such that the rD register
> is always a destination register. This has the great advantage that this
> information is computed when the operand tables are generated and not when the
> instructions themselves are executed. I have also added some documentation of
> the OPTYPE_ flags.
>
> ChangeLog:
> Mark wich operand is the destination operand in the architechture definition.
>

This time with the patch.


Just one comment. The or32.h and or32.c are links even in cvs, so changing
them in or1ksim means changing them also in other places
like binutils, gdb... Although the changes may work nicely in or1ksim they
might break a bunch of other stuff. Did you maybe try the changes in
binutils... ?

regards,
p.


Re: [or1ksim] Mark destination operand in or32.c
by Unknown on Jan 25, 2005
Not available!
Just one comment. The or32.h and or32.c are links even in cvs, so changing
them in or1ksim means changing them also in other places
like binutils, gdb... Although the changes may work nicely in or1ksim they
might break a bunch of other stuff. Did you maybe try the changes in
binutils... ?


Ok, I didn't know this. I'll go and check this now. I don't think these
changes break anything there as having a extra OPTYPE_DST shouldn't hurt but the
others might.

nog.

no use no use 1/1 no use no use
© copyright 1999-2026 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.