2014-11-05 58 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属性来指示。