Advertisement
Guest User

Untitled

a guest
Jan 26th, 2024
19
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 39.14 KB | None | 0 0
  1. 0x0000000000502210 <+0>: push %r15
  2. 0x0000000000502212 <+2>: mov $0x1,%eax
  3. 0x0000000000502217 <+7>: lea 0x20(%rdi),%r15
  4. 0x000000000050221b <+11>: mov %rdx,%r9
  5. 0x000000000050221e <+14>: push %r14
  6. 0x0000000000502220 <+16>: mov %rax,%r14
  7. 0x0000000000502223 <+19>: lea 0x38(%rsi),%r11
  8. 0x0000000000502227 <+23>: lea 0x28(%rsi),%r10
  9. 0x000000000050222b <+27>: push %r13
  10. 0x000000000050222d <+29>: mov %rdx,%r13
  11. 0x0000000000502230 <+32>: push %r12
  12. 0x0000000000502232 <+34>: push %rbp
  13. 0x0000000000502233 <+35>: mov %rsi,%rbp
  14. 0x0000000000502236 <+38>: push %rbx
  15. 0x0000000000502237 <+39>: sub $0x38,%rsp
  16. 0x000000000050223b <+43>: movzbl 0x9(%rdi),%ecx
  17. 0x000000000050223f <+47>: shl %cl,%r14
  18. 0x0000000000502242 <+50>: movzbl 0x8(%rdi),%ecx
  19. 0x0000000000502246 <+54>: add %r15,%r14
  20. 0x0000000000502249 <+57>: shl %cl,%rax
  21. 0x000000000050224c <+60>: lea -0x1(%rax),%rbx
  22. 0x0000000000502250 <+64>: mov %rbx,%r8
  23. 0x0000000000502253 <+67>: and %rdx,%r8
  24. 0x0000000000502256 <+70>: cmp $0x7,%ecx
  25. 0x0000000000502259 <+73>: jg 0x5022e0 <unicodekeys_lookup_unicode+208>
  26. 0x000000000050225f <+79>: movsbq (%r15,%r8,1),%r12
  27. 0x0000000000502264 <+84>: test %r12,%r12
  28. 0x0000000000502267 <+87>: js 0x502348 <unicodekeys_lookup_unicode+312>
  29. 0x000000000050226d <+93>: mov %r12,%rax
  30. 0x0000000000502270 <+96>: shl $0x4,%rax
  31. 0x0000000000502274 <+100>: mov (%r14,%rax,1),%rax
  32. 0x0000000000502278 <+104>: cmp %rax,%rbp
  33. 0x000000000050227b <+107>: je 0x502332 <unicodekeys_lookup_unicode+290>
  34. 0x0000000000502281 <+113>: cmp 0x18(%rax),%r13
  35. 0x0000000000502285 <+117>: je 0x502360 <unicodekeys_lookup_unicode+336>
  36. 0x000000000050228b <+123>: mov %r9,%rdx
  37. 0x000000000050228e <+126>: lea (%r8,%r8,4),%r12
  38. 0x0000000000502292 <+130>: shr $0x5,%rdx
  39. 0x0000000000502296 <+134>: lea 0x1(%r12,%rdx,1),%r8
  40. 0x000000000050229b <+139>: and %rbx,%r8
  41. 0x000000000050229e <+142>: cmp $0x7,%ecx
  42. 0x00000000005022a1 <+145>: jg 0x502310 <unicodekeys_lookup_unicode+256>
  43. 0x00000000005022a3 <+147>: movsbq (%r15,%r8,1),%r12
  44. 0x00000000005022a8 <+152>: test %r12,%r12
  45. 0x00000000005022ab <+155>: js 0x502328 <unicodekeys_lookup_unicode+280>
  46. 0x00000000005022ad <+157>: mov %r12,%rdi
  47. 0x00000000005022b0 <+160>: shl $0x4,%rdi
  48. 0x00000000005022b4 <+164>: mov (%r14,%rdi,1),%rax
  49. 0x00000000005022b8 <+168>: cmp %rax,%rbp
  50. 0x00000000005022bb <+171>: je 0x502332 <unicodekeys_lookup_unicode+290>
  51. 0x00000000005022bd <+173>: cmp 0x18(%rax),%r13
  52. 0x00000000005022c1 <+177>: je 0x502405 <unicodekeys_lookup_unicode+501>
  53. 0x00000000005022c7 <+183>: shr $0xa,%r9
  54. 0x00000000005022cb <+187>: lea (%r8,%r8,4),%rdx
  55. 0x00000000005022cf <+191>: lea 0x1(%r9,%rdx,1),%r8
  56. 0x00000000005022d4 <+196>: and %rbx,%r8
  57. 0x00000000005022d7 <+199>: cmp $0x7,%ecx
  58. 0x00000000005022da <+202>: jle 0x50225f <unicodekeys_lookup_unicode+79>
  59. 0x00000000005022dc <+204>: nopl 0x0(%rax)
  60. 0x00000000005022e0 <+208>: cmp $0xf,%ecx
  61. 0x00000000005022e3 <+211>: jg 0x5024c0 <unicodekeys_lookup_unicode+688>
  62. 0x00000000005022e9 <+217>: movswq (%r15,%r8,2),%r12
  63. 0x00000000005022ee <+222>: test %r12,%r12
  64. 0x00000000005022f1 <+225>: jns 0x50226d <unicodekeys_lookup_unicode+93>
  65. 0x00000000005022f7 <+231>: cmp $0xffffffffffffffff,%r12
  66. 0x00000000005022fb <+235>: je 0x502352 <unicodekeys_lookup_unicode+322>
  67. 0x00000000005022fd <+237>: mov %r9,%rdx
  68. 0x0000000000502300 <+240>: lea (%r8,%r8,4),%r8
  69. 0x0000000000502304 <+244>: shr $0x5,%rdx
  70. 0x0000000000502308 <+248>: lea 0x1(%r8,%rdx,1),%r8
  71. 0x000000000050230d <+253>: and %rbx,%r8
  72. 0x0000000000502310 <+256>: cmp $0xf,%ecx
  73. 0x0000000000502313 <+259>: jg 0x5024f3 <unicodekeys_lookup_unicode+739>
  74. 0x0000000000502319 <+265>: movswq (%r15,%r8,2),%r12
  75. 0x000000000050231e <+270>: test %r12,%r12
  76. 0x0000000000502321 <+273>: jns 0x5022ad <unicodekeys_lookup_unicode+157>
  77. 0x0000000000502323 <+275>: nopl 0x0(%rax,%rax,1)
  78. 0x0000000000502328 <+280>: cmp $0xffffffffffffffff,%r12
  79. 0x000000000050232c <+284>: jne 0x5024a6 <unicodekeys_lookup_unicode+662>
  80. 0x0000000000502332 <+290>: add $0x38,%rsp
  81. 0x0000000000502336 <+294>: mov %r12,%rax
  82. 0x0000000000502339 <+297>: pop %rbx
  83. 0x000000000050233a <+298>: pop %rbp
  84. 0x000000000050233b <+299>: pop %r12
  85. 0x000000000050233d <+301>: pop %r13
  86. 0x000000000050233f <+303>: pop %r14
  87. 0x0000000000502341 <+305>: pop %r15
  88. 0x0000000000502343 <+307>: retq
  89. 0x0000000000502344 <+308>: nopl 0x0(%rax)
  90. 0x0000000000502348 <+312>: cmp $0xffffffffffffffff,%r12
  91. 0x000000000050234c <+316>: jne 0x5024db <unicodekeys_lookup_unicode+715>
  92. 0x0000000000502352 <+322>: mov $0xffffffffffffffff,%r12
  93. 0x0000000000502359 <+329>: jmp 0x502332 <unicodekeys_lookup_unicode+290>
  94. 0x000000000050235b <+331>: nopl 0x0(%rax,%rax,1)
  95. 0x0000000000502360 <+336>: mov 0x10(%rax),%rsi
  96. 0x0000000000502364 <+340>: cmp 0x10(%rbp),%rsi
  97. 0x0000000000502368 <+344>: jne 0x421db8 <unicodekeys_lookup_unicode-918616>
  98. 0x000000000050236e <+350>: test %rsi,%rsi
  99. 0x0000000000502371 <+353>: je 0x502332 <unicodekeys_lookup_unicode+290>
  100. 0x0000000000502373 <+355>: movzbl 0x20(%rax),%edi
  101. 0x0000000000502377 <+359>: movzbl 0x20(%rbp),%edx
  102. 0x000000000050237b <+363>: xor %edi,%edx
  103. 0x000000000050237d <+365>: and $0x1c,%edx
  104. 0x0000000000502380 <+368>: jne 0x421db8 <unicodekeys_lookup_unicode-918616>
  105. 0x0000000000502386 <+374>: mov %edi,%edx
  106. 0x0000000000502388 <+376>: shr $0x2,%dl
  107. 0x000000000050238b <+379>: and $0x7,%edx
  108. 0x000000000050238e <+382>: imul %rsi,%rdx
  109. 0x0000000000502392 <+386>: movzbl 0x20(%rbp),%esi
  110. 0x0000000000502396 <+390>: test $0x20,%sil
  111. 0x000000000050239a <+394>: je 0x421daf <unicodekeys_lookup_unicode.cold>
  112. 0x00000000005023a0 <+400>: and $0x40,%esi
  113. 0x00000000005023a3 <+403>: je 0x502517 <unicodekeys_lookup_unicode+775>
  114. 0x00000000005023a9 <+409>: mov %r10,%rsi
  115. 0x00000000005023ac <+412>: test $0x20,%dil
  116. 0x00000000005023b0 <+416>: je 0x502531 <unicodekeys_lookup_unicode+801>
  117. 0x00000000005023b6 <+422>: and $0x40,%edi
  118. 0x00000000005023b9 <+425>: je 0x50250e <unicodekeys_lookup_unicode+766>
  119. 0x00000000005023bf <+431>: lea 0x28(%rax),%rdi
  120. 0x00000000005023c3 <+435>: mov %r10,0x28(%rsp)
  121. 0x00000000005023c8 <+440>: mov %r11,0x20(%rsp)
  122. 0x00000000005023cd <+445>: mov %r9,0x18(%rsp)
  123. 0x00000000005023d2 <+450>: mov %r8,0x10(%rsp)
  124. 0x00000000005023d7 <+455>: mov %ecx,0xc(%rsp)
  125. 0x00000000005023db <+459>: callq 0x41c140 <memcmp@plt>
  126. 0x00000000005023e0 <+464>: mov 0xc(%rsp),%ecx
  127. 0x00000000005023e4 <+468>: mov 0x10(%rsp),%r8
  128. 0x00000000005023e9 <+473>: test %eax,%eax
  129. 0x00000000005023eb <+475>: mov 0x18(%rsp),%r9
  130. 0x00000000005023f0 <+480>: mov 0x20(%rsp),%r11
  131. 0x00000000005023f5 <+485>: mov 0x28(%rsp),%r10
  132. 0x00000000005023fa <+490>: je 0x502332 <unicodekeys_lookup_unicode+290>
  133. 0x0000000000502400 <+496>: jmpq 0x421db8 <unicodekeys_lookup_unicode-918616>
  134. 0x0000000000502405 <+501>: mov 0x10(%rax),%rsi
  135. 0x0000000000502409 <+505>: cmp 0x10(%rbp),%rsi
  136. 0x000000000050240d <+509>: jne 0x5024a6 <unicodekeys_lookup_unicode+662>
  137. 0x0000000000502413 <+515>: test %rsi,%rsi
  138. 0x0000000000502416 <+518>: je 0x502332 <unicodekeys_lookup_unicode+290>
  139. 0x000000000050241c <+524>: movzbl 0x20(%rax),%edi
  140. 0x0000000000502420 <+528>: mov %edi,%edx
  141. 0x0000000000502422 <+530>: xor 0x20(%rbp),%edx
  142. 0x0000000000502425 <+533>: and $0x1c,%dl
  143. 0x0000000000502428 <+536>: jne 0x5024a6 <unicodekeys_lookup_unicode+662>
  144. 0x000000000050242a <+538>: mov %edi,%edx
  145. 0x000000000050242c <+540>: shr $0x2,%dl
  146. 0x000000000050242f <+543>: and $0x7,%edx
  147. 0x0000000000502432 <+546>: imul %rsi,%rdx
  148. 0x0000000000502436 <+550>: movzbl 0x20(%rbp),%esi
  149. 0x000000000050243a <+554>: test $0x20,%sil
  150. 0x000000000050243e <+558>: je 0x421df4 <unicodekeys_lookup_unicode-918556>
  151. 0x0000000000502444 <+564>: and $0x40,%sil
  152. 0x0000000000502448 <+568>: je 0x502529 <unicodekeys_lookup_unicode+793>
  153. 0x000000000050244e <+574>: mov %r10,%rsi
  154. 0x0000000000502451 <+577>: test $0x20,%dil
  155. 0x0000000000502455 <+581>: je 0x421de2 <unicodekeys_lookup_unicode-918574>
  156. 0x000000000050245b <+587>: and $0x40,%dil
  157. 0x000000000050245f <+591>: je 0x502505 <unicodekeys_lookup_unicode+757>
  158. 0x0000000000502465 <+597>: lea 0x28(%rax),%rdi
  159. 0x0000000000502469 <+601>: mov %r10,0x28(%rsp)
  160. 0x000000000050246e <+606>: mov %r11,0x20(%rsp)
  161. 0x0000000000502473 <+611>: mov %r8,0x18(%rsp)
  162. 0x0000000000502478 <+616>: mov %r9,0x10(%rsp)
  163. 0x000000000050247d <+621>: mov %ecx,0xc(%rsp)
  164. 0x0000000000502481 <+625>: callq 0x41c140 <memcmp@plt>
  165. 0x0000000000502486 <+630>: mov 0xc(%rsp),%ecx
  166. 0x000000000050248a <+634>: mov 0x10(%rsp),%r9
  167. 0x000000000050248f <+639>: test %eax,%eax
  168. 0x0000000000502491 <+641>: mov 0x18(%rsp),%r8
  169. 0x0000000000502496 <+646>: mov 0x20(%rsp),%r11
  170. 0x000000000050249b <+651>: mov 0x28(%rsp),%r10
  171. 0x00000000005024a0 <+656>: je 0x502332 <unicodekeys_lookup_unicode+290>
  172. 0x00000000005024a6 <+662>: shr $0xa,%r9
  173. 0x00000000005024aa <+666>: lea (%r8,%r8,4),%r8
  174. 0x00000000005024ae <+670>: lea 0x1(%r9,%r8,1),%r8
  175. 0x00000000005024b3 <+675>: and %rbx,%r8
  176. 0x00000000005024b6 <+678>: jmpq 0x502256 <unicodekeys_lookup_unicode+70>
  177. 0x00000000005024bb <+683>: nopl 0x0(%rax,%rax,1)
  178. 0x00000000005024c0 <+688>: cmp $0x1f,%ecx
  179. 0x00000000005024c3 <+691>: jg 0x421dd9 <unicodekeys_lookup_unicode-918583>
  180. 0x00000000005024c9 <+697>: movslq (%r15,%r8,4),%r12
  181. 0x00000000005024cd <+701>: test %r12,%r12
  182. 0x00000000005024d0 <+704>: jns 0x50226d <unicodekeys_lookup_unicode+93>
  183. 0x00000000005024d6 <+710>: jmpq 0x5022f7 <unicodekeys_lookup_unicode+231>
  184. 0x00000000005024db <+715>: mov %r9,%rsi
  185. 0x00000000005024de <+718>: lea (%r8,%r8,4),%rdi
  186. 0x00000000005024e2 <+722>: shr $0x5,%rsi
  187. 0x00000000005024e6 <+726>: lea 0x1(%rsi,%rdi,1),%r8
  188. 0x00000000005024eb <+731>: and %rbx,%r8
  189. 0x00000000005024ee <+734>: jmpq 0x5022a3 <unicodekeys_lookup_unicode+147>
  190. 0x00000000005024f3 <+739>: cmp $0x1f,%ecx
  191. 0x00000000005024f6 <+742>: jg 0x421deb <unicodekeys_lookup_unicode-918565>
  192. 0x00000000005024fc <+748>: movslq (%r15,%r8,4),%r12
  193. 0x0000000000502500 <+752>: jmpq 0x50231e <unicodekeys_lookup_unicode+270>
  194. 0x0000000000502505 <+757>: lea 0x38(%rax),%rdi
  195. 0x0000000000502509 <+761>: jmpq 0x502469 <unicodekeys_lookup_unicode+601>
  196. 0x000000000050250e <+766>: lea 0x38(%rax),%rdi
  197. 0x0000000000502512 <+770>: jmpq 0x5023c3 <unicodekeys_lookup_unicode+435>
  198. 0x0000000000502517 <+775>: mov %r11,%rsi
  199. 0x000000000050251a <+778>: test $0x20,%dil
  200. 0x000000000050251e <+782>: jne 0x5023b6 <unicodekeys_lookup_unicode+422>
  201. 0x0000000000502524 <+788>: jmpq 0x421dfd <unicodekeys_lookup_unicode-918547>
  202. 0x0000000000502529 <+793>: mov %r11,%rsi
  203. 0x000000000050252c <+796>: jmpq 0x502451 <unicodekeys_lookup_unicode+577>
  204. 0x0000000000502531 <+801>: jmpq 0x421dfd <unicodekeys_lookup_unicode-918547>
  205. Address range 0x421daf to 0x421e06:
  206. 0x0000000000421daf <-918625>: mov 0x38(%rbp),%rsi
  207. 0x0000000000421db3 <-918621>: jmpq 0x50251a <unicodekeys_lookup_unicode+778>
  208. 0x0000000000421db8 <-918616>: mov %r9,%rax
  209. 0x0000000000421dbb <-918613>: lea (%r8,%r8,4),%r8
  210. 0x0000000000421dbf <-918609>: shr $0x5,%rax
  211. 0x0000000000421dc3 <-918605>: lea 0x1(%rax,%r8,1),%r8
  212. 0x0000000000421dc8 <-918600>: and %rbx,%r8
  213. 0x0000000000421dcb <-918597>: cmp $0x7,%ecx
  214. 0x0000000000421dce <-918594>: jg 0x502310 <unicodekeys_lookup_unicode+256>
  215. 0x0000000000421dd4 <-918588>: jmpq 0x5022a3 <unicodekeys_lookup_unicode+147>
  216. 0x0000000000421dd9 <-918583>: mov (%r15,%r8,8),%r12
  217. 0x0000000000421ddd <-918579>: jmpq 0x5024cd <unicodekeys_lookup_unicode+701>
  218. 0x0000000000421de2 <-918574>: mov 0x38(%rax),%rdi
  219. 0x0000000000421de6 <-918570>: jmpq 0x502469 <unicodekeys_lookup_unicode+601>
  220. 0x0000000000421deb <-918565>: mov (%r15,%r8,8),%r12
  221. 0x0000000000421def <-918561>: jmpq 0x50231e <unicodekeys_lookup_unicode+270>
  222. 0x0000000000421df4 <-918556>: mov 0x38(%rbp),%rsi
  223. 0x0000000000421df8 <-918552>: jmpq 0x502451 <unicodekeys_lookup_unicode+577>
  224. 0x0000000000421dfd <-918547>: mov 0x38(%rax),%rdi
  225. 0x0000000000421e01 <-918543>: jmpq 0x5023c3 <unicodekeys_lookup_unicode+435>
  226.  
  227.  
  228. ./Include/internal/pycore_dict.h:
  229. 193 static inline void* _DK_ENTRIES(PyDictKeysObject *dk) {
  230. 194 int8_t *indices = (int8_t*)(dk->dk_indices);
  231. 195 size_t index = (size_t)1 << dk->dk_log2_index_bytes;
  232. 196 return (&indices[index]);
  233. 197 }
  234. 198 static inline PyDictKeyEntry* DK_ENTRIES(PyDictKeysObject *dk) {
  235. 199 assert(dk->dk_kind == DICT_KEYS_GENERAL);
  236. 200 return (PyDictKeyEntry*)_DK_ENTRIES(dk);
  237. 201 }
  238. 202 static inline PyDictUnicodeEntry* DK_UNICODE_ENTRIES(PyDictKeysObject *dk) {
  239. 203 assert(dk->dk_kind != DICT_KEYS_GENERAL);
  240. 204 return (PyDictUnicodeEntry*)_DK_ENTRIES(dk);
  241. 0x0000000000502210 <+0>: push %r15
  242. 0x0000000000502212 <+2>: mov $0x1,%eax
  243. 0x0000000000502217 <+7>: lea 0x20(%rdi),%r15
  244.  
  245. 196 return (&indices[index]);
  246. 0x000000000050221b <+11>: mov %rdx,%r9
  247. 0x000000000050221e <+14>: push %r14
  248. 0x0000000000502220 <+16>: mov %rax,%r14
  249. 0x0000000000502223 <+19>: lea 0x38(%rsi),%r11
  250. 0x0000000000502227 <+23>: lea 0x28(%rsi),%r10
  251. 0x000000000050222b <+27>: push %r13
  252. 0x000000000050222d <+29>: mov %rdx,%r13
  253. 0x0000000000502230 <+32>: push %r12
  254. 0x0000000000502232 <+34>: push %rbp
  255. 0x0000000000502233 <+35>: mov %rsi,%rbp
  256. 0x0000000000502236 <+38>: push %rbx
  257. 0x0000000000502237 <+39>: sub $0x38,%rsp
  258. 0x000000000050223b <+43>: movzbl 0x9(%rdi),%ecx
  259. 0x000000000050223f <+47>: shl %cl,%r14
  260. 0x0000000000502242 <+50>: movzbl 0x8(%rdi),%ecx
  261. 0x0000000000502246 <+54>: add %r15,%r14
  262.  
  263. Objects/dictobject.c:
  264. warning: Source file is more recent than executable.
  265. 888 size_t mask = DK_MASK(dk);
  266. 0x0000000000502249 <+57>: shl %cl,%rax
  267. 0x000000000050224c <+60>: lea -0x1(%rax),%rbx
  268.  
  269. 889 size_t perturb = hash;
  270. 890 size_t i = (size_t)hash & mask;
  271. 0x0000000000502250 <+64>: mov %rbx,%r8
  272. 0x0000000000502253 <+67>: and %rdx,%r8
  273.  
  274. 893 ix = dictkeys_get_index(dk, i);
  275. 0x0000000000502256 <+70>: cmp $0x7,%ecx
  276. 0x0000000000502259 <+73>: jg 0x5022e0 <unicodekeys_lookup_unicode+208>
  277. 348 ix = indices[i];
  278. 0x000000000050225f <+79>: movsbq (%r15,%r8,1),%r12
  279.  
  280. 894 if (ix >= 0) {
  281. 0x0000000000502264 <+84>: test %r12,%r12
  282. 0x0000000000502267 <+87>: js 0x502348 <unicodekeys_lookup_unicode+312>
  283.  
  284. 919 }
  285. 920 Py_UNREACHABLE();
  286. 921 }
  287. 922
  288. 923 static inline Py_ALWAYS_INLINE
  289. 924 Py_ssize_t compare_unicode_generic(PyDictObject *mp, PyDictKeysObject *dk,
  290. 925 void *ep0, Py_ssize_t ix, PyObject *key, Py_hash_t hash)
  291. 926 {
  292. 927 PyDictUnicodeEntry *ep = &((PyDictUnicodeEntry *)ep0)[ix];
  293. 928 assert(ep->me_key != NULL);
  294. 929 assert(PyUnicode_CheckExact(ep->me_key));
  295. 930 assert(!PyUnicode_CheckExact(key));
  296. 931 // TODO: Thread safety
  297. 932
  298. 933 if (unicode_get_hash(ep->me_key) == hash) {
  299. 934 PyObject *startkey = ep->me_key;
  300. 935 Py_INCREF(startkey);
  301. 936 int cmp = PyObject_RichCompareBool(startkey, key, Py_EQ);
  302. 937 Py_DECREF(startkey);
  303. 938 if (cmp < 0) {
  304. 939 return DKIX_ERROR;
  305. 940 }
  306. 941 if (dk == mp->ma_keys && ep->me_key == startkey) {
  307. 942 if (cmp > 0) {
  308. 943 return ix;
  309. 944 }
  310. 945 }
  311. 946 else {
  312. 947 /* The dict was mutated, restart */
  313. 948 return DKIX_KEY_CHANGED;
  314. 949 }
  315. 950 }
  316. 951 return DKIX_DUMMY;
  317. 952 }
  318. 953
  319. 954 static Py_ssize_t
  320. 955 unicodekeys_lookup_generic(PyDictObject *mp, PyDictKeysObject* dk, PyObject *key, Py_hash_t hash)
  321. 956 {
  322. 957 return do_lookup(mp, dk, key, hash, (generic_entries_func)DK_UNICODE_ENTRIES, compare_unicode_generic);
  323. 958 }
  324. 959
  325. 960 static inline Py_ALWAYS_INLINE
  326. 961 Py_ssize_t compare_unicode_unicode(PyDictObject *mp, PyDictKeysObject *dk,
  327. 962 void *ep0, Py_ssize_t ix, PyObject *key, Py_hash_t hash)
  328. 963 {
  329. 964 PyDictUnicodeEntry *ep = &((PyDictUnicodeEntry *)ep0)[ix];
  330. 965 assert(ep->me_key != NULL);
  331. 966 assert(PyUnicode_CheckExact(ep->me_key));
  332. 967 if (ep->me_key == key ||
  333. 0x000000000050226d <+93>: mov %r12,%rax
  334. 0x0000000000502270 <+96>: shl $0x4,%rax
  335. 0x0000000000502274 <+100>: mov (%r14,%rax,1),%rax
  336. 0x0000000000502278 <+104>: cmp %rax,%rbp
  337. 0x000000000050227b <+107>: je 0x502332 <unicodekeys_lookup_unicode+290>
  338.  
  339. 286 return _PyASCIIObject_CAST(o)->hash;
  340. 0x0000000000502281 <+113>: cmp 0x18(%rax),%r13
  341. 0x0000000000502285 <+117>: je 0x502360 <unicodekeys_lookup_unicode+336>
  342.  
  343. 901 return DKIX_EMPTY;
  344. 902 }
  345. 903 perturb >>= PERTURB_SHIFT;
  346. 904 i = mask & (i*5 + perturb + 1);
  347. 0x000000000050228b <+123>: mov %r9,%rdx
  348. 0x000000000050228e <+126>: lea (%r8,%r8,4),%r12
  349. 0x0000000000502292 <+130>: shr $0x5,%rdx
  350. 0x0000000000502296 <+134>: lea 0x1(%r12,%rdx,1),%r8
  351. 0x000000000050229b <+139>: and %rbx,%r8
  352.  
  353. 905
  354. 906 // Manual loop unrolling
  355. 907 ix = dictkeys_get_index(dk, i);
  356. 0x000000000050229e <+142>: cmp $0x7,%ecx
  357. 0x00000000005022a1 <+145>: jg 0x502310 <unicodekeys_lookup_unicode+256>
  358.  
  359. 348 ix = indices[i];
  360. 0x00000000005022a3 <+147>: movsbq (%r15,%r8,1),%r12
  361.  
  362. 908 if (ix >= 0) {
  363. 0x00000000005022a8 <+152>: test %r12,%r12
  364. 0x00000000005022ab <+155>: js 0x502328 <unicodekeys_lookup_unicode+280>
  365.  
  366. 919 }
  367. 920 Py_UNREACHABLE();
  368. 921 }
  369. 922
  370. 923 static inline Py_ALWAYS_INLINE
  371. 924 Py_ssize_t compare_unicode_generic(PyDictObject *mp, PyDictKeysObject *dk,
  372. 925 void *ep0, Py_ssize_t ix, PyObject *key, Py_hash_t hash)
  373. 926 {
  374. 927 PyDictUnicodeEntry *ep = &((PyDictUnicodeEntry *)ep0)[ix];
  375. 928 assert(ep->me_key != NULL);
  376. 929 assert(PyUnicode_CheckExact(ep->me_key));
  377. 930 assert(!PyUnicode_CheckExact(key));
  378. 931 // TODO: Thread safety
  379. 932
  380. 933 if (unicode_get_hash(ep->me_key) == hash) {
  381. 934 PyObject *startkey = ep->me_key;
  382. 935 Py_INCREF(startkey);
  383. 936 int cmp = PyObject_RichCompareBool(startkey, key, Py_EQ);
  384. 937 Py_DECREF(startkey);
  385. 938 if (cmp < 0) {
  386. 939 return DKIX_ERROR;
  387. 940 }
  388. 941 if (dk == mp->ma_keys && ep->me_key == startkey) {
  389. 942 if (cmp > 0) {
  390. 943 return ix;
  391. 944 }
  392. 945 }
  393. 946 else {
  394. 947 /* The dict was mutated, restart */
  395. 948 return DKIX_KEY_CHANGED;
  396. 949 }
  397. 950 }
  398. 951 return DKIX_DUMMY;
  399. 952 }
  400. 953
  401. 954 static Py_ssize_t
  402. 955 unicodekeys_lookup_generic(PyDictObject *mp, PyDictKeysObject* dk, PyObject *key, Py_hash_t hash)
  403. 956 {
  404. 957 return do_lookup(mp, dk, key, hash, (generic_entries_func)DK_UNICODE_ENTRIES, compare_unicode_generic);
  405. 958 }
  406. 959
  407. 960 static inline Py_ALWAYS_INLINE
  408. 961 Py_ssize_t compare_unicode_unicode(PyDictObject *mp, PyDictKeysObject *dk,
  409. 962 void *ep0, Py_ssize_t ix, PyObject *key, Py_hash_t hash)
  410. 963 {
  411. 964 PyDictUnicodeEntry *ep = &((PyDictUnicodeEntry *)ep0)[ix];
  412. 965 assert(ep->me_key != NULL);
  413. 966 assert(PyUnicode_CheckExact(ep->me_key));
  414. 967 if (ep->me_key == key ||
  415. 0x00000000005022ad <+157>: mov %r12,%rdi
  416. 0x00000000005022b0 <+160>: shl $0x4,%rdi
  417. 0x00000000005022b4 <+164>: mov (%r14,%rdi,1),%rax
  418. 0x00000000005022b8 <+168>: cmp %rax,%rbp
  419. 0x00000000005022bb <+171>: je 0x502332 <unicodekeys_lookup_unicode+290>
  420.  
  421. 286 return _PyASCIIObject_CAST(o)->hash;
  422. 0x00000000005022bd <+173>: cmp 0x18(%rax),%r13
  423. 0x00000000005022c1 <+177>: je 0x502405 <unicodekeys_lookup_unicode+501>
  424.  
  425. 915 return DKIX_EMPTY;
  426. 916 }
  427. 917 perturb >>= PERTURB_SHIFT;
  428. 0x00000000005022c7 <+183>: shr $0xa,%r9
  429. 918 i = mask & (i*5 + perturb + 1);
  430. 0x00000000005022cb <+187>: lea (%r8,%r8,4),%rdx
  431. 0x00000000005022cf <+191>: lea 0x1(%r9,%rdx,1),%r8
  432. 0x00000000005022d4 <+196>: and %rbx,%r8
  433.  
  434. 893 ix = dictkeys_get_index(dk, i);
  435. 0x00000000005022d7 <+199>: cmp $0x7,%ecx
  436. 0x00000000005022da <+202>: jle 0x50225f <unicodekeys_lookup_unicode+79>
  437. 0x00000000005022dc <+204>: nopl 0x0(%rax)
  438.  
  439. 350 else if (log2size < 16) {
  440. 0x00000000005022e0 <+208>: cmp $0xf,%ecx
  441. 0x00000000005022e3 <+211>: jg 0x5024c0 <unicodekeys_lookup_unicode+688>
  442.  
  443. 351 const int16_t *indices = (const int16_t*)(keys->dk_indices);
  444. 352 ix = indices[i];
  445. 0x00000000005022e9 <+217>: movswq (%r15,%r8,2),%r12
  446.  
  447. 894 if (ix >= 0) {
  448. 0x00000000005022ee <+222>: test %r12,%r12
  449. 0x00000000005022f1 <+225>: jns 0x50226d <unicodekeys_lookup_unicode+93>
  450.  
  451. 895 ix = check_lookup(mp, dk, ep0, ix, key, hash);
  452. 896 if (ix != DKIX_DUMMY) {
  453. 897 return ix;
  454. 898 }
  455. 899 }
  456. 900 else if (ix == DKIX_EMPTY) {
  457. 0x00000000005022f7 <+231>: cmp $0xffffffffffffffff,%r12
  458. 0x00000000005022fb <+235>: je 0x502352 <unicodekeys_lookup_unicode+322>
  459.  
  460. 901 return DKIX_EMPTY;
  461. 902 }
  462. 903 perturb >>= PERTURB_SHIFT;
  463. 904 i = mask & (i*5 + perturb + 1);
  464. 0x00000000005022fd <+237>: mov %r9,%rdx
  465. 0x0000000000502300 <+240>: lea (%r8,%r8,4),%r8
  466. 0x0000000000502304 <+244>: shr $0x5,%rdx
  467. 0x0000000000502308 <+248>: lea 0x1(%r8,%rdx,1),%r8
  468. 0x000000000050230d <+253>: and %rbx,%r8
  469.  
  470. 905
  471. 906 // Manual loop unrolling
  472. 907 ix = dictkeys_get_index(dk, i);
  473. 0x0000000000502310 <+256>: cmp $0xf,%ecx
  474. 0x0000000000502313 <+259>: jg 0x5024f3 <unicodekeys_lookup_unicode+739>
  475.  
  476. 352 ix = indices[i];
  477. 0x0000000000502319 <+265>: movswq (%r15,%r8,2),%r12
  478.  
  479. 908 if (ix >= 0) {
  480.  
  481. 0x000000000050231e <+270>: test %r12,%r12
  482. 0x0000000000502321 <+273>: jns 0x5022ad <unicodekeys_lookup_unicode+157>
  483. 0x0000000000502323 <+275>: nopl 0x0(%rax,%rax,1)
  484.  
  485. 909 ix = check_lookup(mp, dk, ep0, ix, key, hash);
  486. 910 if (ix != DKIX_DUMMY) {
  487. 911 return ix;
  488. 912 }
  489. 913 }
  490. 914 else if (ix == DKIX_EMPTY) {
  491. 0x0000000000502328 <+280>: cmp $0xffffffffffffffff,%r12
  492. 0x000000000050232c <+284>: jne 0x5024a6 <unicodekeys_lookup_unicode+662>
  493. 0x0000000000502332 <+290>: add $0x38,%rsp
  494. 0x0000000000502336 <+294>: mov %r12,%rax
  495. 0x0000000000502339 <+297>: pop %rbx
  496. 0x000000000050233a <+298>: pop %rbp
  497. 0x000000000050233b <+299>: pop %r12
  498. 0x000000000050233d <+301>: pop %r13
  499. 0x000000000050233f <+303>: pop %r14
  500. 0x0000000000502341 <+305>: pop %r15
  501. 0x0000000000502343 <+307>: retq
  502. 0x0000000000502344 <+308>: nopl 0x0(%rax)
  503.  
  504. 900 else if (ix == DKIX_EMPTY) {
  505. 0x0000000000502348 <+312>: cmp $0xffffffffffffffff,%r12
  506. 0x000000000050234c <+316>: jne 0x5024db <unicodekeys_lookup_unicode+715>
  507. 0x0000000000502352 <+322>: mov $0xffffffffffffffff,%r12
  508. 0x0000000000502359 <+329>: jmp 0x502332 <unicodekeys_lookup_unicode+290>
  509. 0x000000000050235b <+331>: nopl 0x0(%rax,%rax,1)
  510.  
  511. ./Include/cpython/unicodeobject.h:
  512. 280 return _PyASCIIObject_CAST(op)->length;
  513. 0x0000000000502360 <+336>: mov 0x10(%rax),%rsi
  514. 0x0000000000502364 <+340>: cmp 0x10(%rbp),%rsi
  515. 0x0000000000502368 <+344>: jne 0x421db8 <unicodekeys_lookup_unicode-918616>
  516.  
  517. Objects/stringlib/eq.h:
  518. 11 if (PyUnicode_GET_LENGTH(a) == 0)
  519. 0x000000000050236e <+350>: test %rsi,%rsi
  520. 0x0000000000502371 <+353>: je 0x502332 <unicodekeys_lookup_unicode+290>
  521.  
  522. 12 return 1;
  523. 13 if (PyUnicode_KIND(a) != PyUnicode_KIND(b))
  524. 0x0000000000502373 <+355>: movzbl 0x20(%rax),%edi
  525. 0x0000000000502377 <+359>: movzbl 0x20(%rbp),%edx
  526. 0x000000000050237b <+363>: xor %edi,%edx
  527. 0x000000000050237d <+365>: and $0x1c,%edx
  528. 0x0000000000502380 <+368>: jne 0x421db8 <unicodekeys_lookup_unicode-918616>
  529.  
  530. 14 return 0;
  531. 15 return memcmp(PyUnicode_1BYTE_DATA(a), PyUnicode_1BYTE_DATA(b),
  532. 0x0000000000502386 <+374>: mov %edi,%edx
  533. 0x0000000000502388 <+376>: shr $0x2,%dl
  534. 0x000000000050238b <+379>: and $0x7,%edx
  535. 0x000000000050238e <+382>: imul %rsi,%rdx
  536.  
  537. ./Include/cpython/unicodeobject.h:
  538. 262 if (PyUnicode_IS_COMPACT(op)) {
  539. 0x0000000000502392 <+386>: movzbl 0x20(%rbp),%esi
  540. 0x0000000000502396 <+390>: test $0x20,%sil
  541. 0x000000000050239a <+394>: je 0x421daf <unicodekeys_lookup_unicode.cold>
  542.  
  543. 263 return _PyUnicode_COMPACT_DATA(op);
  544. 0x00000000005023a0 <+400>: and $0x40,%esi
  545. 0x00000000005023a3 <+403>: je 0x502517 <unicodekeys_lookup_unicode+775>
  546.  
  547. 248 return _Py_STATIC_CAST(void*, (_PyASCIIObject_CAST(op) + 1));
  548. 0x00000000005023a9 <+409>: mov %r10,%rsi
  549.  
  550. 251 }
  551. 252
  552. 253 static inline void* _PyUnicode_NONCOMPACT_DATA(PyObject *op) {
  553. 254 void *data;
  554. 255 assert(!PyUnicode_IS_COMPACT(op));
  555. 256 data = _PyUnicodeObject_CAST(op)->data.any;
  556. 257 assert(data != NULL);
  557. 258 return data;
  558. 259 }
  559. 260
  560. 261 static inline void* PyUnicode_DATA(PyObject *op) {
  561. 262 if (PyUnicode_IS_COMPACT(op)) {
  562. 0x00000000005023ac <+412>: test $0x20,%dil
  563. 0x00000000005023b0 <+416>: je 0x502531 <unicodekeys_lookup_unicode+801>
  564.  
  565. 263 return _PyUnicode_COMPACT_DATA(op);
  566. 0x00000000005023b6 <+422>: and $0x40,%edi
  567. 0x00000000005023b9 <+425>: je 0x50250e <unicodekeys_lookup_unicode+766>
  568.  
  569. 248 return _Py_STATIC_CAST(void*, (_PyASCIIObject_CAST(op) + 1));
  570. 0x00000000005023bf <+431>: lea 0x28(%rax),%rdi
  571. 0x00000000005023c3 <+435>: mov %r10,0x28(%rsp)
  572. 0x00000000005023c8 <+440>: mov %r11,0x20(%rsp)
  573. 0x00000000005023cd <+445>: mov %r9,0x18(%rsp)
  574. 0x00000000005023d2 <+450>: mov %r8,0x10(%rsp)
  575. 0x00000000005023d7 <+455>: mov %ecx,0xc(%rsp)
  576. 0x00000000005023db <+459>: callq 0x41c140 <memcmp@plt>
  577. 0x00000000005023e0 <+464>: mov 0xc(%rsp),%ecx
  578. 0x00000000005023e4 <+468>: mov 0x10(%rsp),%r8
  579. 0x00000000005023e9 <+473>: test %eax,%eax
  580. 0x00000000005023eb <+475>: mov 0x18(%rsp),%r9
  581. 0x00000000005023f0 <+480>: mov 0x20(%rsp),%r11
  582. 0x00000000005023f5 <+485>: mov 0x28(%rsp),%r10
  583. 0x00000000005023fa <+490>: je 0x502332 <unicodekeys_lookup_unicode+290>
  584. 0x0000000000502400 <+496>: jmpq 0x421db8 <unicodekeys_lookup_unicode-918616>
  585.  
  586. 264 }
  587. 265 return _PyUnicode_NONCOMPACT_DATA(op);
  588. 266 }
  589. 267 #define PyUnicode_DATA(op) PyUnicode_DATA(_PyObject_CAST(op))
  590. 268
  591. 269 /* Return pointers to the canonical representation cast to unsigned char,
  592. 270 Py_UCS2, or Py_UCS4 for direct character access.
  593. 271 No checks are performed, use PyUnicode_KIND() before to ensure
  594. 272 these will work correctly. */
  595. 273
  596. 274 #define PyUnicode_1BYTE_DATA(op) _Py_STATIC_CAST(Py_UCS1*, PyUnicode_DATA(op))
  597. 275 #define PyUnicode_2BYTE_DATA(op) _Py_STATIC_CAST(Py_UCS2*, PyUnicode_DATA(op))
  598. 276 #define PyUnicode_4BYTE_DATA(op) _Py_STATIC_CAST(Py_UCS4*, PyUnicode_DATA(op))
  599. 277
  600. 278 /* Returns the length of the unicode string. */
  601. 279 static inline Py_ssize_t PyUnicode_GET_LENGTH(PyObject *op) {
  602. 280 return _PyASCIIObject_CAST(op)->length;
  603. 0x0000000000502405 <+501>: mov 0x10(%rax),%rsi
  604. 0x0000000000502409 <+505>: cmp 0x10(%rbp),%rsi
  605. 0x000000000050240d <+509>: jne 0x5024a6 <unicodekeys_lookup_unicode+662>
  606.  
  607. Objects/stringlib/eq.h:
  608. 11 if (PyUnicode_GET_LENGTH(a) == 0)
  609. 0x0000000000502413 <+515>: test %rsi,%rsi
  610. 0x0000000000502416 <+518>: je 0x502332 <unicodekeys_lookup_unicode+290>
  611.  
  612. 12 return 1;
  613. 13 if (PyUnicode_KIND(a) != PyUnicode_KIND(b))
  614. 0x000000000050241c <+524>: movzbl 0x20(%rax),%edi
  615. 0x0000000000502420 <+528>: mov %edi,%edx
  616. 0x0000000000502422 <+530>: xor 0x20(%rbp),%edx
  617. 0x0000000000502425 <+533>: and $0x1c,%dl
  618. 0x0000000000502428 <+536>: jne 0x5024a6 <unicodekeys_lookup_unicode+662>
  619.  
  620. 14 return 0;
  621. 15 return memcmp(PyUnicode_1BYTE_DATA(a), PyUnicode_1BYTE_DATA(b),
  622. 0x000000000050242a <+538>: mov %edi,%edx
  623. 0x000000000050242c <+540>: shr $0x2,%dl
  624. 0x000000000050242f <+543>: and $0x7,%edx
  625. 0x0000000000502432 <+546>: imul %rsi,%rdx
  626.  
  627. ./Include/cpython/unicodeobject.h:
  628. 262 if (PyUnicode_IS_COMPACT(op)) {
  629. 0x0000000000502436 <+550>: movzbl 0x20(%rbp),%esi
  630. 0x000000000050243a <+554>: test $0x20,%sil
  631. 0x000000000050243e <+558>: je 0x421df4 <unicodekeys_lookup_unicode-918556>
  632.  
  633. 263 return _PyUnicode_COMPACT_DATA(op);
  634. 0x0000000000502444 <+564>: and $0x40,%sil
  635. 0x0000000000502448 <+568>: je 0x502529 <unicodekeys_lookup_unicode+793>
  636.  
  637. 248 return _Py_STATIC_CAST(void*, (_PyASCIIObject_CAST(op) + 1));
  638. 0x000000000050244e <+574>: mov %r10,%rsi
  639.  
  640. 251 }
  641. 252
  642. 253 static inline void* _PyUnicode_NONCOMPACT_DATA(PyObject *op) {
  643. 254 void *data;
  644. 255 assert(!PyUnicode_IS_COMPACT(op));
  645. 256 data = _PyUnicodeObject_CAST(op)->data.any;
  646. 257 assert(data != NULL);
  647. 258 return data;
  648. 259 }
  649. 260
  650. 261 static inline void* PyUnicode_DATA(PyObject *op) {
  651. 262 if (PyUnicode_IS_COMPACT(op)) {
  652. 0x0000000000502451 <+577>: test $0x20,%dil
  653. 0x0000000000502455 <+581>: je 0x421de2 <unicodekeys_lookup_unicode-918574>
  654.  
  655. 263 return _PyUnicode_COMPACT_DATA(op);
  656. 0x000000000050245b <+587>: and $0x40,%dil
  657. 0x000000000050245f <+591>: je 0x502505 <unicodekeys_lookup_unicode+757>
  658.  
  659. 248 return _Py_STATIC_CAST(void*, (_PyASCIIObject_CAST(op) + 1));
  660. 0x0000000000502465 <+597>: lea 0x28(%rax),%rdi
  661. 0x0000000000502469 <+601>: mov %r10,0x28(%rsp)
  662. 0x000000000050246e <+606>: mov %r11,0x20(%rsp)
  663. 0x0000000000502473 <+611>: mov %r8,0x18(%rsp)
  664. 0x0000000000502478 <+616>: mov %r9,0x10(%rsp)
  665. 0x000000000050247d <+621>: mov %ecx,0xc(%rsp)
  666. 0x0000000000502481 <+625>: callq 0x41c140 <memcmp@plt>
  667. 0x0000000000502486 <+630>: mov 0xc(%rsp),%ecx
  668. 0x000000000050248a <+634>: mov 0x10(%rsp),%r9
  669. 0x000000000050248f <+639>: test %eax,%eax
  670. 0x0000000000502491 <+641>: mov 0x18(%rsp),%r8
  671. 0x0000000000502496 <+646>: mov 0x20(%rsp),%r11
  672. 0x000000000050249b <+651>: mov 0x28(%rsp),%r10
  673. 0x00000000005024a0 <+656>: je 0x502332 <unicodekeys_lookup_unicode+290>
  674.  
  675. Objects/dictobject.c:
  676. 917 perturb >>= PERTURB_SHIFT;
  677. 0x00000000005024a6 <+662>: shr $0xa,%r9
  678.  
  679. 918 i = mask & (i*5 + perturb + 1);
  680. 0x00000000005024aa <+666>: lea (%r8,%r8,4),%r8
  681. 0x00000000005024ae <+670>: lea 0x1(%r9,%r8,1),%r8
  682. 0x00000000005024b3 <+675>: and %rbx,%r8
  683.  
  684. 892 for (;;) {
  685. 0x00000000005024b6 <+678>: jmpq 0x502256 <unicodekeys_lookup_unicode+70>
  686. 0x00000000005024bb <+683>: nopl 0x0(%rax,%rax,1)
  687.  
  688. 355 else if (log2size >= 32) {
  689. 0x00000000005024c0 <+688>: cmp $0x1f,%ecx
  690. 0x00000000005024c3 <+691>: jg 0x421dd9 <unicodekeys_lookup_unicode-918583>
  691.  
  692. 356 const int64_t *indices = (const int64_t*)(keys->dk_indices);
  693. 357 ix = indices[i];
  694. 358 }
  695. 359 #endif
  696. 360 else {
  697. 361 const int32_t *indices = (const int32_t*)(keys->dk_indices);
  698. 362 ix = indices[i];
  699. 0x00000000005024c9 <+697>: movslq (%r15,%r8,4),%r12
  700.  
  701. 894 if (ix >= 0) {
  702. 0x00000000005024cd <+701>: test %r12,%r12
  703. 0x00000000005024d0 <+704>: jns 0x50226d <unicodekeys_lookup_unicode+93>
  704. 0x00000000005024d6 <+710>: jmpq 0x5022f7 <unicodekeys_lookup_unicode+231>
  705.  
  706. 901 return DKIX_EMPTY;
  707. 902 }
  708. 903 perturb >>= PERTURB_SHIFT;
  709. 904 i = mask & (i*5 + perturb + 1);
  710. 0x00000000005024db <+715>: mov %r9,%rsi
  711. 0x00000000005024de <+718>: lea (%r8,%r8,4),%rdi
  712. 0x00000000005024e2 <+722>: shr $0x5,%rsi
  713. 0x00000000005024e6 <+726>: lea 0x1(%rsi,%rdi,1),%r8
  714. 0x00000000005024eb <+731>: and %rbx,%r8
  715.  
  716. 905
  717. 906 // Manual loop unrolling
  718. 907 ix = dictkeys_get_index(dk, i);
  719. 0x00000000005024ee <+734>: jmpq 0x5022a3 <unicodekeys_lookup_unicode+147>
  720.  
  721. 355 else if (log2size >= 32) {
  722. 0x00000000005024f3 <+739>: cmp $0x1f,%ecx
  723. 0x00000000005024f6 <+742>: jg 0x421deb <unicodekeys_lookup_unicode-918565>
  724.  
  725. 356 const int64_t *indices = (const int64_t*)(keys->dk_indices);
  726. 357 ix = indices[i];
  727. 358 }
  728. 359 #endif
  729. 360 else {
  730. 361 const int32_t *indices = (const int32_t*)(keys->dk_indices);
  731. 362 ix = indices[i];
  732. 0x00000000005024fc <+748>: movslq (%r15,%r8,4),%r12
  733. 0x0000000000502500 <+752>: jmpq 0x50231e <unicodekeys_lookup_unicode+270>
  734.  
  735. ./Include/cpython/unicodeobject.h:
  736. 250 return _Py_STATIC_CAST(void*, (_PyCompactUnicodeObject_CAST(op) + 1));
  737. 0x0000000000502505 <+757>: lea 0x38(%rax),%rdi
  738. 0x0000000000502509 <+761>: jmpq 0x502469 <unicodekeys_lookup_unicode+601>
  739. 0x000000000050250e <+766>: lea 0x38(%rax),%rdi
  740. 0x0000000000502512 <+770>: jmpq 0x5023c3 <unicodekeys_lookup_unicode+435>
  741. 0x0000000000502517 <+775>: mov %r11,%rsi
  742.  
  743. 251 }
  744. 252
  745. 253 static inline void* _PyUnicode_NONCOMPACT_DATA(PyObject *op) {
  746. 254 void *data;
  747. 255 assert(!PyUnicode_IS_COMPACT(op));
  748. 256 data = _PyUnicodeObject_CAST(op)->data.any;
  749. 257 assert(data != NULL);
  750. 258 return data;
  751. 259 }
  752. 260
  753. 261 static inline void* PyUnicode_DATA(PyObject *op) {
  754. 262 if (PyUnicode_IS_COMPACT(op)) {
  755. 0x000000000050251a <+778>: test $0x20,%dil
  756. 0x000000000050251e <+782>: jne 0x5023b6 <unicodekeys_lookup_unicode+422>
  757. 0x0000000000502524 <+788>: jmpq 0x421dfd <unicodekeys_lookup_unicode-918547>
  758.  
  759. 250 return _Py_STATIC_CAST(void*, (_PyCompactUnicodeObject_CAST(op) + 1));
  760. 0x0000000000502529 <+793>: mov %r11,%rsi
  761. 0x000000000050252c <+796>: jmpq 0x502451 <unicodekeys_lookup_unicode+577>
  762. 0x0000000000502531 <+801>: jmpq 0x421dfd <unicodekeys_lookup_unicode-918547>
  763. Address range 0x421daf to 0x421e06:
  764. ./Include/cpython/unicodeobject.h:
  765. 253 static inline void* _PyUnicode_NONCOMPACT_DATA(PyObject *op) {
  766. 254 void *data;
  767. 255 assert(!PyUnicode_IS_COMPACT(op));
  768. 256 data = _PyUnicodeObject_CAST(op)->data.any;
  769. 257 assert(data != NULL);
  770. 258 return data;
  771. 259 }
  772. 260
  773. 261 static inline void* PyUnicode_DATA(PyObject *op) {
  774. 262 if (PyUnicode_IS_COMPACT(op)) {
  775. 263 return _PyUnicode_COMPACT_DATA(op);
  776. 264 }
  777. 265 return _PyUnicode_NONCOMPACT_DATA(op);
  778. 0x0000000000421daf <-918625>: mov 0x38(%rbp),%rsi
  779.  
  780. 258 return data;
  781. 0x0000000000421db3 <-918621>: jmpq 0x50251a <unicodekeys_lookup_unicode+778>
  782.  
  783. Objects/dictobject.c:
  784. 904 i = mask & (i*5 + perturb + 1);
  785. 0x0000000000421db8 <-918616>: mov %r9,%rax
  786. 0x0000000000421dbb <-918613>: lea (%r8,%r8,4),%r8
  787. 0x0000000000421dbf <-918609>: shr $0x5,%rax
  788. 0x0000000000421dc3 <-918605>: lea 0x1(%rax,%r8,1),%r8
  789. 0x0000000000421dc8 <-918600>: and %rbx,%r8
  790.  
  791. 905
  792. 906 // Manual loop unrolling
  793. 907 ix = dictkeys_get_index(dk, i);
  794. 0x0000000000421dcb <-918597>: cmp $0x7,%ecx
  795. 0x0000000000421dce <-918594>: jg 0x502310 <unicodekeys_lookup_unicode+256>
  796. 0x0000000000421dd4 <-918588>: jmpq 0x5022a3 <unicodekeys_lookup_unicode+147>
  797.  
  798. 357 ix = indices[i];
  799. 0x0000000000421dd9 <-918583>: mov (%r15,%r8,8),%r12
  800. 0x0000000000421ddd <-918579>: jmpq 0x5024cd <unicodekeys_lookup_unicode+701>
  801.  
  802. ./Include/cpython/unicodeobject.h:
  803. 265 return _PyUnicode_NONCOMPACT_DATA(op);
  804. 0x0000000000421de2 <-918574>: mov 0x38(%rax),%rdi
  805.  
  806. 258 return data;
  807. 0x0000000000421de6 <-918570>: jmpq 0x502469 <unicodekeys_lookup_unicode+601>
  808.  
  809. Objects/dictobject.c:
  810. 357 ix = indices[i];
  811. 0x0000000000421deb <-918565>: mov (%r15,%r8,8),%r12
  812. 0x0000000000421def <-918561>: jmpq 0x50231e <unicodekeys_lookup_unicode+270>
  813.  
  814. ./Include/cpython/unicodeobject.h:
  815. 265 return _PyUnicode_NONCOMPACT_DATA(op);
  816. 0x0000000000421df4 <-918556>: mov 0x38(%rbp),%rsi
  817.  
  818. 258 return data;
  819. 0x0000000000421df8 <-918552>: jmpq 0x502451 <unicodekeys_lookup_unicode+577>
  820.  
  821. 259 }
  822. 260
  823. 261 static inline void* PyUnicode_DATA(PyObject *op) {
  824. 262 if (PyUnicode_IS_COMPACT(op)) {
  825. 263 return _PyUnicode_COMPACT_DATA(op);
  826. 264 }
  827. 265 return _PyUnicode_NONCOMPACT_DATA(op);
  828. 0x0000000000421dfd <-918547>: mov 0x38(%rax),%rdi
  829.  
  830. 258 return data;
  831. 0x0000000000421e01 <-918543>: jmpq 0x5023c3 <unicodekeys_lookup_unicode+435>
  832.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement