On 7/12/16 15:15, Vlastimil Babka wrote:
> On 07/11/2016 09:47 PM, Chen Gang wrote:
>>
>>
>> In our case, the 2 output size are same, but under x86_64, the insns are
>> different. After uses bool, it uses push/pop instead of branch, for me,
>> it should be a little better for catching.
>
> You mean "caching"? I don't see how this is better for caching. After the
> push/pop, the same branch is still there, so it's not eliminated (which would
> be indeed better). Somehow the original version just avoids the function
> prologue (push rbp, mov rsp, rbp) for the !__PageMovable(page) case. That's
> something I would expect e.g. if it was marked likely(), but here it's
> probably just accidental that the heuristics think it's likely in the "int"
> case and not "bool". So it's not a valid reason for prefering int over bool.
> The question is perhaps if it's indeed likely or unlikely and should be
> marked as such :)
>
Oh, sorry, after check the details, the result is a little complex (2
things are mixed together, and likely can be also considered):
- One return statement instead of the 3 statements which will change
the detail instructions (in fact, it has negative effect).
- gcc 6.0 and redhat gcc 4.8 generate the different results.
The related output are:
- If use one return statement instead of the 3 statements with gcc 6.0,
the result is my original outputs which we discussed before.
- If still use 3 statements (only use true, false instead of 1, 0) with
gcc 6.0, the 2 outputs are equal.
- If still use 3 statements (only use true, false instead of 1, 0) with
gcc 4.8, the 2 outputs are different, and obviously, the bool will be
a little better (no "xor %ebx,%ebx").
- If use one return statement instead of the 3 statements with gcc 4.8,
the result is a little bad than keeping 3 statements.
- If we add likely(), can get the same result: bool is a little better
(no "movzbl %al,%eax").
All together:
- For return statement, merging multi-statement together is not a good
idea, it will let compiler generates a little bad code.
- For gcc 6.0, in our case, the outputs are the same (and both enable
'likely', too).
- For gcc 4.8, in our case, 'bool' output is a little better than 'int'
(after enable 'likely', also get the same result)
The int output by gcc 4.8:
0000000000001150 <PageMovable>:
1150: 48 8b 57 08 mov 0x8(%rdi),%rdx
1154: 55 push %rbp
1155: 48 89 e5 mov %rsp,%rbp
1158: 53 push %rbx
1159: 31 db xor %ebx,%ebx
115b: 83 e2 03 and $0x3,%edx
115e: 48 83 fa 02 cmp $0x2,%rdx
1162: 74 05 je 1169 <__SetPageMovable+0x1169>
1164: 89 d8 mov %ebx,%eax
1166: 5b pop %rbx
1167: 5d pop %rbp
1168: c3 retq
1169: e8 00 00 00 00 callq 116e <__SetPageMovable+0x116e>
116e: 48 85 c0 test %rax,%rax
1171: 74 f1 je 1164 <__SetPageMovable+0x1164>
1173: 48 8b 40 68 mov 0x68(%rax),%rax
1177: 48 85 c0 test %rax,%rax
117a: 74 e8 je 1164 <__SetPageMovable+0x1164>
117c: 31 db xor %ebx,%ebx
117e: 48 83 78 68 00 cmpq $0x0,0x68(%rax)
1183: 0f 95 c3 setne %bl
1186: 89 d8 mov %ebx,%eax
1188: 5b pop %rbx
1189: 5d pop %rbp
118a: c3 retq
118b: 0f 1f 44 00 00 nopl 0x0(%rax,%rax,1)
The bool output by gcc 4.8:
0000000000001150 <PageMovable>:
1150: 48 8b 57 08 mov 0x8(%rdi),%rdx
1154: 55 push %rbp
1155: 48 89 e5 mov %rsp,%rbp
1158: 53 push %rbx
1159: 31 db xor %ebx,%ebx
115b: 83 e2 03 and $0x3,%edx
115e: 48 83 fa 02 cmp $0x2,%rdx
1162: 74 05 je 1169 <__SetPageMovable+0x1169>
1164: 89 d8 mov %ebx,%eax
1166: 5b pop %rbx
1167: 5d pop %rbp
1168: c3 retq
1169: e8 00 00 00 00 callq 116e <__SetPageMovable+0x116e>
116e: 48 85 c0 test %rax,%rax
1171: 74 f1 je 1164 <__SetPageMovable+0x1164>
1173: 48 8b 40 68 mov 0x68(%rax),%rax
1177: 48 85 c0 test %rax,%rax
117a: 74 e8 je 1164 <__SetPageMovable+0x1164>
117c: 48 83 78 68 00 cmpq $0x0,0x68(%rax)
1181: 0f 95 c3 setne %bl
1184: 89 d8 mov %ebx,%eax
1186: 5b pop %rbx
1187: 5d pop %rbp
1188: c3 retq
1189: 0f 1f 80 00 00 00 00 nopl 0x0(%rax)
The int output by gcc 4.8 with likely():
0000000000001150 <PageMovable>:
1150: 48 8b 47 08 mov 0x8(%rdi),%rax
1154: 83 e0 03 and $0x3,%eax
1157: 48 83 f8 02 cmp $0x2,%rax
115b: 74 03 je 1160 <__SetPageMovable+0x1160>
115d: 31 c0 xor %eax,%eax
115f: c3 retq
1160: 55 push %rbp
1161: 48 89 e5 mov %rsp,%rbp
1164: e8 00 00 00 00 callq 1169 <__SetPageMovable+0x1169>
1169: 48 85 c0 test %rax,%rax
116c: 74 16 je 1184 <__SetPageMovable+0x1184>
116e: 48 8b 40 68 mov 0x68(%rax),%rax
1172: 48 85 c0 test %rax,%rax
1175: 74 0d je 1184 <__SetPageMovable+0x1184>
1177: 48 83 78 68 00 cmpq $0x0,0x68(%rax)
117c: 5d pop %rbp
117d: 0f 95 c0 setne %al
1180: 0f b6 c0 movzbl %al,%eax
1183: c3 retq
1184: 31 c0 xor %eax,%eax
1186: 5d pop %rbp
1187: c3 retq
1188: 0f 1f 84 00 00 00 00 nopl 0x0(%rax,%rax,1)
118f: 00
The bool output by gcc 4.8 with likely():
0000000000001150 <PageMovable>:
1150: 48 8b 47 08 mov 0x8(%rdi),%rax
1154: 83 e0 03 and $0x3,%eax
1157: 48 83 f8 02 cmp $0x2,%rax
115b: 74 03 je 1160 <__SetPageMovable+0x1160>
115d: 31 c0 xor %eax,%eax
115f: c3 retq
1160: 55 push %rbp
1161: 48 89 e5 mov %rsp,%rbp
1164: e8 00 00 00 00 callq 1169 <__SetPageMovable+0x1169>
1169: 48 85 c0 test %rax,%rax
116c: 74 13 je 1181 <__SetPageMovable+0x1181>
116e: 48 8b 40 68 mov 0x68(%rax),%rax
1172: 48 85 c0 test %rax,%rax
1175: 74 0a je 1181 <__SetPageMovable+0x1181>
1177: 48 83 78 68 00 cmpq $0x0,0x68(%rax)
117c: 5d pop %rbp
117d: 0f 95 c0 setne %al
1180: c3 retq
1181: 31 c0 xor %eax,%eax
1183: 5d pop %rbp
1184: c3 retq
1185: 66 66 2e 0f 1f 84 00 data32 nopw %cs:0x0(%rax,%rax,1)
118c: 00 00 00 00
Thanks.
>> The orig:
>>
>> 0000000000001290 <PageMovable>:
>> 1290: 48 8b 47 08 mov 0x8(%rdi),%rax
>> 1294: 83 e0 03 and $0x3,%eax
>> 1297: 48 83 f8 02 cmp $0x2,%rax
>> 129b: 74 03 je 12a0
>> <__SetPageMovable+0x12a0>
>> 129d: 31 c0 xor %eax,%eax
>> 129f: c3 retq
>> 12a0: 55 push %rbp
>> 12a1: 48 89 e5 mov %rsp,%rbp
>> 12a4: e8 00 00 00 00 callq 12a9
>> <__SetPageMovable+0x12a9>
>> 12a9: 48 85 c0 test %rax,%rax
>> 12ac: 74 17 je 12c5
>> <__SetPageMovable+0x12c5>
>> 12ae: 48 8b 50 68 mov 0x68(%rax),%rdx
>> 12b2: 48 85 d2 test %rdx,%rdx
>> 12b5: 74 0e je 12c5
>> <__SetPageMovable+0x12c5>
>> 12b7: 48 83 7a 68 00 cmpq $0x0,0x68(%rdx)
>> 12bc: b8 01 00 00 00 mov $0x1,%eax
>> 12c1: 74 02 je 12c5
>> <__SetPageMovable+0x12c5>
>> 12c3: 5d pop %rbp
>> 12c4: c3 retq
>> 12c5: 31 c0 xor %eax,%eax
>> 12c7: 5d pop %rbp
>> 12c8: c3 retq
>> 12c9: 0f 1f 80 00 00 00 00 nopl 0x0(%rax)
>>
>> The new:
>>
>> 0000000000001290 <PageMovable>:
>> 1290: 48 8b 47 08 mov 0x8(%rdi),%rax
>> 1294: 55 push %rbp
>> 1295: 48 89 e5 mov %rsp,%rbp
>> 1298: 53 push %rbx
>> 1299: 31 db xor %ebx,%ebx
>> 129b: 83 e0 03 and $0x3,%eax
>> 129e: 48 83 f8 02 cmp $0x2,%rax
>> 12a2: 74 05 je 12a9
>> <__SetPageMovable+0x12a9>
>> 12a4: 89 d8 mov %ebx,%eax
>> 12a6: 5b pop %rbx
>> 12a7: 5d pop %rbp
>> 12a8: c3 retq
>> 12a9: e8 00 00 00 00 callq 12ae
>> <__SetPageMovable+0x12ae>
>> 12ae: 48 85 c0 test %rax,%rax
>> 12b1: 74 f1 je 12a4
>> <__SetPageMovable+0x12a4>
>> 12b3: 48 8b 40 68 mov 0x68(%rax),%rax
>> 12b7: 48 85 c0 test %rax,%rax
>> 12ba: 74 e8 je 12a4
>> <__SetPageMovable+0x12a4>
>> 12bc: 48 83 78 68 00 cmpq $0x0,0x68(%rax)
>> 12c1: 0f 95 c3 setne %bl
>> 12c4: 89 d8 mov %ebx,%eax
>> 12c6: 5b pop %rbx
>> 12c7: 5d pop %rbp
>> 12c8: c3 retq
>> 12c9: 0f 1f 80 00 00 00 00 nopl 0x0(%rax)
>>
>> Thanks.
>>
>
>
--
Chen Gang (陈刚)
Managing Natural Environments is the Duty of Human Beings.