Commit | Line | Data |
---|---|---|
4a71579b PC |
1 | /* |
2 | This is a very simple check to a condition that on lightning 2.0.5 | |
3 | could cause an assertion on some backends, due to correcting a problem | |
4 | with temporaries that could not be saved/reloaded due to being used only | |
5 | in the hardware instruction, or being considered live for too long on the | |
6 | lightning instruction, and that could not be reloaded after the jump target | |
7 | (or after false/true target on conditional branches). | |
8 | ||
9 | If this code in lib/lightning.c:_jit_update(): | |
10 | ||
11 | for (regno = 0; regno < _jitc->reglen; regno++) { | |
12 | spec = jit_class(_rvs[regno].spec); | |
13 | if (jit_regset_tstbit(mask, regno) && | |
14 | (spec & (jit_class_gpr|jit_class_fpr)) && | |
15 | !(spec & jit_class_sav)) | |
16 | jit_regset_clrbit(mask, regno); | |
17 | } | |
18 | ||
19 | were removed, this test case, on x86_64 would fail like this: | |
20 | ||
21 | lt-lightning: lightning.c:305: _jit_get_reg: Assertion `regspec & 0x02000000' failed. | |
22 | Aborted (core dumped) | |
23 | */ | |
24 | ||
25 | .data 32 | |
26 | ret: | |
27 | #if __WORDSIZE == 32 | |
28 | .i 0 | |
29 | #else | |
30 | .l 0 | |
31 | #endif | |
32 | ok: | |
33 | .c "ok" | |
34 | ||
35 | .code | |
36 | prolog | |
37 | jmpi start | |
38 | ||
39 | add_v1_v2: | |
40 | addr %v1 %v1 %v2 | |
41 | ldi %r0 ret | |
42 | jmpr %r0 | |
43 | ||
44 | start: | |
45 | movi %v1 1 | |
46 | movi %v2 2 | |
47 | movi %r0 ret_add_v1_v2 | |
48 | sti ret %r0 | |
49 | movi %v0 add_v1_v2 | |
50 | jmpr %v0 | |
51 | movi_d %f0 3 | |
52 | beqi_d pass_movi_f0 %f0 3 | |
53 | calli @abort | |
54 | pass_movi_f0: | |
55 | beqi pass_check_v2 %v2 2 | |
56 | calli @abort | |
57 | pass_check_v2: | |
58 | ret_add_v1_v2: | |
59 | beqi pass_add_v1_v2 %v1 3 | |
60 | calli @abort | |
61 | pass_add_v1_v2: | |
62 | prepare | |
63 | pushargi ok | |
64 | finishi @puts | |
65 | ret | |
66 | epilog |