Am Sun, 17 Aug 2014 14:36:53 +0000 schrieb "Timo Sintonen" <t.sinto...@luukku.com>:
> On Sunday, 17 August 2014 at 13:59:03 UTC, Artur Skawina via > D.gnu wrote: > > On 08/17/14 15:44, Timo Sintonen via D.gnu wrote: > > > >> I am compiling for arm and I am sorry I misinterpreted the > >> optimized code. Actually the code is correct but it still does > >> not work. > >> The problem is that the call to get the tls pointer for > >> volatile_dummy seems to corrupt the register (r3) where the > >> this pointer is. The call is inside the while loop. After > >> removing tha call by hand in the assembly everything works. R3 > >> is usually pushed into stack when it is used in a function. I > >> have to check what is wrong in this case. > > > > Does declaring it as: > > > > extern __gshared int volatile_dummy; > > > > help? > > > > artur > > Yes, now it works. > > But the register corruption is still an issue. My tls function > clearly uses r3 and does not save it. > > Johannes, do you know the arm calling system? Is it caller or > callee that should save r3? > In this case it is my function that has one function inlined that > has another function inlined that contains a compiler generated > function call. Could this be a bug in the compiler that it does > not recognize the innermost call and does not save registers? r3 is an argument/scratch register, the callee can't rely on its contents after a function call. This could also be caused by the inline ASM.