Hi, I compiled the following code using nios gcc -da -O3 (gcc version 3.3.3)
#include <math.h> #define PI (4*atan(1)) double rad2deg(double rad) { return (180.0 * rad / (PI)); } In .s file, it has some codes like this ........ mov r4, zero movhi r5, %hiadj(1072693248) addi r5, r5, %lo(1072693248) mov r16, r2 mov r17, r3 call atan mov r5, r3 mov r4, r2 mov r6, zero movhi r7, %hiadj(1074790400) addi r7, r7, %lo(1074790400) call __muldf3 mov r10, r2 mov r5, r17 mov r6, r10 mov r7, r3 mov r4, r16 ............ In .c.26.flow2 file, (call_insn 23 19 28 0 0x0 (parallel [ (set (reg:DF 2 r2) (call (mem:QI (symbol_ref:SI ("atan")) [0 S1 A8]) (const_int 0 [0x0]))) (clobber (reg:SI 31 ra)) ]) 44 {*call_value} (insn_list 21 (nil)) (expr_list:REG_DEAD (reg:DF 4 r4) (expr_list:REG_UNUSED (reg:SI 31 ra) (nil))) (expr_list (use (reg:DF 4 r4)) (nil))) ..... (call_insn/u 31 30 36 0 0x0 (parallel [ (set (reg:DF 2 r2) (call (mem:QI (symbol_ref:SI ("__muldf3")) [0 S1 A8]) (const_int 0 [0x0]))) (clobber (reg:SI 31 ra)) ]) 44 {*call_value} (insn_list 27 (insn_list 29 (nil))) (expr_list:REG_DEAD (reg:DF 4 r4) (expr_list:REG_DEAD (reg:DF 6 r6) (expr_list:REG_UNUSED (reg:SI 31 ra) (expr_list:REG_EH_REGION (const_int -1 [0xffffffff]) (nil))))) (expr_list (use (reg:DF 6 r6)) (expr_list (use (reg:DF 4 r4)) (nil)))) >From the RTL we can see that these two calls don't use r5, but why here both assembly codes and rtl have some codes with r5, like movhi r5, %hiadj(1072693248) addi r5, r5, %lo(1072693248) (move 32-bit constant into register) and mov r5, r3 In nios2, r2 and r3 are for return value. r4, r5, r6, r7 are for registre auruments Does the following rtl implicitly indicate that r5 is used? (expr_list (use (reg:DF 6 r6)) (expr_list (use (reg:DF 4 r4)) Thanks. Regards, Haibin