Front page | perl.perl5.porters |
Postings from January 2013
Re: I think b630937 (SvUOK docs) is wrong
Thread Previous
|
Thread Next
From:
bulk88
Date:
January 14, 2013 23:29
Subject:
Re: I think b630937 (SvUOK docs) is wrong
Message ID:
BLU0-SMTP196D4EE401282D062761F16DF2E0@phx.gbl
Dave Mitchell wrote:
>
> It would also be good if someone could compare the assembly produced by say
>
> if(SvUOK) { ... }
>
> and
>
> if(cBOOL(SvUOK)) { ... }
>
> and see if the second is less efficient.
>
______________________________________________________________
void
SvUOKtest(sv)
SV * sv
PPCODE:
if(SvUOK(sv)) {
printf("I am SvUOK\n");
}
else {
printf("I am not SvUOK\n");
}
void
cBOOLSvUOKtest(sv)
SV * sv
PPCODE:
if(cBOOL(SvUOK(sv))) {
printf("I am cBOOLSvUOKtest\n");
}
else {
printf("I am not cBOOLSvUOKtest\n");
}
______________________________________________________________
3484: XS_EUPXS(XS_Local__XS_SvUOKtest); /* prototype to pass
-Wmissing-prototypes */
3485: XS_EUPXS(XS_Local__XS_SvUOKtest)
3486: {
003C5E5B 53 push ebx
003C5E5C 56 push esi
3487: dVAR; dXSARGS;
003C5E5D 8B 74 24 0C mov esi,dword ptr [esp+0Ch]
003C5E61 8B 46 48 mov eax,dword ptr [esi+48h]
003C5E64 8B 08 mov ecx,dword ptr [eax]
003C5E66 8B 56 0C mov edx,dword ptr [esi+0Ch]
003C5E69 83 C0 FC add eax,0FFFFFFFCh
003C5E6C 89 46 48 mov dword ptr [esi+48h],eax
003C5E6F 57 push edi
003C5E70 8B 3E mov edi,dword ptr [esi]
003C5E72 8B D9 mov ebx,ecx
003C5E74 C1 E3 02 shl ebx,2
003C5E77 8B C7 mov eax,edi
003C5E79 2B C3 sub eax,ebx
003C5E7B 2B C2 sub eax,edx
003C5E7D C1 F8 02 sar eax,2
3488: if (items != 1)
003C5E80 83 F8 01 cmp eax,1
003C5E83 74 0F je $L118730 (3C5E94h)
3489: croak_xs_usage(cv, "sv");
003C5E85 68 A4 8A 3C 00 push offset string "sv" (3C8AA4h)
003C5E8A FF 74 24 18 push dword ptr [esp+18h]
003C5E8E FF 15 08 71 3C 00 call dword ptr
[__imp__Perl_croak_xs_usage (3C7108h)]
3490: PERL_UNUSED_VAR(ax); /* -Wall */
3491: SP -= items;
3492: {
3493: SV * sv = ST(0)
3494: ;
3495: if(SvUOK(sv)) {
003C5E94 8B 44 8A 04 mov eax,dword ptr [edx+ecx*4+4]
003C5E98 8B 48 08 mov ecx,dword ptr [eax+8]
003C5E9B B8 00 01 00 80 mov eax,80000100h
003C5EA0 23 C8 and ecx,eax
003C5EA2 83 EF 04 sub edi,4
003C5EA5 3B C8 cmp ecx,eax
003C5EA7 75 07 jne $L118730+1Ch (3C5EB0h)
3496: printf("I am SvUOK\n");
003C5EA9 68 CC 80 3C 00 push offset string "I am SvUOK\n"
(3C80CCh)
3497: }
3498: else {
003C5EAE EB 05 jmp $L118730+21h (3C5EB5h)
3499: printf("I am not SvUOK\n");
003C5EB0 68 BC 80 3C 00 push offset string "I am not SvUOK\n"
(3C80BCh)
003C5EB5 FF 15 B4 70 3C 00 call dword ptr [__imp__printf (3C70B4h)]
003C5EBB 59 pop ecx
3500: }
3501: PUTBACK;
003C5EBC 89 3E mov dword ptr [esi],edi
003C5EBE 5F pop edi
003C5EBF 5E pop esi
003C5EC0 5B pop ebx
3502: return;
3503: }
3504: }
003C5EC1 C3 ret
3505:
3506:
3507: XS_EUPXS(XS_Local__XS_cBOOLSvUOKtest); /* prototype to pass
-Wmissing-prototypes */
3508: XS_EUPXS(XS_Local__XS_cBOOLSvUOKtest)
3509: {
003C5EC2 53 push ebx
003C5EC3 56 push esi
3510: dVAR; dXSARGS;
003C5EC4 8B 74 24 0C mov esi,dword ptr [esp+0Ch]
003C5EC8 8B 46 48 mov eax,dword ptr [esi+48h]
003C5ECB 8B 08 mov ecx,dword ptr [eax]
003C5ECD 8B 56 0C mov edx,dword ptr [esi+0Ch]
003C5ED0 83 C0 FC add eax,0FFFFFFFCh
003C5ED3 89 46 48 mov dword ptr [esi+48h],eax
003C5ED6 57 push edi
003C5ED7 8B 3E mov edi,dword ptr [esi]
003C5ED9 8B D9 mov ebx,ecx
003C5EDB C1 E3 02 shl ebx,2
003C5EDE 8B C7 mov eax,edi
003C5EE0 2B C3 sub eax,ebx
003C5EE2 2B C2 sub eax,edx
003C5EE4 C1 F8 02 sar eax,2
3511: if (items != 1)
003C5EE7 83 F8 01 cmp eax,1
003C5EEA 74 0F je $L118724 (3C5EFBh)
3512: croak_xs_usage(cv, "sv");
003C5EEC 68 A4 8A 3C 00 push offset string "sv" (3C8AA4h)
003C5EF1 FF 74 24 18 push dword ptr [esp+18h]
003C5EF5 FF 15 08 71 3C 00 call dword ptr
[__imp__Perl_croak_xs_usage (3C7108h)]
3513: PERL_UNUSED_VAR(ax); /* -Wall */
3514: SP -= items;
3515: {
3516: SV * sv = ST(0)
3517: ;
3518: if(cBOOL(SvUOK(sv))) {
003C5EFB 8B 44 8A 04 mov eax,dword ptr [edx+ecx*4+4]
003C5EFF 8B 48 08 mov ecx,dword ptr [eax+8]
003C5F02 B8 00 01 00 80 mov eax,80000100h
003C5F07 23 C8 and ecx,eax
003C5F09 83 EF 04 sub edi,4
003C5F0C 3B C8 cmp ecx,eax
003C5F0E 75 07 jne $L118724+1Ch (3C5F17h)
3519: printf("I am cBOOLSvUOKtest\n");
003C5F10 68 A4 80 3C 00 push offset string "I am
cBOOLSvUOKtest\n" (3C80A4h)
3520: }
3521: else {
003C5F15 EB 05 jmp $L118724+21h (3C5F1Ch)
3522: printf("I am not cBOOLSvUOKtest\n");
003C5F17 68 88 80 3C 00 push offset string "I am not
cBOOLSvUOKtest\n" (3C8088h)
003C5F1C FF 15 B4 70 3C 00 call dword ptr [__imp__printf (3C70B4h)]
003C5F22 59 pop ecx
3523: }
3524: PUTBACK;
003C5F23 89 3E mov dword ptr [esi],edi
003C5F25 5F pop edi
003C5F26 5E pop esi
003C5F27 5B pop ebx
3525: return;
3526: }
3527: }
003C5F28 C3 ret
________________________________________________________________________
It is the same. Compiled on 32 bit VC 2003 with " 'OPTIMIZE' => '
-O1 -G7 -GL -Oi -Og -arch::SSE2 '".
davem, do you have an opinion on khw's
> What would the implications be of changing the macro to match the prior
> documentation, and return true if it is indeed SvIOK with a positive
> number?
which I understand to mean adding lt/gt check against the UV/IV in SvUOK
macro?
Thread Previous
|
Thread Next