Commit 8beb65e3 by Michael Meissner Committed by Michael Meissner

power7 patch #2: add bswap64; add preliminary VSX register support; add more -mdebug=* support

Co-Authored-By: Pat Haugen <pthaugen@us.ibm.com>
Co-Authored-By: Revital Eres <eres@il.ibm.com>

From-SVN: r148955
parent c8aca64f
2009-06-25 Michael Meissner <meissner@linux.vnet.ibm.com>
Pat Haugen <pthaugen@us.ibm.com>
Revital Eres <ERES@il.ibm.com>
* config/rs6000/rs6000-protos.h (rs6000_secondary_reload_class):
Change some of the functions called by macros to being called
through a pointer, so debug functions can be inserted if
-mdebug=addr or -mdebug=cost.
(rs6000_preferred_reload_class_ptr): Ditto.
(rs6000_secondary_reload_class_ptr): Ditto.
(rs6000_secondary_memory_needed_ptr): Ditto.
(rs6000_cannot_change_mode_class_ptr): Ditto.
(rs6000_secondary_reload_inner): Ditto.
(rs6000_legitimize_reload_address): Ditto.
(rs6000_legitimize_reload_address_ptr): Ditto.
(rs6000_mode_dependent_address): Ditto.
(rs6000_mode_dependent_address_ptr): Ditto.
* config/rs6000/rs6000.c (reg_offset_addressing_ok_p): New
function to return true if the mode allows reg + integer
addresses.
(virtual_stack_registers_memory_p): New function to return true if
the address refers to a virtual stack register.
(rs6000_legitimate_offset_address_p): Move code to say whether a
mode supports reg+int addressing to reg_offset_addressing_ok_p and
call it.
(rs6000_legitimate_address_p): Add checks for modes that only can
do reg+reg addressing. Start adding VSX support.
(rs6000_legitimize_reload_address): Ditto.
(rs6000_legitimize_address): Ditto.
(rs6000_debug_legitimate_address_p): New debug functions for
-mdebug=addr and -mdebug=cost.
(rs6000_debug_rtx_costs): Ditto.
(rs6000_debug_address_costs): Ditto.
(rs6000_debug_adjust_cost): Ditto.
(rs6000_debug_legitimize_address): Ditto.
(rs6000_legitimize_reload_address_ptr): Point to call normal
function or debug function. Make functions called via pointer
static.
(rs6000_mode_dependent_address_ptr): Ditto.
(rs6000_secondary_reload_class_ptr): Ditto.
(rs6000_hard_regno_mode_ok): Add preliminary VSX support.
(rs6000_emit_move): Add -mdebug=addr support. Change an abort
into a friendlier error.
(rs6000_init_builtins): Add initial VSX support.
(rs6000_adjust_cost): Fix some spacing issues.
* config/rs6000/rs6000.h (enum reg_class): Add VSX_REGS.
(REG_CLASS_NAMES): Ditto.
(REG_CLASS_CONTENTS): Ditto.
(PREFERRED_RELOAD_CLASS): Move from a macro to calling through a
pointer, to add -mdebug=addr support.
(CANNOT_CHANGE_MODE_CLASS): Ditto.
(SECONDARY_RELOAD_CLASS): Call through a pointer to add
-mdebug=addr support.
(LEGITIMIZE_RELOAD_ADDRESS): Ditto.
(GO_IF_MODE_DEPENDENT_ADDRESS): Ditto.
(enum rs6000_builtins): Add RS6000_BUILTIN_BSWAP_HI.
* config/rs6000/rs6000.md (bswaphi*): Add support for swapping
16-bit values.
(bswapsi*): Set attribute types for load/store. Add combiner
patterns to eliminate zero extend on 64-bit.
(bswapdi*): Add support for swapping 64-bit values. Use ldbrx and
stdbrx if the hardware supports those instructions.
2009-06-25 Ian Lance Taylor <iant@google.com>
* doc/invoke.texi (Option Summary): Mention -static-libstdc++.
......
......@@ -64,9 +64,18 @@ extern int insvdi_rshift_rlwimi_p (rtx, rtx, rtx);
extern int registers_ok_for_quad_peep (rtx, rtx);
extern int mems_ok_for_quad_peep (rtx, rtx);
extern bool gpr_or_gpr_p (rtx, rtx);
extern enum reg_class rs6000_secondary_reload_class (enum reg_class,
enum machine_mode, rtx);
extern enum reg_class (*rs6000_preferred_reload_class_ptr) (rtx,
enum reg_class);
extern enum reg_class (*rs6000_secondary_reload_class_ptr) (enum reg_class,
enum machine_mode,
rtx);
extern bool (*rs6000_secondary_memory_needed_ptr) (enum reg_class,
enum reg_class,
enum machine_mode);
extern bool (*rs6000_cannot_change_mode_class_ptr) (enum machine_mode,
enum machine_mode,
enum reg_class);
extern void rs6000_secondary_reload_inner (rtx, rtx, rtx, bool);
extern int paired_emit_vector_cond_expr (rtx, rtx, rtx,
rtx, rtx, rtx);
extern void paired_expand_vector_move (rtx operands[]);
......@@ -107,10 +116,10 @@ extern rtx create_TOC_reference (rtx);
extern void rs6000_split_multireg_move (rtx, rtx);
extern void rs6000_emit_move (rtx, rtx, enum machine_mode);
extern rtx rs6000_secondary_memory_needed_rtx (enum machine_mode);
extern rtx rs6000_legitimize_reload_address (rtx, enum machine_mode,
int, int, int, int *);
extern rtx (*rs6000_legitimize_reload_address_ptr) (rtx, enum machine_mode,
int, int, int, int *);
extern bool rs6000_legitimate_offset_address_p (enum machine_mode, rtx, int);
extern bool rs6000_mode_dependent_address (rtx);
extern bool (*rs6000_mode_dependent_address_ptr) (rtx);
extern rtx rs6000_find_base_term (rtx);
extern bool rs6000_offsettable_memref_p (rtx);
extern rtx rs6000_return_addr (int, rtx);
......
......@@ -1194,6 +1194,7 @@ enum reg_class
GENERAL_REGS,
FLOAT_REGS,
ALTIVEC_REGS,
VSX_REGS,
VRSAVE_REGS,
VSCR_REGS,
SPE_ACC_REGS,
......@@ -1224,6 +1225,7 @@ enum reg_class
"GENERAL_REGS", \
"FLOAT_REGS", \
"ALTIVEC_REGS", \
"VSX_REGS", \
"VRSAVE_REGS", \
"VSCR_REGS", \
"SPE_ACC_REGS", \
......@@ -1253,6 +1255,7 @@ enum reg_class
{ 0xffffffff, 0x00000000, 0x00000008, 0x00020000 }, /* GENERAL_REGS */ \
{ 0x00000000, 0xffffffff, 0x00000000, 0x00000000 }, /* FLOAT_REGS */ \
{ 0x00000000, 0x00000000, 0xffffe000, 0x00001fff }, /* ALTIVEC_REGS */ \
{ 0x00000000, 0xffffffff, 0xffffe000, 0x00001fff }, /* VSX_REGS */ \
{ 0x00000000, 0x00000000, 0x00000000, 0x00002000 }, /* VRSAVE_REGS */ \
{ 0x00000000, 0x00000000, 0x00000000, 0x00004000 }, /* VSCR_REGS */ \
{ 0x00000000, 0x00000000, 0x00000000, 0x00008000 }, /* SPE_ACC_REGS */ \
......@@ -1334,20 +1337,14 @@ extern enum reg_class rs6000_vector_reg_class[];
*/
#define PREFERRED_RELOAD_CLASS(X,CLASS) \
((CONSTANT_P (X) \
&& reg_classes_intersect_p ((CLASS), FLOAT_REGS)) \
? NO_REGS \
: (GET_MODE_CLASS (GET_MODE (X)) == MODE_INT \
&& (CLASS) == NON_SPECIAL_REGS) \
? GENERAL_REGS \
: (CLASS))
rs6000_preferred_reload_class_ptr (X, CLASS)
/* Return the register class of a scratch register needed to copy IN into
or out of a register in CLASS in MODE. If it can be done directly,
NO_REGS is returned. */
#define SECONDARY_RELOAD_CLASS(CLASS,MODE,IN) \
rs6000_secondary_reload_class (CLASS, MODE, IN)
rs6000_secondary_reload_class_ptr (CLASS, MODE, IN)
/* If we are copying between FP or AltiVec registers and anything
else, we need a memory location. The exception is when we are
......@@ -1355,18 +1352,7 @@ extern enum reg_class rs6000_vector_reg_class[];
are available.*/
#define SECONDARY_MEMORY_NEEDED(CLASS1,CLASS2,MODE) \
((CLASS1) != (CLASS2) && (((CLASS1) == FLOAT_REGS \
&& (!TARGET_MFPGPR || !TARGET_POWERPC64 \
|| ((MODE != DFmode) \
&& (MODE != DDmode) \
&& (MODE != DImode)))) \
|| ((CLASS2) == FLOAT_REGS \
&& (!TARGET_MFPGPR || !TARGET_POWERPC64 \
|| ((MODE != DFmode) \
&& (MODE != DDmode) \
&& (MODE != DImode)))) \
|| (CLASS1) == ALTIVEC_REGS \
|| (CLASS2) == ALTIVEC_REGS))
rs6000_secondary_memory_needed_ptr (CLASS1, CLASS2, MODE)
/* For cpus that cannot load/store SDmode values from the 64-bit
FP registers without using a full 64-bit load/store, we need
......@@ -1386,19 +1372,7 @@ extern enum reg_class rs6000_vector_reg_class[];
/* Return nonzero if for CLASS a mode change from FROM to TO is invalid. */
#define CANNOT_CHANGE_MODE_CLASS(FROM, TO, CLASS) \
(GET_MODE_SIZE (FROM) != GET_MODE_SIZE (TO) \
? ((GET_MODE_SIZE (FROM) < 8 || GET_MODE_SIZE (TO) < 8 \
|| TARGET_IEEEQUAD) \
&& reg_classes_intersect_p (FLOAT_REGS, CLASS)) \
: (((TARGET_E500_DOUBLE \
&& ((((TO) == DFmode) + ((FROM) == DFmode)) == 1 \
|| (((TO) == TFmode) + ((FROM) == TFmode)) == 1 \
|| (((TO) == DDmode) + ((FROM) == DDmode)) == 1 \
|| (((TO) == TDmode) + ((FROM) == TDmode)) == 1 \
|| (((TO) == DImode) + ((FROM) == DImode)) == 1)) \
|| (TARGET_SPE \
&& (SPE_VECTOR_MODE (FROM) + SPE_VECTOR_MODE (TO)) == 1)) \
&& reg_classes_intersect_p (GENERAL_REGS, CLASS)))
rs6000_cannot_change_mode_class_ptr (FROM, TO, CLASS)
/* Stack layout; function entry, exit and calling. */
......@@ -1897,7 +1871,7 @@ typedef struct rs6000_args
#define LEGITIMIZE_RELOAD_ADDRESS(X,MODE,OPNUM,TYPE,IND_LEVELS,WIN) \
do { \
int win; \
(X) = rs6000_legitimize_reload_address ((X), (MODE), (OPNUM), \
(X) = rs6000_legitimize_reload_address_ptr ((X), (MODE), (OPNUM), \
(int)(TYPE), (IND_LEVELS), &win); \
if ( win ) \
goto WIN; \
......@@ -1908,7 +1882,7 @@ do { \
#define GO_IF_MODE_DEPENDENT_ADDRESS(ADDR,LABEL) \
do { \
if (rs6000_mode_dependent_address (ADDR)) \
if (rs6000_mode_dependent_address_ptr (ADDR)) \
goto LABEL; \
} while (0)
......@@ -3162,6 +3136,7 @@ enum rs6000_builtins
RS6000_BUILTIN_RECIP,
RS6000_BUILTIN_RECIPF,
RS6000_BUILTIN_RSQRTF,
RS6000_BUILTIN_BSWAP_HI,
RS6000_BUILTIN_COUNT
};
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment