otherwise leave empty.
* 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>
* config/ia64/ia64.c (ia64_expand_prologue): Mark extra
R -- print the prefix for register names.
z -- print the opcode suffix for the size of the current operand.
* -- 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.
s -- print a shift double count, followed by the assemblers argument
delimiter.
putc ('*', file);
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':
if (ASSEMBLER_DIALECT == 0)
putc ('l', file);
if (STACK_REG_P (x))
return;
- /* Intel syntax has no truck with instruction suffixes. */
- if (ASSEMBLER_DIALECT != 0)
- return;
-
/* this is the size of op from size of operand */
switch (GET_MODE_SIZE (GET_MODE (x)))
{
default:
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 (" PTR ", file);
}
if (GET_CODE (disp) == CONST_INT)
{
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));
}
else if (flag_pic)
R -- print the prefix for register names.
z -- print the opcode suffix for the size of the current operand.
* -- print a star (in certain assembler syntax)
+ A -- print an absolute memory reference.
P -- if PIC, print an @PLT suffix.
X -- don't print any sort of PIC '@' suffix for a symbol.
s -- ??? something to do with double shifts. not actually used, afaik.
(define_insn "indirect_jump"
[(set (pc) (match_operand:SI 0 "nonimmediate_operand" "rm"))]
""
- "jmp\\t%*%0"
+ "jmp\\t%A0"
[(set_attr "type" "ibr")
(set_attr "length_immediate" "0")])
[(set (pc) (match_operand:SI 0 "nonimmediate_operand" "rm"))
(use (label_ref (match_operand 1 "" "")))]
"! flag_pic"
- "jmp\\t%*%0"
+ "jmp\\t%A0"
[(set_attr "type" "ibr")
(set_attr "length_immediate" "0")])
[(set (pc) (match_operand:SI 0 "nonimmediate_operand" "rm"))
(use (label_ref (match_operand 1 "" "")))]
""
- "jmp\\t%*%0"
+ "jmp\\t%A0"
[(set_attr "type" "ibr")
(set_attr "length_immediate" "0")])
\f
return \"call\\t%P0\";
}
if (SIBLING_CALL_P (insn))
- return \"jmp\\t%*%0\";
+ return \"jmp\\t%A0\";
else
- return \"call\\t%*%0\";
+ return \"call\\t%A0\";
}"
[(set_attr "type" "call")])
return \"call\\t%P0\";
}
if (SIBLING_CALL_P (insn))
- return \"jmp\\t%*%0\";
+ return \"jmp\\t%A0\";
else
- return \"call\\t%*%0\";
+ return \"call\\t%A0\";
}"
[(set_attr "type" "call")])
[(return)
(use (match_operand:SI 0 "register_operand" "r"))]
"reload_completed"
- "jmp\\t%*%0"
+ "jmp\\t%A0"
[(set_attr "type" "ibr")
(set_attr "length_immediate" "0")])
return \"call\\t%P1\";
}
if (SIBLING_CALL_P (insn))
- return \"jmp\\t%*%1\";
+ return \"jmp\\t%A1\";
else
- return \"call\\t%*%1\";
+ return \"call\\t%A1\";
}"
[(set_attr "type" "callv")])
return \"call\\t%P1\";
}
if (SIBLING_CALL_P (insn))
- return \"jmp\\t%*%1\";
+ return \"jmp\\t%A1\";
else
- return \"call\\t%*%1\";
+ return \"call\\t%A1\";
}"
[(set_attr "type" "callv")])
\f