mirror of
https://github.com/espressif/binutils-gdb.git
synced 2025-06-27 06:17:47 +08:00
(vu_count): New static local.
(assemble_vif): Temporary hack to properly align mpg/direct data. (assemble_vu): Insert mpg every 256 insns.
This commit is contained in:
@ -17,6 +17,9 @@ Fri Feb 20 12:43:02 1998 Doug Evans <devans@canuck.cygnus.com>
|
|||||||
(record_mach): New function.
|
(record_mach): New function.
|
||||||
(md_begin): Initialize `cur_mach'.
|
(md_begin): Initialize `cur_mach'.
|
||||||
(assemble_*): Record current mach type.
|
(assemble_*): Record current mach type.
|
||||||
|
(vu_count): New static local.
|
||||||
|
(assemble_vif): Temporary hack to properly align mpg/direct data.
|
||||||
|
(assemble_vu): Insert mpg every 256 insns.
|
||||||
|
|
||||||
end-sanitize-sky
|
end-sanitize-sky
|
||||||
Fri Feb 20 15:03:13 1998 Ian Lance Taylor <ian@cygnus.com>
|
Fri Feb 20 15:03:13 1998 Ian Lance Taylor <ian@cygnus.com>
|
||||||
|
@ -129,6 +129,10 @@ static char *cur_varlen_insn;
|
|||||||
/* The length value specified in the insn, or -1 if '*'. */
|
/* The length value specified in the insn, or -1 if '*'. */
|
||||||
static int cur_varlen_value;
|
static int cur_varlen_value;
|
||||||
|
|
||||||
|
/* Count of vu insns seen since the last mpg.
|
||||||
|
Set to -1 to disable automatic mpg insertion. */
|
||||||
|
static int vu_count;
|
||||||
|
|
||||||
/* Non-zero if packing vif instructions in dma tags. */
|
/* Non-zero if packing vif instructions in dma tags. */
|
||||||
static int dma_pack_vif_p;
|
static int dma_pack_vif_p;
|
||||||
|
|
||||||
@ -227,6 +231,9 @@ md_begin ()
|
|||||||
set_asm_state (ASM_INIT);
|
set_asm_state (ASM_INIT);
|
||||||
|
|
||||||
dma_pack_vif_p = 0;
|
dma_pack_vif_p = 0;
|
||||||
|
|
||||||
|
/* Disable automatic mpg insertion. */
|
||||||
|
vu_count = -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* We need to keep a list of fixups. We can't simply generate them as
|
/* We need to keep a list of fixups. We can't simply generate them as
|
||||||
@ -421,8 +428,30 @@ assemble_vif (str)
|
|||||||
early if -no-vif. */
|
early if -no-vif. */
|
||||||
if (output_vif)
|
if (output_vif)
|
||||||
{
|
{
|
||||||
|
/* Record the mach before doing the alignment so that we properly
|
||||||
|
disassemble any inserted vifnop's. */
|
||||||
|
|
||||||
record_mach (DVP_VIF);
|
record_mach (DVP_VIF);
|
||||||
|
|
||||||
|
if (opcode->flags & VIF_OPCODE_MPG)
|
||||||
|
{
|
||||||
|
frag_align (3, 0, 0);
|
||||||
|
record_alignment (now_seg, 3);
|
||||||
|
/* FIXME: The data must be aligned on a 64 bit boundary.
|
||||||
|
Not sure how to do this yet so punt by making the mpg insn
|
||||||
|
8 bytes (vifnop,mpg). */
|
||||||
|
f = frag_more (4);
|
||||||
|
memset (f, 0, 4);
|
||||||
|
}
|
||||||
|
else if (opcode->flags & VIF_OPCODE_DIRECT)
|
||||||
|
{
|
||||||
|
frag_align (4, 0, 0);
|
||||||
|
record_alignment (now_seg, 4);
|
||||||
|
/* FIXME: revisit */
|
||||||
|
f = frag_more (12);
|
||||||
|
memset (f, 0, 12);
|
||||||
|
}
|
||||||
|
|
||||||
/* Reminder: it is important to fetch enough space in one call to
|
/* Reminder: it is important to fetch enough space in one call to
|
||||||
`frag_more'. We use (f - frag_now->fr_literal) to compute where
|
`frag_more'. We use (f - frag_now->fr_literal) to compute where
|
||||||
we are and we don't want frag_now to change between calls. */
|
we are and we don't want frag_now to change between calls. */
|
||||||
@ -488,7 +517,11 @@ assemble_vif (str)
|
|||||||
cur_varlen_insn = f;
|
cur_varlen_insn = f;
|
||||||
cur_varlen_value = data_len;
|
cur_varlen_value = data_len;
|
||||||
if (opcode->flags & VIF_OPCODE_MPG)
|
if (opcode->flags & VIF_OPCODE_MPG)
|
||||||
set_asm_state (ASM_MPG);
|
{
|
||||||
|
set_asm_state (ASM_MPG);
|
||||||
|
/* Enable automatic mpg insertion every 256 insns. */
|
||||||
|
vu_count = 0;
|
||||||
|
}
|
||||||
else if (opcode->flags & VIF_OPCODE_DIRECT)
|
else if (opcode->flags & VIF_OPCODE_DIRECT)
|
||||||
set_asm_state (ASM_DIRECT);
|
set_asm_state (ASM_DIRECT);
|
||||||
else if (opcode->flags & VIF_OPCODE_UNPACK)
|
else if (opcode->flags & VIF_OPCODE_UNPACK)
|
||||||
@ -552,6 +585,18 @@ assemble_vu (str)
|
|||||||
char *f;
|
char *f;
|
||||||
const dvp_opcode *opcode;
|
const dvp_opcode *opcode;
|
||||||
|
|
||||||
|
/* Handle automatic mpg insertion if enabled. */
|
||||||
|
if (CUR_ASM_STATE == ASM_MPG
|
||||||
|
&& vu_count == 256)
|
||||||
|
{
|
||||||
|
s_endmpg (1);
|
||||||
|
md_assemble ("mpg *,*");
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Do an implicit alignment to a 8 byte boundary. */
|
||||||
|
frag_align (3, 0, 0);
|
||||||
|
record_alignment (now_seg, 3);
|
||||||
|
|
||||||
record_mach (DVP_VUUP);
|
record_mach (DVP_VUUP);
|
||||||
|
|
||||||
/* The lower instruction has the lower address.
|
/* The lower instruction has the lower address.
|
||||||
@ -592,6 +637,10 @@ assemble_vu (str)
|
|||||||
if (strcmp (opcode->mnemonic, "loi") == 0)
|
if (strcmp (opcode->mnemonic, "loi") == 0)
|
||||||
f[7] |= 0x80;
|
f[7] |= 0x80;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Increment the vu insn counter.
|
||||||
|
If get reach 256 we need to insert an `mpg'. */
|
||||||
|
++vu_count;
|
||||||
}
|
}
|
||||||
|
|
||||||
static const dvp_opcode *
|
static const dvp_opcode *
|
||||||
@ -1010,7 +1059,7 @@ dvp_parse_done ()
|
|||||||
level. */
|
level. */
|
||||||
/* Check for missing .EndMpg, and supply one if necessary. */
|
/* Check for missing .EndMpg, and supply one if necessary. */
|
||||||
if (CUR_ASM_STATE == ASM_MPG)
|
if (CUR_ASM_STATE == ASM_MPG)
|
||||||
s_endmpg (0);
|
s_endmpg (1);
|
||||||
else if (CUR_ASM_STATE == ASM_DIRECT)
|
else if (CUR_ASM_STATE == ASM_DIRECT)
|
||||||
s_enddirect (0);
|
s_enddirect (0);
|
||||||
else if (CUR_ASM_STATE == ASM_UNPACK)
|
else if (CUR_ASM_STATE == ASM_UNPACK)
|
||||||
@ -1560,10 +1609,11 @@ cur_vif_insn_length ()
|
|||||||
byte_len = frag_more (0) - cur_varlen_insn - 4; /* -4 for mpg itself */
|
byte_len = frag_more (0) - cur_varlen_insn - 4; /* -4 for mpg itself */
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
byte_len = (cur_varlen_frag->fr_fix + cur_varlen_frag->fr_offset -
|
byte_len = (cur_varlen_frag->fr_fix
|
||||||
(cur_varlen_insn - cur_varlen_frag->fr_literal)) - 4;
|
/*+ cur_varlen_frag->fr_offset + cur_varlen_frag->fr_var*/
|
||||||
|
- (cur_varlen_insn - cur_varlen_frag->fr_literal)) - 4;
|
||||||
for (f = cur_varlen_frag->fr_next; f != frag_now; f = f->fr_next)
|
for (f = cur_varlen_frag->fr_next; f != frag_now; f = f->fr_next)
|
||||||
byte_len += f->fr_fix + f->fr_offset;
|
byte_len += f->fr_fix /*+ f->fr_offset + f->fr_var*/;
|
||||||
byte_len += frag_now_fix ();
|
byte_len += frag_now_fix ();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1583,8 +1633,8 @@ install_vif_length (buf, len)
|
|||||||
if ((cmd & 0x70) == 0x40)
|
if ((cmd & 0x70) == 0x40)
|
||||||
{
|
{
|
||||||
/* mpg */
|
/* mpg */
|
||||||
len /= 4;
|
len /= 8;
|
||||||
/* ??? Worry about data /= 4 cuts off? */
|
/* ??? Worry about data /= 8 cuts off? */
|
||||||
if (len > 256)
|
if (len > 256)
|
||||||
as_bad ("`mpg' data length must be between 1 and 256");
|
as_bad ("`mpg' data length must be between 1 and 256");
|
||||||
buf[2] = len == 256 ? 0 : len;
|
buf[2] = len == 256 ? 0 : len;
|
||||||
@ -1896,9 +1946,12 @@ s_enddirect (ignore)
|
|||||||
demand_empty_rest_of_line ();
|
demand_empty_rest_of_line ();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* INTERNAL_P is non-zero if invoked internally by this file rather than
|
||||||
|
by the user. In this case we don't touch the input stream. */
|
||||||
|
|
||||||
static void
|
static void
|
||||||
s_endmpg (ignore)
|
s_endmpg (internal_p)
|
||||||
int ignore;
|
int internal_p;
|
||||||
{
|
{
|
||||||
int byte_len;
|
int byte_len;
|
||||||
|
|
||||||
@ -1922,10 +1975,14 @@ s_endmpg (ignore)
|
|||||||
cur_varlen_insn = NULL;
|
cur_varlen_insn = NULL;
|
||||||
cur_varlen_value = 0;
|
cur_varlen_value = 0;
|
||||||
|
|
||||||
|
/* Reset the vu insn counter. */
|
||||||
|
vu_count = -1;
|
||||||
|
|
||||||
/* Update $.MpgLoc. */
|
/* Update $.MpgLoc. */
|
||||||
vif_set_mpgloc (vif_get_mpgloc () + byte_len);
|
vif_set_mpgloc (vif_get_mpgloc () + byte_len);
|
||||||
|
|
||||||
demand_empty_rest_of_line ();
|
if (! internal_p)
|
||||||
|
demand_empty_rest_of_line ();
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
Reference in New Issue
Block a user