1 /* DN(X) generates 2**N copies of asm instruction X. */ 2 #define D0(X) X 3 #define D1(X) X "\n\t" X 4 #define D2(X) D1 (D1 (X)) 5 #define D3(X) D2 (D1 (X)) 6 #define D4(X) D2 (D2 (X)) 7 #define D5(X) D4 (D1 (X)) 8 #define D6(X) D4 (D2 (X)) 9 #define D7(X) D4 (D2 (D1 (X))) 10 #define D8(X) D4 (D4 (X)) 11 #define D9(X) D8 (D1 (X)) 12 #define D10(X) D8 (D2 (X)) 13 #define D11(X) D8 (D2 (D1 (X))) 14 #define D12(X) D8 (D4 (X)) 15 #define D13(X) D8 (D4 (D1 (X))) 16 #define D14(X) D8 (D4 (D2 (X))) 17 18 /* Emit something that is 0x1fff8 bytes long, which is the largest 19 permissible range for non-MIPS16 forward branches. */ 20 #define OCCUPY_0x1fff8 \ 21 asm (D14 ("nop") "\n\t" \ 22 D13 ("nop") "\n\t" \ 23 D12 ("nop") "\n\t" \ 24 D11 ("nop") "\n\t" \ 25 D10 ("nop") "\n\t" \ 26 D9 ("nop") "\n\t" \ 27 D8 ("nop") "\n\t" \ 28 D7 ("nop") "\n\t" \ 29 D6 ("nop") "\n\t" \ 30 D5 ("nop") "\n\t" \ 31 D4 ("nop") "\n\t" \ 32 D3 ("nop") "\n\t" \ 33 D2 ("nop") "\n\t" \ 34 D1 ("nop")) 35 36 /* Emit something that is 0xfffc bytes long, which is the largest 37 permissible range for microMIPS forward branches when branches 38 have delay slots. */ 39 #define OCCUPY_0xfffc \ 40 asm (D13 ("nop32") "\n\t" \ 41 D12 ("nop32") "\n\t" \ 42 D11 ("nop32") "\n\t" \ 43 D10 ("nop32") "\n\t" \ 44 D9 ("nop32") "\n\t" \ 45 D8 ("nop32") "\n\t" \ 46 D7 ("nop32") "\n\t" \ 47 D6 ("nop32") "\n\t" \ 48 D5 ("nop32") "\n\t" \ 49 D4 ("nop32") "\n\t" \ 50 D3 ("nop32") "\n\t" \ 51 D2 ("nop32") "\n\t" \ 52 D1 ("nop32") "\n\t" \ 53 D0 ("nop32")) 54 /* Likewise emit something that is 0x1fffc bytes long. */ 55 #define OCCUPY_0x1fffc do { asm ("nop"); OCCUPY_0x1fff8; } while (0) 56 /* Likewise emit something that is 0x10000 bytes long. */ 57 #define OCCUPY_0x10000 do { asm ("nop32"); OCCUPY_0xfffc; } while (0) 58