| 1 | ; File bwtest-err-1.s |
| 2 | |
| 3 | ; { dg-do assemble { target cris-*-* } } |
| 4 | |
| 5 | ; A variant of exbwtest.s. This is an example of invalid use of the broken- |
| 6 | ; dot-word function. The nearest label occurs about 32 kbytes after the primary |
| 7 | ; jump table so the secondary jump table can't be reached by word displace- |
| 8 | ; ments and the broken words overflow. |
| 9 | |
| 10 | ; main() |
| 11 | ; { |
| 12 | ; byte i; |
| 13 | ; |
| 14 | ; for (i=0; i <= 3; i++) { |
| 15 | ; result[i] = funct(i); |
| 16 | ; } |
| 17 | ; } |
| 18 | ; |
| 19 | ; Register use : r1 - i |
| 20 | ; r2 - result address |
| 21 | |
| 22 | .text |
| 23 | .syntax no_register_prefix |
| 24 | .word 0 |
| 25 | main: move.d stack,sp |
| 26 | moveq 0,r1 |
| 27 | move.d result,r2 |
| 28 | for1: cmpq 3,r1 |
| 29 | bgt endfor1 |
| 30 | move.d r1,r0 |
| 31 | jsr funct |
| 32 | move.w r0,[r2+r1.w] |
| 33 | ba for1 |
| 34 | addq 1,r1 |
| 35 | endfor1: |
| 36 | end: ba end |
| 37 | nop |
| 38 | |
| 39 | |
| 40 | ; uword funct(i) |
| 41 | ; byte i; |
| 42 | ; { |
| 43 | ; switch (i) { |
| 44 | ; case 0 : return 0x1111; |
| 45 | ; case 1 : return 0x2222; |
| 46 | ; case 2 : return 0x3333; |
| 47 | ; case 3 : return 0x4444; |
| 48 | ; } |
| 49 | ; } |
| 50 | ; |
| 51 | ; Parameters : r0 - i |
| 52 | ; |
| 53 | ; Register use : r1 - pjt address |
| 54 | |
| 55 | funct: push r1 |
| 56 | move.d pjt,r1 |
| 57 | adds.w [r1+r0.w],pc |
| 58 | pjt: .word near1 - pjt |
| 59 | .word near2 - pjt |
| 60 | .word far1 - pjt |
| 61 | .word far2 - pjt |
| 62 | |
| 63 | ; Note that the line-number of the source-location of the error |
| 64 | ; seems slightly off from the user perspective, but it's the |
| 65 | ; best I could get without major changes in BW-handling. Not |
| 66 | ; sure it it's worth fixing. May need adjustments if |
| 67 | ; BW-handling changes. Four errors from four .words are what's |
| 68 | ; expected. |
| 69 | |
| 70 | .space 32760,0xFF; { dg-error "Adjusted signed \.word \(.*\) overflow.*" } |
| 71 | |
| 72 | near1: move.w 0x1111,r0 |
| 73 | ba ret1 |
| 74 | nop |
| 75 | |
| 76 | near2: move.w 0x2222,r0 |
| 77 | ba ret1 |
| 78 | nop |
| 79 | |
| 80 | far1: move.w 0x3333,r0 |
| 81 | ba ret1 |
| 82 | nop |
| 83 | |
| 84 | far2: move.w 0x4444,r0 |
| 85 | ret1: pop r1 |
| 86 | ret |
| 87 | |
| 88 | |
| 89 | result: .space 4 * 2 ; static uword result[4]; |
| 90 | |
| 91 | .space 4 |
| 92 | stack: |