This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.
Index Nav: | [Date Index] [Subject Index] [Author Index] [Thread Index] | |
---|---|---|
Message Nav: | [Date Prev] [Date Next] | [Thread Prev] [Thread Next] |
Other format: | [Raw text] |
This patch adds support for a new attribute "page0" that can be put on global variables to indicate a variable is in page0 and direct addressing mode can be used. This enables the use of bset/bclr on these variables. The patch also fixes an integration pb introduced by one of my previous patch (gen_rtx was used instead of gen_rtx_REG).
* config/m68hc11/m68hc11.c (m68hc11_handle_page0_attribute): New. (m68hc11_attribute_table): New attribute "page0" to mark a global variable as being allocated from within page0 section. (m68hc11_encode_label): New function. (m68hc11_strip_name_encoding): New function. (m68hc11_page0_symbol_p): New function. (m68hc11_indirect_p): Accept global variables marked in page0. (m68hc11_encode_section_info): Lookup "page0" attribute.
* config/m68hc11/m68hc11.h (EXTRA_CONSTRAINT): 'R' constraint also represents access to page0 variables.
* config/m68hc11/m68hc11.md ("*logicalsi3_zexthi"): Use gen_rtx_REG. ("*logicalsi3_silshl16_zext"): Likewise. ("*ashldi3_const32"): Likewise. (peephole2 ashift): Likewise.
Index: config/m68hc11/m68hc11-protos.h =================================================================== RCS file: /cvs/gcc/gcc/gcc/config/m68hc11/m68hc11-protos.h,v retrieving revision 1.30 diff -u -p -r1.30 m68hc11-protos.h --- config/m68hc11/m68hc11-protos.h 27 Oct 2003 12:26:19 -0000 1.30 +++ config/m68hc11/m68hc11-protos.h 28 Mar 2004 11:51:28 -0000 @@ -132,6 +132,7 @@ extern void m68hc11_function_epilogue (F extern int m68hc11_is_far_symbol (rtx); extern int m68hc11_is_trap_symbol (rtx); +extern int m68hc11_page0_symbol_p (rtx x); #endif /* TREE_CODE */ Index: config/m68hc11/m68hc11.c =================================================================== RCS file: /cvs/gcc/gcc/gcc/config/m68hc11/m68hc11.c,v retrieving revision 1.101 diff -u -p -r1.101 m68hc11.c --- config/m68hc11/m68hc11.c 7 Mar 2004 21:01:26 -0000 1.101 +++ config/m68hc11/m68hc11.c 28 Mar 2004 11:51:30 -0000 @@ -1,5 +1,6 @@ /* Subroutines for code generation on Motorola 68HC11 and 68HC12. - Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004 Free Software Foundation, Inc. + Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004 + Free Software Foundation, Inc. Contributed by Stephane Carrez (stcarrez@nerim.fr) This file is part of GCC. @@ -83,6 +84,7 @@ static void m68hc11_asm_out_constructor static void m68hc11_asm_out_destructor (rtx, int); static void m68hc11_file_start (void); static void m68hc11_encode_section_info (tree, rtx, int); +static const char *m68hc11_strip_name_encoding (const char* str); static unsigned int m68hc11_section_type_flags (tree, const char*, int); static int autoinc_mode (rtx); static int m68hc11_make_autoinc_notes (rtx *, void *); @@ -271,6 +273,9 @@ static int nb_soft_regs; #undef TARGET_RETURN_IN_MEMORY #define TARGET_RETURN_IN_MEMORY m68hc11_return_in_memory +#undef TARGET_STRIP_NAME_ENCODING +#define TARGET_STRIP_NAME_ENCODING m68hc11_strip_name_encoding + struct gcc_target targetm = TARGET_INITIALIZER; int @@ -1047,6 +1052,9 @@ m68hc11_indirect_p (rtx operand, enum ma rtx op = XEXP (operand, 0); int addr_mode; + if (m68hc11_page0_symbol_p (op)) + return 1; + if (symbolic_memory_operand (op, mode)) return TARGET_M6812; @@ -1263,6 +1271,28 @@ m68hc11_initialize_trampoline (rtx tramp /* Declaration of types. */ +/* Handle an "tiny_data" attribute; arguments as in + struct attribute_spec.handler. */ +static tree +m68hc11_handle_page0_attribute (tree *node, tree name, + tree args ATTRIBUTE_UNUSED, + int flags ATTRIBUTE_UNUSED, bool *no_add_attrs) +{ + tree decl = *node; + + if (TREE_STATIC (decl) || DECL_EXTERNAL (decl)) + { + DECL_SECTION_NAME (decl) = build_string (6, ".page0"); + } + else + { + warning ("`%s' attribute ignored", IDENTIFIER_POINTER (name)); + *no_add_attrs = true; + } + + return NULL_TREE; +} + const struct attribute_spec m68hc11_attribute_table[] = { /* { name, min_len, max_len, decl_req, type_req, fn_type_req, handler } */ @@ -1270,6 +1300,7 @@ const struct attribute_spec m68hc11_attr { "trap", 0, 0, false, true, true, m68hc11_handle_fntype_attribute }, { "far", 0, 0, false, true, true, m68hc11_handle_fntype_attribute }, { "near", 0, 0, false, true, true, m68hc11_handle_fntype_attribute }, + { "page0", 0, 0, false, false, false, m68hc11_handle_page0_attribute }, { NULL, 0, 0, false, false, false, NULL } }; @@ -1298,6 +1329,51 @@ m68hc11_handle_fntype_attribute (tree *n return NULL_TREE; } +/* Undo the effects of the above. */ + +static const char * +m68hc11_strip_name_encoding (const char *str) +{ + return str + (*str == '*' || *str == '@' || *str == '&'); +} + +static void +m68hc11_encode_label (tree decl) +{ + const char *str = XSTR (XEXP (DECL_RTL (decl), 0), 0); + int len = strlen (str); + char *newstr = alloca (len + 2); + + newstr[0] = '@'; + strcpy (&newstr[1], str); + + XSTR (XEXP (DECL_RTL (decl), 0), 0) = ggc_alloc_string (newstr, len + 1); +} + +/* Return 1 if this is a symbol in page0 */ +int +m68hc11_page0_symbol_p (rtx x) +{ + switch (GET_CODE (x)) + { + case SYMBOL_REF: + return XSTR (x, 0) != 0 && XSTR (x, 0)[0] == '@'; + + case CONST: + return m68hc11_page0_symbol_p (XEXP (x, 0)); + + case PLUS: + if (!m68hc11_page0_symbol_p (XEXP (x, 0))) + return 0; + + return GET_CODE (XEXP (x, 1)) == CONST_INT + && INTVAL (XEXP (x, 1)) < 256 + && INTVAL (XEXP (x, 1)) >= 0; + + default: + return 0; + } +} /* We want to recognize trap handlers so that we handle calls to traps in a special manner (by issuing the trap). This information is stored @@ -1310,6 +1386,13 @@ m68hc11_encode_section_info (tree decl, int trap_handler; int is_far = 0; + if (TREE_CODE (decl) == VAR_DECL) + { + if (lookup_attribute ("page0", DECL_ATTRIBUTES (decl)) != 0) + m68hc11_encode_label (decl); + return; + } + if (TREE_CODE (decl) != FUNCTION_DECL) return; Index: config/m68hc11/m68hc11.h =================================================================== RCS file: /cvs/gcc/gcc/gcc/config/m68hc11/m68hc11.h,v retrieving revision 1.85 diff -u -p -r1.85 m68hc11.h --- config/m68hc11/m68hc11.h 11 Mar 2004 05:54:31 -0000 1.85 +++ config/m68hc11/m68hc11.h 28 Mar 2004 11:51:31 -0000 @@ -879,7 +879,9 @@ extern enum reg_class m68hc11_tmp_regs_c && VALUE == CONST0_RTX (GET_MODE (VALUE))) : 0) /* 'U' represents certain kind of memory indexed operand for 68HC12. - and any memory operand for 68HC11. */ + and any memory operand for 68HC11. + 'R' represents indexed addressing mode or access to page0 for 68HC11. + For 68HC12, it represents any memory operand. */ #define EXTRA_CONSTRAINT(OP, C) \ ((C) == 'U' ? m68hc11_small_indexed_indirect_p (OP, GET_MODE (OP)) \ : (C) == 'Q' ? m68hc11_symbolic_p (OP, GET_MODE (OP)) \ Index: config/m68hc11/m68hc11.md =================================================================== RCS file: /cvs/gcc/gcc/gcc/config/m68hc11/m68hc11.md,v retrieving revision 1.63 diff -u -p -r1.63 m68hc11.md --- config/m68hc11/m68hc11.md 11 Mar 2004 05:54:31 -0000 1.63 +++ config/m68hc11/m68hc11.md 28 Mar 2004 11:51:33 -0000 @@ -3688,8 +3688,8 @@ { operands[5] = operands[1]; /* Make all the (set (REG:x) (REG:y)) a nop set. */ - operands[4] = gen_rtx (REG, HImode, HARD_D_REGNUM); - operands[6] = gen_rtx (REG, HImode, HARD_X_REGNUM); + operands[4] = gen_rtx_REG (HImode, HARD_D_REGNUM); + operands[6] = gen_rtx_REG (HImode, HARD_X_REGNUM); } else { @@ -3893,12 +3893,12 @@ { FAIL; } - emit_move_insn (gen_rtx (REG, HImode, HARD_X_REGNUM), operands[2]); - emit_insn (gen_swap_areg (gen_rtx (REG, HImode, HARD_D_REGNUM), - gen_rtx (REG, HImode, HARD_X_REGNUM))); + emit_move_insn (gen_rtx_REG (HImode, HARD_X_REGNUM), operands[2]); + emit_insn (gen_swap_areg (gen_rtx_REG (HImode, HARD_D_REGNUM), + gen_rtx_REG (HImode, HARD_X_REGNUM))); } - operands[4] = gen_rtx (REG, HImode, HARD_D_REGNUM); - operands[6] = gen_rtx (REG, HImode, HARD_X_REGNUM); + operands[4] = gen_rtx_REG (HImode, HARD_D_REGNUM); + operands[6] = gen_rtx_REG (HImode, HARD_X_REGNUM); operands[5] = operands[2]; operands[7] = operands[1]; @@ -4421,7 +4421,7 @@ /* Adjust first operand if it uses SP so that we take into account the above push. Can occur only for 68HC12. */ - if (reg_mentioned_p (gen_rtx (REG, HImode, HARD_SP_REGNUM), + if (reg_mentioned_p (gen_rtx_REG (HImode, HARD_SP_REGNUM), operands[1])) operands[1] = adjust_address (operands[1], GET_MODE (operands[0]), 4); @@ -4516,13 +4516,13 @@ "operands[3] = m68hc11_gen_highpart (HImode, operands[2]); if (X_REG_P (operands[2])) { - operands[4] = gen_rtx (REG, HImode, HARD_X_REGNUM); - operands[5] = gen_rtx (REG, HImode, HARD_D_REGNUM); + operands[4] = gen_rtx_REG (HImode, HARD_X_REGNUM); + operands[5] = gen_rtx_REG (HImode, HARD_D_REGNUM); } else { operands[4] = m68hc11_gen_lowpart (HImode, operands[2]); - operands[5] = gen_rtx (REG, HImode, HARD_X_REGNUM); + operands[5] = gen_rtx_REG (HImode, HARD_X_REGNUM); } ") @@ -7175,8 +7175,8 @@ (set (match_operand:HI 3 "nonimmediate_operand" "") (reg:HI D_REGNUM)) (set (match_operand:HI 4 "nonimmediate_operand" "") (reg:HI X_REGNUM))] "!X_REG_P (operands[1]) - && peep2_reg_dead_p (2, gen_rtx (REG, HImode, D_REGNUM)) - && peep2_reg_dead_p (3, gen_rtx (REG, HImode, X_REGNUM))" + && peep2_reg_dead_p (2, gen_rtx_REG (HImode, D_REGNUM)) + && peep2_reg_dead_p (3, gen_rtx_REG (HImode, X_REGNUM))" [(set (reg:HI D_REGNUM) (match_dup 5)) (set (reg:HI D_REGNUM) (ashift:HI (reg:HI D_REGNUM) (const_int 1))) (set (match_dup 3) (reg:HI D_REGNUM))
Attachment:
pgp00000.pgp
Description: PGP signature
Index Nav: | [Date Index] [Subject Index] [Author Index] [Thread Index] | |
---|---|---|
Message Nav: | [Date Prev] [Date Next] | [Thread Prev] [Thread Next] |