бесконечные
Код:
0x4054fba 89 5d fc mov [ebp-4],ebx <= spill parami1
0x4054fbd 89 75 f8 mov [ebp-8],esi <= spill parami2
0x4054fc0 89 7d f4 mov [ebp-12],edi <= spill parami3
это артефакт кодогена для «callee-saved registers». однако жёстко соблюдать x86 ABI смысла никакого нет: оно надо только для колбэков, а всё остальное перетопчется. потому добавил в Nanojit ABI без этих сохранений. код получился покрасивей:
Код:
building code for `Mth0` () [FASTCALL_NO_SAVE].
=== Aggregated assembly output: BEGIN
===
0x4054fbd [prologue]
0x4054fbd 55 push ebp
0x4054fbe 8b ec mov ebp,esp
0x4054fc0 [frag entry]
0x4054fc0 83 ec 08 sub esp,8
0x4054fc3 89 4d fc mov [ebp-4],ecx <= spill parami1
------------------------------ # n0test_rec_mth_ptr_01:Mth0
0x4054fc6 b9 2c fd d2 04 mov ecx,80936236
0x4054fcb e8 70 5f 07 04 call Log:String
0x4054fd0 8b 5d fc mov ebx,[ebp-4] <= restore parami1
0x4054fd3 8b 0b mov ecx,[ebx+0]
0x4054fd5 e8 46 5f 07 04 call Log:Int
0x4054fda e8 91 5f 07 04 call Log:Ln
0x4054fdf 8b 4d fc mov ecx,[ebp-4] <= restore parami1
0x4054fe2 c7 01 9a 02 00 00 mov [ecx+0],666
0x4054fe8 8b e5 mov esp,ebp
0x4054fea 5d pop ebp
0x4054feb c3 ret
===
=== Aggregated assembly output: END
================================================================================
building code for `StrTest0` () [CDECL_NO_SAVE].
=== Aggregated assembly output: BEGIN
===
0x4054f03 [prologue]
0x4054f03 55 push ebp
0x4054f04 8b ec mov ebp,esp
0x4054f06 [frag entry]
0x4054f06 83 ec 08 sub esp,8
0x4054f09 8b 75 08 mov esi,[ebp+8]
------------------------------ # n0test_rec_mth_ptr_01:StrTest0
------------------------------ # incref(ctor) string var
0x4054f0c 85 f6 test esi,esi
0x4054f0e 74 0f je 0x4054f1f
0x4054f10 8b 1e mov ebx,[esi+0]
0x4054f12 81 fb 65 fd ff ff cmp ebx,-667
0x4054f18 74 05 je 0x4054f1f
0x4054f1a 8d 5b 01 lea ebx,[ebx+1]
0x4054f1d 89 1e mov [esi+0],ebx
0x4054f1f [label1]
0x4054f1f 8d 55 08 lea edx,[ebp+8]
0x4054f22 33 c9 xor ecx,ecx
0x4054f24 e8 57 59 07 04 call (DSTR-CAT)
0x4054f29 8b c8 mov ecx,eax
------------------------------ # allocating no-dtor temp string var
0x4054f2b 8d 55 fc lea edx,[ebp-4] <= restore allocp1
0x4054f2e c7 45 fc 48 fd d2 04 mov [ebp-4],80936264
0x4054f35 e8 46 59 07 04 call (DSTR-CAT)
0x4054f3a 8d 4d 08 lea ecx,[ebp+8] <= restore pparami1
0x4054f3d 89 45 fc mov [ebp-4],eax
0x4054f40 8d 55 fc lea edx,[ebp-4]
0x4054f43 e8 d8 56 07 04 call (DSTR-ASS)
0x4054f48 8d 4d fc lea ecx,[ebp-4] <= restore allocp2
------------------------------ # freeing temp string var
------------------------------ # decref(dtor) string var
0x4054f4b 8b 75 fc mov esi,[ebp-4]
0x4054f4e 85 f6 test esi,esi
0x4054f50 74 18 je 0x4054f6a
0x4054f52 8b 1e mov ebx,[esi+0]
0x4054f54 81 fb 65 fd ff ff cmp ebx,-667
0x4054f5a 74 0e je 0x4054f6a
0x4054f5c 8d 5b ff lea ebx,[ebx-1]
0x4054f5f 89 1e mov [esi+0],ebx
0x4054f61 85 db test ebx,ebx
0x4054f63 75 05 jne 0x4054f6a
0x4054f65 e8 16 54 07 04 call (DSTR-DEALLOC)
0x4054f6a [label2]
0x4054f6a b9 60 fd d2 04 mov ecx,80936288
0x4054f6f e8 cc 5f 07 04 call Log:String
0x4054f74 8d 5d 08 lea ebx,[ebp+8]
0x4054f77 8b 0b mov ecx,[ebx+0]
0x4054f79 e8 c2 5f 07 04 call Log:String
0x4054f7e e8 ed 5f 07 04 call Log:Ln
0x4054f83 8d 4d 08 lea ecx,[ebp+8]
------------------------------ # decref(dtor) string var
0x4054f86 8b 31 mov esi,[ecx+0]
0x4054f88 85 f6 test esi,esi
0x4054f8a 74 18 je 0x4054fa4
0x4054f8c 8b 1e mov ebx,[esi+0]
0x4054f8e 81 fb 65 fd ff ff cmp ebx,-667
0x4054f94 74 0e je 0x4054fa4
0x4054f96 8d 5b ff lea ebx,[ebx-1]
0x4054f99 89 1e mov [esi+0],ebx
0x4054f9b 85 db test ebx,ebx
0x4054f9d 75 05 jne 0x4054fa4
0x4054f9f e8 dc 53 07 04 call (DSTR-DEALLOC)
0x4054fa4 [label3]
0x4054fa4 8b e5 mov esp,ebp
0x4054fa6 5d pop ebp
0x4054fa7 c3 ret
===
=== Aggregated assembly output: END
================================================================================
building code for `(OPEN)` () [FASTCALL].
=== Aggregated assembly output: BEGIN
===
0x4054dca [prologue]
0x4054dca 55 push ebp
0x4054dcb 8b ec mov ebp,esp
0x4054dcd [frag entry]
0x4054dcd 83 ec 18 sub esp,24
0x4054dd0 89 5d fc mov [ebp-4],ebx <= spill parami1
0x4054dd3 89 75 f8 mov [ebp-8],esi <= spill parami2
0x4054dd6 89 7d f4 mov [ebp-12],edi <= spill parami3
------------------------------ # n0test_rec_mth_ptr_01:(OPEN)
0x4054dd9 8b 1d 28 fd d2 04 mov ebx,[0x4d2fd28]
0x4054ddf 85 db test ebx,ebx
0x4054de1 74 20 je 0x4054e03
------------------------------ # allocating no-dtor temp string var
0x4054de3 c7 45 f0 7c fd d2 04 mov [ebp-16],80936316
0x4054dea c7 04 24 8c fd d2 04 mov [esp+0],80936332
0x4054df1 ba 22 00 00 00 mov edx,34
0x4054df6 b9 c0 5b d2 04 mov ecx,80894912
0x4054dfb e8 20 56 07 04 call (ASSERT-FAILURE)
0x4054e00 83 ec 04 sub esp,4
0x4054e03 [label1]
0x4054e03 b9 f8 8a d2 04 mov ecx,80907000
0x4054e08 e8 73 56 07 04 call (NEW-REC)
0x4054e0d 89 05 28 fd d2 04 mov [0+80936232],eax
0x4054e13 8b 1d 28 fd d2 04 mov ebx,[0x4d2fd28]
0x4054e19 85 db test ebx,ebx
0x4054e1b 75 20 jne 0x4054e3d
------------------------------ # allocating no-dtor temp string var
0x4054e1d c7 45 f0 98 fd d2 04 mov [ebp-16],80936344
0x4054e24 c7 04 24 a8 fd d2 04 mov [esp+0],80936360
0x4054e2b ba 24 00 00 00 mov edx,36
0x4054e30 b9 c0 5b d2 04 mov ecx,80894912
0x4054e35 e8 e6 55 07 04 call (ASSERT-FAILURE)
0x4054e3a 83 ec 04 sub esp,4
0x4054e3d [label2]
0x4054e3d 8b 1d 28 fd d2 04 mov ebx,[0x4d2fd28]
0x4054e43 c7 03 45 00 00 00 mov [ebx+0],69
0x4054e49 b9 b4 fd d2 04 mov ecx,80936372
0x4054e4e e8 ed 60 07 04 call Log:String
0x4054e53 8b 1d 28 fd d2 04 mov ebx,[0x4d2fd28]
0x4054e59 8b 0b mov ecx,[ebx+0]
0x4054e5b e8 c0 60 07 04 call Log:Int
0x4054e60 e8 0b 61 07 04 call Log:Ln
0x4054e65 8b 0d 28 fd d2 04 mov ecx,[0x4d2fd28]
0x4054e6b ba 08 8a d2 04 mov edx,80906760
0x4054e70 e8 eb 59 07 04 call (IS-A-PTR)
0x4054e75 85 c0 test eax,eax
0x4054e77 74 0c je 0x4054e85
0x4054e79 b9 d4 fd d2 04 mov ecx,80936404
0x4054e7e e8 bd 60 07 04 call Log:String
0x4054e83 eb 0a jmp 0x4054e8f
0x4054e85 [label3]
0x4054e85 b9 ec fd d2 04 mov ecx,80936428
0x4054e8a e8 b1 60 07 04 call Log:String
0x4054e8f [label4]
0x4054e8f e8 dc 60 07 04 call Log:Ln
0x4054e94 8d 55 f0 lea edx,[ebp-16] <= restore allocp2
0x4054e97 8b 0d 28 fd d2 04 mov ecx,[0x4d2fd28]
0x4054e9d 8d 49 04 lea ecx,[ecx+4]
------------------------------ # allocating no-dtor temp string var
0x4054ea0 c7 45 f0 08 fe d2 04 mov [ebp-16],80936456
0x4054ea7 e8 74 57 07 04 call (DSTR-ASS)
0x4054eac 8b 0d 28 fd d2 04 mov ecx,[0x4d2fd28]
0x4054eb2 e8 06 01 00 00 call n0test_rec_mth_ptr_01:Mth0
0x4054eb7 b9 20 fe d2 04 mov ecx,80936480
0x4054ebc e8 7f 60 07 04 call Log:String
0x4054ec1 8b 1d 28 fd d2 04 mov ebx,[0x4d2fd28]
0x4054ec7 8b 0b mov ecx,[ebx+0]
0x4054ec9 e8 52 60 07 04 call Log:Int
0x4054ece e8 9d 60 07 04 call Log:Ln
0x4054ed3 c7 04 24 40 fe d2 04 mov [esp+0],80936512
0x4054eda e8 24 00 00 00 call n0test_rec_mth_ptr_01:StrTest0
0x4054edf 8b 7d f4 mov edi,[ebp-12] <= restore parami3
0x4054ee2 8b 75 f8 mov esi,[ebp-8] <= restore parami2
0x4054ee5 8b 5d fc mov ebx,[ebp-4] <= restore parami1
0x4054ee8 8b e5 mov esp,ebp
0x4054eea 5d pop ebp
0x4054eeb c3 ret
===
=== Aggregated assembly output: END
================================================================================
building code for `(CLOSE)` () [FASTCALL].
=== Aggregated assembly output: BEGIN
===
0x4054d42 [prologue]
0x4054d42 55 push ebp
0x4054d43 8b ec mov ebp,esp
0x4054d45 [frag entry]
0x4054d45 83 ec 18 sub esp,24
0x4054d48 89 5d fc mov [ebp-4],ebx <= spill parami1
0x4054d4b 89 75 f8 mov [ebp-8],esi <= spill parami2
0x4054d4e 89 7d f4 mov [ebp-12],edi <= spill parami3
------------------------------ # n0test_rec_mth_ptr_01:(CLOSE)
0x4054d51 b9 58 fe d2 04 mov ecx,80936536
0x4054d56 e8 e5 61 07 04 call Log:String
0x4054d5b 8b 0d 28 fd d2 04 mov ecx,[0x4d2fd28]
0x4054d61 b8 04 00 00 00 mov eax,4
0x4054d66 8b 0c 01 mov ecx,[ecx+eax*1+0]
0x4054d69 e8 d2 61 07 04 call Log:String
0x4054d6e e8 fd 61 07 04 call Log:Ln
0x4054d73 8b 0d 28 fd d2 04 mov ecx,[0x4d2fd28]
0x4054d79 8d 49 04 lea ecx,[ecx+4]
0x4054d7c 33 d2 xor edx,edx
0x4054d7e e8 9d 58 07 04 call (DSTR-ASS)
0x4054d83 8b 0d 28 fd d2 04 mov ecx,[0x4d2fd28]
0x4054d89 8d 49 04 lea ecx,[ecx+4]
------------------------------ # allocating no-dtor temp string var
0x4054d8c 8d 55 f0 lea edx,[ebp-16] <= restore allocp1
0x4054d8f c7 45 f0 74 fe d2 04 mov [ebp-16],80936564
0x4054d96 e8 85 58 07 04 call (DSTR-ASS)
0x4054d9b 8b 0d 28 fd d2 04 mov ecx,[0x4d2fd28]
0x4054da1 e8 fa 57 07 04 call (DISPOSE-REC)
0x4054da6 c7 05 28 fd d2 04 00 00 00 00 mov [(null)+80936232],0
0x4054db0 8b e5 mov esp,ebp
0x4054db2 5d pop ebp
0x4054db3 c3 ret
===
=== Aggregated assembly output: END
================================================================================
правда, Nanojit теперь стал активно использовать ESI. не то чтобы это имело значение, но надо посмотреть, можно ли нано сказать, чтобы ESI/EDI трогал в последнюю очередь. чисто для красоты, тащемта.