summaryrefslogtreecommitdiff
path: root/gcc/testsuite
diff options
context:
space:
mode:
authorrsandifo <rsandifo@138bc75d-0d04-0410-961f-82ee72b054a4>2009-09-14 18:52:16 +0000
committerrsandifo <rsandifo@138bc75d-0d04-0410-961f-82ee72b054a4>2009-09-14 18:52:16 +0000
commit74facf6eece2aa84e36088e8e9adf175920b2e8a (patch)
tree55a392adaef788b55ebbabcd2a850c9eeb3bd476 /gcc/testsuite
parent2a8e505af99f05abd1455142b9e28be5b46fe9ab (diff)
downloadgcc-74facf6eece2aa84e36088e8e9adf175920b2e8a.tar.gz
gcc/
* config/mips/mips-protos.h (mips_cfun_has_cprestore_slot_p): Declare. (mips_cprestore_address_p): Likewise. (mips_save_gp_to_cprestore_slot): Likewise. (mips_restore_gp): Rename to... (mips_restore_gp_from_cprestore_slot): ...this. (mips_must_initialize_gp_p): Declare. (mips_emit_save_slot_move): Likewise. (mips_output_load_label): Return nothing. (mips_eh_uses): Declare. * config/mips/mips.h (TARGET_SPLIT_CALLS): Require epilogue_completed. (TARGET_CPRESTORE_DIRECTIVE): New macro. (TARGET_ABSOLUTE_JUMPS): Likewise. (EH_USES): Likewise. (FIRST_PSEUDO_REGISTER): Update comment. (MIPS_ABSOLUTE_JUMP): New macro, extracted from... (MIPS_CALL): ...here. (REGISTER_NAMES): Add $cprestore. * config/mips/mips.c (machine_function): Remove has_gp_insn_p. Add load_label_length, has_inflexible_gp_insn_p, has_flexible_gp_insn_p, must_initialize_gp_p and must_restore_gp_when_clobbered_p. (mips_expand_call): Don't generate split instructions here. (mips_split_call): Update the call to mips_restore_gp after the above name change. (mips16_cfun_returns_in_fpr_p): Move earlier in file. (mips_find_gp_ref): New function. (mips_insn_has_inflexible_gp_ref_p): Likewise. (mips_cfun_has_inflexible_gp_ref_p): Likewise. (mips_insn_has_flexible_gp_ref_p): Likewise. (mips_cfun_has_flexible_gp_ref_p): Likewise. (mips_function_has_gp_insn): Delete. (mips_global_pointer): Drop the df_regs_ever_live_p check. Use the new functions above. Only return INVALID_REGNUM for TARGET_ABSOLUTE_JUMPS. (mips_must_initialize_gp_p): New function. (mips_get_cprestore_base_and_offset): New function, extracted from... (mips_cprestore_slot): ...here. Take a bool parameter. (mips_cfun_has_cprestore_slot_p): New function. (mips_cprestore_address_p): Likewise. (mips_save_gp_to_cprestore_slot): Likewise. (mips_restore_gp): Rename to... (mips_restore_gp_from_cprestore_slot): ...this. Assert epilogue_completed. Update the call to mips_cprestore_slot. Test cfun->machine->must_restore_gp_when_clobbered_p. (mips_direct_save_slot_move_p): New function. (mips_emit_save_slot_move): Likewise. (mips_output_cplocal): Test mips_must_initialize_gp_p () instead of cfun->machine->global_pointer. (mips_output_function_prologue): Check mips_must_initialize_gp_p (). (mips_save_reg): Use mips_emit_save_slot_move. (mips_expand_prologue): Set must_initialize_gp_p. Use mips_cfun_has_cprestore_slot_p. Use gen_potential_cprestore for all cprestore saves. Emit a use_cprestore instruction after setting up the cprestore slot. (mips_restore_reg): Use mips_emit_save_slot_move. (mips_process_load_label): New function. (mips_load_label_length): Likewise. (mips_output_load_label): Don't return asm: output it here instead. Use mips_process_load_label. (mips_adjust_insn_length): Adjust the length of branch instructions that have length MAX_PIC_BRANCH_LENGTH. (mips_output_conditional_branch): Update the call to mips_output_load_label. Assume the branch target is OPERANDS[0] rather than OPERANDS[1]. Use MIPS_ABSOLUTE_JUMP for absolute jumps. (mips_output_order_conditional_branch): Swap the meaning of OPERANDS[0] and OPERANDS[1]. (mips_variable_issue): Don't count ghost instructions. (mips_expand_ghost_gp_insns): New function. (mips_reorg): Rerun mips_reorg_process_insns if it returns true. (mips_output_mi_thunk): Set must_initialize_gp_p. (mips_eh_uses): New function. * config/mips/predicates.md (cprestore_save_slot_operand) (cprestore_load_slot_operand): New predicates. * config/mips/mips.md (UNSPEC_POTENTIAL_CPRESTORE): New unspec. (UNSPEC_MOVE_GP): Likewise. (UNSPEC_CPRESTORE, UNSPEC_RESTORE_GP, UNSPEC_EH_RETURN) (UNSPEC_CONSTTABLE_INT, UNSPEC_CONSTTABLE_FLOAT): Bump to make room. (CPRESTORE_SLOT_REGNUM): New register. (MAX_PIC_BRANCH_LENGTH): New constant. (jal_macro): Use MIPS_ABSOLUTE_JUMPS. (length): Use MAX_PIC_BRANCH_LENGTH as a placeholder for PIC long branches. Fix commentary. (loadgp_newabi_<mode>): Change from unspec_volatile to unspec. Only split if mips_must_initialize_gp_p; expand to nothing otherwise. Change type to "ghost". (loadgp_absolute_<mode>): Likewise. (loadgp_rtp_<mode>): Likewise. (copygp_mips16): Likewise. (loadgp_blockage): Remove redundant mode attribute. (potential_cprestore): New instruction. (cprestore): Turn into an unspec set. (use_cprestore): New instruction. (*branch_fp): Swap operands 0 and 1. Remove redundant mode attribute. (*branch_fp_inverted): Likewise. (*branch_order<mode>): Likewise. (*branch_order<mode>_inverted): Likewise. (*branch_equality<mode>): Likewise. (*branch_equality<mode>_inverted): Likewise. (*branch_bit<bbv><mode>): Likewise. (*branch_bit<bbv><mode>_inverted): Likewise. (*branch_equality<mode>_mips16): Remove redundant mode. (jump): Turn into a define_expand. (*jump_absolute): New instruction. (*jump_pic): Likewise. (*jump_mips16): Rename previously-unnamed pattern. Remove redundant mode attribute. (restore_gp): Split on epilogue_completed rather than reload_completed. Change type to "ghost". (move_gp<mode>): New instruction. * config/mips/mips-dsp.md (mips_bposge): Swap operands 0 and 1. Remove redundant mode attribute. * config/mips/mips-ps-3d.md (bc1any4t): Likewise. (bc1any4f, bc1any2t, bc1any2f): Likewise. (*branch_upper_lower, *branch_upper_lower_inverted): Likewise. gcc/testsuite/ * gcc.target/mips/branch-helper.h: New file. * gcc.target/mips/branch-2.c, * gcc.target/mips/branch-3.c, * gcc.target/mips/branch-4.c, * gcc.target/mips/branch-5.c, * gcc.target/mips/branch-6.c, * gcc.target/mips/branch-7.c, * gcc.target/mips/branch-8.c, * gcc.target/mips/branch-9.c, * gcc.target/mips/branch-10.c, * gcc.target/mips/branch-11.c, * gcc.target/mips/branch-12.c, * gcc.target/mips/branch-13.c, * gcc.target/mips/branch-14.c, * gcc.target/mips/branch-15.c: New tests. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@151695 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/testsuite')
-rw-r--r--gcc/testsuite/ChangeLog18
-rw-r--r--gcc/testsuite/gcc.target/mips/branch-10.c13
-rw-r--r--gcc/testsuite/gcc.target/mips/branch-11.c17
-rw-r--r--gcc/testsuite/gcc.target/mips/branch-12.c13
-rw-r--r--gcc/testsuite/gcc.target/mips/branch-13.c17
-rw-r--r--gcc/testsuite/gcc.target/mips/branch-14.c23
-rw-r--r--gcc/testsuite/gcc.target/mips/branch-15.c23
-rw-r--r--gcc/testsuite/gcc.target/mips/branch-2.c13
-rw-r--r--gcc/testsuite/gcc.target/mips/branch-3.c13
-rw-r--r--gcc/testsuite/gcc.target/mips/branch-4.c12
-rw-r--r--gcc/testsuite/gcc.target/mips/branch-5.c14
-rw-r--r--gcc/testsuite/gcc.target/mips/branch-6.c12
-rw-r--r--gcc/testsuite/gcc.target/mips/branch-7.c14
-rw-r--r--gcc/testsuite/gcc.target/mips/branch-8.c13
-rw-r--r--gcc/testsuite/gcc.target/mips/branch-9.c18
-rw-r--r--gcc/testsuite/gcc.target/mips/branch-helper.h37
16 files changed, 270 insertions, 0 deletions
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index bcc86bfc148..23e9dbf5b02 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,21 @@
+2009-09-14 Richard Sandiford <rdsandiford@googlemail.com>
+
+ * gcc.target/mips/branch-helper.h: New file.
+ * gcc.target/mips/branch-2.c,
+ * gcc.target/mips/branch-3.c,
+ * gcc.target/mips/branch-4.c,
+ * gcc.target/mips/branch-5.c,
+ * gcc.target/mips/branch-6.c,
+ * gcc.target/mips/branch-7.c,
+ * gcc.target/mips/branch-8.c,
+ * gcc.target/mips/branch-9.c,
+ * gcc.target/mips/branch-10.c,
+ * gcc.target/mips/branch-11.c,
+ * gcc.target/mips/branch-12.c,
+ * gcc.target/mips/branch-13.c,
+ * gcc.target/mips/branch-14.c,
+ * gcc.target/mips/branch-15.c: New tests.
+
2009-09-14 Michael Meissner <meissner@linux.vnet.ibm.com>
PR target/41331
diff --git a/gcc/testsuite/gcc.target/mips/branch-10.c b/gcc/testsuite/gcc.target/mips/branch-10.c
new file mode 100644
index 00000000000..7fdebfcc3f6
--- /dev/null
+++ b/gcc/testsuite/gcc.target/mips/branch-10.c
@@ -0,0 +1,13 @@
+/* { dg-options "-mabicalls -mshared -mabi=n32" } */
+/* { dg-final { scan-assembler-not "(\\\$28|%gp_rel|%got)" } } */
+/* { dg-final { scan-assembler-not "\tjr\t\\\$1\n" } } */
+
+#include "branch-helper.h"
+
+NOMIPS16 void
+foo (void (*bar) (void), volatile int *x)
+{
+ bar ();
+ if (__builtin_expect (*x == 0, 1))
+ OCCUPY_0x1fff8;
+}
diff --git a/gcc/testsuite/gcc.target/mips/branch-11.c b/gcc/testsuite/gcc.target/mips/branch-11.c
new file mode 100644
index 00000000000..1c57f82f533
--- /dev/null
+++ b/gcc/testsuite/gcc.target/mips/branch-11.c
@@ -0,0 +1,17 @@
+/* { dg-options "-mabicalls -mshared -mabi=n32" } */
+/* { dg-final { scan-assembler "\tsd\t\\\$28," } } */
+/* { dg-final { scan-assembler "\tld\t\\\$28," } } */
+/* { dg-final { scan-assembler "\taddiu\t\\\$28,\\\$28,%lo\\(%neg\\(%gp_rel\\(foo\\)\\)\\)\n" } } */
+/* { dg-final { scan-assembler "\tlw\t\\\$1,%got_page\\(\[^)\]*\\)\\(\\\$28\\)\n" } } */
+/* { dg-final { scan-assembler "\taddiu\t\\\$1,\\\$1,%got_ofst\\(\[^)\]*\\)\n" } } */
+/* { dg-final { scan-assembler "\tjr\t\\\$1\n" } } */
+
+#include "branch-helper.h"
+
+NOMIPS16 void
+foo (void (*bar) (void), volatile int *x)
+{
+ bar ();
+ if (__builtin_expect (*x == 0, 1))
+ OCCUPY_0x1fffc;
+}
diff --git a/gcc/testsuite/gcc.target/mips/branch-12.c b/gcc/testsuite/gcc.target/mips/branch-12.c
new file mode 100644
index 00000000000..f1b6f1e8244
--- /dev/null
+++ b/gcc/testsuite/gcc.target/mips/branch-12.c
@@ -0,0 +1,13 @@
+/* { dg-options "-mabicalls -mshared -mabi=64" } */
+/* { dg-final { scan-assembler-not "(\\\$28|%gp_rel|%got)" } } */
+/* { dg-final { scan-assembler-not "\tjr\t\\\$1\n" } } */
+
+#include "branch-helper.h"
+
+NOMIPS16 void
+foo (void (*bar) (void), volatile int *x)
+{
+ bar ();
+ if (__builtin_expect (*x == 0, 1))
+ OCCUPY_0x1fff8;
+}
diff --git a/gcc/testsuite/gcc.target/mips/branch-13.c b/gcc/testsuite/gcc.target/mips/branch-13.c
new file mode 100644
index 00000000000..cc0b607d728
--- /dev/null
+++ b/gcc/testsuite/gcc.target/mips/branch-13.c
@@ -0,0 +1,17 @@
+/* { dg-options "-mabicalls -mshared -mabi=64" } */
+/* { dg-final { scan-assembler "\tsd\t\\\$28," } } */
+/* { dg-final { scan-assembler "\tld\t\\\$28," } } */
+/* { dg-final { scan-assembler "\tdaddiu\t\\\$28,\\\$28,%lo\\(%neg\\(%gp_rel\\(foo\\)\\)\\)\n" } } */
+/* { dg-final { scan-assembler "\tld\t\\\$1,%got_page\\(\[^)\]*\\)\\(\\\$28\\)\n" } } */
+/* { dg-final { scan-assembler "\tdaddiu\t\\\$1,\\\$1,%got_ofst\\(\[^)\]*\\)\n" } } */
+/* { dg-final { scan-assembler "\tjr\t\\\$1\n" } } */
+
+#include "branch-helper.h"
+
+NOMIPS16 void
+foo (void (*bar) (void), volatile int *x)
+{
+ bar ();
+ if (__builtin_expect (*x == 0, 1))
+ OCCUPY_0x1fffc;
+}
diff --git a/gcc/testsuite/gcc.target/mips/branch-14.c b/gcc/testsuite/gcc.target/mips/branch-14.c
new file mode 100644
index 00000000000..026417e162b
--- /dev/null
+++ b/gcc/testsuite/gcc.target/mips/branch-14.c
@@ -0,0 +1,23 @@
+/* An executable version of branch-2.c. */
+/* { dg-do run } */
+
+#include "branch-helper.h"
+
+void __attribute__((noinline))
+foo (volatile int *x)
+{
+ if (__builtin_expect (*x == 0, 1))
+ OCCUPY_0x1fff8;
+}
+
+int
+main (void)
+{
+ int x = 0;
+ int y = 1;
+
+ foo (&x);
+ foo (&y);
+
+ return 0;
+}
diff --git a/gcc/testsuite/gcc.target/mips/branch-15.c b/gcc/testsuite/gcc.target/mips/branch-15.c
new file mode 100644
index 00000000000..dee7a0504d6
--- /dev/null
+++ b/gcc/testsuite/gcc.target/mips/branch-15.c
@@ -0,0 +1,23 @@
+/* An executable version of branch-3.c. */
+/* { dg-do run } */
+
+#include "branch-helper.h"
+
+void
+foo (volatile int *x)
+{
+ if (__builtin_expect (*x == 0, 1))
+ OCCUPY_0x1fffc;
+}
+
+int
+main (void)
+{
+ int x = 0;
+ int y = 1;
+
+ foo (&x);
+ foo (&y);
+
+ return 0;
+}
diff --git a/gcc/testsuite/gcc.target/mips/branch-2.c b/gcc/testsuite/gcc.target/mips/branch-2.c
new file mode 100644
index 00000000000..845e7481729
--- /dev/null
+++ b/gcc/testsuite/gcc.target/mips/branch-2.c
@@ -0,0 +1,13 @@
+/* { dg-options "-mabicalls -mshared -mabi=32" } */
+/* { dg-final { scan-assembler-not "(\\\$25|\\\$28|cpload)" } } */
+/* { dg-final { scan-assembler-not "\tjr\t\\\$1\n" } } */
+/* { dg-final { scan-assembler-not "cprestore" } } */
+
+#include "branch-helper.h"
+
+NOMIPS16 void
+foo (volatile int *x)
+{
+ if (__builtin_expect (*x == 0, 1))
+ OCCUPY_0x1fff8;
+}
diff --git a/gcc/testsuite/gcc.target/mips/branch-3.c b/gcc/testsuite/gcc.target/mips/branch-3.c
new file mode 100644
index 00000000000..0a4ffbba604
--- /dev/null
+++ b/gcc/testsuite/gcc.target/mips/branch-3.c
@@ -0,0 +1,13 @@
+/* { dg-options "-mabicalls -mshared -mabi=32" } */
+/* { dg-final { scan-assembler "\t\\.cpload\t\\\$25\n" } } */
+/* { dg-final { scan-assembler "\tjr\t\\\$1\n" } } */
+/* { dg-final { scan-assembler-not "cprestore" } } */
+
+#include "branch-helper.h"
+
+NOMIPS16 void
+foo (volatile int *x)
+{
+ if (__builtin_expect (*x == 0, 1))
+ OCCUPY_0x1fffc;
+}
diff --git a/gcc/testsuite/gcc.target/mips/branch-4.c b/gcc/testsuite/gcc.target/mips/branch-4.c
new file mode 100644
index 00000000000..277bd0af76f
--- /dev/null
+++ b/gcc/testsuite/gcc.target/mips/branch-4.c
@@ -0,0 +1,12 @@
+/* { dg-options "-mabicalls -mshared -mabi=n32" } */
+/* { dg-final { scan-assembler-not "(\\\$25|\\\$28|%gp_rel|%got)" } } */
+/* { dg-final { scan-assembler-not "\tjr\t\\\$1\n" } } */
+
+#include "branch-helper.h"
+
+NOMIPS16 void
+foo (volatile int *x)
+{
+ if (__builtin_expect (*x == 0, 1))
+ OCCUPY_0x1fff8;
+}
diff --git a/gcc/testsuite/gcc.target/mips/branch-5.c b/gcc/testsuite/gcc.target/mips/branch-5.c
new file mode 100644
index 00000000000..3d151d824ef
--- /dev/null
+++ b/gcc/testsuite/gcc.target/mips/branch-5.c
@@ -0,0 +1,14 @@
+/* { dg-options "-mabicalls -mshared -mabi=n32" } */
+/* { dg-final { scan-assembler "\taddiu\t\\\$3,\\\$3,%lo\\(%neg\\(%gp_rel\\(foo\\)\\)\\)\n" } } */
+/* { dg-final { scan-assembler "\tlw\t\\\$1,%got_page\\(\[^)\]*\\)\\(\\\$3\\)\\n" } } */
+/* { dg-final { scan-assembler "\tjr\t\\\$1\n" } } */
+/* { dg-final { scan-assembler-not "\\\$28" } } */
+
+#include "branch-helper.h"
+
+NOMIPS16 void
+foo (volatile int *x)
+{
+ if (__builtin_expect (*x == 0, 1))
+ OCCUPY_0x1fffc;
+}
diff --git a/gcc/testsuite/gcc.target/mips/branch-6.c b/gcc/testsuite/gcc.target/mips/branch-6.c
new file mode 100644
index 00000000000..9bf73f01c9b
--- /dev/null
+++ b/gcc/testsuite/gcc.target/mips/branch-6.c
@@ -0,0 +1,12 @@
+/* { dg-options "-mabicalls -mshared -mabi=64" } */
+/* { dg-final { scan-assembler-not "(\\\$25|\\\$28|%gp_rel|%got)" } } */
+/* { dg-final { scan-assembler-not "\tjr\t\\\$1\n" } } */
+
+#include "branch-helper.h"
+
+NOMIPS16 void
+foo (volatile int *x)
+{
+ if (__builtin_expect (*x == 0, 1))
+ OCCUPY_0x1fff8;
+}
diff --git a/gcc/testsuite/gcc.target/mips/branch-7.c b/gcc/testsuite/gcc.target/mips/branch-7.c
new file mode 100644
index 00000000000..053ec610c3d
--- /dev/null
+++ b/gcc/testsuite/gcc.target/mips/branch-7.c
@@ -0,0 +1,14 @@
+/* { dg-options "-mabicalls -mshared -mabi=64" } */
+/* { dg-final { scan-assembler "\tdaddiu\t\\\$3,\\\$3,%lo\\(%neg\\(%gp_rel\\(foo\\)\\)\\)\n" } } */
+/* { dg-final { scan-assembler "\tld\t\\\$1,%got_page\\(\[^)\]*\\)\\(\\\$3\\)\\n" } } */
+/* { dg-final { scan-assembler "\tjr\t\\\$1\n" } } */
+/* { dg-final { scan-assembler-not "\\\$28" } } */
+
+#include "branch-helper.h"
+
+NOMIPS16 void
+foo (volatile int *x)
+{
+ if (__builtin_expect (*x == 0, 1))
+ OCCUPY_0x1fffc;
+}
diff --git a/gcc/testsuite/gcc.target/mips/branch-8.c b/gcc/testsuite/gcc.target/mips/branch-8.c
new file mode 100644
index 00000000000..c2cbae36905
--- /dev/null
+++ b/gcc/testsuite/gcc.target/mips/branch-8.c
@@ -0,0 +1,13 @@
+/* { dg-options "-mabicalls -mshared -mabi=32" } */
+/* { dg-final { scan-assembler-not "(\\\$28|cpload|cprestore)" } } */
+/* { dg-final { scan-assembler-not "\tjr\t\\\$1\n" } } */
+
+#include "branch-helper.h"
+
+NOMIPS16 void
+foo (void (*bar) (void), volatile int *x)
+{
+ bar ();
+ if (__builtin_expect (*x == 0, 1))
+ OCCUPY_0x1fff8;
+}
diff --git a/gcc/testsuite/gcc.target/mips/branch-9.c b/gcc/testsuite/gcc.target/mips/branch-9.c
new file mode 100644
index 00000000000..2b83ea5b591
--- /dev/null
+++ b/gcc/testsuite/gcc.target/mips/branch-9.c
@@ -0,0 +1,18 @@
+/* { dg-options "-mabicalls -mshared -mabi=32" } */
+/* { dg-final { scan-assembler "\t\\.cpload\t\\\$25\n" } } */
+/* { dg-final { scan-assembler "\t\\.cprestore\t16\n" } } */
+/* { dg-final { scan-assembler "\tlw\t\\\$1,16\\(\\\$fp\\)\n" } } */
+/* { dg-final { scan-assembler "\tlw\t\\\$1,%got\\(\[^)\]*\\)\\(\\\$1\\)\n" } } */
+/* { dg-final { scan-assembler "\taddiu\t\\\$1,\\\$1,%lo\\(\[^)\]*\\)\n" } } */
+/* { dg-final { scan-assembler "\tjr\t\\\$1\n" } } */
+/* { dg-final { scan-assembler-not "\tlw\t\\\$28,16\\(\\\$sp\\)\n" } } */
+
+#include "branch-helper.h"
+
+NOMIPS16 void
+foo (void (*bar) (void), volatile int *x)
+{
+ bar ();
+ if (__builtin_expect (*x == 0, 1))
+ OCCUPY_0x1fffc;
+}
diff --git a/gcc/testsuite/gcc.target/mips/branch-helper.h b/gcc/testsuite/gcc.target/mips/branch-helper.h
new file mode 100644
index 00000000000..85399be4c7d
--- /dev/null
+++ b/gcc/testsuite/gcc.target/mips/branch-helper.h
@@ -0,0 +1,37 @@
+/* DN(X) generates 2**N copies of asm instruction X. */
+#define D0(X) X
+#define D1(X) X "\n\t" X
+#define D2(X) D1 (D1 (X))
+#define D3(X) D2 (D1 (X))
+#define D4(X) D2 (D2 (X))
+#define D5(X) D4 (D1 (X))
+#define D6(X) D4 (D2 (X))
+#define D7(X) D4 (D2 (D1 (X)))
+#define D8(X) D4 (D4 (X))
+#define D9(X) D8 (D1 (X))
+#define D10(X) D8 (D2 (X))
+#define D11(X) D8 (D2 (D1 (X)))
+#define D12(X) D8 (D4 (X))
+#define D13(X) D8 (D4 (D1 (X)))
+#define D14(X) D8 (D4 (D2 (X)))
+
+/* Emit something that is 0x1fff8 bytes long, which is the largest
+ permissible range for non-MIPS16 forward branches. */
+#define OCCUPY_0x1fff8 \
+ asm (D14 ("nop") "\n\t" \
+ D13 ("nop") "\n\t" \
+ D12 ("nop") "\n\t" \
+ D11 ("nop") "\n\t" \
+ D10 ("nop") "\n\t" \
+ D9 ("nop") "\n\t" \
+ D8 ("nop") "\n\t" \
+ D7 ("nop") "\n\t" \
+ D6 ("nop") "\n\t" \
+ D5 ("nop") "\n\t" \
+ D4 ("nop") "\n\t" \
+ D3 ("nop") "\n\t" \
+ D2 ("nop") "\n\t" \
+ D1 ("nop"))
+
+/* Likewise emit something that is 0x1fffc bytes long. */
+#define OCCUPY_0x1fffc do { asm ("nop"); OCCUPY_0x1fff8; } while (0)