Question: "backwards" adressing
Ulf Zibis
Ulf.Zibis at gmx.de
Tue Sep 8 05:59:05 PDT 2009
Christian, thanks for remembering my question.
Am 05.09.2009 11:20, Christian Thalinger schrieb:
> Ulf Zibis wrote:
>
>> Do you know any reason for this ?
>>
>
> Let's see what code is generated (on 32-bit x86)...
>
>
>> static void loop1(int off, char in1, char in2, char[] out) {
>> out[off+3] = in1;
>> out[off+5] = in2;
>> out[off+0] = in1;
>> out[off+4] = in2;
>> out[off+9] = in1;
>> out[off+8] = in2;
>> out[off+6] = in1;
>> out[off+1] = in2;
>> out[off+7] = in1;
>> out[off+2] = in2;
>> }
>>
>
> 030 MOV16 [EDI + #22 + ECX << #1],EBP
> 035 MOV16 [EDI + #12 + ECX << #1],EDX
> 03a MOV16 [EDI + #20 + ECX << #1],EBP
> 03f MOV16 [EDI + #30 + ECX << #1],EDX
> 044 MOV16 [EDI + #28 + ECX << #1],EBP
> 049 MOV16 [EDI + #24 + ECX << #1],EDX
> 04e MOV16 [EDI + #14 + ECX << #1],EBP
> 053 MOV16 [EDI + #26 + ECX << #1],EDX
> 058 MOV16 [EDI + #16 + ECX << #1],EBP
>
>
>> static void loop2(int off, char in1, char in2, char[] out) {
>> out[off++] = in1;
>> out[off++] = in2;
>> out[off++] = in1;
>> out[off++] = in2;
>> out[off++] = in1;
>> out[off++] = in2;
>> out[off++] = in1;
>> out[off++] = in2;
>> out[off++] = in1;
>> out[off++] = in2;
>> }
>>
>
> 02e MOV16 [EBX + #14 + ECX << #1],EDI
> 033 MOV16 [EBX + #16 + ECX << #1],EDX
> 038 MOV16 [EBX + #18 + ECX << #1],EDI
> 03d MOV16 [EBX + #20 + ECX << #1],EDX
> 042 MOV16 [EBX + #22 + ECX << #1],EDI
> 047 MOV16 [EBX + #24 + ECX << #1],EDX
> 04c MOV16 [EBX + #26 + ECX << #1],EDI
> 051 MOV16 [EBX + #28 + ECX << #1],EDX
> 056 MOV16 [EBX + #30 + ECX << #1],EDI
>
> As you can see the instruction sequence is almost the same, except the
> ordering. Theoretically the second one should be faster as continuous
> writes should perform better.
>
Yes, that's what I'm wondering too, because it's even contrariwise in my
test.
Additionally I don't understand:
- the additional shift by #1, so the address in loop2 would be
incremented by 4 (or is there a parenthesis missing around (ECX << #1)
?), but we are in a char[] not int[]
- Why doesn't hotspot compile to INC opcodes? I think, CPU's won't have
INC, if they wouldn't have advantages. ???
- This complex addressing moded MOV opcode needs 5 bytes to be loaded
each, I guess, INC should be shorter.
- Doesn't x86 have a combined MOV_&_INC opcode ?
Stupid questions? OK, it's long time ago, I was programming in
assembler, and modern x86 didn't exist that time.
-Ulf
More information about the hotspot-compiler-dev
mailing list