Array reverse

David Nadlinger see at klickverbot.at
Wed Nov 28 00:19:13 PST 2012


On Wednesday, 28 November 2012 at 00:19:33 UTC, bearophile wrote:
> dpaste is currently down and I don't have gdc2/dc2 installed 
> here, so I can't show the asm from those other compilers.

fwiw, here is what LDC produces:

---
_D4test18__T10reverseArrTiZ10reverseArrFAiZv:
	lea	RAX, QWORD PTR [RSI + 4*RDI - 4]
	cmp	RSI, RAX
	jae	.LBB1_3
	lea	RAX, QWORD PTR [RSI + 4*RDI - 8]
	.align	16, 0x90
.LBB1_2:
	mov	ECX, DWORD PTR [RSI]
	mov	EDX, DWORD PTR [RAX + 4]
	mov	DWORD PTR [RSI], EDX
	mov	DWORD PTR [RAX + 4], ECX
	add	RSI, 4
	cmp	RSI, RAX
	lea	RAX, QWORD PTR [RAX - 4]
	jb	.LBB1_2
.LBB1_3:
	ret
---

---
_D3std9algorithm15__T7reverseTAiZ7reverseFAiZv:
	test	RDI, RDI
	je	.LBB2_4
	lea	RAX, QWORD PTR [RSI + 4*RDI - 4]
	.align	16, 0x90
.LBB2_2:
	mov	ECX, DWORD PTR [RSI]
	mov	EDX, DWORD PTR [RAX]
	mov	DWORD PTR [RSI], EDX
	mov	DWORD PTR [RAX], ECX
	cmp	RDI, 1
	je	.LBB2_4
	add	RAX, -4
	add	RSI, 4
	add	RDI, -2
	jne	.LBB2_2
.LBB2_4:
	ret
---

---
_D4test20__T12reverseArrayTiZ12reverseArrayFAiZv:
	lea	RAX, QWORD PTR [RSI + 4*RDI - 4]
	cmp	RSI, RAX
	jae	.LBB3_3
	add	RSI, 4
	.align	16, 0x90
.LBB3_2:
	mov	ECX, DWORD PTR [RSI - 4]
	mov	EDX, DWORD PTR [RAX]
	mov	DWORD PTR [RSI - 4], EDX
	mov	DWORD PTR [RAX], ECX
	add	RAX, -4
	cmp	RSI, RAX
	lea	RSI, QWORD PTR [RSI + 4]
	jb	.LBB3_2
.LBB3_3:
	ret
---

The extra jump in the std.algorithm version is still there – I 
haven't checked whether it would be feasible to optimize the 
induction variable away entirely.

David


More information about the Digitalmars-d mailing list