diff options
-rw-r--r-- | gas/ChangeLog | 6 | ||||
-rw-r--r-- | gas/config/tc-dvp.c | 46 |
2 files changed, 37 insertions, 15 deletions
diff --git a/gas/ChangeLog b/gas/ChangeLog index 2e4d7eb..69c0707 100644 --- a/gas/ChangeLog +++ b/gas/ChangeLog @@ -1,4 +1,10 @@ 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> * config/tc-dvp.c (md_pseudo_table): Make .quad 16 bytes. diff --git a/gas/config/tc-dvp.c b/gas/config/tc-dvp.c index 357a0be..8de2ace 100644 --- a/gas/config/tc-dvp.c +++ b/gas/config/tc-dvp.c @@ -243,7 +243,8 @@ md_begin () cur_state_index = 0; 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. */ vu_count = -1; @@ -342,7 +343,7 @@ static void assemble_dma (str) char *str; { - DVP_INSN insn_buf[4]; + DVP_INSN insn_buf[2]; /* Insn's length, in 32 bit words. */ int len; /* Pointer to allocated frag. */ @@ -361,11 +362,6 @@ assemble_dma (str) /* This is the DMA tag. */ insn_buf[0] = 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, dma_opcode_lookup_asm (str), dma_operands, @@ -377,11 +373,10 @@ assemble_dma (str) record_mach (DVP_DMA, 0); - len = 4; - f = frag_more (len * 4); + f = frag_more (8); /* 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); /* Create any fixups. */ @@ -408,6 +403,22 @@ assemble_dma (str) (operand->flags & DVP_OPERAND_RELATIVE_BRANCH) != 0, (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. */ @@ -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. - The section name prefix to use is stored in *PNAME. */ + The label prefix to use is stored in *PNAME. */ static int cpu_sto (cpu, pname) @@ -1130,6 +1141,13 @@ md_undefined_symbol (name) void 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 level. */ /* Check for missing .EndMpg, and supply one if necessary. */ @@ -1159,7 +1177,7 @@ dvp_frob_label (sym) /* Functions concerning relocs. */ /* 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 /* Given a cpu type and operand number, return a temporary reloc type @@ -2120,8 +2138,6 @@ s_dmapackvif (ignore) int ignore; { /* Syntax: .dmapackvif 0|1 */ - symbolS *label; /* Points to symbol */ - char *name; /* points to name of symbol */ /* Leading whitespace is part of operand. */ SKIP_WHITESPACE (); @@ -2134,7 +2150,7 @@ s_dmapackvif (ignore) dma_pack_vif_p = 1; break; default: - as_bad ("illegal argument to `.DmaPackPke'"); + as_bad ("illegal argument to `.dmapackvif'"); } demand_empty_rest_of_line (); } |