hi,
   I'm having some trouble while understanding the generated assembly
code for trampoline by mips back-end.

Following is the code for which i'm trying to undertsand the generated
trampoline code.

int foo(int (*f)()){
       (*f)();
}
main(){
       int i;
       int g(){printf("hello,%d",i);}
       foo(g);
}

Parts of generated assembly code which are confusing are

$LTRAMP0:
       .word   0x03e00821              # move   $1,$31
       .word   0x04110001              # bgezal $0,.+8
       .word   0x00000000              # nop
       .word   0x8fe30014              # lw     $3,20($31)
       .word   0x8fe20018              # lw     $2,24($31)
       .word   0x0060c821              # move   $25,$3 (abicalls)
       .word   0x00600008              # jr     $3
       .word   0x0020f821              # move   $31,$1
       .word   0x00000000              # <function address>
       .word   0x00000000              # <static chain value>
       .globl  _flush_cache

main:
       - - - - - - - - - - - -
       addiu   $sp,$sp,-80
       sw      $31,72($sp)
       sw      $fp,68($sp)
       sw      $16,64($sp)
       move    $fp,$sp
       addiu   $2,$fp,20
       addiu   $16,$2,4
       lui     $2,%hi($LTRAMP0)
       move    $3,$16
       addiu   $2,$2,%lo($LTRAMP0)
       li      $5,40                   # 0x28
       move    $4,$2
       jal     memcpy
       nop

       lui     $2,%hi(g.1238)
       addiu   $2,$2,%lo(g.1238)
       sw      $2,32($16)
       move    $3,$16
       li      $4,40                   # 0x28
       li      $5,3                    # 0x3
       jal     _flush_cache
       nop

       addiu   $2,$fp,20
       addiu   $2,$2,4
       move    $3,$2
       jal     foo
       nop


A bit of explaination of above code will be helpful

Reply via email to