I'm not sure this is the right place, since this touches both C and asm.
I have trouble making tigcc understand that he is not to use some specific variables after I have used them in an inline assembly instruction. Here is a working code sample :
(This strlen works for <65535 chars strings, and should be faster than a romcall for short strings)
#define strlen(x) ({register unsigned short _result_; \ __asm__("move.l %1,%%a0 \n\t" \ "moveq #-1,%0 \n\t" \ "tst.b %%a0@+ \n\t" \ "dbeq %0,.-2 \n\t" \ "not.w %0 \n\t" \ : "=d" (_result_) \ : "a" (x) \ : "a0"); _result_; })
However I'm not satisfied with it, because:
- it uses a hardcoded register
- the first instruction may be an extra copy if x is not used anymore after the call.
Here is what I tried :
#define strlen(x) ({register unsigned _result_; \ __asm__("moveq #-1,%0 \n\t" \ "tst.b %1@+ \n\t" \ "dbeq %0,.-2 \n\t" \ "not.w %0 \n\t" \ : "=d" (_result_) \ : "a" (x) \ : "%1"); _result_; })
I get no error. However, if I use x after the call, tigcc reuses the register %1, without reloading it first.
What did I miss ?
[edit: Well, it seems that this way of specifying cloberred registers is wong. That would explain]