Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
R
riscv-gcc-1
Overview
Overview
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
lvzhengyang
riscv-gcc-1
Commits
e72498e1
Commit
e72498e1
authored
Sep 21, 1993
by
Jan Brittenson
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
*** empty log message ***
From-SVN: r5377
parent
683e6ccd
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
180 additions
and
0 deletions
+180
-0
gcc/config/m68k/m68k.c
+32
-0
gcc/config/m68k/m68k.h
+148
-0
No files found.
gcc/config/m68k/m68k.c
View file @
e72498e1
...
...
@@ -2299,3 +2299,35 @@ strict_low_part_peephole_ok (mode, first_insn, target)
return
0
;
}
/* Emit the machine-code interface trampoline at the beginning of a byte
coded function. The argument is a label name of the interpreter
bytecode callinfo structure; the return value is a label name for
the beginning of the actual bytecode. */
char
*
bc_emit_trampoline
(
callinfo
)
char
*
callinfo
;
{
short
insn
;
int
zero
=
0
;
char
mylab
[
256
];
static
int
n
;
sprintf
(
mylab
,
"*LB%d"
,
n
++
);
/* Push a reference to the callinfo structure. */
insn
=
0x4879
;
/* pea xxx.L */
seg_data
(
trampoline
,
(
char
*
)
&
insn
,
sizeof
insn
);
seg_refsym
(
trampoline
,
callinfo
,
0
);
/* Call __interp, pop arguments, and return. */
insn
=
0x4EB9
;
/* jsr xxx.L */
seg_data
(
trampoline
,
(
char
*
)
&
insn
,
sizeof
insn
);
seg_refsym
(
trampoline
,
"__callint"
,
0
);
insn
=
0x588F
;
/* addql #4, sp */
seg_data
(
trampoline
,
(
char
*
)
&
insn
,
sizeof
insn
);
insn
=
0x4E75
;
/* rts */
seg_data
(
trampoline
,
(
char
*
)
&
insn
,
sizeof
insn
);
seg_defsym
(
bytecode
,
mylab
);
return
sym_lookup
(
mylab
)
->
name
;
}
gcc/config/m68k/m68k.h
View file @
e72498e1
...
...
@@ -1809,6 +1809,154 @@ do { long l; \
#define PRINT_OPERAND_ADDRESS(FILE, ADDR) print_operand_address (FILE, ADDR)
/* Definitions for generating bytecode */
/* Just so it's known this target is supported by the bytecode generator.
If this define isn't found anywhere in the target config files, then
dummy stubs are supplied by bytecode.h, and any attempt to use
-fbytecode will result in an error message. */
#define TARGET_SUPPORTS_BYTECODE
/* Minimal segment alignment within sections is 8 units. */
#define MACHINE_SEG_ALIGN 3
/* Integer alignment is two units. */
#define INT_ALIGN 2
/* Pointer alignment is eight units. */
#define PTR_ALIGN 3
/* Global symbols begin with `_' */
#define NAMES_HAVE_UNDERSCORES
/* BC_xxx below are similar to their ASM_xxx counterparts above. */
#define BC_GLOBALIZE_LABEL(FP, NAME) bc_globalize_label(NAME)
#define BC_OUTPUT_COMMON(FP, NAME, SIZE, ROUNDED) \
do { bc_emit_common(NAME, ROUNDED); bc_globalize_label(NAME); } while (0)
#define BC_OUTPUT_LOCAL(FP, NAME, SIZE, ROUNDED) \
bc_emit_common(NAME, ROUNDED)
#define BC_OUTPUT_ALIGN(FP, ALIGN) bc_align(ALIGN)
#define BC_OUTPUT_LABEL(FP, NAME) bc_emit_labeldef(NAME)
#define BC_OUTPUT_SKIP(FP, SIZE) bc_emit_skip(SIZE)
#define BC_OUTPUT_LABELREF(FP, NAME) \
do { \
char *foo = (char *) xmalloc(strlen(NAME) + 2); \
strcpy(foo, "_"); \
strcat(foo, NAME); \
bc_emit_labelref (foo); \
free (foo); \
} while (0)
#define BC_OUTPUT_FLOAT(FP, VAL) \
do { \
float F = VAL; \
bc_emit ((char *) &F, sizeof F); \
} while (0)
#define BC_OUTPUT_DOUBLE(FP, VAL) \
do { \
double D = VAL; \
bc_emit ((char *) &D, sizeof D); \
} while (0)
#define BC_OUTPUT_BYTE(FP, VAL) \
do { \
char C = VAL; \
bc_emit (&C, 1); \
} while (0)
#define BC_OUTPUT_FILE ASM_OUTPUT_FILE
#define BC_OUTPUT_ASCII ASM_OUTPUT_ASCII
#define BC_OUTPUT_IDENT ASM_OUTPUT_IDENT
/* Same as XSTR, but for bytecode */
#define BCXSTR(RTX) ((RTX)->bc_label)
/* Flush bytecode buffer onto file */
#define BC_WRITE_FILE(FP) \
{ \
fprintf (FP, ".text\n"); \
bc_seg_write (bc_text_seg, FP); \
fprintf(FP, "\n.data\n"); \
bc_seg_write (bc_data_seg, FP); \
bc_sym_write (FP);
/* do .globl, .bss, etc. */
\
}
/* Write one symbol */
#define BC_WRITE_SEGSYM(SEGSYM, FP) \
{ \
prsym (FP, (SEGSYM)->sym->name); \
fprintf (FP, ":\n"); \
}
/* Write one reloc entry */
#define BC_WRITE_RELOC_ENTRY(SEGRELOC, FP, OFFSET) \
{ \
fprintf (FP, "\t.long "); \
prsym (FP, (SEGRELOC)->sym->name); \
fprintf (FP, " + %d\n", OFFSET); \
}
/* Start new line of bytecodes */
#define BC_START_BYTECODE_LINE(FP) \
{ \
fprintf (FP, "\t.byte"); \
}
/* Write one bytecode */
#define BC_WRITE_BYTECODE(SEP, VAL, FP) \
{ \
fprintf (FP, "%c0x%02X", (SEP), (VAL) & 0xff); \
}
/* Write one bytecode RTL entry */
#define BC_WRITE_RTL(R, FP) \
{ \
fprintf (FP, "%s+%d/0x%08X\n", (R)->label, (R)->offset, (R)->bc_label); \
}
/* Emit function entry trampoline */
#define BC_EMIT_TRAMPOLINE(TRAMPSEG, CALLINFO) \
{ \
short insn; \
\
/* Push a reference to the callinfo structure. */
\
insn = 0x4879;
/* pea xxx.L */
\
seg_data (TRAMPSEG, (char *) &insn, sizeof insn); \
seg_refsym (TRAMPSEG, CALLINFO, 0); \
\
/* Call __interp, pop arguments, and return. */
\
insn = 0x4eb9;
/* jsr xxx.L */
\
seg_data (TRAMPSEG, (char *) &insn, sizeof insn); \
seg_refsym (TRAMPSEG, "__callint", 0); \
insn = 0x588f;
/* addql #4, sp */
\
seg_data (TRAMPSEG, (char *) &insn, sizeof insn); \
insn = 0x4e75;
/* rts */
\
seg_data (TRAMPSEG, (char *) &insn, sizeof insn); \
}
#if 0
#define VALIDATE_STACK() if (stack_depth < 0) abort ();
#else
#if 0
#define VALIDATE_STACK() \
fprintf (stderr, " %%%d%%", stack_depth);
#endif
#endif
/* Define functions defined in aux-output.c and used in templates. */
extern
char
*
output_move_double
();
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment