sparc_init_modes ();
if ((profile_flag || profile_block_flag)
- && sparc_cmodel != CM_MEDLOW)
+ && sparc_cmodel != CM_32 && sparc_cmodel != CM_MEDLOW)
{
error ("profiling does not support code models other than medlow");
}
int blockno;
{
char LPBX[32];
+ int bbreg = TARGET_ARCH64 ? 4 : 2;
if (profile_block_flag == 2)
{
ASM_GENERATE_INTERNAL_LABEL (LPBX, "LPBX", 0);
fprintf (file, "\tsethi\t%%hi(%s__bb),%%g1\n", user_label_prefix);
- fprintf (file, "\tsethi\t%%hi(%d),%%g2\n", blockno);
+ fprintf (file, "\tsethi\t%%hi(%d),%%g%d\n", blockno, bbreg);
fprintf (file, "\tor\t%%g1,%%lo(%s__bb),%%g1\n", user_label_prefix);
- fprintf (file, "\tor\t%%g2,%%lo(%d),%%g2\n", blockno);
+ fprintf (file, "\tor\t%%g%d,%%lo(%d),%%g%d\n", bbreg, blockno, bbreg);
- fputs ("\tst\t%g2,[%g1]\n", file);
+ fprintf (file, "\tst\t%%g%d,[%%g1]\n", bbreg);
fputs ("\tsethi\t%hi(", file);
assemble_name (file, LPBX);
- fputs ("),%g2\n", file);
+ fprintf (file, "),%%g%d\n", bbreg);
fputs ("\tor\t%o2,%lo(", file);
assemble_name (file, LPBX);
- fputs ("),%g2\n", file);
+ fprintf (file, "),%%g%d\n", bbreg);
- fputs ("\tst\t%g2,[%g1+4]\n", file);
- fputs ("\tmov\t%o7,%g2\n", file);
+ fprintf (file, "\tst\t%%g%d,[%%g1+4]\n", bbreg);
+ fprintf (file, "\tmov\t%%o7,%%g%d\n", bbreg);
fprintf (file, "\tcall\t%s__bb_trace_func\n\t nop\n", user_label_prefix);
- fputs ("\tmov\t%g2,%o7\n", file);
+ fprintf (file, "\tmov\t%%g%d,%%o7\n", bbreg);
}
else if (profile_block_flag != 0)
{
fputs ("\tld\t[%g1+%lo(", file);
assemble_name (file, LPBX);
- fprintf (file, "+%d)],%%g2\n", blockno*4);
+ if (TARGET_ARCH64 && USE_AS_OFFSETABLE_LO10)
+ fprintf (file, ")+%d],%%g%d\n", blockno*4, bbreg);
+ else
+ fprintf (file, "+%d)],%%g%d\n", blockno*4, bbreg);
- fputs ("\tadd\t%g2,1,%g2\n", file);
+ fprintf (file, "\tadd\t%%g%d,1,%%g%d\n", bbreg, bbreg);
- fputs ("\tst\t%g2,[%g1+%lo(", file);
+ fprintf (file, "\tst\t%%g%d,[%%g1+%%lo(", bbreg);
assemble_name (file, LPBX);
- fprintf (file, "+%d)]\n", blockno*4);
+ if (TARGET_ARCH64 && USE_AS_OFFSETABLE_LO10)
+ fprintf (file, ")+%d]\n", blockno*4);
+ else
+ fprintf (file, "+%d)]\n", blockno*4);
}
}
#define TARGET_CM_MEDANY (sparc_cmodel == CM_MEDANY)
#define TARGET_CM_EMBMEDANY (sparc_cmodel == CM_EMBMEDANY)
-#define SPARC_DEFAULT_CMODEL CM_MEDLOW
+#define SPARC_DEFAULT_CMODEL CM_32
/* This is call-clobbered in the normal ABI, but is reserved in the
home grown (aka upward compatible) embedded ABI. */
} \
if (profile_block_flag) \
{ \
- /* %g1 and %g2 must be fixed, because BLOCK_PROFILER \
- uses them. */ \
+ /* %g1 and %g2 (sparc32) resp. %g4 (sparc64) must be \
+ fixed, because BLOCK_PROFILER uses them. */ \
fixed_regs[1] = 1; \
- fixed_regs[2] = 1; \
+ fixed_regs[TARGET_ARCH64 ? 4 : 2] = 1; \
} \
} \
while (0)
#define MACHINE_STATE_SAVE(ID) \
unsigned long ms_flags, ms_saveret; \
asm volatile( \
- "mov %%g2,%1\n\ \
+ "mov %%g4,%1\n\
rd %%ccr,%0" \
: "=r"(ms_flags), "=r"(ms_saveret));
#define MACHINE_STATE_RESTORE(ID) \
asm volatile ( \
"wr %0,0,%%ccr\n\
- mov %1,%%g2" \
+ mov %1,%%g4" \
: : "r"(ms_flags), "r"(ms_saveret) \
- : "cc", "g2");
+ : "cc", "g4");
#endif