@@ -149,23 +149,31 @@ struct test_arg_end {
149
149
"1: "instruction" \n\t" \
150
150
" nop \n\t"
151
151
152
- #define TEST_BRANCH_F (instruction , xtra_dist ) \
152
+ #define TEST_BRANCH_F (instruction ) \
153
153
TEST_INSTRUCTION(instruction) \
154
- ".if "#xtra_dist" \n\t" \
155
154
" b 99f \n\t" \
156
- ".space "#xtra_dist" \n\t" \
157
- ".endif \n\t" \
155
+ "2: nop \n\t"
156
+
157
+ #define TEST_BRANCH_B (instruction ) \
158
+ " b 50f \n\t" \
159
+ " b 99f \n\t" \
160
+ "2: nop \n\t" \
161
+ " b 99f \n\t" \
162
+ TEST_INSTRUCTION(instruction)
163
+
164
+ #define TEST_BRANCH_FX (instruction , codex ) \
165
+ TEST_INSTRUCTION(instruction) \
166
+ " b 99f \n\t" \
167
+ codex" \n\t" \
158
168
" b 99f \n\t" \
159
169
"2: nop \n\t"
160
170
161
- #define TEST_BRANCH_B (instruction , xtra_dist ) \
171
+ #define TEST_BRANCH_BX (instruction , codex ) \
162
172
" b 50f \n\t" \
163
173
" b 99f \n\t" \
164
174
"2: nop \n\t" \
165
175
" b 99f \n\t" \
166
- ".if "#xtra_dist" \n\t" \
167
- ".space "#xtra_dist" \n\t" \
168
- ".endif \n\t" \
176
+ codex" \n\t" \
169
177
TEST_INSTRUCTION(instruction)
170
178
171
179
#define TESTCASE_END \
@@ -301,47 +309,60 @@ struct test_arg_end {
301
309
TESTCASE_START(code1 #reg1 code2) \
302
310
TEST_ARG_PTR(reg1, val1) \
303
311
TEST_ARG_END("") \
304
- TEST_BRANCH_F(code1 #reg1 code2, 0 ) \
312
+ TEST_BRANCH_F(code1 #reg1 code2) \
305
313
TESTCASE_END
306
314
307
- #define TEST_BF_X (code , xtra_dist ) \
315
+ #define TEST_BF (code ) \
308
316
TESTCASE_START(code) \
309
317
TEST_ARG_END("") \
310
- TEST_BRANCH_F(code, xtra_dist) \
318
+ TEST_BRANCH_F(code) \
311
319
TESTCASE_END
312
320
313
- #define TEST_BB_X (code , xtra_dist ) \
321
+ #define TEST_BB (code ) \
314
322
TESTCASE_START(code) \
315
323
TEST_ARG_END("") \
316
- TEST_BRANCH_B(code, xtra_dist) \
324
+ TEST_BRANCH_B(code) \
317
325
TESTCASE_END
318
326
319
- #define TEST_BF_RX (code1 , reg , val , code2 , xtra_dist ) \
320
- TESTCASE_START(code1 #reg code2) \
321
- TEST_ARG_REG(reg, val) \
322
- TEST_ARG_END("") \
323
- TEST_BRANCH_F(code1 #reg code2, xtra_dist) \
327
+ #define TEST_BF_R (code1 , reg , val , code2 ) \
328
+ TESTCASE_START(code1 #reg code2) \
329
+ TEST_ARG_REG(reg, val) \
330
+ TEST_ARG_END("") \
331
+ TEST_BRANCH_F(code1 #reg code2) \
324
332
TESTCASE_END
325
333
326
- #define TEST_BB_RX (code1 , reg , val , code2 , xtra_dist ) \
327
- TESTCASE_START(code1 #reg code2) \
328
- TEST_ARG_REG(reg, val) \
329
- TEST_ARG_END("") \
330
- TEST_BRANCH_B(code1 #reg code2, xtra_dist) \
334
+ #define TEST_BB_R (code1 , reg , val , code2 ) \
335
+ TESTCASE_START(code1 #reg code2) \
336
+ TEST_ARG_REG(reg, val) \
337
+ TEST_ARG_END("") \
338
+ TEST_BRANCH_B(code1 #reg code2) \
331
339
TESTCASE_END
332
340
333
- #define TEST_BF (code ) TEST_BF_X(code, 0)
334
- #define TEST_BB (code ) TEST_BB_X(code, 0)
335
-
336
- #define TEST_BF_R (code1 , reg , val , code2 ) TEST_BF_RX(code1, reg, val, code2, 0)
337
- #define TEST_BB_R (code1 , reg , val , code2 ) TEST_BB_RX(code1, reg, val, code2, 0)
338
-
339
341
#define TEST_BF_RR (code1 , reg1 , val1 , code2 , reg2 , val2 , code3 ) \
340
342
TESTCASE_START(code1 #reg1 code2 #reg2 code3) \
341
343
TEST_ARG_REG(reg1, val1) \
342
344
TEST_ARG_REG(reg2, val2) \
343
345
TEST_ARG_END("") \
344
- TEST_BRANCH_F(code1 #reg1 code2 #reg2 code3, 0) \
346
+ TEST_BRANCH_F(code1 #reg1 code2 #reg2 code3) \
347
+ TESTCASE_END
348
+
349
+ #define TEST_BF_X (code , codex ) \
350
+ TESTCASE_START(code) \
351
+ TEST_ARG_END("") \
352
+ TEST_BRANCH_FX(code, codex) \
353
+ TESTCASE_END
354
+
355
+ #define TEST_BB_X (code , codex ) \
356
+ TESTCASE_START(code) \
357
+ TEST_ARG_END("") \
358
+ TEST_BRANCH_BX(code, codex) \
359
+ TESTCASE_END
360
+
361
+ #define TEST_BF_RX (code1 , reg , val , code2 , codex ) \
362
+ TESTCASE_START(code1 #reg code2) \
363
+ TEST_ARG_REG(reg, val) \
364
+ TEST_ARG_END("") \
365
+ TEST_BRANCH_FX(code1 #reg code2, codex) \
345
366
TESTCASE_END
346
367
347
368
#define TEST_X (code , codex ) \
@@ -372,6 +393,25 @@ struct test_arg_end {
372
393
TESTCASE_END
373
394
374
395
396
+ /*
397
+ * Macros for defining space directives spread over multiple lines.
398
+ * These are required so the compiler guesses better the length of inline asm
399
+ * code and will spill the literal pool early enough to avoid generating PC
400
+ * relative loads with out of range offsets.
401
+ */
402
+ #define TWICE (x ) x x
403
+ #define SPACE_0x8 TWICE(".space 4\n\t")
404
+ #define SPACE_0x10 TWICE(SPACE_0x8)
405
+ #define SPACE_0x20 TWICE(SPACE_0x10)
406
+ #define SPACE_0x40 TWICE(SPACE_0x20)
407
+ #define SPACE_0x80 TWICE(SPACE_0x40)
408
+ #define SPACE_0x100 TWICE(SPACE_0x80)
409
+ #define SPACE_0x200 TWICE(SPACE_0x100)
410
+ #define SPACE_0x400 TWICE(SPACE_0x200)
411
+ #define SPACE_0x800 TWICE(SPACE_0x400)
412
+ #define SPACE_0x1000 TWICE(SPACE_0x800)
413
+
414
+
375
415
/* Various values used in test cases... */
376
416
#define N (val ) (val ^ 0xffffffff)
377
417
#define VAL1 0x12345678
0 commit comments