Status: New
Owner: ----

New issue 3697 by [email protected]: Poor code for integer tests
https://code.google.com/p/v8/issues/detail?id=3697

The patterns (x|0)==x and x == Math.floor(x) are used to test for int32 and integral double values.
Smi values always pass these test.

The optimzied code generated for check1 and check2 is below.
The Smi path is marked with '*'.

The code would be much faster if the initial Smi check branched directly to 'true'.

The code seems very naive - both instances of 'x' in the expression are Smi-tested. Surely this can be GVN-ed?



--- Raw source ---
(x) { return (x|0) === x; }

15 instructions on fast (smi) path

*   0x51d54184    36  8b4508         mov eax,[ebp+0x8]
                      ;;; <@16,#30> tagged-to-i
* 0x51d54187 39 d1f8 sar eax,1 ;; debug: position 32
*   0x51d54189    41  0f8253000000   jc 130  (0x51d541e2)
                      ;;; <@17,#30> gap
*   0x51d5418f    47  8b4d08         mov ecx,[ebp+0x8]
                      ;;; <@18,#29> double-untag
*   0x51d54192    50  f6c101         test_b cl,0x1
*   0x51d54195    53  7414           jz 75  (0x51d541ab)
0x51d54197 55 8179ff7181f04e cmp [ecx-0x1],0x4ef08171 ;; object: 0x4ef08171 <Map(elements=3)>
    0x51d5419e    62  0f85b2000000   jnz 246  (0x51d54256)
    0x51d541a4    68  f20f104903     movsd xmm1,[ecx+0x3]
    0x51d541a9    73  eb0b           jmp 86  (0x51d541b6)
*   0x51d541ab    75  89ca           mov edx,ecx
*   0x51d541ad    77  d1fa           sar edx,1
*   0x51d541af    79  0f57c9         xorps xmm1,xmm1
*   0x51d541b2    82  f20f2aca       cvtsi2sd xmm1,edx
                      ;;; <@20,#32> int32-to-double
*   0x51d541b6    86  0f57d2         xorps xmm2,xmm2
*   0x51d541b9    89  f20f2ad0       cvtsi2sd xmm2,eax
                      ;;; <@23,#15> compare-numeric-and-branch
*   0x51d541bd    93  660f2ed1       ucomisd xmm2,xmm1
*   0x51d541c1    97  0f8a06000000   jpe 109  (0x51d541cd)
*   0x51d541c7   103  0f840a000000   jz 119  (0x51d541d7)


--- Raw source ---
(x) { return x == Math.floor(x); }

19 instructions on fast (smi) path.

* 0x51d542e4 36 8b4508 mov eax,[ebp+0x8] ;; debug: position 76
                      ;;; <@18,#31> double-untag
*   0x51d542e7    39  a801           test al,0x1
*   0x51d542e9    41  7414           jz 63  (0x51d542ff)
0x51d542eb 43 8178ff7181f04e cmp [eax-0x1],0x4ef08171 ;; object: 0x4ef08171 <Map(elements=3)>
    0x51d542f2    50  0f8567000000   jnz 159  (0x51d5435f)
    0x51d542f8    56  f20f104803     movsd xmm1,[eax+0x3]
    0x51d542fd    61  eb0b           jmp 74  (0x51d5430a)
*   0x51d542ff    63  89c1           mov ecx,eax
*   0x51d54301    65  d1f9           sar ecx,1
*   0x51d54303    67  0f57c9         xorps xmm1,xmm1
*   0x51d54306    70  f20f2ac9       cvtsi2sd xmm1,ecx
                      ;;; <@20,#15> math-floor
*   0x51d5430a    74  0f57c0         xorps xmm0,xmm0
*   0x51d5430d    77  660f2ec8       ucomisd xmm1,xmm0
*   0x51d54311    81  750d           jnz 96  (0x51d54320)
    0x51d54313    83  660f50c9       movmskpd ecx,xmm1
    0x51d54317    87  f6c101         test_b cl,0x1
    0x51d5431a    90  0f8544000000   jnz 164  (0x51d54364)
*   0x51d54320    96  660f3a0bc109   roundsd xmm0,xmm1,9
*   0x51d54326   102  f20f2cc8       cvttsd2si ecx,xmm0
*   0x51d5432a   106  83f901         cmp ecx,0x1
*   0x51d5432d   109  0f8031000000   jo 164  (0x51d54364)
                      ;;; <@22,#32> int32-to-double
*   0x51d54333   115  0f57d2         xorps xmm2,xmm2
*   0x51d54336   118  f20f2ad1       cvtsi2sd xmm2,ecx
                      ;;; <@25,#16> compare-numeric-and-branch
*   0x51d5433a   122  660f2eca       ucomisd xmm1,xmm2
*   0x51d5433e   126  0f8a06000000   jpe 138  (0x51d5434a)
*   0x51d54344   132  0f840a000000   jz 148  (0x51d54354)




Attachments:
        index.html  101 bytes

--
You received this message because this project is configured to send all issue notifications to this address.
You may adjust your notification preferences at:
https://code.google.com/hosting/settings

--
--
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev
--- You received this message because you are subscribed to the Google Groups "v8-dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/d/optout.

Reply via email to