qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Qemu-devel] x86 tcg problem


From: Vince Weaver
Subject: [Qemu-devel] x86 tcg problem
Date: Mon, 28 Jul 2008 23:32:15 -0400 (EDT)

Hello

I've spent a day now trying to figure out why bzip2 compress/decompress doesn't work when using sparc32plus-linux-user on x86.

I've tracked the problem to the Zero flag being improperly set (attached is a small exe/src that reproduces the problem.. it reports "Greater"
on real hardware, "Less Than" on qemu current).

The issue seems to be a misordering of an x86 sub instruction. I tried to track this down in the tcg code but I quickly got lost.

The code does this for a compare (on sparc the compare turns into a subtract with result as the [ignores] zero reg):

 mov_i32 cc_src_0,g4_0                          ;
 mov_i32 cc_src_1,g4_1                          ; load g4  (0xaae60)
 mov_i32 cc_src2_0,g3_0                         ;
 mov_i32 cc_src2_1,g3_1                         ; load g3  (0)
 sub2_i32 cc_dst_0,cc_dst_1,cc_src2_0,cc_src2_1,cc_src_0,cc_src_1
                                                ; result = 0xaafe0-0
 movi_i32 psr,$0x0                              ; clear psr
 mov_i32 tmp42,cc_dst_0                         ; get cc_dst_0
 movi_i32 tmp43,$0x0                            ;
 movi_i32 tmp44,$0x0                            ;
 movi_i32 tmp45,$0x0                            ; zero extends
 brcond2_i32 tmp42,tmp43,tmp44,tmp45,$0x1,$0x0  ; if not zero, skip
 movi_i32 tmp19,$0x400000                       ; else set zero flag



which converts into x86:
 0xb80da04d:  sub    %ecx,%eax          ; %ecx = g4-g3
 0xb80da04f:  sbb    %ebx,%edx
 0xb80da051:  mov    %eax,0x6c(%ebp)    ; saving g3, not the result (ecx)!
 0xb80da054:  mov    %edx,0x70(%ebp)    ;
 0xb80da057:  xor    %edx,%edx
 0xb80da059:  xor    %ecx,%ecx          ; clearing our result for use as psr
                                        ; result is lost!
                                        ; the later test for zero is done
                                        ; against g3 instead, which
                                        ; sets the zero flag when it
 ...                                    ; shouldn't
 0xb80da06f:  test   %eax,%eax
 0xb80da071:  jne    0xb80da091         ; skip if not zero
 ..
 0xb80da07f:  mov    0x8c(%ebp),%eax    ; load psr
 0xb80da085:  or     $0x400000,%eax     ; set zero flag


So unless there's some weird AT&T/intel ordering thing that is confusing me (please let me know if I am missing something), TCG is getting confused about which argument of the subtract is the result. I'm not sure how to fix this though...

Thanks for any help

Vince

Attachment: cmp_test.s
Description: Text document

Attachment: cmp_test
Description: Binary data


reply via email to

[Prev in Thread] Current Thread [Next in Thread]