Posted to tcl by aspect at Wed Sep 30 01:39:29 GMT 2015view raw

  1. with -Os, the unoptimised version compiles as:
  2.  
  3. CompareVarKeys:
  4. .LFB82:
  5. pushq %r13 #
  6. pushq %r12 #
  7. pushq %rbp #
  8. pushq %rbx #
  9. pushq %rcx #
  10. movq 32(%rsi), %rbp # hPtr_10(D)->key.objPtr, objPtr2
  11. cmpq %rbp, %rdi # objPtr2, keyPtr
  12. jne .L107 #,
  13. .L111:
  14. movl $1, %r13d #, D.20762
  15. jmp .L108 #
  16. .L107:
  17. movq 8(%rdi), %r12 # MEM[(struct Tcl_Obj *)keyPtr_8(D)].bytes, p1
  18. movq %rdi, %rbx # keyPtr, keyPtr
  19. testq %r12, %r12 # p1
  20. jne .L109 #,
  21. call Tcl_GetString@PLT #
  22. movq %rax, %r12 #, p1
  23. .L109:
  24. movq 8(%rbp), %rsi # objPtr2_11->bytes, p2
  25. movl 16(%rbx), %ebx # MEM[(struct Tcl_Obj *)keyPtr_8(D)].length, l1
  26. testq %rsi, %rsi # p2
  27. jne .L110 #,
  28. movq %rbp, %rdi # objPtr2,
  29. call Tcl_GetString@PLT #
  30. movq %rax, %rsi #, p2
  31. .L110:
  32. xorl %r13d, %r13d # D.20762
  33. cmpl 16(%rbp), %ebx # objPtr2_11->length, l1
  34. jne .L108 #,
  35. movslq %ebx, %rdx # l1, D.20763
  36. movq %r12, %rdi # p1,
  37. call memcmp@PLT #
  38. testl %eax, %eax # tmp95
  39. je .L111 #,
  40. .L108:
  41. popq %rdx #
  42. movl %r13d, %eax # D.20762,
  43. popq %rbx #
  44. popq %rbp #
  45. popq %r12 #
  46. popq %r13 #
  47. ret
  48.  
  49.  
  50.  
  51. Optimised version:
  52.  
  53. CompareVarKeys:
  54. movq 32(%rsi), %rsi # hPtr_5(D)->key.objPtr, objPtr2
  55. cmpq %rsi, %rdi # objPtr2, keyPtr
  56. je .L113 #,
  57. jmp CompareDistinctVarKeys #
  58. .L113:
  59. movl $1, %eax #,
  60. ret
  61.  
  62.  
  63.  
  64. CompareDistinctVarKeys:
  65. pushq %r12 #
  66. pushq %rbp #
  67. movq %rsi, %r12 # objPtr2, objPtr2
  68. pushq %rbx #
  69. movq 8(%rdi), %rbp # objPtr1_7(D)->bytes, p1
  70. movq %rdi, %rbx # objPtr1, objPtr1
  71. testq %rbp, %rbp # p1
  72. jne .L107 #,
  73. call Tcl_GetString@PLT #
  74. movq %rax, %rbp #, p1
  75. .L107:
  76. movq 8(%r12), %rsi # objPtr2_12(D)->bytes, p2
  77. movl 16(%rbx), %ebx # objPtr1_7(D)->length, l1
  78. testq %rsi, %rsi # p2
  79. jne .L108 #,
  80. movq %r12, %rdi # objPtr2,
  81. call Tcl_GetString@PLT #
  82. movq %rax, %rsi #, p2
  83. .L108:
  84. xorl %eax, %eax # D.20770
  85. cmpl 16(%r12), %ebx # objPtr2_12(D)->length, l1
  86. jne .L109 #,
  87. movslq %ebx, %rdx # l1, D.20771
  88. movq %rbp, %rdi # p1,
  89. call memcmp@PLT #
  90. testl %eax, %eax # tmp95
  91. sete %al #, D.20770
  92. movzbl %al, %eax # D.20770, D.20770
  93. .L109:
  94. popq %rbx #
  95. popq %rbp #
  96. popq %r12 #
  97. ret
  98.