3510

trilove grin

3511

grin
avatar
Zeroblog

« Tout homme porte sur l'épaule gauche un singe et, sur l'épaule droite, un perroquet. » — Jean Cocteau
« Moi je cherche plus de logique non plus. C'est surement pour cela que j'apprécie les Ataris, ils sont aussi logiques que moi ! » — GT Turbo

3512

Est-ce que le comportement d'une expression telle que if ((a++ > b) || (a++ < c)) est parfaitement défini en C ou C++ ?
(bien sûr, ne parlons pas lisibilité)

Je crois que || et && sont paresseux, donc ça donne plusieurs possibilités :
- une seule incrémentation si (a++ > b) est vrai- deux incrémentations si la première condition est fausse
- une ou deux incrémentations suivant le compilo, la position de la lune et l'âge du capitaine

Merci d'avance happy

3513

Non elle n’est pas définie, c’est d’ailleurs marque dans la norme.

Et même quand tu n’as pas un || ou && qui peux simplifier les tests au milieux

Foo(a++, a++) ne donne pas un résultat garantit.
avatar
Proud to be CAKE©®™


GCC4TI importe qui a problème en Autriche, pour l'UE plus et une encore de correspours nucléaire, ce n'est pas ytre d'instérier. L'état très même contraire, toujours reconstruire un pouvoir une choyer d'aucrée de compris le plus mite de genre, ce n'est pas moins)
Stalin est l'élection de la langie.

3514

Merci ! top

3515

Godzil : flemme de ressortir le K&R là, mais il me semblait que les opérateurs || et && étaient garantis de fonctionner tel que le décrit Folco :
Folco (./3512) :
- une seule incrémentation si (a++ > b) est vrai
- deux incrémentations si la première condition est fausse

D'ailleurs cette réponse le confirme :
https://stackoverflow.com/questions/21238900/sequence-point-operator

Ce n'est pas la même chose que Foo(a++, a++) dont le comportement est effectivement indéfini.
avatar
Zeroblog

« Tout homme porte sur l'épaule gauche un singe et, sur l'épaule droite, un perroquet. » — Jean Cocteau
« Moi je cherche plus de logique non plus. C'est surement pour cela que j'apprécie les Ataris, ils sont aussi logiques que moi ! » — GT Turbo

3516

Folco (./3514) :
Merci ! top

3517

Zéro, Ce n’est pas mon interprétation, si le || ou && évalue la partie à droite on retombe sur le même cas que l'appel de fonction
avatar
Proud to be CAKE©®™


GCC4TI importe qui a problème en Autriche, pour l'UE plus et une encore de correspours nucléaire, ce n'est pas ytre d'instérier. L'état très même contraire, toujours reconstruire un pouvoir une choyer d'aucrée de compris le plus mite de genre, ce n'est pas moins)
Stalin est l'élection de la langie.

3518

Ben non ? Le problème avec l'appel de fonction est qu'il n'y a pas de sequence point entre les deux a++, alors que les opérateurs || et && en ont un, et garantissent en plus l'ordre et les conditions d'évaluation.
avatar
Zeroblog

« Tout homme porte sur l'épaule gauche un singe et, sur l'épaule droite, un perroquet. » — Jean Cocteau
« Moi je cherche plus de logique non plus. C'est surement pour cela que j'apprécie les Ataris, ils sont aussi logiques que moi ! » — GT Turbo

3519

Je ne sais pas, mais personellement le fait que les "++" et "--" ai une priorité supérieure au || et && est contradictoire avec le "sequence point", et apres regardage de la sortie de compilateur pour un code aussi simple que

void bar(int x, int y, int z); void foo(int a, int b, int c) { if ((a++ > b) || (a++ < c)) b+=53; bar(a, b, c); }
Tu peux avoir des (mauvaises) surprises sur la valeur de A en sortie.
Le code en question reste sale et sujet a des effets de bords potentiellement indesirable. Je ne me risquerais pas a ecrire un telle chose
avatar
Proud to be CAKE©®™


GCC4TI importe qui a problème en Autriche, pour l'UE plus et une encore de correspours nucléaire, ce n'est pas ytre d'instérier. L'état très même contraire, toujours reconstruire un pouvoir une choyer d'aucrée de compris le plus mite de genre, ce n'est pas moins)
Stalin est l'élection de la langie.

3520

Ah mais c'est sûr que de toute façon, c'est pas une bonne idée d'écrire du code de ce genre. Mais je pense que Folco posait la question par simple curiosité.
avatar
Zeroblog

« Tout homme porte sur l'épaule gauche un singe et, sur l'épaule droite, un perroquet. » — Jean Cocteau
« Moi je cherche plus de logique non plus. C'est surement pour cela que j'apprécie les Ataris, ils sont aussi logiques que moi ! » — GT Turbo

3521

Yep. Je suis juste tombé sur un cas où j'aurais pu l'écrire, modulo le fait que ça marche comme attendu. Mais j'ai écrit proprement (et plus lisiblement, accessoirement).

3522

Je confirme ce qu'a écrit Zerosquare (donc Godzil a tort), && et || sont bien des points séquence et donc a n'est postincrémenté qu'une fois (et n'est pas référencé ailleurs) par séquence (intervalle entre 2 points séquence) et donc le code est bien défini.
avatar
Mes news pour calculatrices TI: Ti-Gen
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité

3523

Cf une question de Folco dans vider le presse papier, je voulais voir ce que fait un compilateur, je suis duement impressioné et ce n'est pas ce que je voulais montrer a la base:

https://godbolt.org/g/PbHJT1

GCC, mais surtout CLANG arrivent a détecter que mon code recursif (debile) fait une multiplication et remplace le tout par l'instruction qui va bien, je suis sur le cul!
avatar
Proud to be CAKE©®™


GCC4TI importe qui a problème en Autriche, pour l'UE plus et une encore de correspours nucléaire, ce n'est pas ytre d'instérier. L'état très même contraire, toujours reconstruire un pouvoir une choyer d'aucrée de compris le plus mite de genre, ce n'est pas moins)
Stalin est l'élection de la langie.

3524

Je m'y connais pas trop en x86_64, mais je vois un truc bizarre réalisé par les deux compilateur : "xor eax, eax". Ca semble une alternative a un "mov eax, 0". C'est plus rapide?
avatar

3525

C'est un vieux truc connu, c'est souvent utilisé, probablement plus rapide vu que c'est juste des registres ? En tout cas c'est ultra courant, et je doute que ce soit juste pour se donner un genre grin

Godzil > Ah oui, tiens, moi aussi je suis assis !

Kevin Kofler (./3522) :
Je confirme ce qu'a écrit Zerosquare (donc Godzil a tort), && et || sont bien des points séquence et donc a n'est postincrémenté qu'une fois (et n'est pas référencé ailleurs) par séquence (intervalle entre 2 points séquence) et donc le code est bien défini.
pencil, c'est du coupe circuit donc c'est pas évalué.

3526

C'est un vieux truc bizzare qu'une grand mere veux vous devoiler et que les informaticiens deteste


Plus serieusement:

Usage:  MOV     dest,src

                             Clocks                 Size
    Operands         808x  286   386   486          Bytes
    reg,immed         4     2     2     1            2-3
https://zsmith.co/intel_m.html#mov

Usage:  XOR     dest,src
                             Clocks                 Size
    Operands         808x  286   386   486          Bytes
    reg,reg           3     2     2     1             2
https://zsmith.co/intel_x.html#xor

Pour les archi recente (post 486), le comptage de cycle est quasi impossible, ou du moins tres complexe (deja que le 386/486 ne sont pas simple a ce niveau)

Le NOP n'existe pas non plus, et est en fait un

XCHG AL, AL

http://www.mlsite.net/8086/

Si on compare avec les autres instruction tel que MOV en ligne B, la colonne 0 pointe sur AL, 1 sur CL, 2 sur DL, etc..
XCHG en ligne 9 est "NOP" en colonne 0, CX/AX en 1, DX/AX en 2 etc..

On l'apelle "NOP" mais en realité le CPU fait bel et bien l'operation d'echange entre AX et AX XD (en tout cas sur les 8086-80286-ish, intel a modifié entre temps pour etre un veritable NOP surtout sur les archi a microarchitecture comme le Pentium
avatar
Proud to be CAKE©®™


GCC4TI importe qui a problème en Autriche, pour l'UE plus et une encore de correspours nucléaire, ce n'est pas ytre d'instérier. L'état très même contraire, toujours reconstruire un pouvoir une choyer d'aucrée de compris le plus mite de genre, ce n'est pas moins)
Stalin est l'élection de la langie.

3527

Godzil (./3526) :
C'est un vieux truc bizzare qu'une grand mere veux vous devoiler et que les informaticiens deteste
grin

3528

Impressionnant CLang oO
Je me demande quel algo peut détecter (peephole) ou optimiser à ce point !

3529

Oui hein?
avatar
Proud to be CAKE©®™


GCC4TI importe qui a problème en Autriche, pour l'UE plus et une encore de correspours nucléaire, ce n'est pas ytre d'instérier. L'état très même contraire, toujours reconstruire un pouvoir une choyer d'aucrée de compris le plus mite de genre, ce n'est pas moins)
Stalin est l'élection de la langie.

3530

Je suppose que cette construction apparaît dans un benchmark populaire et est donc explicitement détectée. grin
avatar
Mes news pour calculatrices TI: Ti-Gen
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité

3531

Il ne trouve pas que pour la récursion, mais aussi pour une version purement itérative:

https://godbolt.org/g/UfheJs

Il trouve aussi pour une addition récursive.
Par contre, pas la division, va comprendre.
Par contre il est capable de rentre itératif la division récursive, en un code très proche de la version itérative.
avatar
Proud to be CAKE©®™


GCC4TI importe qui a problème en Autriche, pour l'UE plus et une encore de correspours nucléaire, ce n'est pas ytre d'instérier. L'état très même contraire, toujours reconstruire un pouvoir une choyer d'aucrée de compris le plus mite de genre, ce n'est pas moins)
Stalin est l'élection de la langie.

3532

C'est assez impressionnant en effet.
avatar
Zeroblog

« Tout homme porte sur l'épaule gauche un singe et, sur l'épaule droite, un perroquet. » — Jean Cocteau
« Moi je cherche plus de logique non plus. C'est surement pour cela que j'apprécie les Ataris, ils sont aussi logiques que moi ! » — GT Turbo

3533

c'est peut être une optim commune built in.

3534

Tu connais beaucoup de gens qui font des multiplications par additions récursives, toi ? cheeky
avatar
Zeroblog

« Tout homme porte sur l'épaule gauche un singe et, sur l'épaule droite, un perroquet. » — Jean Cocteau
« Moi je cherche plus de logique non plus. C'est surement pour cela que j'apprécie les Ataris, ils sont aussi logiques que moi ! » — GT Turbo

3535

Hypothèse : s'il commence par détecter que la fonction est récursive terminale, il va la remplacer par la version itérative équivalente. À partir de là, le code est peut-être assez simple à analyser pour détecter qu'il s'agit d'une multiplication ?
avatar
All right. Keep doing whatever it is you think you're doing.
------------------------------------------
Besoin d'aide sur le site ? Essayez par ici :)

3536

La transformation récursif -> itératif est assez classique pour les compilateurs en effet, mais je suis davantage surpris par la transformation additions -> multiplication.
avatar
Zeroblog

« Tout homme porte sur l'épaule gauche un singe et, sur l'épaule droite, un perroquet. » — Jean Cocteau
« Moi je cherche plus de logique non plus. C'est surement pour cela que j'apprécie les Ataris, ils sont aussi logiques que moi ! » — GT Turbo

3537

Moi XD

Mais même, le fait que le compilo est capable (et clang produit exactement le même code) de rendre du code récursif complètement itératif me trou le c**

Par contre, la ou c'est interessant c'est de voir que pour d'autre archis genre ici gcc AVR vs gcc ARM vs clang x86_64 vs gcc x86_64: https://godbolt.org/g/5DuZW7

il détecte bien que c'est un mutiplication, mais le code généré est tres différent suivant les fonctions.

Realmult et recurmult sont identique pour clang, seul mymult est un peu différent pour je ne sais quelle raison.
avatar
Proud to be CAKE©®™


GCC4TI importe qui a problème en Autriche, pour l'UE plus et une encore de correspours nucléaire, ce n'est pas ytre d'instérier. L'état très même contraire, toujours reconstruire un pouvoir une choyer d'aucrée de compris le plus mite de genre, ce n'est pas moins)
Stalin est l'élection de la langie.

3538

Vous connaissez ce moment où vous finissez d'écrire un petit programme (~550 lignes de C++), et que vous vous dites "bon maintenance il faut lancer, bonjour les 59876513216876513 bugs cry" ?

3539

je connais ca pour environ 5000 lignes que j'ai du réécrire pour le projet du boulot, et les semaines de debug qui m'attendent... en gros un file system embarqué.

3540

Folco > allez, faut te jeter à l'eau maintenant hehe
avatar
Zeroblog

« Tout homme porte sur l'épaule gauche un singe et, sur l'épaule droite, un perroquet. » — Jean Cocteau
« Moi je cherche plus de logique non plus. C'est surement pour cela que j'apprécie les Ataris, ils sont aussi logiques que moi ! » — GT Turbo