2014-11-05 20 views
1
bne $2,$0,$L4 # 27 *branch_equalitydi [length = 8] 
    lw $4,$LC0 # 29 *movsf_softfloat/2 [length = 24] 
    move $5,$0 # 30 *movsf_softfloat/1 [length = 4] 
    jal __divsf3 # 31 call_value_internal/2 [length = 8] 

我所不解的是,其下面的模式:如何閱讀MIPS通過gcc的組件產生的「-Dap -S」

opcode $dest, $src1, $src2 # insn_uid * md-pattern/XX [length = XX] 

什麼我不明白是在模式的XX部分。有人可以對此有所瞭解嗎?

回答

2

使用來源,盧克!在gcc源代碼中的相關部分是:

if (insn_data[num].n_alternatives > 1) 
    fprintf (asm_out_file, "/%d", which_alternative + 1); 

指令模板可提供對各種情況下多個備選方案,而這個數字告訴你已經使用哪一個。讓我們來看看定義movsf_softfloat

(define_insn "*movsf_softfloat" 
    [(set (match_operand:SF 0 "nonimmediate_operand" "=d,d,m") 
     (match_operand:SF 1 "move_operand" "Gd,m,d"))] 

正如你所看到的,它提供了3個備選方案。 lw $4,$LC0是從內存移動到由第二組約束(dm)描述的寄存器中。 move $5,$0是寄存器到寄存器的移動,由第一個替代(dGd)描述。還有第三種選擇,從寄存器到內存。這也通過設置爲set_attr "move_type" "move,load,store"move_type屬性來指示。