Problem of inline assembly for branch instruction
Naveen H. S
Naveen.S@kpitcummins.com
Wed Sep 7 13:17:00 GMT 2011
Hi,
We are implementing a special branch instruction for offsets between
0 and 32 bytes in CR16 port.
=======================================================================
if (get_attr_length (insn) == 2)
return \"beq0<tIsa>\t%0,%l1\";
else
return \"cmp<tIsa>\t$0, %0\;beq\t%l1\";
}"
[(set (attr "length")
(if_then_else
(and (ge (minus (match_dup 1) (pc)) (const_int 2))
(le (minus (match_dup 1) (pc)) (const_int 32)))
(const_int 2)
(const_int 6)))]
=======================================================================
The branch instruction has been implemented and working as expected.
However, it resulted in error while testing an application with inline
assembly. In the application, the linker calculated length of offset
from current location to the branch as 24. However, due to some inline
assembly in between PC and branch location, the offset is more than 32.
Hence, the linker generates error while linking application.
However, we could not find any solution to handling inline assembly in
such scenarios.
Please let us know if the compiler could be informed not to generate
special branch instruction for code with inline assembly.
Also let us know if the inline assembly length attribute could be
passed to linker so that it can calculate the exact offset.
Thanks & Regards,
Naveen
More information about the Gcc-help
mailing list