On 2008-11-23, Marc Espie wrote:sur un intel, adresse non multiple de 4: lenteur... en particulier cote
pile et valeurs flottantes.
A noter que pour les personnes n'ayant qu'un x86 sous la main,
et voulant traquer les pb d'alignement, il semble qu'on puisse
dire au processeur de générer un "Bus error".
Mais ça dépend visiblement de certains paramètres de config.
J'avais le code suivant:
int main(){
char t[sizeof(double)*2];
double* d= (double*) (t+1);
__asm__("pushfl; popl %eax; orl $0x40000,%eax; pushl %eax; popfl;");
*d= 1.0;
return 0;
}
qui me faisait un beau message d'erreur sur ma précédente machine,
et qui ne dit plus rien sur la nouvelle (toutes deux des x86 sous
Linux, complio gcc).
On 2008-11-23, Marc Espie <espie@lain.home> wrote:
sur un intel, adresse non multiple de 4: lenteur... en particulier cote
pile et valeurs flottantes.
A noter que pour les personnes n'ayant qu'un x86 sous la main,
et voulant traquer les pb d'alignement, il semble qu'on puisse
dire au processeur de générer un "Bus error".
Mais ça dépend visiblement de certains paramètres de config.
J'avais le code suivant:
int main(){
char t[sizeof(double)*2];
double* d= (double*) (t+1);
__asm__("pushfl; popl %eax; orl $0x40000,%eax; pushl %eax; popfl;");
*d= 1.0;
return 0;
}
qui me faisait un beau message d'erreur sur ma précédente machine,
et qui ne dit plus rien sur la nouvelle (toutes deux des x86 sous
Linux, complio gcc).
On 2008-11-23, Marc Espie wrote:sur un intel, adresse non multiple de 4: lenteur... en particulier cote
pile et valeurs flottantes.
A noter que pour les personnes n'ayant qu'un x86 sous la main,
et voulant traquer les pb d'alignement, il semble qu'on puisse
dire au processeur de générer un "Bus error".
Mais ça dépend visiblement de certains paramètres de config.
J'avais le code suivant:
int main(){
char t[sizeof(double)*2];
double* d= (double*) (t+1);
__asm__("pushfl; popl %eax; orl $0x40000,%eax; pushl %eax; popfl;");
*d= 1.0;
return 0;
}
qui me faisait un beau message d'erreur sur ma précédente machine,
et qui ne dit plus rien sur la nouvelle (toutes deux des x86 sous
Linux, complio gcc).
nota: il y a derrière cette optimisation éventuelle une question
intéressante concernant l'influence d'un bout d'assembleur dans une
fonction sur la génération du code. J'avais fait des essais mais je ne
sais plus si c'était sur du C++ ou du Delphi. La logique et la prudence
voudrait que le compilateur compile comme en debug, mais ça ne semble
pas être le cas.
nota: il y a derrière cette optimisation éventuelle une question
intéressante concernant l'influence d'un bout d'assembleur dans une
fonction sur la génération du code. J'avais fait des essais mais je ne
sais plus si c'était sur du C++ ou du Delphi. La logique et la prudence
voudrait que le compilateur compile comme en debug, mais ça ne semble
pas être le cas.
nota: il y a derrière cette optimisation éventuelle une question
intéressante concernant l'influence d'un bout d'assembleur dans une
fonction sur la génération du code. J'avais fait des essais mais je ne
sais plus si c'était sur du C++ ou du Delphi. La logique et la prudence
voudrait que le compilateur compile comme en debug, mais ça ne semble
pas être le cas.
Marc Boyer, le 24/11/2008 a écrit :On 2008-11-23, Marc Espie wrote:sur un intel, adresse non multiple de 4: lenteur... en particulier cote
pile et valeurs flottantes.
A noter que pour les personnes n'ayant qu'un x86 sous la main,
et voulant traquer les pb d'alignement, il semble qu'on puisse
dire au processeur de générer un "Bus error".
Mais ça dépend visiblement de certains paramètres de config.
J'avais le code suivant:
int main(){
char t[sizeof(double)*2];
double* d= (double*) (t+1);
__asm__("pushfl; popl %eax; orl $0x40000,%eax; pushl %eax; popfl;");
*d= 1.0;
Il y a en x87 l'instruction fld1 qui charge ... 1.0 dans un registre de la
FPU. Ce n'est peut-être pas le meilleur choix pour éviter les
optimisations, encore que...
Marc Boyer, le 24/11/2008 a écrit :
On 2008-11-23, Marc Espie <espie@lain.home> wrote:
sur un intel, adresse non multiple de 4: lenteur... en particulier cote
pile et valeurs flottantes.
A noter que pour les personnes n'ayant qu'un x86 sous la main,
et voulant traquer les pb d'alignement, il semble qu'on puisse
dire au processeur de générer un "Bus error".
Mais ça dépend visiblement de certains paramètres de config.
J'avais le code suivant:
int main(){
char t[sizeof(double)*2];
double* d= (double*) (t+1);
__asm__("pushfl; popl %eax; orl $0x40000,%eax; pushl %eax; popfl;");
*d= 1.0;
Il y a en x87 l'instruction fld1 qui charge ... 1.0 dans un registre de la
FPU. Ce n'est peut-être pas le meilleur choix pour éviter les
optimisations, encore que...
Marc Boyer, le 24/11/2008 a écrit :On 2008-11-23, Marc Espie wrote:sur un intel, adresse non multiple de 4: lenteur... en particulier cote
pile et valeurs flottantes.
A noter que pour les personnes n'ayant qu'un x86 sous la main,
et voulant traquer les pb d'alignement, il semble qu'on puisse
dire au processeur de générer un "Bus error".
Mais ça dépend visiblement de certains paramètres de config.
J'avais le code suivant:
int main(){
char t[sizeof(double)*2];
double* d= (double*) (t+1);
__asm__("pushfl; popl %eax; orl $0x40000,%eax; pushl %eax; popfl;");
*d= 1.0;
Il y a en x87 l'instruction fld1 qui charge ... 1.0 dans un registre de la
FPU. Ce n'est peut-être pas le meilleur choix pour éviter les
optimisations, encore que...
"Pierre Maurette" a écrit dans le message de
news:Marc Boyer, le 24/11/2008 a écrit :On 2008-11-23, Marc Espie wrote:sur un intel, adresse non multiple de 4: lenteur... en particulier cote
pile et valeurs flottantes.
A noter que pour les personnes n'ayant qu'un x86 sous la main,
et voulant traquer les pb d'alignement, il semble qu'on puisse
dire au processeur de générer un "Bus error".
Mais ça dépend visiblement de certains paramètres de config.
J'avais le code suivant:
int main(){
char t[sizeof(double)*2];
double* d= (double*) (t+1);
__asm__("pushfl; popl %eax; orl $0x40000,%eax; pushl %eax; popfl;");
*d= 1.0;
Il y a en x87 l'instruction fld1 qui charge ... 1.0 dans un registre de
la FPU. Ce n'est peut-être pas le meilleur choix pour éviter les
optimisations, encore que...
Dans le code ci-dessous, le compilateur peut tout à fait ne pas faire
l'affectation du tout. Pour éviter cette optimisation, on peut utiliser un
buffer global. Enfin le compilateur peut aussi generer l'equivalent d'un
memcpy vu que le nombre est constant, connu à compile time. Pour eviter
cette erreur là, on peut faire un calcul et utiliser une autre variable
globale pour l'argument.
Essaie avec le code suivant :
#include <math.h>
int main() {
static double x = 0;
static char t[sizeof(double)*2];
double *d = (double*)(t+1);
__asm__("pushfl; popl %eax; orl $0x40000,%eax; pushl %eax; popfl;");
x += 1;
*d = sin(x);
return 0;
};
--
Chqrlie.
"Pierre Maurette" <maurettepierre@wanadoo.fr> a écrit dans le message de
news: mn.c2e27d8b4c78b054.79899@wanadoo.fr...
Marc Boyer, le 24/11/2008 a écrit :
On 2008-11-23, Marc Espie <espie@lain.home> wrote:
sur un intel, adresse non multiple de 4: lenteur... en particulier cote
pile et valeurs flottantes.
A noter que pour les personnes n'ayant qu'un x86 sous la main,
et voulant traquer les pb d'alignement, il semble qu'on puisse
dire au processeur de générer un "Bus error".
Mais ça dépend visiblement de certains paramètres de config.
J'avais le code suivant:
int main(){
char t[sizeof(double)*2];
double* d= (double*) (t+1);
__asm__("pushfl; popl %eax; orl $0x40000,%eax; pushl %eax; popfl;");
*d= 1.0;
Il y a en x87 l'instruction fld1 qui charge ... 1.0 dans un registre de
la FPU. Ce n'est peut-être pas le meilleur choix pour éviter les
optimisations, encore que...
Dans le code ci-dessous, le compilateur peut tout à fait ne pas faire
l'affectation du tout. Pour éviter cette optimisation, on peut utiliser un
buffer global. Enfin le compilateur peut aussi generer l'equivalent d'un
memcpy vu que le nombre est constant, connu à compile time. Pour eviter
cette erreur là, on peut faire un calcul et utiliser une autre variable
globale pour l'argument.
Essaie avec le code suivant :
#include <math.h>
int main() {
static double x = 0;
static char t[sizeof(double)*2];
double *d = (double*)(t+1);
__asm__("pushfl; popl %eax; orl $0x40000,%eax; pushl %eax; popfl;");
x += 1;
*d = sin(x);
return 0;
};
--
Chqrlie.
"Pierre Maurette" a écrit dans le message de
news:Marc Boyer, le 24/11/2008 a écrit :On 2008-11-23, Marc Espie wrote:sur un intel, adresse non multiple de 4: lenteur... en particulier cote
pile et valeurs flottantes.
A noter que pour les personnes n'ayant qu'un x86 sous la main,
et voulant traquer les pb d'alignement, il semble qu'on puisse
dire au processeur de générer un "Bus error".
Mais ça dépend visiblement de certains paramètres de config.
J'avais le code suivant:
int main(){
char t[sizeof(double)*2];
double* d= (double*) (t+1);
__asm__("pushfl; popl %eax; orl $0x40000,%eax; pushl %eax; popfl;");
*d= 1.0;
Il y a en x87 l'instruction fld1 qui charge ... 1.0 dans un registre de
la FPU. Ce n'est peut-être pas le meilleur choix pour éviter les
optimisations, encore que...
Dans le code ci-dessous, le compilateur peut tout à fait ne pas faire
l'affectation du tout. Pour éviter cette optimisation, on peut utiliser un
buffer global. Enfin le compilateur peut aussi generer l'equivalent d'un
memcpy vu que le nombre est constant, connu à compile time. Pour eviter
cette erreur là, on peut faire un calcul et utiliser une autre variable
globale pour l'argument.
Essaie avec le code suivant :
#include <math.h>
int main() {
static double x = 0;
static char t[sizeof(double)*2];
double *d = (double*)(t+1);
__asm__("pushfl; popl %eax; orl $0x40000,%eax; pushl %eax; popfl;");
x += 1;
*d = sin(x);
return 0;
};
--
Chqrlie.
Exemple "concret" de déréférencement interdit ?
Exemple "concret" de déréférencement interdit ?
Exemple "concret" de déréférencement interdit ?
Pour swapper deux variables de même type, il suffit de swapper leurs
représentations physiques, ce qu'on peut effectuer par le cast en
type unsigned. Soit deux variables d'un type quelconque et 'ent' le
type entier non signé de même taille.
Pas compris ce qu'est ent. Si le type "quelconque" est, au hasard,
struct toto
{
int a;
char b;
void *c;
double z[24];
};
c'est quoi "le type entier non signé de même taille" ?
Pour swapper deux variables de même type, il suffit de swapper leurs
représentations physiques, ce qu'on peut effectuer par le cast en
type unsigned. Soit deux variables d'un type quelconque et 'ent' le
type entier non signé de même taille.
Pas compris ce qu'est ent. Si le type "quelconque" est, au hasard,
struct toto
{
int a;
char b;
void *c;
double z[24];
};
c'est quoi "le type entier non signé de même taille" ?
Pour swapper deux variables de même type, il suffit de swapper leurs
représentations physiques, ce qu'on peut effectuer par le cast en
type unsigned. Soit deux variables d'un type quelconque et 'ent' le
type entier non signé de même taille.
Pas compris ce qu'est ent. Si le type "quelconque" est, au hasard,
struct toto
{
int a;
char b;
void *c;
double z[24];
};
c'est quoi "le type entier non signé de même taille" ?
On 23 nov, 17:56, candide wrote:Exemple "concret" de déréférencement interdit ?
Sur une machine de type 68000, ceci provoque un trap BERR (Bus
ERRor):
#include <stdio.h>
int main (void)
{
long x[4];
char *p = (char *) x + 1;
int *pi = (int *) p;
printf ("pi = %pn", (void *) pi);
*pi = 0; /* accès 16-bit a une adresse
impaire : BERR */
return 0;
}
On 23 nov, 17:56, candide <cand...@free.invalid> wrote:
Exemple "concret" de déréférencement interdit ?
Sur une machine de type 68000, ceci provoque un trap BERR (Bus
ERRor):
#include <stdio.h>
int main (void)
{
long x[4];
char *p = (char *) x + 1;
int *pi = (int *) p;
printf ("pi = %pn", (void *) pi);
*pi = 0; /* accès 16-bit a une adresse
impaire : BERR */
return 0;
}
On 23 nov, 17:56, candide wrote:Exemple "concret" de déréférencement interdit ?
Sur une machine de type 68000, ceci provoque un trap BERR (Bus
ERRor):
#include <stdio.h>
int main (void)
{
long x[4];
char *p = (char *) x + 1;
int *pi = (int *) p;
printf ("pi = %pn", (void *) pi);
*pi = 0; /* accès 16-bit a une adresse
impaire : BERR */
return 0;
}
Bin il n'y en a pas (dans le cas général), donc en bonnes mathématiques qui
se respectent, le « soit » ci-dessus n'est pas exhaustif et n'inclut pas,
entre autres, le type struct toto.
Mais cela ne devrait pas être un empêchement pour comprendre l'explication
de Pierre.
Bin il n'y en a pas (dans le cas général), donc en bonnes mathématiques qui
se respectent, le « soit » ci-dessus n'est pas exhaustif et n'inclut pas,
entre autres, le type struct toto.
Mais cela ne devrait pas être un empêchement pour comprendre l'explication
de Pierre.
Bin il n'y en a pas (dans le cas général), donc en bonnes mathématiques qui
se respectent, le « soit » ci-dessus n'est pas exhaustif et n'inclut pas,
entre autres, le type struct toto.
Mais cela ne devrait pas être un empêchement pour comprendre l'explication
de Pierre.
-ed- a écrit :On 23 nov, 17:56, candide wrote:Exemple "concret" de déréférencement interdit ?
Sur une machine de type 68000, ceci provoque un trap BERR (Bus
ERRor):
#include <stdio.h>
int main (void)
{
long x[4];
char *p = (char *) x + 1;
int *pi = (int *) p;
printf ("pi = %pn", (void *) pi);
*pi = 0; /* accès 16-bit a une adresse
impaire : BERR */
return 0;
}
Merci de cet exemple complet compilable. J'ai bien une machine 68k et
même un émulateur mais ça fait tellement longtemps que je ne les ai pas
utilisés que je ne vais pas savoir les faire remarcher facilement.
[Si quelqu'un a un exemple du même genre sur x86, qu'il le donne.]
Est-il certain qu'il s'agisse bien d'un problème d'alignement ? En quoi
ai-je bien le droit d'affecter 0 à l'adresse pi , et ce malgré le cast
en int * lors e l'initialisation?
Et si c'est un problème d'alignement,
quel § de la norme n'est pas respecté ?
-ed- a écrit :
On 23 nov, 17:56, candide <cand...@free.invalid> wrote:
Exemple "concret" de déréférencement interdit ?
Sur une machine de type 68000, ceci provoque un trap BERR (Bus
ERRor):
#include <stdio.h>
int main (void)
{
long x[4];
char *p = (char *) x + 1;
int *pi = (int *) p;
printf ("pi = %pn", (void *) pi);
*pi = 0; /* accès 16-bit a une adresse
impaire : BERR */
return 0;
}
Merci de cet exemple complet compilable. J'ai bien une machine 68k et
même un émulateur mais ça fait tellement longtemps que je ne les ai pas
utilisés que je ne vais pas savoir les faire remarcher facilement.
[Si quelqu'un a un exemple du même genre sur x86, qu'il le donne.]
Est-il certain qu'il s'agisse bien d'un problème d'alignement ? En quoi
ai-je bien le droit d'affecter 0 à l'adresse pi , et ce malgré le cast
en int * lors e l'initialisation?
Et si c'est un problème d'alignement,
quel § de la norme n'est pas respecté ?
-ed- a écrit :On 23 nov, 17:56, candide wrote:Exemple "concret" de déréférencement interdit ?
Sur une machine de type 68000, ceci provoque un trap BERR (Bus
ERRor):
#include <stdio.h>
int main (void)
{
long x[4];
char *p = (char *) x + 1;
int *pi = (int *) p;
printf ("pi = %pn", (void *) pi);
*pi = 0; /* accès 16-bit a une adresse
impaire : BERR */
return 0;
}
Merci de cet exemple complet compilable. J'ai bien une machine 68k et
même un émulateur mais ça fait tellement longtemps que je ne les ai pas
utilisés que je ne vais pas savoir les faire remarcher facilement.
[Si quelqu'un a un exemple du même genre sur x86, qu'il le donne.]
Est-il certain qu'il s'agisse bien d'un problème d'alignement ? En quoi
ai-je bien le droit d'affecter 0 à l'adresse pi , et ce malgré le cast
en int * lors e l'initialisation?
Et si c'est un problème d'alignement,
quel § de la norme n'est pas respecté ?
[Si quelqu'un a un exemple du même genre sur x86, qu'il le donne.]
Est-il certain qu'il s'agisse bien d'un problème d'alignement ?
En quoi
ai-je bien le droit d'affecter 0 à l'adresse pi , et ce malgré le cast
en int * lors e l'initialisation?
Et si c'est un problème d'alignement, quel § de la norme n'est pas respecté ?
[Si quelqu'un a un exemple du même genre sur x86, qu'il le donne.]
Est-il certain qu'il s'agisse bien d'un problème d'alignement ?
En quoi
ai-je bien le droit d'affecter 0 à l'adresse pi , et ce malgré le cast
en int * lors e l'initialisation?
Et si c'est un problème d'alignement, quel § de la norme n'est pas respecté ?
[Si quelqu'un a un exemple du même genre sur x86, qu'il le donne.]
Est-il certain qu'il s'agisse bien d'un problème d'alignement ?
En quoi
ai-je bien le droit d'affecter 0 à l'adresse pi , et ce malgré le cast
en int * lors e l'initialisation?
Et si c'est un problème d'alignement, quel § de la norme n'est pas respecté ?