develooper 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


nntp.perl.org: Perl Programming lists via nntp and http.
Comments to Ask Bjørn Hansen at ask@perl.org | Group listing | About