December 31, 2004

new CL.EXE bug...orz

When I use /O2 option for CL.EXE, it seems to generate bad code...

0:000>u nspr4!dosprintf
nspr4!dosprintf
00000000`30009650 488bc4           mov     rax,rsp
00000000`30009653 4881ec08020000   sub     rsp,0x208
00000000`3000965a 488958f8         mov     [rax-0x8],rbx
00000000`3000965e 488968f0         mov     [rax-0x10],rbp
00000000`30009662 4c8960d8         mov     [rax-0x28],r12
00000000`30009666 4d8be0           mov     r12,r8
00000000`30009669 488bda           mov     rbx,rdx
00000000`3000966c 488be9           mov     rbp,rcx
00000000`3000966f 4c8d4c2470       lea     r9,[rsp+0x70]
00000000`30009674 4c8d442450       lea     r8,[rsp+0x50]
00000000`30009679 498bd4           mov rdx,r12
00000000`3000967c 488bcb           mov  rcx,rbx
00000000`3000967f 4c8970c8         mov     [rax-0x38],r14
00000000`30009683 48c744244800000000 mov   qword ptr [rsp+0x48],0x0
00000000`3000968c e8bffaffff      call    nspr4!BuildArgArray (0000000030009150)
00000000`30009691 8b542450         mov edx,[rsp+0x50]
00000000`30009695 85d2             test    edx,edx
00000000`30009697 4c8bf0           mov     r14,rax
00000000`3000969a 7907            jns nspr4!dosprintf+0x53 (00000000300096a3)
00000000`3000969c 8bc2             mov     eax,edx
00000000`3000969e e94c060000     jmp nspr4!dosprintf+0x69f (0000000030009cef)
00000000`300096a3 0fb603           movzx   eax,byte ptr [rbx]
00000000`300096a6 4889b424f0010000 mov     [rsp+0x1f0],rsi
00000000`300096ae 4889bc24e8010000 mov     [rsp+0x1e8],rdi
00000000`300096b6 84c0             test    al,al
00000000`300096b8 4c89ac24d8010000 mov     [rsp+0x1d8],r13
00000000`300096c0 4c89bc24c8010000 mov     [rsp+0x1c8],r15
00000000`300096c8 660f7fb424b0010000 movdqa oword ptr [rsp+0x1b0],xmm6
00000000`300096d1 0f84c1050000    je nspr4!dosprintf+0x648 (0000000030009c98)
00000000`300096d7 4c8b7c2448       mov r15,[rsp+0x48]
00000000`300096dc 66666690         nop
00000000`300096e0 48ffc3           inc rbx

If xmm8 is uninitalized, Athlon64 throws error such as AV.

When I use /Od, ...

0:000> u nspr4!dosprintf
nspr4!dosprintf
00000000`3000a4f0 4c89442418 mov     [rsp+0x18],r8
00000000`3000a4f5 4889542410       mov [rsp+0x10],rdx
00000000`3000a4fa 48894c2408       mov     [rsp+0x8],rcx
00000000`3000a4ff 4881ec58020000 sub rsp,0x258
00000000`3000a506 48c784248000000000000000 mov qword ptr [rsp+0x80],0x0
00000000`3000a512 48c78424f801000000000000 mov qword ptr [rsp+0x1f8],0x0
00000000`3000a51e 4c8d8c24a0000000 lea r9,[rsp+0xa0]
00000000`3000a526 4c8d8424e0010000 lea r8,[rsp+0x1e0]
00000000`3000a52e 488b942470020000 mov rdx,[rsp+0x270]
00000000`3000a536 488b8c2468020000 mov rcx,[rsp+0x268]
00000000`3000a53e e84d1e0000      call nspr4!BuildArgArray (000000003000c390)
00000000`3000a543 4889842480000000 mov [rsp+0x80],rax
00000000`3000a54b 83bc24e001000000 cmp     dword ptr [rsp+0x1e0],0x0
00000000`3000a553 7d0c            jge nspr4!dosprintf+0x71 (000000003000a561)
00000000`3000a555 8b8424e0010000 mov eax,[rsp+0x1e0]
00000000`3000a55c e95e0f0000     jmp nspr4!dosprintf+0xfcf (000000003000b4bf)
00000000`3000a561 488b842468020000 mov rax,[rsp+0x268]
00000000`3000a569 0fb600 movzx eax,byte ptr [rax]
00000000`3000a56c 888424f0010000 mov [rsp+0x1f0],al
00000000`3000a573 0fbe8424f0010000 movsx   eax,byte ptr [rsp+0x1f0]
00000000`3000a57b 488b8c2468020000 mov     rcx,[rsp+0x268]
00000000`3000a583 48ffc1 inc rcx
00000000`3000a586 48898c2468020000 mov [rsp+0x268],rcx
00000000`3000a58e 85c0             test eax,eax
00000000`3000a590 0f84c60e0000    je nspr4!dosprintf+0xf6c (000000003000b45c)

This is right code. This is a bug of CL.EXE...

Trackback URL: http://oldskool.s60.coreserver.jp/www.mozilla-x86-64.com/mt/mt-tb.cgi/33