Module Name: src
Committed By: matt
Date: Fri Aug 14 16:57:17 UTC 2009
Modified Files:
src/lib/csu/mips [matt-nb5-mips64]: dot_init.h
Log Message:
Add support ABIS other than O32 (O64, N32, N64). Rebuilding for O32 results
in no binary differences.
To generate a diff of this commit:
cvs rdiff -u -r1.9 -r1.9.10.1 src/lib/csu/mips/dot_init.h
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/lib/csu/mips/dot_init.h
diff -u src/lib/csu/mips/dot_init.h:1.9 src/lib/csu/mips/dot_init.h:1.9.10.1
--- src/lib/csu/mips/dot_init.h:1.9 Sat May 10 15:31:04 2008
+++ src/lib/csu/mips/dot_init.h Fri Aug 14 16:57:17 2009
@@ -1,4 +1,4 @@
-/* $NetBSD: dot_init.h,v 1.9 2008/05/10 15:31:04 martin Exp $ */
+/* $NetBSD: dot_init.h,v 1.9.10.1 2009/08/14 16:57:17 matt Exp $ */
/*-
* Copyright (c) 2001 Ross Harvey
@@ -36,48 +36,98 @@
#include <sys/cdefs.h> /* RCS ID & Copyright macro defns */
-#define ra "$31"
+#define t9 "$25"
/*
- * Allocate 32 bytes for the stack frame. Store GP at SP+16 (since
- * this is where code generated by the compiler for fallthru processing
- * expects it to be), and the RA at SP+28.
+ * For O32/O64, allocate 8 "slots" for the stack frame. Store GP in the 4th
+ * (zero-based) slot (since this is where compiler generated code for fallthru
+ * processing expects it to be), and the RA in seventh (highest address).
*
- * This will need adjustment for 64-bit ABIs.
+ * For N32/N64, allocate 4 8-byte "slots" for the stack frame. Store GP in the
+ * 2nd (zero-based) slot (since ...) and the RA in third (highest address).
*/
+
+#ifdef __mips_o32
+#define sPTR_ADDU "addu"
+#define sREG_L "lw"
+#define sREG_S "sw"
+#define sRAOFF "28"
+#define sFRAMESZ "32"
+#define MD_GPRESTORE /* nothing */
+#else
+#define sPTR_ADDU "daddu"
+#define sREG_L "ld"
+#define sREG_S "sd"
+#if defined(__mips_n32) || defined(__mips_n64)
+#define MD_GPRESTORE ".cpreturn" "\n\t"
+#define sRAOFF "24"
+#define sFRAMESZ "32"
+#elif defined(__mips_o64)
+#define sRAOFF "56"
+#define sFRAMESZ "64"
+#define MD_GPRESTORE /* nothing */
+#endif
+#endif
+
#ifdef __ABICALLS__
-#define MD_FUNCTION_PROLOGUE \
- ".set noreorder \n"\
- ".cpload $25 \n"\
- ".set reorder \n"\
- " subu $sp,$sp,32 \n"\
- ".cprestore 16 \n"\
- " sw "ra",28($sp) \n"
+#if defined(__mips_o32) || defined(__mips_o64)
+#define MD_FUNCTION_PROLOGUE(entry_pt) \
+ ".set noreorder" "\n\t" \
+ ".cpload "t9 "\n\t" \
+ ".set reorder" "\n\t" \
+ sPTR_ADDU" $sp,$sp,-"sFRAMESZ "\n\t" \
+ ".cprestore 16" "\n\t" \
+ sREG_S" $ra,"sRAOFF"($sp)" "\n\t"
+
+#elif defined(__mips_n32) || defined(__mips_n64)
+#define MD_FUNCTION_PROLOGUE(entry_pt) \
+ ".set noreorder" "\n\t" \
+ "daddu $sp,$sp,-32" "\n\t" \
+ ".cpsetup "t9", 8, "#entry_pt "\n\t" \
+ "sd $ra,24($sp)" "\n\t" \
+ ".set reorder" "\n\t"
+#else
+#error ABI not supported
+#endif
+#else
+#if defined(__mips_o32) || defined(__mips_o64)
+#define MD_FUNCTION_PROLOGUE(entry_pt) \
+ sPTR_ADDU" $sp,$sp,-"sFRAMESZ "\n\t" \
+ sREG_S" $ra,"sRAOFF"($sp)" "\n\t"
+
+#elif defined(__mips_n32) || defined(__mips_n64)
+/*
+ * On N32/N64, GP is callee-saved.
+ */
+#define MD_FUNCTION_PROLOGUE(entry_pt) \
+ "daddu $sp,$sp,-32" "\n\t" \
+ "sd $gp,8($sp)" "\n\t" \
+ "sd $ra,24($sp)" "\n\t" \
#else
-#define MD_FUNCTION_PROLOGUE \
- " subu $sp,$sp,32 \n"\
- " sw "ra",28($sp) \n"
+#error ABI not supported
#endif
+#endif /* __ABICALLS */
-#define MD_SECTION_PROLOGUE(sect, entry_pt) \
- __asm ( \
- ".section "#sect",\"ax\",@progbits \n"\
- ".align 2 \n"\
- ".globl "#entry_pt" \n"\
- #entry_pt": \n"\
- MD_FUNCTION_PROLOGUE \
- " /* fall thru */ \n"\
+#define MD_SECTION_PROLOGUE(sect, entry_pt) \
+ __asm ( \
+ ".section "#sect",\"ax\",@progbits" "\n\t" \
+ ".align 2" "\n\t" \
+ ".globl "#entry_pt "\n\t" \
+ #entry_pt":" "\n\t" \
+ MD_FUNCTION_PROLOGUE(entry_pt) \
+ " /* fall thru */" "\n\t" \
".previous")
-#define MD_SECTION_EPILOGUE(sect) \
- __asm ( \
- ".section "#sect",\"ax\",@progbits \n"\
- " lw "ra",28($sp) \n"\
- " .set noreorder \n"\
- " j "ra" \n"\
- " addu $sp,$sp,32 \n"\
- " .set reorder \n"\
+#define MD_SECTION_EPILOGUE(sect) \
+ __asm ( \
+ ".section "#sect",\"ax\",@progbits" "\n\t" \
+ sREG_L" $ra,"sRAOFF"($sp)" "\n\t" \
+ MD_GPRESTORE \
+ ".set noreorder" "\n\t" \
+ "j $ra" "\n\t" \
+ sPTR_ADDU" $sp,$sp,"sFRAMESZ "\n\t" \
+ ".set reorder" "\n\t" \
".previous")
#define MD_INIT_SECTION_PROLOGUE MD_SECTION_PROLOGUE(.init, _init)