On Thu, Jun 16, 2011 at 4:28 PM, Ian Lance Taylor <iant@xxxxxxxxxx> wrote: > Jeffrey Walton <noloader@xxxxxxxxx> writes: > >> Any ideas on what knob turning I should perform? The C/C++ source for >> `sadd` is below. There's not much to it - just a test on an x86 flag. > > I don't think there is any straightforward way to do this. gcc is not > in the business of letting you pick and choose the assembly instructions > that it generates--that's what the assembler is for. If you really must > have an add instruction, use an asm statement. I was trying to stay away from coding the ADD myself - I wanted to give the tool chain the most latitude over picking registers and scheduling. > >> int sadd(int a, int b, int* r) >> { >> int overflow = 0; >> int result = a + b; >> >> asm volatile("jo 1f"); >> asm volatile("jmp 2f"); >> >> asm volatile("1:"); >> overflow = 1; >> >> asm volatile("2:"); >> if(r) >> *r = result; >> >> // TRUE (1) if safe to use >> return !overflow; >> } > > Note that jumping from one asm statement to another is explicitly not > supported and will fail in some cases. You can jump to a C label, but > not to an asm label. When I tried to jump to a C label, I got an undefined reference from ld. I'll keep chipping away at it. Thanks for the help, Jeff