Tiens, y'a des gens qui codent en Delphi pour de vrai :D Je croyais que c'était une espèce disparue...
Tiens, y'a des gens qui codent en Delphi pour de vrai :D Je croyais que c'était une espèce disparue...
Ouais notre prof de diplôme ne jurait que par ça ! Donc on s’est envoyé un gros tas de Delphi (manda extérieur et autres..)
We should treat all the trivial things of life seriously, and all the serious things of life with sincere and studied triviality.[Oscar wilde]
There is no such thing as a moral or an immoral book. Books are well written, or badly written. That is all.[Oscar wilde]
No artist is ever morbid. The artist can express everything.[Oscar wilde]
Il y a vraiment differents niveaux de C, pour en faire toute la journee ce n'est jamais aussi bas niveau...
Bon des fois je m'amuse un peu et fais des trucs plus corses pour embeter mes collegues
Il est des circonstances dans la vie où un homme quelqu'intelligent qu'il soit optempère à des raisons qui bien qu'aléatoires n'en sont pas moins impératives et absolues.
No need to go to a mad house to see deranged minds, Earth is the asylum of the Universe.
Borland offre sa version 10 de Delphi, on aurait tort de s'en priver.Envoyé par Alexko
Par contre pfiou j'ai rarement vu une IDE aussi longue à démarrer.
(dispo sur http://www.codegear.com/, mais le serveur est souvent occupé ...)
Oui, Borland ne va très bien en ce moment, surtout au niveau de ses *Builder qui se vendent mal (c'est sur qu'entre VS et Eclipse, il n'y plus beaucoup de place).
Apparemment, ils se recentrent sur l'Application Lifecycle Management, domaine ou leurs ventes sont meilleures (TeamSystem, Caliber, Together, rachat de Segue, ...).
Plutôt un fisttp en deuxième, sinon la sémantique du cast C n'est pas respectée.Envoyé par Franck@x86
(Même si je ne vois pas trop dans quels circonstances en pratique on voudrait faire une troncature plutôt qu'un arrondi au plus près ou vers -infini, c'est le C qui veut ça...)
Mon gcc 4.1.3 (x86-64, aucune optim) compile (int)f en utilisant un cvttsd2si (SSE2 Convert with Truncation Scalar Double-Precision Floating-Point Value to Signed Doubleword Integer).Donc finalement cette macro, bien que super peu pratique par rapport à un simple "(int)f", reste le meilleur compromis à mon avis.
Difficile de faire plus efficace... (Enfin si avec un cvttpd2pi :D)
c'est bien la 10 :
Borland® Delphi® for Microsoft® Windows™ Version 10.0.2288.42451
C'est du au fait que ce soit justement un gcc x86-64. Si c'était juste un gcc x86, il ferait ça avec x87, à moins de compiler avec -mfpu=sse.Envoyé par Møgluglu
"si tout le monde s'etait dit "pour quoi faire ?" je pense qu'on tournerait encore sur 8086. Si tant est qu'on ait l'electricite ... " Franck@X86
If all goes well will Dell sell Cells?
<°)))><
Sur une machine i386 j'obtiens :
(désolé pour la syntaxe Gnu, j'ai pas trouvé dans les 500 pages du man comment faire cracher autre chose à gcc [Edit: -masm=intel, pour la prochaine fois])
-march=k8 -mfpmath=387 :
Tiens, du SSE2 même quand on ne lui en demande pas... Pourquoi pas, mais ça oblige à passer par un store-load.Code:fstpl -24(%ebp) movlpd -24(%ebp), %xmm0 cvttsd2si %xmm0, %eax
-march=prescott -mfpmath=387 :
Le SSE3 c'est bon mangez-en :PCode:fisttpl -12(%ebp)
-march=i686 :
Ahhh, du grand art.Code:fnstcw -26(%ebp) movzwl -26(%ebp), %eax orw $3072, %ax movw %ax, -28(%ebp) fldcw -28(%ebp) fistpl -12(%ebp) fldcw -26(%ebp) movl -12(%ebp), %eax
- Sauvegarde du registre de contrôle x87
- Changement du mode d'arrondi en troncature (avec un passage par la mémoire mais on n'est plus à ça près, on a déjà cassé le pipeline de toute façon)
- Conversion en entier, avec le mode d'arrondi sélectionné
- Restauration du registre de contrôle
Du coup effectivement, pour ces processeurs-là la bidouille avec la constante est largement plus efficace qu'un changement du mode d'arrondi.
Mais tout ça c'est la faute du C et sa sémantique euh... étrange.
Donc il reste 2 solutions
- hardware : compiler en X87+SSE3, ou en SSE2
- software : programmer en C99 et faire le cast avec lrint.
Et tout ça parce que quelqu'un dans les années 70 s'est dit que ce serait plus simple d'implémenter le cast float -> int par une troncature plutôt qu'avec un vrai arrondi... :fou:
Purée le code que ça fait en i686 pour un simple cast, j'aurais jamais cru uch:
Je te rassure, ça c'était la version naïve et lente de gcc. La version "rapide" d'Intel est bien pire.Envoyé par Foudge
Aller, juste pour le fun :
(http://developer.intel.com/design/pr...als/248966.pdf, 3.8.3.1)
En gros :Code:_fto132proc lea ecx, [esp-8] sub esp, 16 ; Allocate frame and ecx, -8 ; Align pointer on boundary of 8 fld st(0) ; Duplicate FPU stack top fistp qword ptr[ecx] fild qword ptr[ecx] mov edx, [ecx+4] ; High DWORD of integer mov eax, [ecx] ; Low DWIRD of integer test eax, eax je integer_QnaN_or_zero arg_is_not_integer_QnaN: fsubp st(1), st ; TOS=d-round(d), { st(1) = st(1)-st & pop ST} test edx, edx ; What's sign of integer jns positive ; Number is negative fstp dword ptr[ecx] ; Result of subtraction mov ecx, [ecx] ; DWORD of diff(single-precision) add esp, 16 xor ecx, 80000000h add ecx,7fffffffh ; If diff<0 then decrement integer [increment plutôt??] adc eax,0 ; INC EAX (add CARRY flag) ret positive: fstp dword ptr[ecx] ; 17-18 result of subtraction mov ecx, [ecx] ; DWORD of diff(single precision) add esp, 16 add ecx, 7fffffffh ; If diff<0 then decrement integer sbb eax, 0 ; DEC EAX (subtract CARRY flag) ret integer_QnaN_or_zero: test edx, 7fffffffh jnz arg_is_not_integer_QnaN add esp, 16 ret
- On convertit en entier dans le mode d'arrondi actuel
- On reconvertit dans l'autre sens en flottant
- On fait la différence des deux pour savoir dans quel sens s'est fait l'arrondi, et s'il s'est fait dans le mauvais sens on corrige en ajoutant/retranchant 1, en considérant les cas positif/négatif.
Remarquer la touche de l'artiste : le add ecx,7fffffffh sur la représentation binaire d'un flottant pour récupérer le signe et le faire passer dans le flag carry, suivi d'un adc/sbb eax,0 pour incrémenter/décrémenter ou pas le nombre suivant la valeur de ce signe. t1cable:
Et puis un peu de code spaghetti pour distinguer les overflows des NaNs...
Oui, tout ça pour un simple cast.
En fait, le C est un langage de haut niveau, il n'y a aucun doute :D
Si jamais il y a des trucs comme ça et d’autres qui sont expliqués dans les blue books d’Intel !Envoyé par Lissyx
We should treat all the trivial things of life seriously, and all the serious things of life with sincere and studied triviality.[Oscar wilde]
There is no such thing as a moral or an immoral book. Books are well written, or badly written. That is all.[Oscar wilde]
No artist is ever morbid. The artist can express everything.[Oscar wilde]