Commit fb204271 by Diego Novillo Committed by Diego Novillo

i386.c (print_operand): Handle new 'A' formatting code.


2000-10-23  Diego Novillo  <dnovillo@cygnus.com>

	* i386.c (print_operand): Handle new 'A' formatting code.
	387 opcodes need suffixes even with -mintel-syntax.
	Check for explicit size override (codes 'b', 'w' and 'k').
	(print_operand_address): Check if register prefix is needed when
	emitting `ds' segment override.
	* i386.h: Add comment about new 'A' formatting code.
	* i386.md (jump and call patterns): Emit absolute references using %A.

From-SVN: r37055
parent 138e79e7
...@@ -67,6 +67,16 @@ Wed Oct 25 01:02:44 EDT 2000 John Wehle (john@feith.com) ...@@ -67,6 +67,16 @@ Wed Oct 25 01:02:44 EDT 2000 John Wehle (john@feith.com)
otherwise leave empty. otherwise leave empty.
* configure: Regenerate. * configure: Regenerate.
2000-10-23 Diego Novillo <dnovillo@cygnus.com>
* i386.c (print_operand): Handle new 'A' formatting code.
387 opcodes need suffixes even with -mintel-syntax.
Check for explicit size override (codes 'b', 'w' and 'k').
(print_operand_address): Check if register prefix is needed when
emitting `ds' segment override.
* i386.h: Add comment about new 'A' formatting code.
* i386.md (jump and call patterns): Emit absolute references using %A.
2000-10-23 Richard Henderson <rth@cygnus.com> 2000-10-23 Richard Henderson <rth@cygnus.com>
* config/ia64/ia64.c (ia64_expand_prologue): Mark extra * config/ia64/ia64.c (ia64_expand_prologue): Mark extra
......
...@@ -3250,6 +3250,7 @@ print_reg (x, code, file) ...@@ -3250,6 +3250,7 @@ print_reg (x, code, file)
R -- print the prefix for register names. R -- print the prefix for register names.
z -- print the opcode suffix for the size of the current operand. z -- print the opcode suffix for the size of the current operand.
* -- print a star (in certain assembler syntax) * -- print a star (in certain assembler syntax)
A -- print an absolute memory reference.
w -- print the operand as if it's a "word" (HImode) even if it isn't. w -- print the operand as if it's a "word" (HImode) even if it isn't.
s -- print a shift double count, followed by the assemblers argument s -- print a shift double count, followed by the assemblers argument
delimiter. delimiter.
...@@ -3276,6 +3277,26 @@ print_operand (file, x, code) ...@@ -3276,6 +3277,26 @@ print_operand (file, x, code)
putc ('*', file); putc ('*', file);
return; return;
case 'A':
if (ASSEMBLER_DIALECT == 0)
putc ('*', file);
else if (ASSEMBLER_DIALECT == 1)
{
/* Intel syntax. For absolute addresses, registers should not
be surrounded by braces. */
if (GET_CODE (x) != REG)
{
putc ('[', file);
PRINT_OPERAND (file, x, 0);
putc (']', file);
return;
}
}
PRINT_OPERAND (file, x, 0);
return;
case 'L': case 'L':
if (ASSEMBLER_DIALECT == 0) if (ASSEMBLER_DIALECT == 0)
putc ('l', file); putc ('l', file);
...@@ -3313,10 +3334,6 @@ print_operand (file, x, code) ...@@ -3313,10 +3334,6 @@ print_operand (file, x, code)
if (STACK_REG_P (x)) if (STACK_REG_P (x))
return; return;
/* Intel syntax has no truck with instruction suffixes. */
if (ASSEMBLER_DIALECT != 0)
return;
/* this is the size of op from size of operand */ /* this is the size of op from size of operand */
switch (GET_MODE_SIZE (GET_MODE (x))) switch (GET_MODE_SIZE (GET_MODE (x)))
{ {
...@@ -3422,6 +3439,15 @@ print_operand (file, x, code) ...@@ -3422,6 +3439,15 @@ print_operand (file, x, code)
default: default:
abort (); abort ();
} }
/* Check for explicit size override (codes 'b', 'w' and 'k') */
if (code == 'b')
size = "BYTE";
else if (code == 'w')
size = "WORD";
else if (code == 'k')
size = "DWORD";
fputs (size, file); fputs (size, file);
fputs (" PTR ", file); fputs (" PTR ", file);
} }
...@@ -3519,7 +3545,11 @@ print_operand_address (file, addr) ...@@ -3519,7 +3545,11 @@ print_operand_address (file, addr)
if (GET_CODE (disp) == CONST_INT) if (GET_CODE (disp) == CONST_INT)
{ {
if (ASSEMBLER_DIALECT != 0) if (ASSEMBLER_DIALECT != 0)
fputs ("ds:", file); {
if (USER_LABEL_PREFIX[0] == 0)
putc ('%', file);
fputs ("ds:", file);
}
fprintf (file, HOST_WIDE_INT_PRINT_DEC, INTVAL (addr)); fprintf (file, HOST_WIDE_INT_PRINT_DEC, INTVAL (addr));
} }
else if (flag_pic) else if (flag_pic)
......
...@@ -2723,6 +2723,7 @@ do { long l; \ ...@@ -2723,6 +2723,7 @@ do { long l; \
R -- print the prefix for register names. R -- print the prefix for register names.
z -- print the opcode suffix for the size of the current operand. z -- print the opcode suffix for the size of the current operand.
* -- print a star (in certain assembler syntax) * -- print a star (in certain assembler syntax)
A -- print an absolute memory reference.
P -- if PIC, print an @PLT suffix. P -- if PIC, print an @PLT suffix.
X -- don't print any sort of PIC '@' suffix for a symbol. X -- don't print any sort of PIC '@' suffix for a symbol.
s -- ??? something to do with double shifts. not actually used, afaik. s -- ??? something to do with double shifts. not actually used, afaik.
......
...@@ -8662,7 +8662,7 @@ ...@@ -8662,7 +8662,7 @@
(define_insn "indirect_jump" (define_insn "indirect_jump"
[(set (pc) (match_operand:SI 0 "nonimmediate_operand" "rm"))] [(set (pc) (match_operand:SI 0 "nonimmediate_operand" "rm"))]
"" ""
"jmp\\t%*%0" "jmp\\t%A0"
[(set_attr "type" "ibr") [(set_attr "type" "ibr")
(set_attr "length_immediate" "0")]) (set_attr "length_immediate" "0")])
...@@ -8670,7 +8670,7 @@ ...@@ -8670,7 +8670,7 @@
[(set (pc) (match_operand:SI 0 "nonimmediate_operand" "rm")) [(set (pc) (match_operand:SI 0 "nonimmediate_operand" "rm"))
(use (label_ref (match_operand 1 "" "")))] (use (label_ref (match_operand 1 "" "")))]
"! flag_pic" "! flag_pic"
"jmp\\t%*%0" "jmp\\t%A0"
[(set_attr "type" "ibr") [(set_attr "type" "ibr")
(set_attr "length_immediate" "0")]) (set_attr "length_immediate" "0")])
...@@ -8744,7 +8744,7 @@ ...@@ -8744,7 +8744,7 @@
[(set (pc) (match_operand:SI 0 "nonimmediate_operand" "rm")) [(set (pc) (match_operand:SI 0 "nonimmediate_operand" "rm"))
(use (label_ref (match_operand 1 "" "")))] (use (label_ref (match_operand 1 "" "")))]
"" ""
"jmp\\t%*%0" "jmp\\t%A0"
[(set_attr "type" "ibr") [(set_attr "type" "ibr")
(set_attr "length_immediate" "0")]) (set_attr "length_immediate" "0")])
...@@ -8915,9 +8915,9 @@ ...@@ -8915,9 +8915,9 @@
return \"call\\t%P0\"; return \"call\\t%P0\";
} }
if (SIBLING_CALL_P (insn)) if (SIBLING_CALL_P (insn))
return \"jmp\\t%*%0\"; return \"jmp\\t%A0\";
else else
return \"call\\t%*%0\"; return \"call\\t%A0\";
}" }"
[(set_attr "type" "call")]) [(set_attr "type" "call")])
...@@ -8965,9 +8965,9 @@ ...@@ -8965,9 +8965,9 @@
return \"call\\t%P0\"; return \"call\\t%P0\";
} }
if (SIBLING_CALL_P (insn)) if (SIBLING_CALL_P (insn))
return \"jmp\\t%*%0\"; return \"jmp\\t%A0\";
else else
return \"call\\t%*%0\"; return \"call\\t%A0\";
}" }"
[(set_attr "type" "call")]) [(set_attr "type" "call")])
...@@ -9103,7 +9103,7 @@ ...@@ -9103,7 +9103,7 @@
[(return) [(return)
(use (match_operand:SI 0 "register_operand" "r"))] (use (match_operand:SI 0 "register_operand" "r"))]
"reload_completed" "reload_completed"
"jmp\\t%*%0" "jmp\\t%A0"
[(set_attr "type" "ibr") [(set_attr "type" "ibr")
(set_attr "length_immediate" "0")]) (set_attr "length_immediate" "0")])
...@@ -11546,9 +11546,9 @@ ...@@ -11546,9 +11546,9 @@
return \"call\\t%P1\"; return \"call\\t%P1\";
} }
if (SIBLING_CALL_P (insn)) if (SIBLING_CALL_P (insn))
return \"jmp\\t%*%1\"; return \"jmp\\t%A1\";
else else
return \"call\\t%*%1\"; return \"call\\t%A1\";
}" }"
[(set_attr "type" "callv")]) [(set_attr "type" "callv")])
...@@ -11581,9 +11581,9 @@ ...@@ -11581,9 +11581,9 @@
return \"call\\t%P1\"; return \"call\\t%P1\";
} }
if (SIBLING_CALL_P (insn)) if (SIBLING_CALL_P (insn))
return \"jmp\\t%*%1\"; return \"jmp\\t%A1\";
else else
return \"call\\t%*%1\"; return \"call\\t%A1\";
}" }"
[(set_attr "type" "callv")]) [(set_attr "type" "callv")])
......
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