* config/tc-dvp.c (md_begin): Turn dma/vif packing on by default.

(assemble_dma): Only output 8 bytes for actual dma insn if dma/vif
	packing is enabled.  Emit VIF cpu marker after dma insn.
This commit is contained in:
Doug Evans
1998-03-17 18:51:57 +00:00
parent 4c95336d9f
commit 7f28a81d93
2 changed files with 37 additions and 15 deletions

View File

@ -1,4 +1,10 @@
start-sanitize-sky start-sanitize-sky
Tue Mar 17 10:40:54 1998 Doug Evans <devans@canuck.cygnus.com>
* config/tc-dvp.c (md_begin): Turn dma/vif packing on by default.
(assemble_dma): Only output 8 bytes for actual dma insn if dma/vif
packing is enabled. Emit VIF cpu marker after dma insn.
Mon Mar 16 10:19:44 1998 Doug Evans <devans@canuck.cygnus.com> Mon Mar 16 10:19:44 1998 Doug Evans <devans@canuck.cygnus.com>
* config/tc-dvp.c (md_pseudo_table): Make .quad 16 bytes. * config/tc-dvp.c (md_pseudo_table): Make .quad 16 bytes.

View File

@ -243,7 +243,8 @@ md_begin ()
cur_state_index = 0; cur_state_index = 0;
set_asm_state (ASM_INIT); set_asm_state (ASM_INIT);
dma_pack_vif_p = 0; /* Pack vif insns in dma tags by default. */
dma_pack_vif_p = 1;
/* Disable automatic mpg insertion. */ /* Disable automatic mpg insertion. */
vu_count = -1; vu_count = -1;
@ -342,7 +343,7 @@ static void
assemble_dma (str) assemble_dma (str)
char *str; char *str;
{ {
DVP_INSN insn_buf[4]; DVP_INSN insn_buf[2];
/* Insn's length, in 32 bit words. */ /* Insn's length, in 32 bit words. */
int len; int len;
/* Pointer to allocated frag. */ /* Pointer to allocated frag. */
@ -361,11 +362,6 @@ assemble_dma (str)
/* This is the DMA tag. */ /* This is the DMA tag. */
insn_buf[0] = 0; insn_buf[0] = 0;
insn_buf[1] = 0; insn_buf[1] = 0;
/* These are VIF NOPs.
They may be over-written later if DmaPackPke is on.
initialize the remainder with zeros. */
insn_buf[2] = 0;
insn_buf[3] = 0;
opcode = assemble_one_insn (DVP_DMA, opcode = assemble_one_insn (DVP_DMA,
dma_opcode_lookup_asm (str), dma_operands, dma_opcode_lookup_asm (str), dma_operands,
@ -377,11 +373,10 @@ assemble_dma (str)
record_mach (DVP_DMA, 0); record_mach (DVP_DMA, 0);
len = 4; f = frag_more (8);
f = frag_more (len * 4);
/* Write out the DMA instruction. */ /* Write out the DMA instruction. */
for (i = 0; i < len; ++i) for (i = 0; i < 2; ++i)
md_number_to_chars (f + i * 4, insn_buf[i], 4); md_number_to_chars (f + i * 4, insn_buf[i], 4);
/* Create any fixups. */ /* Create any fixups. */
@ -408,6 +403,22 @@ assemble_dma (str)
(operand->flags & DVP_OPERAND_RELATIVE_BRANCH) != 0, (operand->flags & DVP_OPERAND_RELATIVE_BRANCH) != 0,
(bfd_reloc_code_real_type) reloc_type); (bfd_reloc_code_real_type) reloc_type);
} }
/* The upper two words are vif insns. */
record_mach (DVP_VIF, 0);
/* If not doing dma/vif packing, fill out the insn with vif nops.
??? We take advantage of the fact that the default fill value of zero
is the vifnop insn. This occurs for example when handling mpg
alignment. It also occurs when one dma tag immediately follows the
previous one. */
if (! dma_pack_vif_p)
{
f = frag_more (8);
#define VIFNOP 0
md_number_to_chars (f + 0, VIFNOP, 4);
md_number_to_chars (f + 4, VIFNOP, 4);
}
} }
/* Subroutine of md_assemble to assemble VIF instructions. */ /* Subroutine of md_assemble to assemble VIF instructions. */
@ -1021,7 +1032,7 @@ assemble_one_insn (cpu, opcode, operand_table, pstr, insn_buf)
} }
/* Given a dvp cpu type, return it's STO_DVP value. /* Given a dvp cpu type, return it's STO_DVP value.
The section name prefix to use is stored in *PNAME. */ The label prefix to use is stored in *PNAME. */
static int static int
cpu_sto (cpu, pname) cpu_sto (cpu, pname)
@ -1130,6 +1141,13 @@ md_undefined_symbol (name)
void void
dvp_after_pass_hook () dvp_after_pass_hook ()
{ {
/* If doing dma packing, ensure the last dma tag is filled out. */
if (dma_pack_vif_p)
{
/* Nothing to do as vifnops are zero and frag_align at beginning
of dmatag is all we need. */
}
#if 0 /* ??? Doesn't work unless we keep track of the nested include file #if 0 /* ??? Doesn't work unless we keep track of the nested include file
level. */ level. */
/* Check for missing .EndMpg, and supply one if necessary. */ /* Check for missing .EndMpg, and supply one if necessary. */
@ -1159,7 +1177,7 @@ dvp_frob_label (sym)
/* Functions concerning relocs. */ /* Functions concerning relocs. */
/* Spacing between each cpu type's operand numbers. /* Spacing between each cpu type's operand numbers.
Should be at least as bit as any operand table. */ Should be at least as big as any operand table. */
#define RELOC_SPACING 256 #define RELOC_SPACING 256
/* Given a cpu type and operand number, return a temporary reloc type /* Given a cpu type and operand number, return a temporary reloc type
@ -2120,8 +2138,6 @@ s_dmapackvif (ignore)
int ignore; int ignore;
{ {
/* Syntax: .dmapackvif 0|1 */ /* Syntax: .dmapackvif 0|1 */
symbolS *label; /* Points to symbol */
char *name; /* points to name of symbol */
/* Leading whitespace is part of operand. */ /* Leading whitespace is part of operand. */
SKIP_WHITESPACE (); SKIP_WHITESPACE ();
@ -2134,7 +2150,7 @@ s_dmapackvif (ignore)
dma_pack_vif_p = 1; dma_pack_vif_p = 1;
break; break;
default: default:
as_bad ("illegal argument to `.DmaPackPke'"); as_bad ("illegal argument to `.dmapackvif'");
} }
demand_empty_rest_of_line (); demand_empty_rest_of_line ();
} }