Hello, Ian Lance Taylor <iant@xxxxxxxxxx> writes: > ludo@xxxxxxx (Ludovic CourtÃs) writes: > >> Ian Lance Taylor <iant@xxxxxxxxxx> writes: >> >>> ludo@xxxxxxx (Ludovic CourtÃs) writes: >>> >>>> Iâm trying to use âasm gotoâ with GCC 4.5 to implement tagged integer >>>> arithmetic for Guileâs VM. For instance, the addition of X and Y looks >>>> like this: >>>> >>>> { >>>> SCM result = y; >>>> asm volatile goto ("add %0, %[result]; jo %l[slow_add]; " >>>> "sub %[tag], %[result]; " >>>> "test %[tag], %[result]; " >>>> "je %l[slow_add]; " >>>> "mov %[result], (%[vsp])\n" >>>> : /* no output */ >>>> : "r" (x), [result] "r" (result), >>>> [vsp] "r" (sp), [tag] "i" (scm_tc2_int) >>>> : "memory" >>>> : slow_add); >>>> NEXT; /* Jump to the next virtual IP. */ >>>> } >>>> slow_add: >>>> /* Add X and Y the slow way, using bignums if needed. */ >>>> >>>> However, this doesnât work because GCC doesnât allocate any new register >>>> for âresultâ (which it is allowed to do given that âresultâ is an >>>> input), so the âtestâ instruction modifies âyâ, and we may jump to >>>> âslow_addâ with an erroneous value of âyâ. >>>> >>>> I could add a clobber for a specific register and use that to store the >>>> intermediate result, but Iâd rather let GCC choose a register for me. >>>> Unfortunately, only specific register names are allowed in the clobber >>>> list, so I canât, e.g., use the ârâ constraint to achieve this. >>>> >>>> Any idea how I can work around this? >>> >>> When your asm modifies a register, you need to tell gcc that that is >>> happening. E.g., list the value in the list of outputs and give it a + >>> constraint. >> >> That doesnât work because âasm gotoâ doesnât support output variables as >> of GCC 4.5 (info "(gcc) Extended Asm"). > > Whoops, sorry about that. That should really be fixed. > > Still, your asm simply can not change registers and not tell gcc about > it. That is certain to break. I think you're going to have to force > the use of an explicit register or use a regular asm rather than an asm > goto. Yes, thatâs why Iâm asking for ideas to work around this. :-) Namely, clobbering a specific register doesnât sound wise here since this asm snippet will be part of the bytecode interpreter, where GCCâs register allocator can supposedly do a better job if I donât make its life harder by clobbering an arbitrarily-chosen register. Likewise, using âasmâ instead of âasm gotoâ doesnât seem doable, since the cost would outweigh the benefits AFAICS (e.g., one of the output variables would have to be a boolean indicating whether an overflow occurred...). Thanks, Ludoâ.