* config/m68k/predicates.md (const_call_operand): Adjust comment.
(const_sibcall_operand): New.
(sibcall_operand): Use it.
* config/m68k/m68k.c (FL_FOR_isa_c): Not ISA_B compatible.
(m68k_isas): ISAC does not imply FPU or EMAC.
(override_options): Add ISA_C logic for symbolic jump & call.
From-SVN: r125774
* config/m68k/m68k.c (all_isas): Remove FL_CF_FPU and
FL_CF_EMAC from the entry for isac.
+ * config/m68k/predicates.md (const_call_operand): Adjust comment.
+ (const_sibcall_operand): New.
+ (sibcall_operand): Use it.
+ * config/m68k/m68k.c (FL_FOR_isa_c): Not ISA_B compatible.
+ (m68k_isas): ISAC does not imply FPU or EMAC.
+ (override_options): Add ISA_C logic for symbolic jump & call.
+
2007-06-17 Eric Botcazou <ebotcazou@libertysurf.fr>
* config/sparc/sparc.c (sparc_vis_init_builtins): Retrieve the
#define FL_FOR_isa_aplus (FL_FOR_isa_a | FL_ISA_APLUS | FL_CF_USP)
/* Note ISA_B doesn't necessarily include USP (user stack pointer) support. */
#define FL_FOR_isa_b (FL_FOR_isa_a | FL_ISA_B | FL_CF_HWDIV)
-#define FL_FOR_isa_c (FL_FOR_isa_b | FL_ISA_C | FL_CF_USP)
+/* ISA_C is not upwardly compatible with ISA_B. */
+#define FL_FOR_isa_c (FL_FOR_isa_a | FL_ISA_C | FL_CF_HWDIV | FL_CF_USP)
enum m68k_isa
{
else if (TARGET_ID_SHARED_LIBRARY)
/* All addresses must be loaded from the GOT. */
;
- else if (TARGET_68020 || TARGET_ISAB)
+ else if (TARGET_68020 || TARGET_ISAB || TARGET_ISAC)
{
if (TARGET_PCREL)
+ m68k_symbolic_call = "bsr.l %c0";
+ else
{
- m68k_symbolic_call = "bsr.l %c0";
- m68k_symbolic_jump = "bra.l %c0";
+#if defined(USE_GAS)
+ m68k_symbolic_call = "bsr.l %p0";
+#else
+ m68k_symbolic_call = "bsr %p0";
+#endif
}
+ if (TARGET_ISAC)
+ /* No unconditional long branch */;
+ else if (TARGET_PCREL)
+ m68k_symbolic_jump = "bra.l %c0";
else
{
#if defined(USE_GAS)
- m68k_symbolic_call = "bsr.l %p0";
m68k_symbolic_jump = "bra.l %p0";
#else
- m68k_symbolic_call = "bsr %p0";
m68k_symbolic_jump = "bra %p0";
#endif
}
}
})
-;; A constant that can be used the address in a call or sibcall insn.
+;; A constant that can be used the address in a call insn
(define_predicate "const_call_operand"
(ior (match_operand 0 "const_int_operand")
(and (match_test "m68k_symbolic_call != NULL")
(ior (match_operand 0 "const_call_operand")
(match_operand 0 "register_operand")))
+;; A constant that can be used the address in a sibcall insn
+(define_predicate "const_sibcall_operand"
+ (ior (match_operand 0 "const_int_operand")
+ (and (match_test "m68k_symbolic_jump != NULL")
+ (match_operand 0 "symbolic_operand"))))
+
;; An operand that can be used as the address in a sibcall insn.
(define_predicate "sibcall_operand"
- (ior (match_operand 0 "const_call_operand")
+ (ior (match_operand 0 "const_sibcall_operand")
(and (match_code "reg")
(match_test "REGNO (op) == STATIC_CHAIN_REGNUM"))))