November 28, 2007
Jerome:
> That's your problem right there. You can install MinGW wherever you
> want (although it's probably best to avoid spaces in the path),
> but you *must* install gdc to the *same* folder.
> Then add c:\mingw\bin to the path if it didn't do it

It works, thank you very much :-)

As a first test I have tried to benchmark the templated Bitfield accessors:

Timings (seconds), n=4_000_000*25:
  C:   0.80
  GDC: 1.30
  DMD: 3.18

Compiled with:
  gcc version 3.4.5 (mingw special) (gdc 0.24, using dmd 1.020)

  DMD v1.023

  gcc version 3.4.2 (mingw-special)

Compilation parameters I have used:
  gcc -O3 -s -finline-functions -ffast-math -fomit-frame-pointer -funroll-loops -march=pentiumpro bitfieldsC.c -o bitfieldsC

  gdc -O3 -s -frelease -finline-functions -ffast-math -fomit-frame-pointer -funroll-loops -march=pentiumpro bitfieldsD.d -o bitfieldsD2

  dmd -O -release -inline bitfieldsD.d


And for reference here is the assembly too, it's interesting.

ASM from GCC:

	.file	"bitfieldsC.c"
	.def	___main;	.scl	2;	.type	32;	.endef
	.data
	.align 4
LC0:
	.long	1628676761
	.long	1620574103
	.long	1237153253
	.long	1098880307
	.long	87513741
	.long	13181925
	.long	14686126
	.long	7429435
	.long	16286706
	.long	6474381
	.long	4879794
	.long	7734725
	.long	3745958
	.long	13353858
	.long	4236193
	.long	7587
	.long	4309
	.long	28846
	.long	7313
	.long	14516
	.long	126
	.long	143
	.long	171
	.long	221
	.long	156
	.section .rdata,"dr"
LC1:
	.ascii "%d\12\0"
	.text
	.p2align 4,,15
.globl _main
	.def	_main;	.scl	2;	.type	32;	.endef
_main:
	pushl	%ebp
	movl	$16, %eax
	movl	%esp, %ebp
	pushl	%edi
	pushl	%esi
	pushl	%ebx
	subl	$140, %esp
	andl	$-16, %esp
	call	__alloca
	call	___main
	leal	-136(%ebp), %eax
	movl	$100, %ecx
	movl	$LC0, %edx
	movl	%ecx, 8(%esp)
	xorl	%esi, %esi
	xorl	%edi, %edi
	movl	%edx, 4(%esp)
	movl	%eax, (%esp)
	call	_memcpy
L9:
	xorl	%ebx, %ebx
	.p2align 4,,15
L8:
	movl	-136(%ebp,%ebx,4), %eax
	movl	-132(%ebp,%ebx,4), %edx
	movl	%eax, %ecx
	shrl	$2, %ecx
	andl	$1, %eax
	andl	$127, %ecx
	addl	%eax, %ecx
	leal	(%esi,%ecx), %ecx
	movl	%edx, %esi
	movl	-128(%ebp,%ebx,4), %eax
	shrl	$2, %esi
	andl	$1, %edx
	andl	$127, %esi
	addl	%edx, %esi
	addl	%esi, %ecx
	movl	-124(%ebp,%ebx,4), %edx
	movl	%eax, %esi
	shrl	$2, %esi
	andl	$1, %eax
	andl	$127, %esi
	addl	%eax, %esi
	movl	%edx, %eax
	addl	%esi, %ecx
	shrl	$2, %eax
	movl	-120(%ebp,%ebx,4), %esi
	andl	$127, %eax
	andl	$1, %edx
	addl	%edx, %eax
	addl	$5, %ebx
	addl	%eax, %ecx
	movl	%esi, %eax
	shrl	$2, %eax
	andl	$1, %esi
	andl	$127, %eax
	addl	%esi, %eax
	cmpl	$24, %ebx
	leal	(%ecx,%eax), %esi
	jle	L8
	incl	%edi
	cmpl	$3999999, %edi
	jle	L9
	movl	%esi, 4(%esp)
	movl	$LC1, (%esp)
	call	_printf
	leal	-12(%ebp), %esp
	xorl	%eax, %eax
	popl	%ebx
	popl	%esi
	popl	%edi
	popl	%ebp
	ret
	.def	_memcpy;	.scl	3;	.type	32;	.endef
	.def	_printf;	.scl	3;	.type	32;	.endef

----------------------

ASM from GDC:

	.file	"bitfieldsD.d"
.globl __D34TypeInfo_S10bitfieldsD10INTORFLOAT6__initZ
	.section	.data$_D34TypeInfo_S10bitfieldsD10INTORFLOAT6__initZ,"w"
	.linkonce same_size
	.align 4
__D34TypeInfo_S10bitfieldsD10INTORFLOAT6__initZ:
	.long	__D15TypeInfo_Struct6__vtblZ
	.long	0
	.long	21
	.long	__D34TypeInfo_S10bitfieldsD10INTORFLOAT6__initZ+44
	.long	4
	.long	0
	.long	0
	.long	0
	.long	0
	.long	0
	.long	0
	.ascii "bitfieldsD.INTORFLOAT\0"
.globl __D10bitfieldsD10INTORFLOAT6__initZ
	.section .rdata,"dr"
	.align 4
__D10bitfieldsD10INTORFLOAT6__initZ:
	.space 4
LC0:
	.ascii "%d\12\0"
	.text
	.p2align 4,,15
.globl __Dmain
	.def	__Dmain;	.scl	2;	.type	32;	.endef
__Dmain:
	pushl	%ebp
	movl	$25, %ecx
	movl	$25, %edx
	pushl	%edi
	xorl	%ebp, %ebp
	xorl	%edi, %edi
	pushl	%esi
	pushl	%ebx
	subl	$140, %esp
	movl	%ecx, %ebx
	movl	%edx, 4(%esp)
	sall	$2, %ebx
	leal	16(%esp), %esi
	movl	$__D11TypeInfo_Ak6__initZ, (%esp)
	call	__d_newarrayT
	movl	$1628676761, (%edx)
	movl	$1620574103, 4(%edx)
	movl	$1237153253, 8(%edx)
	movl	$1098880307, 12(%edx)
	movl	$87513741, 16(%edx)
	movl	$13181925, 20(%edx)
	movl	$14686126, 24(%edx)
	movl	$7429435, 28(%edx)
	movl	$16286706, 32(%edx)
	movl	$6474381, 36(%edx)
	movl	$4879794, 40(%edx)
	movl	$7734725, 44(%edx)
	movl	$3745958, 48(%edx)
	movl	$13353858, 52(%edx)
	movl	$4236193, 56(%edx)
	movl	$7587, 60(%edx)
	movl	$4309, 64(%edx)
	movl	$28846, 68(%edx)
	movl	$7313, 72(%edx)
	movl	$14516, 76(%edx)
	movl	$126, 80(%edx)
	movl	$143, 84(%edx)
	movl	$171, 88(%edx)
	movl	$221, 92(%edx)
	movl	$156, 96(%edx)
	movl	%ebx, 8(%esp)
	xorl	%ebx, %ebx
	movl	%edx, 4(%esp)
	movl	%esi, (%esp)
	call	_memcpy
	cmpl	$4000000, %ebx
	jge	L9
L25:
	xorl	%ecx, %ecx
	jmp	L11
	.p2align 4,,7
L23:
	movl	16(%esp,%ecx,4), %edx
	xorl	%esi, %esi
	movl	%edx, %eax
	shrl	$2, %eax
	andl	$1, %edx
	andl	$127, %eax
	addl	%edx, %eax
	movl	20(%esp,%ecx,4), %edx
	addl	%eax, %edi
	adcl	%esi, %ebp
	xorl	%esi, %esi
	movl	%edx, %eax
	shrl	$2, %eax
	andl	$1, %edx
	andl	$127, %eax
	addl	%edx, %eax
	movl	24(%esp,%ecx,4), %edx
	addl	%eax, %edi
	adcl	%esi, %ebp
	xorl	%esi, %esi
	movl	%edx, %eax
	shrl	$2, %eax
	andl	$1, %edx
	andl	$127, %eax
	addl	%edx, %eax
	movl	28(%esp,%ecx,4), %edx
	addl	%eax, %edi
	adcl	%esi, %ebp
	xorl	%esi, %esi
	movl	%edx, %eax
	shrl	$2, %eax
	andl	$1, %edx
	andl	$127, %eax
	addl	%edx, %eax
	movl	32(%esp,%ecx,4), %edx
	addl	%eax, %edi
	adcl	%esi, %ebp
	xorl	%esi, %esi
	movl	%edx, %eax
	shrl	$2, %eax
	andl	$1, %edx
	andl	$127, %eax
	addl	%edx, %eax
	addl	%eax, %edi
	adcl	%esi, %ebp
	addl	$5, %ecx
L11:
	cmpl	$25, %ecx
	jl	L23
	incl	%ebx
	cmpl	$4000000, %ebx
	jl	L25
L9:
	movl	%edi, 4(%esp)
	movl	%ebp, 8(%esp)
	movl	$LC0, (%esp)
	call	_printf
	addl	$140, %esp
	xorl	%eax, %eax
	popl	%ebx
	popl	%esi
	popl	%edi
	popl	%ebp
	ret
	.section .rdata,"dr"
LC1:
	.ascii "bitfieldsD\0"
.globl __D10bitfieldsD12__ModuleInfoZ
	.data
	.align 4
__D10bitfieldsD12__ModuleInfoZ:
	.long	0
	.long	0
	.long	10
	.long	LC1
	.long	1
	.long	__D10bitfieldsD12__ModuleInfoZ+48
	.long	0
	.long	0
	.long	0
	.long	0
	.long	0
	.long	0
	.long	__D3std5stdio12__ModuleInfoZ
	.align 4
___mod_ref.0:
	.long	0
	.long	__D10bitfieldsD12__ModuleInfoZ
	.section	.ctors,"w"
	.align 4
	.long	__D10bitfieldsD9__modinitFZv
	.text
	.p2align 4,,15
.globl __D10bitfieldsD10INTORFLOAT4signMFZk
	.def	__D10bitfieldsD10INTORFLOAT4signMFZk;	.scl	2;	.type	32;	.endef
__D10bitfieldsD10INTORFLOAT4signMFZk:
	movl	4(%esp), %eax
	movl	(%eax), %eax
	andl	$1, %eax
	ret
	.p2align 4,,15
.globl __D10bitfieldsD10INTORFLOAT4signMFkZv
	.def	__D10bitfieldsD10INTORFLOAT4signMFkZv;	.scl	2;	.type	32;	.endef
__D10bitfieldsD10INTORFLOAT4signMFkZv:
	movl	4(%esp), %eax
	movl	8(%esp), %ecx
	movl	(%eax), %edx
	andl	$1, %ecx
	andl	$-2, %edx
	orl	%ecx, %edx
	movl	%edx, (%eax)
	ret
	.p2align 4,,15
.globl __D10bitfieldsD10INTORFLOAT14biasedexponentMFZk
	.def	__D10bitfieldsD10INTORFLOAT14biasedexponentMFZk;	.scl	2;	.type	32;	.endef
__D10bitfieldsD10INTORFLOAT14biasedexponentMFZk:
	movl	4(%esp), %eax
	movl	(%eax), %eax
	shrl	%eax
	andl	$255, %eax
	ret
	.p2align 4,,15
.globl __D10bitfieldsD10INTORFLOAT14biasedexponentMFkZv
	.def	__D10bitfieldsD10INTORFLOAT14biasedexponentMFkZv;	.scl	2;	.type	32;	.endef
__D10bitfieldsD10INTORFLOAT14biasedexponentMFkZv:
	movzbl	8(%esp), %eax
	movl	4(%esp), %ecx
	movl	(%ecx), %edx
	addl	%eax, %eax
	andl	$-511, %edx
	orl	%eax, %edx
	movl	%edx, (%ecx)
	ret
	.p2align 4,,15
.globl __D10bitfieldsD10INTORFLOAT11significandMFZk
	.def	__D10bitfieldsD10INTORFLOAT11significandMFZk;	.scl	2;	.type	32;	.endef
__D10bitfieldsD10INTORFLOAT11significandMFZk:
	movl	4(%esp), %eax
	movl	(%eax), %eax
	shrl	$9, %eax
	ret
	.p2align 4,,15
.globl __D10bitfieldsD10INTORFLOAT11significandMFkZv
	.def	__D10bitfieldsD10INTORFLOAT11significandMFkZv;	.scl	2;	.type	32;	.endef
__D10bitfieldsD10INTORFLOAT11significandMFkZv:
	movl	4(%esp), %ecx
	movl	8(%esp), %eax
	movl	(%ecx), %edx
	andl	$8388607, %eax
	sall	$9, %eax
	andl	$511, %edx
	orl	%eax, %edx
	movl	%edx, (%ecx)
	ret
	.p2align 4,,15
	.def	__D10bitfieldsD9__modinitFZv;	.scl	3;	.type	32;	.endef
__D10bitfieldsD9__modinitFZv:
	movl	__Dmodule_ref, %eax
	movl	$___mod_ref.0, %edx
	movl	%edx, __Dmodule_ref
	movl	%eax, ___mod_ref.0
	ret
	.def	_memcpy;	.scl	2;	.type	32;	.endef


Bye,
bearophile
November 28, 2007
bearophile wrote:
> Jerome:
>> That's your problem right there. You can install MinGW wherever you
>> want (although it's probably best to avoid spaces in the path),
>> but you *must* install gdc to the *same* folder.
>> Then add c:\mingw\bin to the path if it didn't do it
> 
> It works, thank you very much :-)
> 
> As a first test I have tried to benchmark the templated Bitfield accessors:
> 
> Timings (seconds), n=4_000_000*25:
>   [...]

Nice, thanks for the info!
But, now of course I wonder how D2.Phobos' templates compare... =)

regards, frank