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.