Mercurial > pub > dyncall > dyncall
comparison doc/disas_examples/mips64.n64.disas @ 499:fc614cb865c6
- doc and disasexample additions specific to non-trivial C++ aggregates as return values (incl. fixes to doc and additional LSB specific PPC32 section)
author | Tassilo Philipp |
---|---|
date | Mon, 04 Apr 2022 15:50:52 +0200 |
parents | fd9ba3a6d348 |
children |
comparison
equal
deleted
inserted
replaced
498:fd9ba3a6d348 | 499:fc614cb865c6 |
---|---|
3344 | 3344 |
3345 ; ... snip, removed code of ctor and copy ctor ... | 3345 ; ... snip, removed code of ctor and copy ctor ... |
3346 | 3346 |
3347 | 3347 |
3348 | 3348 |
3349 ; ---------- C++ trivial and non-trivial aggrs as return values ----------> | |
3350 ; | |
3351 ; struct Trivial { int a; }; | |
3352 ; struct NonTrivial { int a; NonTrivial() : a(0) {} NonTrivial(const NonTrivial& rhs) : a(rhs.a) { } }; | |
3353 ; | |
3354 ; extern "C" { | |
3355 ; struct Trivial f1() { return Trivial(); } | |
3356 ; } | |
3357 ; | |
3358 ; struct NonTrivial f2() { return NonTrivial(); } | |
3359 ; | |
3360 ; extern "C" { | |
3361 ; void f() | |
3362 ; { | |
3363 ; int a=1; | |
3364 ; a += 123; | |
3365 ; struct Trivial t = f1(); | |
3366 ; a -= 123; | |
3367 ; struct NonTrivial n = f2(); | |
3368 ; a -= 12; | |
3369 ; } | |
3370 ; } | |
3371 | |
3372 | |
3373 | |
3374 ; output from freebsd-12.0_r333647-malta_mips64ebhf w/ gcc 4.2.1 | |
3375 | |
3376 0000000120000b60 <f1>: | |
3377 120000b60: 67bdfff0 daddiu sp,sp,-16 | |
3378 120000b64: ffbe0008 sd s8,8(sp) | |
3379 120000b68: ffbc0000 sd gp,0(sp) | |
3380 120000b6c: 03a0f02d move s8,sp | |
3381 120000b70: 3c1c0002 lui gp,0x2 | |
3382 120000b74: 0399e02d daddu gp,gp,t9 | |
3383 120000b78: 679c8320 daddiu gp,gp,-31968 | |
3384 120000b7c: 0000102d move v0,zero | |
3385 120000b80: 0002103c dsll32 v0,v0,0x0 | |
3386 120000b84: 03c0e82d move sp,s8 | |
3387 120000b88: dfbe0008 ld s8,8(sp) | |
3388 120000b8c: dfbc0000 ld gp,0(sp) | |
3389 120000b90: 03e00008 jr ra | |
3390 120000b94: 67bd0010 daddiu sp,sp,16 | |
3391 | |
3392 0000000120000b98 <_Z2f2v>: | |
3393 120000b98: 67bdffe0 daddiu sp,sp,-32 | |
3394 120000b9c: ffbf0018 sd ra,24(sp) | |
3395 120000ba0: ffbe0010 sd s8,16(sp) | |
3396 120000ba4: ffbc0008 sd gp,8(sp) | |
3397 120000ba8: ffb00000 sd s0,0(sp) | |
3398 120000bac: 03a0f02d move s8,sp | |
3399 120000bb0: 3c1c0002 lui gp,0x2 | |
3400 120000bb4: 0399e02d daddu gp,gp,t9 | |
3401 120000bb8: 679c82e8 daddiu gp,gp,-32024 | |
3402 120000bbc: 0080802d move s0,a0 | |
3403 120000bc0: 0200102d move v0,s0 | |
3404 120000bc4: 0040202d move a0,v0 | |
3405 120000bc8: df9980e0 ld t9,-32544(gp) | |
3406 120000bcc: 0320f809 jalr t9 | |
3407 120000bd0: 00000000 nop | |
3408 120000bd4: 0200102d move v0,s0 ; ptr to retval space -> v0 | |
3409 120000bd8: 03c0e82d move sp,s8 | |
3410 120000bdc: dfbf0018 ld ra,24(sp) | |
3411 120000be0: dfbe0010 ld s8,16(sp) | |
3412 120000be4: dfbc0008 ld gp,8(sp) | |
3413 120000be8: dfb00000 ld s0,0(sp) | |
3414 120000bec: 03e00008 jr ra | |
3415 120000bf0: 67bd0020 daddiu sp,sp,32 | |
3416 120000bf4: 00000000 nop | |
3417 | |
3418 0000000120000bf8 <f>: | |
3419 120000bf8: 67bdffd0 daddiu sp,sp,-48 ; | |
3420 120000bfc: ffbf0020 sd ra,32(sp) ; | |
3421 120000c00: ffbe0018 sd s8,24(sp) ; | |
3422 120000c04: ffbc0010 sd gp,16(sp) ; | |
3423 120000c08: 03a0f02d move s8,sp ; | |
3424 120000c0c: 3c1c0002 lui gp,0x2 ; | |
3425 120000c10: 0399e02d daddu gp,gp,t9 ; | |
3426 120000c14: 679c8288 daddiu gp,gp,-32120 ; | |
3427 120000c18: 24020001 li v0,1 ; | |
3428 120000c1c: afc20000 sw v0,0(s8) ; | |
3429 120000c20: 8fc20000 lw v0,0(s8) ; | |
3430 120000c24: 2442007b addiu v0,v0,123 ; | |
3431 120000c28: afc20000 sw v0,0(s8) ; | |
3432 120000c2c: df9980d8 ld t9,-32552(gp) ; | call f1() | |
3433 120000c30: 0320f809 jalr t9 ; | | |
3434 120000c34: 00000000 nop ; | |
3435 120000c38: 0002103f dsra32 v0,v0,0x0 ; | returned via reg v0, as small and trivial | |
3436 120000c3c: afc20004 sw v0,4(s8) ; | | |
3437 120000c40: 8fc20000 lw v0,0(s8) ; | |
3438 120000c44: 2442ff85 addiu v0,v0,-123 ; | |
3439 120000c48: afc20000 sw v0,0(s8) ; | |
3440 120000c4c: 67c20008 daddiu v0,s8,8 ; | |
3441 120000c50: 0040202d move a0,v0 ; hidden first arg (ptr to space for ret val) | |
3442 120000c54: df9980e8 ld t9,-32536(gp) ; | call f2() | |
3443 120000c58: 0320f809 jalr t9 ; | | |
3444 120000c5c: 00000000 nop ; | |
3445 120000c60: 8fc20000 lw v0,0(s8) ; | |
3446 120000c64: 2442fff4 addiu v0,v0,-12 ; | |
3447 120000c68: afc20000 sw v0,0(s8) ; | |
3448 120000c6c: 03c0e82d move sp,s8 ; | |
3449 120000c70: dfbf0020 ld ra,32(sp) ; | |
3450 120000c74: dfbe0018 ld s8,24(sp) ; | |
3451 120000c78: dfbc0010 ld gp,16(sp) ; | |
3452 120000c7c: 03e00008 jr ra ; | |
3453 120000c80: 67bd0030 daddiu sp,sp,48 ; | |
3454 120000c84: 00000000 nop ; | |
3455 | |
3456 | |
3457 | |
3349 ; vim: ft=asm | 3458 ; vim: ft=asm |
3350 | 3459 |