2010-02-10 60 views
2

我尝试修补GCC使得目的地寄存器 存储到堆栈一个fdivd,即后:如何避免的insn beeing调度到延迟槽

fdivd%F0,F2%,%F4; =>变为 fdivd%f0,%f2,%f4; std%f4,[%fp + ...]

我使用 define_expand模式(参见下文)中的(emit_insn,DONE)序列生成divdf3的rtl。

在汇编程序输出阶段,我使用define_insn并将“fdivd \ t %% 1,%% 2,%% 0; std %% 0,%% 3”作为表达式字符串写入 。

生成的代码似乎没问题。但是:

我的问题:

我如何可以标记模式的话,它会不sheduled成 延迟槽?我怎样才能指定输出将是2条指令 并提示调度器呢? define_insn divdf3_store (下面)中的(set_attr“length”“2”)属性是否已经足够?

- 问候康拉德

-------------- changed sparc.md ------------------------- 
;;;;;;;;;;;;;;;;;; handle divdf3 ;;;;;;;;;;;;;;;; 
(define_expand "divdf3" 
    [(parallel [(set (match_operand:DF 0 "register_operand" "=e") 
         (div:DF (match_operand:DF 1 "register_operand" "e") 
       (match_operand:DF 2 "register_operand" "e"))) 
      (clobber (match_scratch:SI 3 ""))])] 
    "TARGET_FPU" 
    "{ 
     output_divdf3_emit (operands[0], operands[1], operands[2], operands[3]); 
     DONE; 
    }") 

(define_insn "divdf3_store" 
    [(set (match_operand:DF 0 "register_operand" "=e") 
         (div:DF (match_operand:DF 1 "register_operand" "e") 
       (match_operand:DF 2 "register_operand" "e"))) 
      (clobber (match_operand:DF 3 "memory_operand" "" ))] 
    "TARGET_FPU && TARGET_STORE_AFTER_DIVSQRT" 
    { 
     return output_divdf3 (operands[0], operands[1], operands[2], operands[3]); 
    } 
    [(set_attr "type" "fpdivd") 
    (set_attr "fptype" "double") 
    (set_attr "length" "2")]) 

(define_insn "divdf3_nostore" 
    [(set (match_operand:DF 0 "register_operand" "=e") 
    (div:DF (match_operand:DF 1 "register_operand" "e") 
     (match_operand:DF 2 "register_operand" "e")))] 
    "TARGET_FPU && (!TARGET_STORE_AFTER_DIVSQRT)" 
    "fdivd\t%1, %2, %0" 
    [(set_attr "type" "fpdivd") 
    (set_attr "fptype" "double")]) 



-------------- changed sparc.c ------------------------- 

/**************************** handle fdivd ****************************/ 
char * 
output_divdf3 (rtx op0, rtx op1, rtx dest, rtx scratch) 
{ 
    static char string[128]; 
    if (debug_patch_divsqrt) { 
    fprintf(stderr, "debug_patch_divsqrt:\n"); 
    debug_rtx(op0); 
    debug_rtx(op1); 
    debug_rtx(dest); 
    fprintf(stderr, "scratch: 0x%x\n",(int)scratch); 
    } 
    sprintf(string,"fdivd\t%%1, %%2, %%0; std %%0, %%3 !!!"); 
    return string; 
} 

void 
output_divdf3_emit (rtx dest, rtx op0, rtx op1, rtx scratch) 
{ 
    rtx slot0, div, divsave; 

    if (debug_patch_divsqrt) { 
    fprintf(stderr, "output_divdf3_emit:\n"); 
    debug_rtx(op0); 
    debug_rtx(op1); 
    debug_rtx(dest); 
    fprintf(stderr, "scratch: 0x%x\n",(int)scratch); 
    } 

    div = gen_rtx_SET (VOIDmode, 
      dest, 
      gen_rtx_DIV (DFmode, 
        op0, 
        op1)); 

    if (TARGET_STORE_AFTER_DIVSQRT) { 
    slot0 = assign_stack_local (DFmode, 8, 8); 
    divsave = gen_rtx_SET (VOIDmode, slot0, dest); 
    emit_insn(divsave); 
    emit_insn (gen_rtx_PARALLEL(VOIDmode, 
       gen_rtvec (2, 
         div, 
         gen_rtx_CLOBBER (SImode, 
           slot0)))); 
    } else { 
    emit_insn(div); 
    } 
} 
+0

这绝对是[email protected]问题 – 2010-02-10 13:59:11

回答

1

我第二Laurynas。对于这样一个确切的问题,[email protected]将会非常有帮助。