Commit 6ef67412 by Jan Hubicka Committed by Jan Hubicka

genattrtab.c (write_attr_value): Do not abort for CONST_INT operands.

	* genattrtab.c (write_attr_value): Do not abort for CONST_INT operands.
	* i386.c (ix86_attr_length_default): Kill.
	(ix86_attr_length_immediate_default, ix86_attr_length_address_default):
	New.
	* i386-protos.h (ix86_attr_length_default): Kill
	(ix86_attr_length_immediate_default, ix86_attr_length_address_default):
	Add prototype
	* i386.md (attribute type): Add "test".
	(attribute length_prefix): Kill.
	(attribute length_opcode): Kill.
	(attribute i387, mode, length_immediate, length_address, prefix_data16,
	prefix_rep, prefix_0f, modrm): New.
	(attribute length): Compute using the new attributes.
	(attribute pent_prefix): New.
	(attribute pent_pair): Compute using pent_prefix.
	(all insn patterns): Set mode,modrm and immediate_length attributes where
	needed.
	(cmpsi patterns): Compute sizes propertly for test instruction.
	(movsi, movhi patterns): Compute sizes propertly for eax shortcuts.
	(movstricthi_xor, movstrictqi_xor): New patterns.
	(andsi/andhi): Use splitters to generate xor instructions.
	(xorqi_ext_1): New pattern.
	(movstricthi->movstricthi_xor peep2): New.

From-SVN: r34731
parent 638f9bae
Tue Jun 27 12:14:12 MET DST 2000 Jan Hubicka <jh@suse.cz>
* genattrtab.c (write_attr_value): Do not abort for CONST_INT operands.
* i386.c (ix86_attr_length_default): Kill.
(ix86_attr_length_immediate_default, ix86_attr_length_address_default):
New.
* i386-protos.h (ix86_attr_length_default): Kill
(ix86_attr_length_immediate_default, ix86_attr_length_address_default):
Add prototype
* i386.md (attribute type): Add "test".
(attribute length_prefix): Kill.
(attribute length_opcode): Kill.
(attribute i387, mode, length_immediate, length_address, prefix_data16,
prefix_rep, prefix_0f, modrm): New.
(attribute length): Compute using the new attributes.
(attribute pent_prefix): New.
(attribute pent_pair): Compute using pent_prefix.
(all insn patterns): Set mode,modrm and immediate_length attributes where
needed.
(cmpsi patterns): Compute sizes propertly for test instruction.
(movsi, movhi patterns): Compute sizes propertly for eax shortcuts.
(movstricthi_xor, movstrictqi_xor): New patterns.
(andsi/andhi): Use splitters to generate xor instructions.
(xorqi_ext_1): New pattern.
(movstricthi->movstricthi_xor peep2): New.
Tue Jun 27 12:03:03 MET DST 2000 Jan Hubicka <jh@suse.cz> Tue Jun 27 12:03:03 MET DST 2000 Jan Hubicka <jh@suse.cz>
* i386.md (addqi_low_1): Remove. * i386.md (addqi_low_1): Remove.
......
...@@ -113,7 +113,8 @@ extern void ix86_expand_strlensi_unroll_1 PARAMS ((rtx, rtx, rtx)); ...@@ -113,7 +113,8 @@ extern void ix86_expand_strlensi_unroll_1 PARAMS ((rtx, rtx, rtx));
extern int ix86_address_cost PARAMS ((rtx)); extern int ix86_address_cost PARAMS ((rtx));
extern rtx assign_386_stack_local PARAMS ((enum machine_mode, int)); extern rtx assign_386_stack_local PARAMS ((enum machine_mode, int));
extern int ix86_attr_length_default PARAMS ((rtx)); extern int ix86_attr_length_immediate_default PARAMS ((rtx, int));
extern int ix86_attr_length_address_default PARAMS ((rtx));
extern int ix86_issue_rate PARAMS ((void)); extern int ix86_issue_rate PARAMS ((void));
extern int ix86_adjust_cost PARAMS ((rtx, rtx, rtx, int)); extern int ix86_adjust_cost PARAMS ((rtx, rtx, rtx, int));
......
...@@ -6156,119 +6156,59 @@ memory_address_length (addr) ...@@ -6156,119 +6156,59 @@ memory_address_length (addr)
return len; return len;
} }
/* Compute default value for "length_immediate" attribute. When SHORTFORM is set
expect that insn have 8bit immediate alternative. */
int int
ix86_attr_length_default (insn) ix86_attr_length_immediate_default (insn, shortform)
rtx insn; rtx insn;
int shortform;
{ {
enum attr_type type; int len = 0;
int len = 0, i; int i;
type = get_attr_type (insn);
extract_insn (insn); extract_insn (insn);
switch (type) for (i = recog_data.n_operands - 1; i >= 0; --i)
{ if (CONSTANT_P (recog_data.operand[i]))
case TYPE_INCDEC:
case TYPE_SETCC:
case TYPE_ICMOV:
case TYPE_FMOV:
case TYPE_FOP:
case TYPE_FCMP:
case TYPE_FOP1:
case TYPE_FMUL:
case TYPE_FDIV:
case TYPE_FSGN:
case TYPE_FPSPC:
case TYPE_FCMOV:
case TYPE_IBR:
break;
case TYPE_STR:
case TYPE_CLD:
len = 0;
case TYPE_ALU1:
case TYPE_NEGNOT:
case TYPE_ALU:
case TYPE_ICMP:
case TYPE_IMOVX:
case TYPE_ISHIFT:
case TYPE_IMUL:
case TYPE_IDIV:
case TYPE_PUSH:
case TYPE_POP:
for (i = recog_data.n_operands - 1; i >= 0; --i)
if (CONSTANT_P (recog_data.operand[i]))
{
if (GET_CODE (recog_data.operand[i]) == CONST_INT
&& CONST_OK_FOR_LETTER_P (INTVAL (recog_data.operand[i]), 'K'))
len += 1;
else
len += GET_MODE_SIZE (GET_MODE (recog_data.operand[0]));
}
break;
case TYPE_IMOV:
if (CONSTANT_P (recog_data.operand[1]))
len += GET_MODE_SIZE (GET_MODE (recog_data.operand[0]));
break;
case TYPE_CALL:
if (constant_call_address_operand (recog_data.operand[0],
GET_MODE (recog_data.operand[0])))
return 5;
break;
case TYPE_CALLV:
if (constant_call_address_operand (recog_data.operand[1],
GET_MODE (recog_data.operand[1])))
return 5;
break;
case TYPE_LEA:
{ {
/* Irritatingly, single_set doesn't work with REG_UNUSED present, if (len)
as we'll get from running life_analysis during reg-stack when
not optimizing. Not that it matters anyway, now that
pro_epilogue_adjust_stack uses lea, and is by design not
single_set. */
rtx set = PATTERN (insn);
if (GET_CODE (set) == SET)
;
else if (GET_CODE (set) == PARALLEL
&& GET_CODE (XVECEXP (set, 0, 0)) == SET)
set = XVECEXP (set, 0, 0);
else
abort (); abort ();
if (shortform
len += memory_address_length (SET_SRC (set)); && GET_CODE (recog_data.operand[i]) == CONST_INT
goto just_opcode; && CONST_OK_FOR_LETTER_P (INTVAL (recog_data.operand[i]), 'K'))
len = 1;
else
{
switch (get_attr_mode (insn))
{
case MODE_QI:
len+=1;
break;
case MODE_HI:
len+=2;
break;
case MODE_SI:
len+=4;
break;
default:
fatal_insn ("Unknown insn mode", insn);
}
}
} }
return len;
case TYPE_OTHER: }
case TYPE_MULTI: /* Compute default value for "length_address" attribute. */
return 15; int
ix86_attr_length_address_default (insn)
case TYPE_FXCH: rtx insn;
if (STACK_TOP_P (recog_data.operand[0])) {
return 2 + (REGNO (recog_data.operand[1]) != FIRST_STACK_REG + 1); int i;
else extract_insn (insn);
return 2 + (REGNO (recog_data.operand[0]) != FIRST_STACK_REG + 1);
default:
abort ();
}
for (i = recog_data.n_operands - 1; i >= 0; --i) for (i = recog_data.n_operands - 1; i >= 0; --i)
if (GET_CODE (recog_data.operand[i]) == MEM) if (GET_CODE (recog_data.operand[i]) == MEM)
{ {
len += memory_address_length (XEXP (recog_data.operand[i], 0)); return memory_address_length (XEXP (recog_data.operand[i], 0));
break; break;
} }
return 0;
just_opcode:
len += get_attr_length_opcode (insn);
len += get_attr_length_prefix (insn);
return len;
} }
/* Return the maximum number of instructions a cpu can issue. */ /* Return the maximum number of instructions a cpu can issue. */
......
This source diff could not be displayed because it is too large. You can view the blob instead.
...@@ -5310,6 +5310,10 @@ write_attr_value (attr, value) ...@@ -5310,6 +5310,10 @@ write_attr_value (attr, value)
write_attr_valueq (attr, XSTR (value, 0)); write_attr_valueq (attr, XSTR (value, 0));
break; break;
case CONST_INT:
printf (HOST_WIDE_INT_PRINT_DEC, INTVAL (value));
break;
case SYMBOL_REF: case SYMBOL_REF:
fputs (XSTR (value, 0), stdout); fputs (XSTR (value, 0), stdout);
break; break;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment