I’ve run into a problem while compiling a package around, I am not
really a good coder, but I tried fixing it for my self, and it still won’t compile.
This is the original bit of code.:
#ifdef __GNUC__
asm("and $3, %%ecx;"
"shl $3 ,%%ecx;"
"ror %%cl, %0"
: "=r" (value)
: "r" (value), "c" (address));
#else
The error is .:
GBAinline.h:139: error: impossible register constraint in ‘asm’
( ifdef line is 138 )
And this is how I tried to make it look.:
#ifdef __GNUC__
asm ("and $3 %%ecx,shl $3 %%ecx,ror %%cl, %0" : "=r" (value): "r" (value), "c" (address));
#else
Still, it would not work. It’s a gba emulator before anyone ask, VBA, and this is
part of GBAinline.h . This assembler is making me crazy already.
Edit.: The problem above was handled fine, I just was not paying attention to which
compiler I was using.
But now I get this error on this bit of code from a header file, I’ve put it on pastebin,
to keep things here a bit more tidy… ( Sorry if this is wrong, i can change that later )
This is the header that has the lines that results in errors.:
http://pastebin.com/k3D4cg0d
And this is the C file it refers to.:
http://pastebin.com/Ymg1X5dg
This is giving an error like this.:
/var/tmp/cc3zA0lH.s: Assembler messages: /var/tmp/cc3zA0lH.s:69: Error: bad instruction `sw $3,0(r3)',
And so on for the rest of those lines.
That inline assembly is buggy:
\nall appears on one line. Whether your assembler accepts statements separated by semicolons makes all the difference there … some may not."+r"(value)as ordinarily suggested for this situation.Without seeing the rest of the code it’s not quite clear why the inline assembly statement looks the way it does; Personally, I’d suggest to write it like:
because there’s little need to do the calculation itself in assembly. The
uintptr_t(from<stdint.h>) cast makes this 32/64bit agnostic as well.Edit:
If you want it for a different CPU but x86 / x64, then it obviously needs to be different … For ARM (not Thumb2), it’d be:
since that’s how the rotate instruction there behaves.
Edit (add reference):
Regarding the operation performed here as such, this blog post gives an interesting perspective – namely, that the compiler is quite likely to create the same output for:
as for the x86 inline
Testing this:
Compile / disassemble it:
Ergo, this inline assembly is unnecessary.