mirror of
https://sourceware.org/git/binutils-gdb.git
synced 2024-12-09 04:21:49 +08:00
Fri Feb 21 14:34:31 1997 Martin M. Hunt <hunt@pizza.cygnus.com>
* config/tc-d30v.c (parallel_ok): New function. * config/tc-d30v.h: Define TARGET_BYTES_BIG_ENDIAN.
This commit is contained in:
parent
cea0f6fc02
commit
1b52469766
@ -1,5 +1,8 @@
|
||||
Fri Feb 21 14:34:31 1997 Martin M. Hunt <hunt@pizza.cygnus.com>
|
||||
|
||||
start-sanitize-d30v
|
||||
* config/tc-d30v.c (parallel_ok): New function.
|
||||
* config/tc-d30v.h: Define TARGET_BYTES_BIG_ENDIAN.
|
||||
end-sanitize-d30v
|
||||
* config/tc-d10v.c (md_pcrel_from_section): Return 0 if
|
||||
relocation is in different section. Fixes PR11574.
|
||||
|
||||
|
@ -447,34 +447,6 @@ get_operands (exp, cmp_hack)
|
||||
return (numops);
|
||||
}
|
||||
|
||||
#if 0
|
||||
static unsigned long
|
||||
d30v_insert_operand (insn, op_type, value, left, fix)
|
||||
unsigned long insn;
|
||||
int op_type;
|
||||
offsetT value;
|
||||
int left;
|
||||
fixS *fix;
|
||||
{
|
||||
int shift, bits;
|
||||
|
||||
shift = d30v_operands[op_type].shift;
|
||||
if (left)
|
||||
shift += 15;
|
||||
|
||||
bits = d30v_operands[op_type].bits;
|
||||
|
||||
/* truncate to the proper number of bits */
|
||||
if (check_range (value, bits, d30v_operands[op_type].flags))
|
||||
as_bad_where (fix->fx_file, fix->fx_line, "operand out of range: %d", value);
|
||||
|
||||
value &= 0x7FFFFFFF >> (31 - bits);
|
||||
insn |= (value << shift);
|
||||
|
||||
return insn;
|
||||
}
|
||||
#endif
|
||||
|
||||
/* build_insn generates the instruction. It does everything */
|
||||
/* but write the FM bits. */
|
||||
|
||||
@ -526,7 +498,6 @@ build_insn (opcode, opers)
|
||||
number = id;
|
||||
}
|
||||
|
||||
if (Optimizing) printf("bits=%d length=%d shift=%d number=%x\n",bits,length,shift,number);
|
||||
|
||||
if (opers[i].X_op != O_register && opers[i].X_op != O_constant && !(flags & OPERAND_NAME))
|
||||
{
|
||||
@ -541,7 +512,6 @@ build_insn (opcode, opers)
|
||||
fixups->fix[fixups->fc].exp = opers[i];
|
||||
fixups->fix[fixups->fc].operand = form->operands[i];
|
||||
fixups->fix[fixups->fc].pcrel = op->reloc_flag;
|
||||
if (Optimizing) printf("fixup %d: reloc=%d operand=%d\n",fixups->fc,fixups->fix[fixups->fc].reloc,form->operands[i]);
|
||||
(fixups->fc)++;
|
||||
}
|
||||
|
||||
@ -585,7 +555,6 @@ write_long (opcode, insn, fx)
|
||||
if (fx->fix[i].reloc)
|
||||
{
|
||||
where = f - frag_now->fr_literal;
|
||||
if (Optimizing) printf("write_L: reloc at %x\n",where);
|
||||
fix_new_exp (frag_now,
|
||||
where,
|
||||
fx->fix[i].size,
|
||||
@ -623,7 +592,6 @@ write_1_short (opcode, insn, fx)
|
||||
if (fx->fix[i].reloc)
|
||||
{
|
||||
where = f - frag_now->fr_literal;
|
||||
if (Optimizing) printf("write_1: reloc at %x\n",where);
|
||||
fix_new_exp (frag_now,
|
||||
where,
|
||||
fx->fix[i].size,
|
||||
@ -648,8 +616,6 @@ write_2_short (opcode1, insn1, opcode2, insn2, exec_type, fx)
|
||||
char *f;
|
||||
int i,j, where;
|
||||
|
||||
if (Optimizing) printf("write_2_short: %llx %llx exec=%d\n",insn1,insn2,exec_type);
|
||||
|
||||
if(exec_type != 1 && (opcode1->op->flags_used == FLAG_JSR))
|
||||
{
|
||||
/* subroutines must be called from 32-bit boundaries */
|
||||
@ -735,7 +701,6 @@ write_2_short (opcode1, insn1, opcode2, insn2, exec_type, fx)
|
||||
{
|
||||
where = (f - frag_now->fr_literal) + 4*j;
|
||||
|
||||
if (Optimizing) printf("write_2: reloc at %x\n",where);
|
||||
fix_new_exp (frag_now,
|
||||
where,
|
||||
fx->fix[i].size,
|
||||
@ -759,105 +724,91 @@ parallel_ok (op1, insn1, op2, insn2, exec_type)
|
||||
unsigned long insn1, insn2;
|
||||
int exec_type;
|
||||
{
|
||||
#if 0
|
||||
int i, j, flags, mask, shift, regno;
|
||||
unsigned long ins, mod[2], used[2];
|
||||
struct d30v_insn *op;
|
||||
int i, j, flags, mask, shift, regno, bits;
|
||||
unsigned long ins, mod_reg[2][3], used_reg[2][3];
|
||||
struct d30v_format *f;
|
||||
struct d30v_opcode *op;
|
||||
|
||||
if ((op1->exec_type & SEQ) != 0 || (op2->exec_type & SEQ) != 0
|
||||
|| (op1->exec_type & PAR) == 0 || (op2->exec_type & PAR) == 0
|
||||
|| (op1->unit == BOTH) || (op2->unit == BOTH)
|
||||
|| (op1->unit == IU && op2->unit == IU)
|
||||
|| (op1->unit == MU && op2->unit == MU))
|
||||
/* section 4.3: both instructions must not be IU or MU only */
|
||||
if ((op1->op->unit == IU && op2->op->unit == IU)
|
||||
|| (op1->op->unit == MU && op2->op->unit == MU))
|
||||
return 0;
|
||||
|
||||
/* If the first instruction is a branch and this is auto parallazation,
|
||||
don't combine with any second instruction. */
|
||||
if (exec_type == 0 && (op1->exec_type & BRANCH) != 0)
|
||||
return 0;
|
||||
/*
|
||||
[0] r0-r31
|
||||
[1] r32-r63
|
||||
[2] a0, a1
|
||||
*/
|
||||
|
||||
/* The idea here is to create two sets of bitmasks (mod and used) */
|
||||
/* which indicate which registers are modified or used by each instruction. */
|
||||
/* The operation can only be done in parallel if instruction 1 and instruction 2 */
|
||||
/* modify different registers, and neither instruction modifies any registers */
|
||||
/* the other is using. Accesses to control registers, PSW, and memory are treated */
|
||||
/* as accesses to a single register. So if both instructions write memory or one */
|
||||
/* instruction writes memory and the other reads, then they cannot be done in parallel. */
|
||||
/* Likewise, if one instruction mucks with the psw and the other reads the PSW */
|
||||
/* (which includes C, F0, and F1), then they cannot operate safely in parallel. */
|
||||
|
||||
/* the bitmasks (mod and used) look like this (bit 31 = MSB) */
|
||||
/* r0-r15 0-15 */
|
||||
/* a0-a1 16-17 */
|
||||
/* cr (not psw) 18 */
|
||||
/* psw 19 */
|
||||
/* mem 20 */
|
||||
|
||||
for (j=0;j<2;j++)
|
||||
for (j = 0; j < 2; j++)
|
||||
{
|
||||
if (j == 0)
|
||||
{
|
||||
op = op1;
|
||||
f = op1->form;
|
||||
op = op1->op;
|
||||
ins = insn1;
|
||||
}
|
||||
else
|
||||
{
|
||||
op = op2;
|
||||
f = op2->form;
|
||||
op = op2->op;
|
||||
ins = insn2;
|
||||
}
|
||||
mod[j] = used[j] = 0;
|
||||
if (op->exec_type & BRANCH_LINK)
|
||||
mod[j] |= 1 << 13;
|
||||
|
||||
for (i = 0; op->operands[i]; i++)
|
||||
mod_reg[j][0] = mod_reg[j][1] = 0;
|
||||
mod_reg[j][2] = op->flags_set;
|
||||
used_reg[j][0] = used_reg[j][1] = 0;
|
||||
used_reg[j][2] = op->flags_used;
|
||||
for (i = 0; f->operands[i]; i++)
|
||||
{
|
||||
flags = d30v_operands[op->operands[i]].flags;
|
||||
shift = d30v_operands[op->operands[i]].shift;
|
||||
mask = 0x7FFFFFFF >> (31 - d30v_operands[op->operands[i]].bits);
|
||||
flags = d30v_operand_table[f->operands[i]].flags;
|
||||
shift = 12 - d30v_operand_table[f->operands[i]].position;
|
||||
bits = d30v_operand_table[f->operands[i]].bits;
|
||||
if (bits == 32)
|
||||
mask = 0xffffffff;
|
||||
else
|
||||
mask = 0x7FFFFFFF >> (31 - bits);
|
||||
if (flags & OPERAND_REG)
|
||||
{
|
||||
regno = (ins >> shift) & mask;
|
||||
if (flags & OPERAND_ACC)
|
||||
regno += 16;
|
||||
else if (flags & OPERAND_CONTROL) /* mvtc or mvfc */
|
||||
{
|
||||
if (regno == 0)
|
||||
regno = 19;
|
||||
else
|
||||
regno = 18;
|
||||
}
|
||||
else if (flags & OPERAND_FLAG)
|
||||
regno = 19;
|
||||
|
||||
if ( flags & OPERAND_DEST )
|
||||
if (flags & OPERAND_DEST)
|
||||
{
|
||||
mod[j] |= 1 << regno;
|
||||
if (flags & OPERAND_EVEN)
|
||||
mod[j] |= 1 << (regno + 1);
|
||||
if (flags & OPERAND_ACC)
|
||||
mod_reg[j][2] = 1 << (regno+16);
|
||||
else if (flags & OPERAND_FLAG)
|
||||
mod_reg[j][2] = 1 << regno;
|
||||
else if (!(flags & OPERAND_CONTROL))
|
||||
{
|
||||
if (regno >= 32)
|
||||
mod_reg[j][1] = 1 << (regno - 32);
|
||||
else
|
||||
mod_reg[j][0] = 1 << regno;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
used[j] |= 1 << regno ;
|
||||
if (flags & OPERAND_EVEN)
|
||||
used[j] |= 1 << (regno + 1);
|
||||
if (flags & OPERAND_ACC)
|
||||
used_reg[j][2] = 1 << (regno+16);
|
||||
else if (flags & OPERAND_FLAG)
|
||||
used_reg[j][2] = 1 << regno;
|
||||
else if (!(flags & OPERAND_CONTROL))
|
||||
{
|
||||
if (regno >= 32)
|
||||
used_reg[j][1] = 1 << (regno - 32);
|
||||
else
|
||||
used_reg[j][0] = 1 << regno;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if (op->exec_type & RMEM)
|
||||
used[j] |= 1 << 20;
|
||||
else if (op->exec_type & WMEM)
|
||||
mod[j] |= 1 << 20;
|
||||
else if (op->exec_type & RF0)
|
||||
used[j] |= 1 << 19;
|
||||
else if (op->exec_type & WF0)
|
||||
mod[j] |= 1 << 19;
|
||||
else if (op->exec_type & WCAR)
|
||||
mod[j] |= 1 << 19;
|
||||
}
|
||||
if ((mod[0] & mod[1]) == 0 && (mod[0] & used[1]) == 0 && (mod[1] & used[0]) == 0)
|
||||
return 1;
|
||||
#endif
|
||||
return 0;
|
||||
|
||||
for(j = 0; j < 3; j++)
|
||||
if ((mod_reg[0][j] & mod_reg[1][j])
|
||||
|| (mod_reg[0][j] & used_reg[1][j])
|
||||
|| (mod_reg[1][j] & used_reg[0][j]))
|
||||
return 0;
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
@ -985,8 +936,6 @@ do_assemble (str, opcode)
|
||||
expressionS myops[6];
|
||||
long long insn;
|
||||
|
||||
if (Optimizing) printf("do_assemble %s\n",str);
|
||||
|
||||
/* Drop leading whitespace */
|
||||
while (*str == ' ')
|
||||
str++;
|
||||
@ -1074,7 +1023,6 @@ do_assemble (str, opcode)
|
||||
input_line_pointer = save;
|
||||
|
||||
insn = build_insn (opcode, myops);
|
||||
if (Optimizing) printf("insn=%llx\n",insn);
|
||||
return (insn);
|
||||
}
|
||||
|
||||
@ -1093,8 +1041,6 @@ find_format (opcode, myops, cmp_hack)
|
||||
struct d30v_format *fm;
|
||||
struct d30v_operand *op;
|
||||
|
||||
if (Optimizing) printf("find_format: %s\n",opcode->name);
|
||||
|
||||
/* get all the operands and save them as expressions */
|
||||
numops = get_operands (myops, cmp_hack);
|
||||
|
||||
@ -1112,7 +1058,6 @@ find_format (opcode, myops, cmp_hack)
|
||||
int X_op = myops[j].X_op;
|
||||
int num = myops[j].X_add_number;
|
||||
|
||||
if (Optimizing) printf("form=%d mod=%d opnum=%d flags=%x X_op=%d num=%d\n",index,fm->modifier,j,flags,X_op,num);
|
||||
if ( flags & OPERAND_SPECIAL )
|
||||
break;
|
||||
else if (X_op == 0)
|
||||
@ -1125,7 +1070,6 @@ find_format (opcode, myops, cmp_hack)
|
||||
(flags & OPERAND_CONTROL && !(num & OPERAND_CONTROL | num & OPERAND_FLAG)))
|
||||
{
|
||||
match = 0;
|
||||
if (Optimizing) printf("failed 1\n");
|
||||
}
|
||||
}
|
||||
else
|
||||
@ -1135,7 +1079,6 @@ find_format (opcode, myops, cmp_hack)
|
||||
((flags & OPERAND_ATPAR) && ((X_op != O_absent) || (num != OPERAND_ATPAR))) ||
|
||||
((flags & OPERAND_ATSIGN) && ((X_op != O_absent) || (num != OPERAND_ATSIGN))))
|
||||
{
|
||||
if (Optimizing) printf("failed 2\n");
|
||||
match=0;
|
||||
}
|
||||
else if (flags & OPERAND_NUM)
|
||||
@ -1165,17 +1108,13 @@ find_format (opcode, myops, cmp_hack)
|
||||
/* and adding our current offset */
|
||||
for (value = 0, f = frchain_now->frch_root; f; f = f->fr_next)
|
||||
value += f->fr_fix + f->fr_offset;
|
||||
if (Optimizing) printf("offset=%d (0x%x) value=%d (0x%x)\n",value,value,
|
||||
S_GET_VALUE(myops[j].X_add_symbol),S_GET_VALUE(myops[j].X_add_symbol) );
|
||||
if (opcode->reloc_flag == RELOC_PCREL)
|
||||
value = S_GET_VALUE(myops[j].X_add_symbol) - value -
|
||||
(obstack_next_free(&frchain_now->frch_obstack) - frag_now->fr_literal);
|
||||
else
|
||||
value = S_GET_VALUE(myops[j].X_add_symbol);
|
||||
if (Optimizing) printf("symbol value=%d (0x%x) reloc=%d\n",value,value,opcode->reloc_flag);
|
||||
if (check_range (value, d30v_operand_table[fm->operands[j]].bits, flags))
|
||||
match = 0;
|
||||
if (Optimizing) printf("match=%d\n",match);
|
||||
}
|
||||
else
|
||||
match = 0;
|
||||
@ -1207,7 +1146,6 @@ tc_gen_reloc (seg, fixp)
|
||||
reloc->sym_ptr_ptr = &fixp->fx_addsy->bsym;
|
||||
reloc->address = fixp->fx_frag->fr_address + fixp->fx_where;
|
||||
reloc->howto = bfd_reloc_type_lookup (stdoutput, fixp->fx_r_type);
|
||||
if (Optimizing) printf("tc_gen_reloc: addr=%x howto=%x\n",reloc->address,reloc->howto);
|
||||
if (reloc->howto == (reloc_howto_type *) NULL)
|
||||
{
|
||||
as_bad_where (fixp->fx_file, fixp->fx_line,
|
||||
@ -1259,20 +1197,18 @@ md_apply_fix3 (fixp, valuep, seg)
|
||||
else if (fixp->fx_pcrel)
|
||||
{
|
||||
value = *valuep;
|
||||
if (Optimizing) printf("value=0x%lx\n",value);
|
||||
} else
|
||||
}
|
||||
else
|
||||
{
|
||||
value = fixp->fx_offset;
|
||||
if (Optimizing) printf("Value=0x%lx\n",value);
|
||||
if (fixp->fx_subsy != (symbolS *) NULL)
|
||||
{
|
||||
if (Optimizing) printf("subsy != NULL\n");
|
||||
if (S_GET_SEGMENT (fixp->fx_subsy) == absolute_section)
|
||||
value -= S_GET_VALUE (fixp->fx_subsy);
|
||||
else
|
||||
{
|
||||
/* We don't actually support subtracting a symbol. */
|
||||
as_bad_where (fixp->fx_file, fixp->fx_line,
|
||||
as_bad_where (fixp->fx_file, fixp->fx_line,
|
||||
"expression too complex");
|
||||
}
|
||||
}
|
||||
@ -1282,42 +1218,35 @@ md_apply_fix3 (fixp, valuep, seg)
|
||||
value, and stuff the instruction back again. */
|
||||
where = fixp->fx_frag->fr_literal + fixp->fx_where;
|
||||
insn = bfd_getb32 ((unsigned char *) where);
|
||||
|
||||
if (Optimizing) printf("md_apply_fix3: type=%ld where=%lx insn=%lx value=%lx\n",fixp->fx_r_type,where,insn,value);
|
||||
|
||||
switch (fixp->fx_r_type)
|
||||
{
|
||||
case BFD_RELOC_D30V_6:
|
||||
if (Optimizing) printf("BFD_RELOC_D30V_6\n");
|
||||
insn |= value & 0x3F;
|
||||
bfd_putb32 ((bfd_vma) insn, (unsigned char *) where);
|
||||
break;
|
||||
case BFD_RELOC_D30V_15:
|
||||
if (Optimizing) printf("BFD_RELOC_D30V_15\n");
|
||||
insn |= (value >> 3) & 0xFFF;
|
||||
bfd_putb32 ((bfd_vma) insn, (unsigned char *) where);
|
||||
break;
|
||||
case BFD_RELOC_D30V_15_PCREL:
|
||||
if ((long)fixp->fx_where & 0x7)
|
||||
value += 4;
|
||||
if (Optimizing) printf("BFD_RELOC_D30V_15_PCREL\n");
|
||||
insn |= (value >> 3) & 0xFFF;
|
||||
bfd_putb32 ((bfd_vma) insn, (unsigned char *) where);
|
||||
break;
|
||||
case BFD_RELOC_D30V_21:
|
||||
if (Optimizing) printf("BFD_RELOC_D30V_21\n");
|
||||
insn |= (value >> 3) & 0x3FFFF;
|
||||
bfd_putb32 ((bfd_vma) insn, (unsigned char *) where);
|
||||
break;
|
||||
case BFD_RELOC_D30V_21_PCREL:
|
||||
if ((long)fixp->fx_where & 0x7)
|
||||
value += 4;
|
||||
if (Optimizing) printf("BFD_RELOC_D30V_21_PCREL: insn=%lx value=%lx\n",insn,(long)value);
|
||||
insn |= (value >> 3) & 0x3FFFF;
|
||||
bfd_putb32 ((bfd_vma) insn, (unsigned char *) where);
|
||||
break;
|
||||
case BFD_RELOC_D30V_32:
|
||||
insn2 = bfd_getb32 ((unsigned char *) where + 4);
|
||||
if (Optimizing) printf("BFD_RELOC_D30V_32: insn=0x%08x%08x\n",(int)insn,(int)insn2);
|
||||
insn |= (value >> 26) & 0x3F; /* top 6 bits */
|
||||
insn2 |= ((value & 0x03FC0000) << 2); /* next 8 bits */
|
||||
insn2 |= value & 0x0003FFFF; /* bottom 18 bits */
|
||||
@ -1328,7 +1257,6 @@ md_apply_fix3 (fixp, valuep, seg)
|
||||
if ((long)fixp->fx_where & 0x7)
|
||||
value += 4;
|
||||
insn2 = bfd_getb32 ((unsigned char *) where + 4);
|
||||
if (Optimizing) printf("BFD_RELOC_D30V_32_PCREL: insn=0x%08x%08x\n",(int)insn,(int)insn2);
|
||||
insn |= (value >> 26) & 0x3F; /* top 6 bits */
|
||||
insn2 |= ((value & 0x03FC0000) << 2); /* next 8 bits */
|
||||
insn2 |= value & 0x0003FFFF; /* bottom 18 bits */
|
||||
@ -1336,7 +1264,6 @@ md_apply_fix3 (fixp, valuep, seg)
|
||||
bfd_putb32 ((bfd_vma) insn2, (unsigned char *) where + 4);
|
||||
break;
|
||||
case BFD_RELOC_32:
|
||||
if (Optimizing) printf("BFD_RELOC_32: insn=0x%08x value=0x%x\n",(int)insn,(int)value);
|
||||
bfd_putb32 ((bfd_vma) value, (unsigned char *) where);
|
||||
break;
|
||||
default:
|
||||
|
Loading…
Reference in New Issue
Block a user