static void
sparc_init_modes (void){
int i;for(i =0; i < NUM_MACHINE_MODES; i++){
machine_mode m =(machine_mode) i;
unsigned int size = GET_MODE_SIZE (m);
switch (GET_MODE_CLASS (m)){case MODE_INT:
case MODE_PARTIAL_INT:
case MODE_COMPLEX_INT:
if(size <4)
sparc_mode_class[i]=1<<(int) H_MODE;elseif(size ==4)
sparc_mode_class[i]=1<<(int) S_MODE;elseif(size ==8)
sparc_mode_class[i]=1<<(int) D_MODE;elseif(size ==16)
sparc_mode_class[i]=1<<(int) T_MODE;elseif(size ==32)
sparc_mode_class[i]=1<<(int) O_MODE;else
sparc_mode_class[i]=0;break;case MODE_VECTOR_INT:
if(size ==4)
sparc_mode_class[i]=1<<(int) SF_MODE;elseif(size ==8)
sparc_mode_class[i]=1<<(int) DF_MODE;else
sparc_mode_class[i]=0;break;case MODE_FLOAT:
case MODE_COMPLEX_FLOAT:
if(size ==4)
sparc_mode_class[i]=1<<(int) SF_MODE;elseif(size ==8)
sparc_mode_class[i]=1<<(int) DF_MODE;elseif(size ==16)
sparc_mode_class[i]=1<<(int) TF_MODE;elseif(size ==32)
sparc_mode_class[i]=1<<(int) OF_MODE;else
sparc_mode_class[i]=0;break;case MODE_CC:
if(m == CCFPmode || m == CCFPEmode)
sparc_mode_class[i]=1<<(int) CCFP_MODE;else
sparc_mode_class[i]=1<<(int) CC_MODE;break;
default:
sparc_mode_class[i]=0;break;}}if(TARGET_ARCH64)
hard_regno_mode_classes = hard_64bit_mode_classes;else
hard_regno_mode_classes = hard_32bit_mode_classes;
/* Initialize the array used by REGNO_REG_CLASS. */
for(i =0; i < FIRST_PSEUDO_REGISTER; i++){if(i <16&& TARGET_V8PLUS)
sparc_regno_reg_class[i]= I64_REGS;elseif(i <32|| i == FRAME_POINTER_REGNUM)
sparc_regno_reg_class[i]= GENERAL_REGS;elseif(i <64)
sparc_regno_reg_class[i]= FP_REGS;elseif(i <96)
sparc_regno_reg_class[i]= EXTRA_FP_REGS;elseif(i <100)
sparc_regno_reg_class[i]= FPCC_REGS;else
sparc_regno_reg_class[i]= NO_REGS;}}
/* Implement TARGET_HARD_REGNO_MODE_OK.
??? Because of the funny way we pass parameters we should allow certain
??? types of float/complex values to be in integer registers during
??? RTL generation. This only matters on arch32. */
static bool
sparc_hard_regno_mode_ok (unsigned int regno, machine_mode mode){return(hard_regno_mode_classes[regno]& sparc_mode_class[mode])!=0;}
// Dump full hard_regno_mode_classes (typically 0 to FIRST_PSEUDO_REGISTER)
fprintf(stderr, "Full hard_regno_mode_classes[]:\n");for(int i =0; i < FIRST_PSEUDO_REGISTER; i++){
fprintf(stderr, " [%2d] = 0x%x\n", i, hard_regno_mode_classes[i]);}
// Dump full sparc_mode_class[]
// extern const char * const mode_name[]; // If not already declared
fprintf(stderr, "Full sparc_mode_class[]:\n");for(int i =0; i < NUM_MACHINE_MODES; i++){
fprintf(stderr, " [%2d] (%s) = 0x%x\n", i, GET_MODE_NAME((machine_mode)i), sparc_mode_class[i]);}
fprintf(stderr, "============================\n");