以下のアセンブリ言語で書かれた関数をC言語風に書き直したいです。

関数内で同じ関数を呼び出しているので再帰処理をしているところまでは分かるのですが、再帰を抜け出す条件と再帰内で何を計算しているのかが分かりません。

どなたか教えていただけないでしょうか。

/* <+0> ~ <+9> 再帰の終了条件 */
0x00000000004010ac <+0>:    test   %edi,%edi  
0x00000000004010ae <+2>:    jle    0x4010db <func4+47> /* もしedi<=0なら再帰終了*/ 
0x00000000004010b0 <+4>:    mov    %esi,%eax 
0x00000000004010b2 <+6>:    cmp    $0x1,%edi 
0x00000000004010b5 <+9>:    je     0x4010e5 <func4+57> /* もしedi=1なら再帰終了, 戻り値はARG2(%eax) */

/* <+11> ~ <+14> で呼出先退避レジスタの値をスタックに退避 */
0x00000000004010b7 <+11>:   push   %r12
0x00000000004010b9 <+13>:   push   %rbp
0x00000000004010ba <+14>:   push   %rbx /* <+11> ~ <+14>

/* <+15> ~ <+17> 引数の値を破壊されないよう安全なレジスタへ退避する
0x00000000004010bb <+15>:   mov    %esi,%ebp /* ARG2 */
0x00000000004010bd <+17>:   mov    %edi,%ebx /* ARG1 */

/* <+19> ~ <+22> func4(ARG1-1, ARG2)で再帰呼出
0x00000000004010bf <+19>:   lea    -0x1(%rdi),%edi /* ARG1=%rdi(ARG1)-1 */
0x00000000004010c2 <+22>:   callq  0x4010ac <func4> 

/* <+27> %r12d=func4一回目の戻り値*1+ARG2+0 */
0x00000000004010c7 <+27>:   lea    0x0(%rbp,%rax,1),%r12d

/* <+32> ~ <+35> func4(ARG1-2, ARG2)で再帰呼出 */
0x00000000004010cc <+32>:   lea    -0x2(%rbx),%edi /* ARG1=%rbx(ARG1)-2 */
0x00000000004010cf <+35>:   mov    %ebp,%esi /* ARG2 */
0x00000000004010d1 <+37>:   callq  0x4010ac <func4>

/* <+42> 戻り値=(func4一回目の戻り値*1+ARG2+0)+ARG2 */
0x00000000004010d6 <+42>:   add    %r12d,%eax
0x00000000004010d9 <+45>:   jmp    0x4010e1 <func4+53>

/* <+47> ~ <+52> edi<=0の時に0をreturn
0x00000000004010db <+47>:   mov    $0x0,%eax
0x00000000004010e0 <+52>:   retq   

/* <+53> ~ <+55> 退避した呼出先退避レジスタの値をスタックから回収 */
0x00000000004010e1 <+53>:   pop    %rbx
0x00000000004010e2 <+54>:   pop    %rbp
0x00000000004010e3 <+55>:   pop    %r12
0x00000000004010e5 <+57>:   repz retq