@@ -1480,19 +1480,17 @@ do { \
/* This macro should be provided on machines where the addresses in a dispatch
table are relative to the table's own address. */
-/* ??? Depends on the pointer size. */
-
#define ASM_OUTPUT_ADDR_DIFF_ELT(STREAM, BODY, VALUE, REL) \
do { \
- if (TARGET_ILP32) \
+ if (CASE_VECTOR_MODE == SImode) \
fprintf (STREAM, "\tdata4 @pcrel(.L%d)\n", VALUE); \
else \
fprintf (STREAM, "\tdata8 @pcrel(.L%d)\n", VALUE); \
} while (0)
-/* Jump tables only need 8 byte alignment. */
+/* Jump tables only need 4 or 8 byte alignment. */
-#define ADDR_VEC_ALIGN(ADDR_VEC) 3
+#define ADDR_VEC_ALIGN(ADDR_VEC) (CASE_VECTOR_MODE == SImode ? 2 : 3)
/* Assembler Commands for Exception Regions. */
@@ -4578,7 +4578,7 @@
[(set_attr "itanium_class" "br")])
(define_expand "tablejump"
- [(parallel [(set (pc) (match_operand:DI 0 "memory_operand" ""))
+ [(parallel [(set (pc) (match_operand 0 "memory_operand" ""))
(use (label_ref (match_operand 1 "" "")))])]
""
{
@@ -4614,7 +4614,7 @@
from the entry to the label. Thus to convert to an absolute address
we add the address of the memory from which the value is loaded. */
operands[0] = expand_simple_binop (DImode, PLUS, op0, addr,
- NULL_RTX, 1, OPTAB_DIRECT);
+ NULL_RTX, 0, OPTAB_DIRECT);
})
(define_insn "*tablejump_internal"
@@ -154,6 +154,10 @@ STATIC func_ptr __CTOR_LIST__[1] \
#undef TARGET_PROMOTE_FUNCTION_MODE
#define TARGET_PROMOTE_FUNCTION_MODE default_promote_function_mode_always_promote
+/* Code is always in P0 (lower 31 bit addresses) on VMS. */
+#undef CASE_VECTOR_MODE
+#define CASE_VECTOR_MODE SImode
+
/* IA64 VMS doesn't fully support COMDAT sections. */
#define SUPPORTS_ONE_ONLY 0