#ifndef _BFIN_CONFIG
#define _BFIN_CONFIG
#define OBJECT_FORMAT_ELF
#define BRT 1
#define BRF 0
#define TARGET_VERSION fprintf (stderr, " (BlackFin bfin)")
extern int target_flags;
#ifndef TARGET_CPU_CPP_BUILTINS
#define TARGET_CPU_CPP_BUILTINS() \
do \
{ \
builtin_define_std ("bfin"); \
builtin_define_std ("BFIN"); \
builtin_define ("__ADSPBLACKFIN__"); \
if (TARGET_FDPIC) \
builtin_define ("__BFIN_FDPIC__"); \
if (TARGET_ID_SHARED_LIBRARY) \
builtin_define ("__ID_SHARED_LIB__"); \
} \
while (0)
#endif
#define DRIVER_SELF_SPECS SUBTARGET_DRIVER_SELF_SPECS "\
%{mfdpic:%{!fpic:%{!fpie:%{!fPIC:%{!fPIE:\
%{!fno-pic:%{!fno-pie:%{!fno-PIC:%{!fno-PIE:-fpie}}}}}}}}} \
"
#ifndef SUBTARGET_DRIVER_SELF_SPECS
# define SUBTARGET_DRIVER_SELF_SPECS
#endif
#define LINK_GCC_C_SEQUENCE_SPEC \
"%{mfdpic:%{!static: %L} %{static: %G %L %G}} \
%{!mfdpic:%G %L %G}"
#undef ASM_SPEC
#define ASM_SPEC "\
%{G*} %{v} %{n} %{T} %{Ym,*} %{Yd,*} %{Wa,*:%*} \
%{mno-fdpic:-mnopic} %{mfdpic}"
#define LINK_SPEC "\
%{h*} %{v:-V} \
%{b} \
%{mfdpic:-melf32bfinfd -z text} \
%{static:-dn -Bstatic} \
%{shared:-G -Bdynamic} \
%{symbolic:-Bsymbolic} \
%{G*} \
%{YP,*} \
%{Qy:} %{!Qn:-Qy} \
-init __init -fini __fini "
#define TARGET_DSP (1)
#define TARGET_DEFAULT (MASK_SPECLD_ANOMALY | MASK_CSYNC_ANOMALY)
#define MAX_LIBRARY_ID 255
extern const char *bfin_library_id_string;
#define OVERRIDE_OPTIONS override_options ()
#define FUNCTION_MODE SImode
#define Pmode SImode
#define STORE_FLAG_VALUE 1
#define STACK_GROWS_DOWNWARD
#define STACK_PUSH_CODE PRE_DEC
#define FRAME_GROWS_DOWNWARD 1
#define FIRST_PARM_OFFSET(DECL) 0
#define STARTING_FRAME_OFFSET 0
#define STACK_POINTER_REGNUM REG_P6
#define FRAME_POINTER_REGNUM REG_P7
#define ARG_POINTER_REGNUM REG_ARGP
#define PIC_OFFSET_TABLE_REGNUM (REG_P5)
#define FDPIC_FPTR_REGNO REG_P1
#define FDPIC_REGNO REG_P3
#define OUR_FDPIC_REG get_hard_reg_initial_val (SImode, FDPIC_REGNO)
#define STATIC_CHAIN_REGNUM REG_P2
#define FIXED_STACK_AREA 12
#define REG_PARM_STACK_SPACE(FNDECL) FIXED_STACK_AREA
#define OUTGOING_REG_PARM_STACK_SPACE
#define ACCUMULATE_OUTGOING_ARGS 1
#define FRAME_POINTER_REQUIRED (bfin_frame_pointer_required ())
#define CONSTANT_ALIGNMENT(EXP, ALIGN) \
(TREE_CODE (EXP) == STRING_CST \
&& (ALIGN) < BITS_PER_WORD ? BITS_PER_WORD : (ALIGN))
#define TRAMPOLINE_SIZE (TARGET_FDPIC ? 30 : 18)
#define TRAMPOLINE_TEMPLATE(FILE) \
if (TARGET_FDPIC) \
{ \
fprintf(FILE, "\t.dd\t0x00000000\n"); \
fprintf(FILE, "\t.dd\t0x00000000\n"); \
fprintf(FILE, "\t.dd\t0x0000e109\n"); \
fprintf(FILE, "\t.dd\t0x0000e149\n"); \
fprintf(FILE, "\t.dd\t0x0000e10a\n"); \
fprintf(FILE, "\t.dd\t0x0000e14a\n"); \
fprintf(FILE, "\t.dw\t0xac4b\n"); \
fprintf(FILE, "\t.dw\t0x9149\n"); \
fprintf(FILE, "\t.dw\t0x0051\n"); \
} \
else \
{ \
fprintf(FILE, "\t.dd\t0x0000e109\n"); \
fprintf(FILE, "\t.dd\t0x0000e149\n"); \
fprintf(FILE, "\t.dd\t0x0000e10a\n"); \
fprintf(FILE, "\t.dd\t0x0000e14a\n"); \
fprintf(FILE, "\t.dw\t0x0051\n"); \
}
#define INITIALIZE_TRAMPOLINE(TRAMP, FNADDR, CXT) \
initialize_trampoline (TRAMP, FNADDR, CXT)
#define ELIMINABLE_REGS \
{{ ARG_POINTER_REGNUM, STACK_POINTER_REGNUM}, \
{ ARG_POINTER_REGNUM, FRAME_POINTER_REGNUM}, \
{ FRAME_POINTER_REGNUM, STACK_POINTER_REGNUM}} \
#define CAN_ELIMINATE(FROM, TO) \
((TO) == STACK_POINTER_REGNUM ? ! frame_pointer_needed : 1)
#define INITIAL_ELIMINATION_OFFSET(FROM, TO, OFFSET) \
((OFFSET) = bfin_initial_elimination_offset ((FROM), (TO)))
#define FIRST_PSEUDO_REGISTER 50
#define D_REGNO_P(X) ((X) <= REG_R7)
#define P_REGNO_P(X) ((X) >= REG_P0 && (X) <= REG_P7)
#define I_REGNO_P(X) ((X) >= REG_I0 && (X) <= REG_I3)
#define DP_REGNO_P(X) (D_REGNO_P (X) || P_REGNO_P (X))
#define ADDRESS_REGNO_P(X) ((X) >= REG_P0 && (X) <= REG_M3)
#define DREG_P(X) (REG_P (X) && D_REGNO_P (REGNO (X)))
#define PREG_P(X) (REG_P (X) && P_REGNO_P (REGNO (X)))
#define IREG_P(X) (REG_P (X) && I_REGNO_P (REGNO (X)))
#define DPREG_P(X) (REG_P (X) && DP_REGNO_P (REGNO (X)))
#define REGISTER_NAMES { \
"R0", "R1", "R2", "R3", "R4", "R5", "R6", "R7", \
"P0", "P1", "P2", "P3", "P4", "P5", "SP", "FP", \
"I0", "I1", "I2", "I3", "B0", "B1", "B2", "B3", \
"L0", "L1", "L2", "L3", "M0", "M1", "M2", "M3", \
"A0", "A1", \
"CC", \
"RETS", "RETI", "RETX", "RETN", "RETE", "ASTAT", "SEQSTAT", "USP", \
"ARGP", \
"LT0", "LT1", "LC0", "LC1", "LB0", "LB1" \
}
#define SHORT_REGISTER_NAMES { \
"R0.L", "R1.L", "R2.L", "R3.L", "R4.L", "R5.L", "R6.L", "R7.L", \
"P0.L", "P1.L", "P2.L", "P3.L", "P4.L", "P5.L", "SP.L", "FP.L", \
"I0.L", "I1.L", "I2.L", "I3.L", "B0.L", "B1.L", "B2.L", "B3.L", \
"L0.L", "L1.L", "L2.L", "L3.L", "M0.L", "M1.L", "M2.L", "M3.L", }
#define HIGH_REGISTER_NAMES { \
"R0.H", "R1.H", "R2.H", "R3.H", "R4.H", "R5.H", "R6.H", "R7.H", \
"P0.H", "P1.H", "P2.H", "P3.H", "P4.H", "P5.H", "SP.H", "FP.H", \
"I0.H", "I1.H", "I2.H", "I3.H", "B0.H", "B1.H", "B2.H", "B3.H", \
"L0.H", "L1.H", "L2.H", "L3.H", "M0.H", "M1.H", "M2.H", "M3.H", }
#define DREGS_PAIR_NAMES { \
"R1:0.p", 0, "R3:2.p", 0, "R5:4.p", 0, "R7:6.p", 0, }
#define BYTE_REGISTER_NAMES { \
"R0.B", "R1.B", "R2.B", "R3.B", "R4.B", "R5.B", "R6.B", "R7.B", }
#define FIXED_REGISTERS \
\
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, \
\
0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, \
\
0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, \
\
1, 1 \
}
#define CALL_USED_REGISTERS \
\
{ 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 0, \
\
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, \
\
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, \
\
1, 1 \
}
#define REG_ALLOC_ORDER \
{ REG_R0, REG_R1, REG_R2, REG_R3, REG_R7, REG_R6, REG_R5, REG_R4, \
REG_P2, REG_P1, REG_P0, REG_P5, REG_P4, REG_P3, REG_P6, REG_P7, \
REG_A0, REG_A1, \
REG_I0, REG_I1, REG_I2, REG_I3, REG_B0, REG_B1, REG_B2, REG_B3, \
REG_L0, REG_L1, REG_L2, REG_L3, REG_M0, REG_M1, REG_M2, REG_M3, \
REG_RETS, REG_RETI, REG_RETX, REG_RETN, REG_RETE, \
REG_ASTAT, REG_SEQSTAT, REG_USP, \
REG_CC, REG_ARGP, \
REG_LT0, REG_LT1, REG_LC0, REG_LC1, REG_LB0, REG_LB1 \
}
#define CONDITIONAL_REGISTER_USAGE \
{ \
conditional_register_usage(); \
if (TARGET_FDPIC) \
call_used_regs[FDPIC_REGNO] = 1; \
if (!TARGET_FDPIC && flag_pic) \
{ \
fixed_regs[PIC_OFFSET_TABLE_REGNUM] = 1; \
call_used_regs[PIC_OFFSET_TABLE_REGNUM] = 1; \
} \
}
enum reg_class
{
NO_REGS,
IREGS,
BREGS,
LREGS,
MREGS,
CIRCREGS,
DAGREGS,
EVEN_AREGS,
ODD_AREGS,
AREGS,
CCREGS,
EVEN_DREGS,
ODD_DREGS,
DREGS,
FDPIC_REGS,
FDPIC_FPTR_REGS,
PREGS_CLOBBERED,
PREGS,
IPREGS,
DPREGS,
MOST_REGS,
LT_REGS,
LC_REGS,
LB_REGS,
PROLOGUE_REGS,
NON_A_CC_REGS,
ALL_REGS, LIM_REG_CLASSES
};
#define N_REG_CLASSES ((int)LIM_REG_CLASSES)
#define GENERAL_REGS DPREGS
#define REG_CLASS_NAMES \
{ "NO_REGS", \
"IREGS", \
"BREGS", \
"LREGS", \
"MREGS", \
"CIRCREGS", \
"DAGREGS", \
"EVEN_AREGS", \
"ODD_AREGS", \
"AREGS", \
"CCREGS", \
"EVEN_DREGS", \
"ODD_DREGS", \
"DREGS", \
"FDPIC_REGS", \
"FDPIC_FPTR_REGS", \
"PREGS_CLOBBERED", \
"PREGS", \
"IPREGS", \
"DPREGS", \
"MOST_REGS", \
"LT_REGS", \
"LC_REGS", \
"LB_REGS", \
"PROLOGUE_REGS", \
"NON_A_CC_REGS", \
"ALL_REGS" }
#define REG_CLASS_CONTENTS \
\
{ { 0x00000000, 0 }, \
{ 0x000f0000, 0 }, \
{ 0x00f00000, 0 }, \
{ 0x0f000000, 0 }, \
{ 0xf0000000, 0 }, \
{ 0x0fff0000, 0 }, \
{ 0xffff0000, 0 }, \
{ 0x00000000, 0x1 }, \
{ 0x00000000, 0x2 }, \
{ 0x00000000, 0x3 }, \
{ 0x00000000, 0x4 }, \
{ 0x00000055, 0 }, \
{ 0x000000aa, 0 }, \
{ 0x000000ff, 0 }, \
{ 0x00000800, 0x000 }, \
{ 0x00000200, 0x000 }, \
{ 0x00004700, 0x800 }, \
{ 0x0000ff00, 0x800 }, \
{ 0x000fff00, 0x800 }, \
{ 0x0000ffff, 0x800 }, \
{ 0xffffffff, 0x800 }, \
{ 0x00000000, 0x3000 }, \
{ 0x00000000, 0xc000 }, \
{ 0x00000000, 0x30000 }, \
{ 0x00000000, 0x3f7f8 }, \
{ 0xffffffff, 0x3fff8 }, \
{ 0xffffffff, 0x3ffff }}
#define IREG_POSSIBLE_P(OUTER) \
((OUTER) == POST_INC || (OUTER) == PRE_INC \
|| (OUTER) == POST_DEC || (OUTER) == PRE_DEC \
|| (OUTER) == MEM || (OUTER) == ADDRESS)
#define MODE_CODE_BASE_REG_CLASS(MODE, OUTER, INDEX) \
((MODE) == HImode && IREG_POSSIBLE_P (OUTER) ? IPREGS : PREGS)
#define INDEX_REG_CLASS PREGS
#define REGNO_OK_FOR_BASE_STRICT_P(X, MODE, OUTER, INDEX) \
(P_REGNO_P (X) || (X) == REG_ARGP \
|| (IREG_POSSIBLE_P (OUTER) && (MODE) == HImode \
&& I_REGNO_P (X)))
#define REGNO_OK_FOR_BASE_NONSTRICT_P(X, MODE, OUTER, INDEX) \
((X) >= FIRST_PSEUDO_REGISTER \
|| REGNO_OK_FOR_BASE_STRICT_P (X, MODE, OUTER, INDEX))
#ifdef REG_OK_STRICT
#define REGNO_MODE_CODE_OK_FOR_BASE_P(X, MODE, OUTER, INDEX) \
REGNO_OK_FOR_BASE_STRICT_P (X, MODE, OUTER, INDEX)
#else
#define REGNO_MODE_CODE_OK_FOR_BASE_P(X, MODE, OUTER, INDEX) \
REGNO_OK_FOR_BASE_NONSTRICT_P (X, MODE, OUTER, INDEX)
#endif
#define REGNO_OK_FOR_INDEX_P(X) 0
#define REG_CLASS_FROM_LETTER(LETTER) \
((LETTER) == 'a' ? PREGS : \
(LETTER) == 'Z' ? FDPIC_REGS : \
(LETTER) == 'Y' ? FDPIC_FPTR_REGS : \
(LETTER) == 'd' ? DREGS : \
(LETTER) == 'z' ? PREGS_CLOBBERED : \
(LETTER) == 'D' ? EVEN_DREGS : \
(LETTER) == 'W' ? ODD_DREGS : \
(LETTER) == 'e' ? AREGS : \
(LETTER) == 'A' ? EVEN_AREGS : \
(LETTER) == 'B' ? ODD_AREGS : \
(LETTER) == 'b' ? IREGS : \
(LETTER) == 'v' ? BREGS : \
(LETTER) == 'f' ? MREGS : \
(LETTER) == 'c' ? CIRCREGS : \
(LETTER) == 'C' ? CCREGS : \
(LETTER) == 't' ? LT_REGS : \
(LETTER) == 'k' ? LC_REGS : \
(LETTER) == 'u' ? LB_REGS : \
(LETTER) == 'x' ? MOST_REGS : \
(LETTER) == 'y' ? PROLOGUE_REGS : \
(LETTER) == 'w' ? NON_A_CC_REGS : \
NO_REGS)
#define REGNO_REG_CLASS(REGNO) \
((REGNO) < REG_P0 ? DREGS \
: (REGNO) < REG_I0 ? PREGS \
: (REGNO) == REG_ARGP ? PREGS \
: (REGNO) >= REG_I0 && (REGNO) <= REG_I3 ? IREGS \
: (REGNO) >= REG_L0 && (REGNO) <= REG_L3 ? LREGS \
: (REGNO) >= REG_B0 && (REGNO) <= REG_B3 ? BREGS \
: (REGNO) >= REG_M0 && (REGNO) <= REG_M3 ? MREGS \
: (REGNO) == REG_A0 || (REGNO) == REG_A1 ? AREGS \
: (REGNO) == REG_LT0 || (REGNO) == REG_LT1 ? LT_REGS \
: (REGNO) == REG_LC0 || (REGNO) == REG_LC1 ? LC_REGS \
: (REGNO) == REG_LB0 || (REGNO) == REG_LB1 ? LB_REGS \
: (REGNO) == REG_CC ? CCREGS \
: (REGNO) >= REG_RETS ? PROLOGUE_REGS \
: NO_REGS)
#define SMALL_REGISTER_CLASSES 1
#define CLASS_LIKELY_SPILLED_P(CLASS) \
((CLASS) == PREGS_CLOBBERED \
|| (CLASS) == PROLOGUE_REGS \
|| (CLASS) == CCREGS)
#define HARD_REGNO_MODE_OK(REGNO, MODE) hard_regno_mode_ok((REGNO), (MODE))
#define CLASS_MAX_NREGS(CLASS, MODE) \
((MODE) == V2PDImode && (CLASS) == AREGS ? 2 \
: ((GET_MODE_SIZE (MODE) + UNITS_PER_WORD - 1) / UNITS_PER_WORD))
#define HARD_REGNO_NREGS(REGNO, MODE) \
((MODE) == PDImode && ((REGNO) == REG_A0 || (REGNO) == REG_A1) ? 1 \
: (MODE) == V2PDImode && ((REGNO) == REG_A0 || (REGNO) == REG_A1) ? 2 \
: CLASS_MAX_NREGS (GENERAL_REGS, MODE))
#define HARD_REGNO_RENAME_OK(FROM, TO) bfin_hard_regno_rename_ok (FROM, TO)
#define MODES_TIEABLE_P(MODE1, MODE2) ((MODE1) == (MODE2))
#define PREFERRED_RELOAD_CLASS(X, CLASS) (CLASS)
typedef enum {
SUBROUTINE, INTERRUPT_HANDLER, EXCPT_HANDLER, NMI_HANDLER
} e_funkind;
#define FUNCTION_ARG_REGISTERS { REG_R0, REG_R1, REG_R2, -1 }
#define CALL_NORMAL 0x00000000
#define CALL_LONG 0x00000001
#define CALL_SHORT 0x00000002
typedef struct {
int words;
int nregs;
int *arg_regs;
int call_cookie;
} CUMULATIVE_ARGS;
#define FUNCTION_ARG(CUM, MODE, TYPE, NAMED) \
(function_arg (&CUM, MODE, TYPE, NAMED))
#define FUNCTION_ARG_REGNO_P(REGNO) function_arg_regno_p (REGNO)
#define INIT_CUMULATIVE_ARGS(CUM,FNTYPE,LIBNAME,INDIRECT, N_NAMED_ARGS) \
(init_cumulative_args (&CUM, FNTYPE, LIBNAME))
#define FUNCTION_ARG_ADVANCE(CUM, MODE, TYPE, NAMED) \
(function_arg_advance (&CUM, MODE, TYPE, NAMED))
#define RETURN_POPS_ARGS(FDECL, FUNTYPE, STKSIZE) 0
#define VALUE_REGNO(MODE) (REG_R0)
#define FUNCTION_VALUE(VALTYPE, FUNC) \
gen_rtx_REG (TYPE_MODE (VALTYPE), \
VALUE_REGNO(TYPE_MODE(VALTYPE)))
#define LIBCALL_VALUE(MODE) gen_rtx_REG (MODE, VALUE_REGNO(MODE))
#define FUNCTION_VALUE_REGNO_P(N) ((N) == REG_R0)
#define DEFAULT_PCC_STRUCT_RETURN 0
#define RETURN_IN_MEMORY(TYPE) bfin_return_in_memory(TYPE)
#define INCOMING_RETURN_ADDR_RTX gen_rtx_REG (Pmode, REG_RETS)
#define RETURN_ADDR_RTX(COUNT, FRAME) bfin_return_addr_rtx (COUNT)
#define DWARF_FRAME_RETURN_COLUMN DWARF_FRAME_REGNUM (REG_RETS)
#define INCOMING_FRAME_SP_OFFSET 0
#define EH_RETURN_DATA_REGNO(N) ((N) < 2 ? (N) : INVALID_REGNUM)
#define EH_RETURN_STACKADJ_RTX gen_rtx_REG (Pmode, REG_P2)
#define EH_RETURN_HANDLER_RTX \
gen_rtx_MEM (Pmode, plus_constant (frame_pointer_rtx, UNITS_PER_WORD))
#define CONSTANT_ADDRESS_P(X) (CONSTANT_P (X))
#define LEGITIMATE_CONSTANT_P(x) 1
#define MAX_REGS_PER_ADDRESS 1
#define LEGITIMATE_MODE_FOR_AUTOINC_P(MODE) \
(GET_MODE_SIZE (MODE) <= 4 || (MODE) == PDImode)
#ifdef REG_OK_STRICT
#define GO_IF_LEGITIMATE_ADDRESS(MODE, X, WIN) \
do { \
if (bfin_legitimate_address_p (MODE, X, 1)) \
goto WIN; \
} while (0);
#else
#define GO_IF_LEGITIMATE_ADDRESS(MODE, X, WIN) \
do { \
if (bfin_legitimate_address_p (MODE, X, 0)) \
goto WIN; \
} while (0);
#endif
#define LEGITIMIZE_ADDRESS(X,OLDX,MODE,WIN) \
do { \
rtx _q = legitimize_address(X, OLDX, MODE); \
if (_q) { X = _q; goto WIN; } \
} while (0)
#define HAVE_POST_INCREMENT 1
#define HAVE_POST_DECREMENT 1
#define HAVE_PRE_DECREMENT 1
#define LEGITIMATE_PIC_OPERAND_P(X) ! SYMBOLIC_CONST (X)
#define SYMBOLIC_CONST(X) \
(GET_CODE (X) == SYMBOL_REF \
|| GET_CODE (X) == LABEL_REF \
|| (GET_CODE (X) == CONST && symbolic_reference_mentioned_p (X)))
#define GO_IF_MODE_DEPENDENT_ADDRESS(ADDR,LABEL) \
do { \
if (GET_CODE (ADDR) == POST_INC \
|| GET_CODE (ADDR) == POST_DEC \
|| GET_CODE (ADDR) == PRE_DEC) \
goto LABEL; \
} while (0)
#define NOTICE_UPDATE_CC(EXPR, INSN) 0
#define TRULY_NOOP_TRUNCATION(OUTPREC, INPREC) 1
#define MOVE_MAX UNITS_PER_WORD
#define SLOW_BYTE_ACCESS 0
#define SLOW_SHORT_ACCESS 0
#define BITS_BIG_ENDIAN 0
#define BYTES_BIG_ENDIAN 0
#define WORDS_BIG_ENDIAN 0
#define BITS_PER_UNIT 8
#define BITS_PER_WORD 32
#define UNITS_PER_WORD 4
#define POINTER_SIZE 32
#define POINTER_BOUNDARY 32
#define PARM_BOUNDARY 32
#define STACK_BOUNDARY 32
#define FUNCTION_BOUNDARY 32
#define EMPTY_FIELD_BOUNDARY BITS_PER_WORD
#define BIGGEST_ALIGNMENT 32
#define STRICT_ALIGNMENT 1
#define UNITS_PER_FLOAT ((FLOAT_TYPE_SIZE + BITS_PER_UNIT - 1) / \
BITS_PER_UNIT)
#define UNITS_PER_DOUBLE ((DOUBLE_TYPE_SIZE + BITS_PER_UNIT - 1) / \
BITS_PER_UNIT)
#define SIZE_TYPE "long unsigned int"
#define DEFAULT_SIGNED_CHAR 1
#define FLOAT_TYPE_SIZE BITS_PER_WORD
#define SHORT_TYPE_SIZE 16
#define CHAR_TYPE_SIZE 8
#define INT_TYPE_SIZE 32
#define LONG_TYPE_SIZE 32
#define LONG_LONG_TYPE_SIZE 64
#define DOUBLE_TYPE_SIZE 64
#define LONG_DOUBLE_TYPE_SIZE 64
#define BFIN_PROMOTE_MODE_P(MODE) \
(!TARGET_DSP && GET_MODE_CLASS (MODE) == MODE_INT \
&& GET_MODE_SIZE (MODE) < UNITS_PER_WORD)
#define PROMOTE_MODE(MODE, UNSIGNEDP, TYPE) \
if (BFIN_PROMOTE_MODE_P(MODE)) \
{ \
if (MODE == QImode) \
UNSIGNEDP = 1; \
else if (MODE == HImode) \
UNSIGNEDP = 0; \
(MODE) = SImode; \
}
#define NO_FUNCTION_CSE 1
#define REGISTER_MOVE_COST(MODE, CLASS1, CLASS2) \
bfin_register_move_cost ((MODE), (CLASS1), (CLASS2))
#define MEMORY_MOVE_COST(MODE, CLASS, IN) \
bfin_memory_move_cost ((MODE), (CLASS), (IN))
#define CASE_VECTOR_MODE SImode
#define JUMP_TABLES_IN_TEXT_SECTION flag_pic
#define CONST_18UBIT_IMM_P(VALUE) ((VALUE) >= 0 && (VALUE) <= 262140)
#define CONST_16BIT_IMM_P(VALUE) ((VALUE) >= -32768 && (VALUE) <= 32767)
#define CONST_16UBIT_IMM_P(VALUE) ((VALUE) >= 0 && (VALUE) <= 65535)
#define CONST_7BIT_IMM_P(VALUE) ((VALUE) >= -64 && (VALUE) <= 63)
#define CONST_7NBIT_IMM_P(VALUE) ((VALUE) >= -64 && (VALUE) <= 0)
#define CONST_5UBIT_IMM_P(VALUE) ((VALUE) >= 0 && (VALUE) <= 31)
#define CONST_4BIT_IMM_P(VALUE) ((VALUE) >= -8 && (VALUE) <= 7)
#define CONST_4UBIT_IMM_P(VALUE) ((VALUE) >= 0 && (VALUE) <= 15)
#define CONST_3BIT_IMM_P(VALUE) ((VALUE) >= -4 && (VALUE) <= 3)
#define CONST_3UBIT_IMM_P(VALUE) ((VALUE) >= 0 && (VALUE) <= 7)
#define CONSTRAINT_LEN(C, STR) \
((C) == 'P' || (C) == 'M' || (C) == 'N' ? 2 \
: (C) == 'K' ? 3 \
: DEFAULT_CONSTRAINT_LEN ((C), (STR)))
#define CONST_OK_FOR_P(VALUE, STR) \
((STR)[1] == '0' ? (VALUE) == 0 \
: (STR)[1] == '1' ? (VALUE) == 1 \
: (STR)[1] == '2' ? (VALUE) == 2 \
: (STR)[1] == '3' ? (VALUE) == 3 \
: (STR)[1] == '4' ? (VALUE) == 4 \
: 0)
#define CONST_OK_FOR_K(VALUE, STR) \
((STR)[1] == 'u' \
? ((STR)[2] == '3' ? CONST_3UBIT_IMM_P (VALUE) \
: (STR)[2] == '4' ? CONST_4UBIT_IMM_P (VALUE) \
: (STR)[2] == '5' ? CONST_5UBIT_IMM_P (VALUE) \
: (STR)[2] == 'h' ? CONST_16UBIT_IMM_P (VALUE) \
: 0) \
: (STR)[1] == 's' \
? ((STR)[2] == '3' ? CONST_3BIT_IMM_P (VALUE) \
: (STR)[2] == '4' ? CONST_4BIT_IMM_P (VALUE) \
: (STR)[2] == '7' ? CONST_7BIT_IMM_P (VALUE) \
: (STR)[2] == 'h' ? CONST_16BIT_IMM_P (VALUE) \
: 0) \
: (STR)[1] == 'n' \
? ((STR)[2] == '7' ? CONST_7NBIT_IMM_P (VALUE) \
: 0) \
: (STR)[1] == 'N' \
? ((STR)[2] == '7' ? CONST_7BIT_IMM_P (-(VALUE)) \
: 0) \
: 0)
#define CONST_OK_FOR_M(VALUE, STR) \
((STR)[1] == '1' ? (VALUE) == 255 \
: (STR)[1] == '2' ? (VALUE) == 65535 \
: 0)
#define CONST_OK_FOR_CONSTRAINT_P(VALUE, C, STR) \
((C) == 'J' ? (log2constp (VALUE)) \
: (C) == 'K' ? CONST_OK_FOR_K (VALUE, STR) \
: (C) == 'L' ? log2constp (~(VALUE)) \
: (C) == 'M' ? CONST_OK_FOR_M (VALUE, STR) \
: (C) == 'P' ? CONST_OK_FOR_P (VALUE, STR) \
: 0)
#define CONST_DOUBLE_OK_FOR_LETTER_P(VALUE, C) \
((C) == 'H' ? 1 : 0)
#define EXTRA_CONSTRAINT(VALUE, D) \
((D) == 'Q' ? GET_CODE (VALUE) == SYMBOL_REF : 0)
#define TARGET_ASM_NAMED_SECTION default_elf_asm_named_section
#define PRINT_OPERAND(FILE, RTX, CODE) print_operand (FILE, RTX, CODE)
#define PRINT_OPERAND_ADDRESS(FILE, RTX) print_address_operand (FILE, RTX)
typedef enum sections {
CODE_DIR,
DATA_DIR,
LAST_SECT_NM
} SECT_ENUM_T;
typedef enum directives {
LONG_CONST_DIR,
SHORT_CONST_DIR,
BYTE_CONST_DIR,
SPACE_DIR,
INIT_DIR,
LAST_DIR_NM
} DIR_ENUM_T;
#define TEXT_SECTION_ASM_OP ".text;"
#define DATA_SECTION_ASM_OP ".data;"
#define ASM_APP_ON ""
#define ASM_APP_OFF ""
#define ASM_GLOBALIZE_LABEL1(FILE, NAME) \
do { fputs (".global ", FILE); \
assemble_name (FILE, NAME); \
fputc (';',FILE); \
fputc ('\n',FILE); \
} while (0)
#define ASM_DECLARE_FUNCTION_NAME(FILE,NAME,DECL) \
do { \
fputs (".type ", FILE); \
assemble_name (FILE, NAME); \
fputs (", STT_FUNC", FILE); \
fputc (';',FILE); \
fputc ('\n',FILE); \
ASM_OUTPUT_LABEL(FILE, NAME); \
} while (0)
#define ASM_OUTPUT_LABEL(FILE, NAME) \
do { assemble_name (FILE, NAME); \
fputs (":\n",FILE); \
} while (0)
#define ASM_OUTPUT_LABELREF(FILE,NAME) \
do { fprintf (FILE, "_%s", NAME); \
} while (0)
#define ASM_OUTPUT_ADDR_VEC_ELT(FILE, VALUE) \
do { char __buf[256]; \
fprintf (FILE, "\t.dd\t"); \
ASM_GENERATE_INTERNAL_LABEL (__buf, "L", VALUE); \
assemble_name (FILE, __buf); \
fputc (';', FILE); \
fputc ('\n', FILE); \
} while (0)
#define ASM_OUTPUT_ADDR_DIFF_ELT(FILE, BODY, VALUE, REL) \
MY_ASM_OUTPUT_ADDR_DIFF_ELT(FILE, VALUE, REL)
#define MY_ASM_OUTPUT_ADDR_DIFF_ELT(FILE, VALUE, REL) \
do { \
char __buf[256]; \
fprintf (FILE, "\t.dd\t"); \
ASM_GENERATE_INTERNAL_LABEL (__buf, "L", VALUE); \
assemble_name (FILE, __buf); \
fputs (" - ", FILE); \
ASM_GENERATE_INTERNAL_LABEL (__buf, "L", REL); \
assemble_name (FILE, __buf); \
fputc (';', FILE); \
fputc ('\n', FILE); \
} while (0)
#define ASM_OUTPUT_ALIGN(FILE,LOG) \
do { \
if ((LOG) != 0) \
fprintf (FILE, "\t.align %d\n", 1 << (LOG)); \
} while (0)
#define ASM_OUTPUT_SKIP(FILE,SIZE) \
do { \
asm_output_skip (FILE, SIZE); \
} while (0)
#define ASM_OUTPUT_LOCAL(FILE, NAME, SIZE, ROUNDED) \
do { \
switch_to_section (data_section); \
if ((SIZE) >= (unsigned int) 4 ) ASM_OUTPUT_ALIGN(FILE,2); \
ASM_OUTPUT_SIZE_DIRECTIVE (FILE, NAME, SIZE); \
ASM_OUTPUT_LABEL (FILE, NAME); \
fprintf (FILE, "%s %ld;\n", ASM_SPACE, \
(ROUNDED) > (unsigned int) 1 ? (ROUNDED) : 1); \
} while (0)
#define ASM_OUTPUT_COMMON(FILE, NAME, SIZE, ROUNDED) \
do { \
ASM_GLOBALIZE_LABEL1(FILE,NAME); \
ASM_OUTPUT_LOCAL (FILE, NAME, SIZE, ROUNDED); } while(0)
#define ASM_COMMENT_START "//"
#define FUNCTION_PROFILER(FILE, LABELNO) \
do { \
fprintf (FILE, "\tCALL __mcount;\n"); \
} while(0)
#undef NO_PROFILE_COUNTERS
#define NO_PROFILE_COUNTERS 1
#define ASM_OUTPUT_REG_PUSH(FILE, REGNO) fprintf (FILE, "[SP--] = %s;\n", reg_names[REGNO])
#define ASM_OUTPUT_REG_POP(FILE, REGNO) fprintf (FILE, "%s = [SP++];\n", reg_names[REGNO])
extern struct rtx_def *bfin_compare_op0, *bfin_compare_op1;
extern struct rtx_def *bfin_cc_rtx, *bfin_rets_rtx;
#define SET_ASM_OP ".set "
#define DBX_REGISTER_NUMBER(REGNO) (REGNO)
#define SIZE_ASM_OP "\t.size\t"
#endif