On Saturday 20 September 2008 12:37, you wrote: >> The md file states: >> >> (define_insn "abssf2" >> [(set (match_operand:SF 0 "register_operand" "=d,r") >> (abs:SF (match_operand:SF 1 "register_operand" "0,0")))] >> "" >> "@ >> andi %D0,0x7f >> clt\;bld %D0,7" >> [(set_attr "length" "1,2") >> (set_attr "cc" "set_n,clobber")]) >> >> I don't know how to read it, but loosely interpreted i >> understand the following: >> abssf2 seems to be involved in the calculation of the >> absolute value of a single precesion float. There are >> two ways to clean the msb of register %DO: >> - one is and immideate with 0x7f and the >> - second is clear the T bit and load that zero on msb >> Now since the first only works on registers r16 to r31 >> sometimes the compiler chooses the second option? > > Yes that is exactly correct. "d" means r16..31 and "r" is r0..r31
Nice, would it then not be better to replace clt\;bld %D0,7" by: rol %D0 \; lsr %D0" This does the same thing, are not more instructions, and leave the Transfer bit in tact (it conserves carry two, like andi) Since this is the only place where the T bit is used, it seems a sensible thing to do and it gives control of that bit back to the assembly programmers. Ruud. _______________________________________________ AVR-GCC-list mailing list AVR-GCC-list@nongnu.org http://lists.nongnu.org/mailman/listinfo/avr-gcc-list