120

Ben chépa, mais toujours est-il que maintenant, ça marche. trigni
En asm, t'as des bugs chelou au run-time. Ici, je les ai en temps de compilation. Ok. grin

Non mais j'avoue honnêtement que même avec ma lenteur de débutant, le C permet d'avancer très vite. smile

121

Non mais j'avoue honnêtement que même avec ma lenteur de débutant, le C permet d'avancer très vite. smile

A code équivalent (= même usage de librairies externes, etc.), le temps de développement (codage + debug) en ASM est habituellement donné comme 3 à 5 fois plus élevé que le temps de développement en C. Le ratio est encore plus élevé avec d'autres langages disposant de grosses librairies de classes toutes prêtes (C++, Java, C#, etc.).
En asm, t'as des bugs chelou au run-time. Ici, je les ai en temps de compilation. Ok. grin

C'est une des raisons qui font diminuer le temps de développement, bien que le C soit loin d'être le meilleur pour les vérifs en temps de compilation et au run-time.
Pour des langages compilés plus fortement vérifiés (à moins que tu fasses exprès de désactiver les vérifs), essaie donc Pascal/Delphi, ou carrément Ada trioui
avatar
Membre de la TI-Chess Team.
Co-mainteneur de GCC4TI (documentation en ligne de GCC4TI), TIEmu et TILP.
Co-admin de TI-Planet.

122

Bon, ça avance, mais visiblement, j'arrive même pas à initialiser les niveaux de gris grin
Voici mon code :
	void *PlanesHdPtr,*PlanesPtr;			//ptr to the handle and to the planes
	if(!(PlanesHdPtr = HeapAllocPtr(LCD_SIZE*4+8)))	//try to alloc planes to save work
	{
		ST_helpMsg("Not enough RAM to run GrayTool");	//else display a message,
		ngetchx();				//wait for a key,
		return;				//and quit
	}
	PlanesPtr = ((void *)((long)(PlanesHdPtr + 7) & ~7L));		//8x alignment for HW1
	memset(PlanesPtr,0,LCD_SIZE*4);			//clear planes
	GribOn(PlanesPtr,PlanesPtr+LCD_SIZE);			//and set up grays

et le prototype de GribOn :
void GribOn(void *plane0 asm("%d0"),void *plane1 asm("%d1"));
Keskyakivapa ? GribOnAllocPlanes marche si je vire l'appel à GribOn, le code de Grib est donc bon (il appelle GribOn en interne).

123

Ada

Constrain Error

>Folco: Qu'est-ce qui se passe?

124

Ben ça reste sur l'écran HOME, rien de plus. Comme si l'int1 n'était pas installée. L'assembleur généré étant de plus en plus dégueulasse (j'ai 1.5 ko de binaire maintenant, sans données), c'est pas évident à déboguer (j'ai pas trouvé mieux que de lire les fichiers .s pour déboguer...).

raaaaaah ne pas craquer, ne pas se précipiter à faire le projet en asm arghhhhhhh, persévérer, persévérer, persévérer raharhrh grin

125

Folco (./108) :
Kevin Kofler (./89) :
Pourquoi -O2 et pas -Os?
Ben pourquoi c'est par défaut alors ?

Connerie de ma part. C'est bien -Os par défaut.

126

L'assembleur produit me semble bon...
	move.l %d4,%d3			;PlanesPtr
	addq.l #7,%d3			;alignement
	moveq #-8,%d0
	and.l %d0,%d3
	pea 15360.w			;taille du memset pour effacement des plans
	clr.w -(%sp)			;on remplit évidemment de 0
	move.l %d3,-(%sp)		;adresse des 4 plans
	move.l 2544(%a0),%a0
	jbsr (%a0)			;memset
	move.l %d3,%d7			;toujours l'adresse des plans
	add.l #3840,%d7			;plan suivant
	move.l %d3,%d1			;arg1
	move.l %d7,%d0			;arg2
	jbsr GribOn			;puis GribOn ...
	lea (10,%sp),%sp

... mur

127

Folco (./115) :
Bon sinon j'en ai marre de buter sur des conneries du genre :
	case '1':
		DrawingData.FLAGS_DEFAULT = 10;
		break;

Expected identifier before numeric constant, me dit-il avec le curseur entre le nom de la structure et le nom du champ. Qu'est-ce qu'il merdouille encore, c'est pourtant pas compliqué ? rage
Euh a priori ça veut dire que FLAGS_DEFAULT est une macro qui représente un nombre (tu as pas un #define FLAGS_DEFAULT quelque part ?) donc elle est remplacée par ce nombre avant la compilation. Si ton champ s'appelle vraiment FLAGS_DEFAULT (pas une bonne idée les caps), il faut que tu changes son nom ou la macro. Mais à mon avis tu t'es juste trompé de nom et le champ ne s'appelle pas comme ça ? ^^
avatar
« Le bonheur, c'est une carte de bibliothèque ! » — The gostak distims the doshes.
Membrane fondatrice de la confrérie des artistes flous.
L'univers est-il un dodécaèdre de Poincaré ?
(``·\ powaaaaaaaaa ! #love#

128

Bien vu sur toute la ligne, c'est DrawingData.Flags qui est initialisé à FLAGS_DEFAULT gni Chapeau top

129

Bon, ce code produit le même effet :
	.xdef	_ti92plus
	.xdef	_nostub
	.include	"kernel.h"

__main:
	pea.l	3840*2+8
	RC	HeapAllocPtr
	movea.l	%a0,%a2
	move.l	%a0,%d0
	addq.l	#7,%d0
	andi.b	#~7,%d0
	move.l	%d0,%d1
	addi.l	#3840,%d1
	bsr	GribOn
	RC	ngetchx
	move.l	%a2,(%sp)
	RC	HeapFreePtr
	addq.l	#4,%sp
	rts

Faut que je vois ce qui se passe du côté de Grib... C'est sûrement de ma faute, c'est une version modifiée... sorry

130

./107 Il me semble que c’est ça pourtant… confus
Pour qu’on puisse t’aider, à chaque fois c’est plus pratique si tu nous donnes la ligne qui pose problème et le message d’erreur.

./109 et ./111 Le type BITMAP est défini par graph.h.

./122 Je sais pas. neutral
avatar
« Quand le dernier arbre sera abattu, la dernière rivière empoisonnée, le dernier poisson capturé, alors vous découvrirez que l'argent ne se mange pas. »

131

./129 Ouais, teste éventuellement avec d’autres versions de Grib.
avatar
« Quand le dernier arbre sera abattu, la dernière rivière empoisonnée, le dernier poisson capturé, alors vous découvrirez que l'argent ne se mange pas. »

132

Ca marche correctement avec un VTI 2.5 sans aucun patch (direct from ticalc). sorry Je commence à être ennuyé. neutral
J'ai pas le même comportement avec TiEmu... (HW1 ou HW2). La version de TiEmu est la dernière disponible ici : http://sourceforge.net/project/showfiles.php?group_id=23169

Je vais tester avec une autre version de Grib (cross).

=> Ok, c'est ma version perso de Grib qui déconne. Au niveau des variables je suppose. Pas le temps de regarder maintenant, je chercherai plus tard, j'utilise pour le moment la version d'origine.

133

Bon, ya un truc qui va pas, c'est que j'essaye d'utiliser les KEY_* pour lire le clavier, dans un switch. Ca marche très bien pour KEY_MODE, KEY_APPS etc... Par contre, pour KEY_LEFT/RIGHT/UP/DOWN, ça marche pas. Ca doit être dû au fait que les valeurs ne sont pas les même sur 89-89ti/v200-92+, mais comment faire ?

-> case KEY_LEFT
ça passe pas...

134

-> ne pas faire de switch grin
avatar
Que cache le pays des Dieux ? - Forum Ghibli - Forum Littéraire

La fin d'un monde souillé est venue. L'oiseau blanc plane dans le ciel annonçant le début d'une longue ère de purification. Détachons-nous à jamais de notre vie dans ce monde de souffrance. Ô toi l'oiseau blanc, l'être vêtu de bleu, guide nous vers ce monde de pureté. - Sutra originel dork.

135

Merci ! Ah oui en fait, ça m'aide pas. grin Je peux avoir le pourquoi du comment ? ^^

136

Tu veux faire un programme dont la version compilée marche sur toutes les calculatrices à la fois ?
Si tu précises à tigcc que tu veux compiler pour un seul modèle, KEY_LEFT etc. seront des constantes. Sinon, ce sont des macros, c'est pour ça que ça ne fonctionne pas.
Ce qu'il faudrait faire à mon avis : récupérer les codes pour chaque calculatrice (en définissant des macros si elles n'existent pas KEY_LEFT_89 etc., qui soient de véritables constantes), ensuite tu fais des case pour *toutes* ces constantes et c'est dans le traitement du case que tu vérifies quel est le modèle de calculatrice.
Ce que font les macros prédéfinies, c'est de faire le test avant de donner la valeur, et ça ça ne marche pas parce qu'un case label ne peut pas être une expression évidemment...
avatar
« Le bonheur, c'est une carte de bibliothèque ! » — The gostak distims the doshes.
Membrane fondatrice de la confrérie des artistes flous.
L'univers est-il un dodécaèdre de Poincaré ?
(``·\ powaaaaaaaaa ! #love#

137

Bon bah cross…

Oui, c’est parce que les macros KEY_machin ne sont pas toujours de bêtes constantes numériques : http://tigcc.ticalc.org/doc/compat.html#KEY_DOWN (par exemple) et si tu fouilles un peu tu t’aperçois que ça utilise ça : http://tigcc.ticalc.org/doc/compat.html#PSEUDO_CONST_CALC or, la variable CALCULATOR peut ne pas être résolue en temps de compilation (c’est-à-dire que c’est une variable dont la valeur dépendra du contexte d’exécution). Or, switch ne permet d’utiliser que des constantes numériques (ce n’est pas le cas dans d’autres langages de programmation de plus haut niveau).
Tu peux résoudre le problème en utilisant ça je crois : http://tigcc.ticalc.org/doc/httigcc.html#advanced_optcalc mais tu perdras la compatibilité on-calc.
avatar
« Quand le dernier arbre sera abattu, la dernière rivière empoisonnée, le dernier poisson capturé, alors vous découvrirez que l'argent ne se mange pas. »

138

ou alors tu fais le test globalement :
switch (machin) {
[cas communs]
default : if (TI89) switch (machin) {
[cas TI89]
}
else switch (machin) {
[cas TI92]
}
}

s'il y a beaucoup de cas où ça diffère entre les deux calcs, ceci fait a priori moins de tests ^^
avatar
« Le bonheur, c'est une carte de bibliothèque ! » — The gostak distims the doshes.
Membrane fondatrice de la confrérie des artistes flous.
L'univers est-il un dodécaèdre de Poincaré ?
(``·\ powaaaaaaaaa ! #love#

139

Bof, ça va ramer... Je préfère ça :
short KDOWN;
if KDOWN = (TI89?truc:machin);

et après utiliser KDOWN dans les switches, ça devrait être plus efficace.

140

Voici ce qu'est la pseudo-constante CALCULATOR :
This pseudo-constant is 0 on the TI-89, 1 on the TI-92 Plus, and 3 on the V200.

Quid des 89ti ? c'est 0, comme les 89 ?

141

Euh il se fiche de moi ??
J'ai écrit ça :
	short KDOWN = (CALCULATOR?344:340);
	short KUP = (CALCULATOR?338:337);
	short KLEFT = (CALCULATOR?337:338);
	short KRIGHT = (CALCULATOR?340:344);

Et ça :
	case KLEFT:
		if (DrawingData.CursX0 != 0)
			DrawingData.CursX0 -= 1;
		break;
	case KRIGHT:
		if (DrawingData.CursX0 != LCD_WIDTH)
			DrawingData.CursX0 += 1;
		break;

Et il veut toujours pas, il dit qu'il arrive pas à réduire le label à une constante entière... confus

142

Tu ne peux utiliser que des valeurs constantes pour ton case. Donc pas de "test?truc:bidule"
avatar
Que cache le pays des Dieux ? - Forum Ghibli - Forum Littéraire

La fin d'un monde souillé est venue. L'oiseau blanc plane dans le ciel annonçant le début d'une longue ère de purification. Détachons-nous à jamais de notre vie dans ce monde de souffrance. Ô toi l'oiseau blanc, l'être vêtu de bleu, guide nous vers ce monde de pureté. - Sutra originel dork.

143

Bon ben j'ai fait des if, pas un switch...

144

oui ce ne sont pas dans les labels qu'il faut faire des tests mais dans le corps des cases...
edit : je suis pas sûr de pas m'être embrouillé dans ce que j'écrivais
je réessaye grin
par exemple :
short vertical = CALCULATOR;
switch (machin) {
  case 337: vertical = !vertical;
  case 338: if (vertical) /* up */ else /* left */ break;
  case 340: vertical = !vertical;
  case 344: if (vertical) /* down */ else /* right */ break;
}
avatar
« Le bonheur, c'est une carte de bibliothèque ! » — The gostak distims the doshes.
Membrane fondatrice de la confrérie des artistes flous.
L'univers est-il un dodécaèdre de Poincaré ?
(``·\ powaaaaaaaaa ! #love#

145

Est-ce que gcc fait systématiquement un hashtable ou un jumptable pour les switch/case? ou il lui arrive de faire une suite de if/elseif..?
Tout ce qui passe pas par le port 80, c'est de la triche.

146

il fait une suite de if/elseif s'il y a des trop gros trous dans la table, mais je ne sais pas exactement quels sont les seuils (ça doit dépendre des switches d'optimisation).
avatar
« Le bonheur, c'est une carte de bibliothèque ! » — The gostak distims the doshes.
Membrane fondatrice de la confrérie des artistes flous.
L'univers est-il un dodécaèdre de Poincaré ?
(``·\ powaaaaaaaaa ! #love#

147

Sasume (./97) :
Si si, elle peut le faire (avec la fonction GribOnAllocPlanes), mais elle permet aussi à l’utilisateur de fournir lui-même les planes, s’il a envie.Et il y a aussi une macro (GribMakePlanes) qui permet d’obtenir, à partir d’un bloc de mémoire (pas forcément aligné sur une adresse multiple de 8), les adresses des deux plans (alignées comme il faut).

Cette manière de fonctionner ne permet pas d'utiliser LCD_MEM pour l'un des plans sur HW1.
Folco (./98) :
Et ya aussi GribOnAllocPlanes2, qui alloue deux plans contigus, alignés komilfô évidemment, sur tous les HW, et en utilisant le handler de f-line (-50 bytes) cheeky

Ce n'est pas réutilisable dans tous les programmes. Il y a des situations dans lesquelles on ne peut pas utiliser de handler F-Line. Par exemple, si le programme doit être compatible tous AMS (donc impossible d'utiliser celui de AMS) et si on veut pouvoir exécuter un autre programme sur une Titanium sans HW3Patch (donc impossible d'utiliser un handler perso, parce que ce programme, qui n'est pas forcément compatible tous AMS, pourrait essayer d'utiliser le handler de AMS et donc se taper ton handler perso et du coup exécuter du code dans une zone non déprotégée).
Lionel Debroux (./101) :
Voilà ce qui se passe quand Kevin n'est pas présent sur le forum depuis plusieurs jours, et découvre un gros topic grin

Euh, le topic n'avait que 2 jours quand je l'ai découvert! Vous avez réussi à poster des tonnes de messages en quelques heures, donc certains étaient carrément incorrects d'ailleurs.
Non, il ne suffit pas d'utiliser les headers officiels de TIGCC pour bénéficier de toutes les capacités de PreOS, devenu standard de fait depuis qu'il est le seul "kernel" maintenu (ça fait CINQ ans, quand même...). Et ce n'est pas de ma faute, puisque j'ai justement modifié kernel.h pour le rendre plus intégrable dans le système de doc spécifique de TIGCC/GCC4TI wink

kernel.h ne sera jamais intégré à TIGCC, c'est une mauvaise solution à un "problème" qui n'en est pas un.
Depuis quand est-il interdit d'évoquer un sujet un peu plus large, sous peine de se faire rabrouer par le maître ? roll

Parce que ce topic parle de C et de TIGCC, pas de C++. Tu es hors sujet.
De plus, il serait dommage qu'il n'y ait pas, à moyen terme, d'upgrade du standard C à partir d'un petit sous-ensemble de ce qui est ajouté par C++0x (voir http://gcc.gnu.org/projects/cxx0x.html ), citons:
* changement d'auto (?);
* expressions constantes généralisées;
* static asserts;
* extension des enums pour améliorer leur typage, par exemple §3.2 de n2347;* pointeur null et alignements (un sous-ensemble de n2341);

Ça m'étonnerait, les standards C et C++ divergent de plus en plus, le C++0x n'intègre toujours pas toutes les nouveautés du C99 et certaines ont même été explicitement refusées.
Lionel Debroux (./103) :
Relever ce qu'il a écrit et sur lequel on peut avoir une opinion différente de la sienne est la cause racine du fait qu'il m'ait retiré les pouvoirs d'admin sur le forum de TIGCC/TICT.

Non, parce que tu as abusé de tes pouvoirs pour nommer des admins sans demander l'avis de Thomas, Sebastian et/ou moi. Te laisser tes droits aurait été un risque de sécurité, donc j'ai été obligé d'agir rapidement. (Et j'ai discuté avec Thomas et Sebastian quoi faire. J'avais proposé de faire un forum TIGCC séparé et de te rendre les droits sur le forum TICT, et je pense toujours que ça aurait été la meilleure solution. Peut-être que je vais même finir par le faire maintenant que la TICT est devenue notre concurrent (cf. la news qui est sur votre page d'accueil depuis quelques semaines).)
Folco (./107) :
Bon, au sommet de ma nioubitude, j'arrive pas à définir un BITMAP... Ben ouais ça arrive. grin

J'essaye ça :
const struct BITMAP mapic = {10,10, {les data}};

Et apparemment... c'est pas ça grin

c'est défini comme ça :
typedef struct { 
 unsigned short NumRows, NumCols; 
 unsigned char Data[]; 
} BITMAP; 

Pourtant c'est bien la bonne syntaxe normalement. Tu essaies de définir ça où? Si c'est à l'intérieur d'une fonction, essaie avec static const struct ....
Folco (./108) :
Kevin Kofler (./89) :
Pourquoi -O2 et pas -Os?
Ben pourquoi c'est par défaut alors ?

C'est -Os par défaut pour tous les nouveaux projets dans les EDIs depuis des lustres. En ligne de commande, c'est -O0 par défaut (totalement inutilisable) pour des raisons de compatibilité antérieure (et c'est bien à cause de ça que la ligne de commande est dépréciée, elle n'a aucun moyen de savoir si tu as un nouveau projet ou un vieux projet).
Pen^2 (./111) :
Sinon ça, ça fonctionne aussi (sans allocation dynamique, contrairement à ce que j'avais raconté...) :
typedef struct {  
 unsigned short NumRows, NumCols;  
 unsigned char* Data;  
} BITMAP; 
unsigned char data[]= {1, 2, 3} ;
BITMAP myBitmap= { 10, 10,  data} ;

Ça ne fonctionne pas, ta structure BITMAP est incompatible avec celle de AMS.
Folco (./112) :
On fait comment pour faire une boucle infinie propre dans un programme ?

while (1) ou for (;;).
Folco (./113) :
Tiens, quand je fais ce switch :
	short key;
MainLoop:
	key = ngetchx();

	switch (key) {
		case 'KEY_APPS':
			DrawMenu(&RootMenu,&DrawingData);
			break;
		case 'KEY_CATALOG':
			DrawMenu(&DrawingMenu,&DrawingData);
			break;
		case 'KEY_MODE':
			DrawMenu(&ModeMenu,&DrawingData);
			break;
	}
	goto MainLoop;
Il me warn : Character constant too long for its type, en m'indiquand les KEY_*.

Parce que les apostrophes sont en trop, ce n'est pas un caractère, c'est une constante.

De plus, tu ne peux en général pas faire un switch sur les KEY_* parce que certains dépendent de la calculatrice et ne sont donc pas des constantes (mais des pseudo-constantes).
Folco (./115) :
Bon sinon j'en ai marre de buter sur des conneries du genre :
	case '1':
		DrawingData.FLAGS_DEFAULT = 10;
		break;

Expected identifier before numeric constant, me dit-il avec le curseur entre le nom de la structure et le nom du champ. Qu'est-ce qu'il merdouille encore, c'est pourtant pas compliqué ? rage

FLAGS_DEFAULT est une macro qui correspond à un nombre (je ne sais pas lequel parce que ce n'est pas une constante de TIGCCLIB), donc tu es en train de lui dire quelque chose comme DrawingData.0 = 10, évidemment que le compilateur ne comprend pas. Tu dois vouloir dire flags ou Flags, pas FLAGS_DEFAULT.
Lionel Debroux (./116) :
e souvent asm volatile("0: bra.s 0b");Pour le breakpoint, j'utilis

sick Le débogueur sert à ça! roll
Brunni (./118) :
Lionel Debroux (./116) :
e souvent asm volatile("0: bra.s 0b");Pour le breakpoint, j'utilis

Bizarre confus pourquoi tu ne fais pas simplement while (1); ?

Parce que GCC vire tout le code dominé par (= démontrablement exécuté toujours après) une boucle infinie parce qu'il ne peut pas être atteint. Du coup tu ne peux pas sauter ton "breakpoint" dans le débogueur. (Mais de toute façon, cette manière de créer un breakpoint est totalement foireuse, il faut passer par le débogueur pour mettre ses breakpoints, pas perdre son temps à recompiler son programme, en plus en y mettant une instruction qui plante la calculatrice, tu risques de publier un programme qui plante par erreur, c'est déjà arrivé au moins 2 fois à Lionel.)
Folco (./132) :
Ok, c'est ma version perso de Grib qui déconne. Au niveau des variables je suppose.

Si tu as modifié la recopie des plans sur HW2, ça doit être TiEmu qui ne reconnaît pas ta routine de recopie. TiEmu reconnaît les routines de gris courantes (y compris la version standard de Grib) pour ses "gris parfaits", si tu as bidouillé cette recopie, ça ne va plus marcher.

Cela dit, si c'est ça, je ne comprends pas pourquoi ça foire si tu émules une HW1. Es-tu sûr que tu ne nous fais pas des recopies sur HW1 au lieu de changer le port du matériel comme il faut?
Sasume (./137) :
Oui, c’est parce que les macros KEY_machin ne sont pas toujours de bêtes constantes numériques : http://tigcc.ticalc.org/doc/compat.html#KEY_DOWN (par exemple) et si tu fouilles un peu tu t’aperçois que ça utilise ça : http://tigcc.ticalc.org/doc/compat.html#PSEUDO_CONST_CALC or, la variable CALCULATOR peut ne pas être résolue en temps de compilation (c’est-à-dire que c’est une variable dont la valeur dépendra du contexte d’exécution). Or, switch ne permet d’utiliser que des constantes numériques (ce n’est pas le cas dans d’autres langages de programmation de plus haut niveau).

Effectivement. Il faut utiliser une chaîne if-else.

Un de mes TODOs pour GCC est de permettre les switches sur les pseudo-constantes d'une manière ou d'une autre (le plus simple, ça doit être de transformer les switches contenant des variables en une chaîne de if-else au niveau de la conversion de l'arbre syntaxique C en l'arbre syntaxique Gimple), mais je n'ai jamais eu le temps d'implémenter ça, un volontaire? smile
Folco (./140) :
Voici ce qu'est la pseudo-constante CALCULATOR :
This pseudo-constant is 0 on the TI-89, 1 on the TI-92 Plus, and 3 on the V200.
Quid des 89ti ? c'est 0, comme les 89 ?

Oui. Pour TIGCC, une Titanium est une TI-89 HW3/HW4. Il y a même "TI-89" dans le nom, et toutes les différences sont dues à la version du matériel. Les caractéristiques définies par le modèle (écran, clavier) sont les mêmes. De plus, ça fait que les programmes existants utilisant if (CALCULATOR) marchent toujours.

Malheureusement, PpHd dans sa sagesse infinie a ignoré tous mes arguments, ainsi que la compatibilité avec TitaniK et Iceberg, quand il a porté PreOs vers la Titanium, donc du coup on se tape ça en kernel:
/* PreOs 0.70 says CALCULATOR is -1 on the Titanium. We don't. */
#define CALCULATOR ((signed char)_CALCULATOR[0]>0?_CALCULATOR[0]:0)

sick
Sally (./146) :
il fait une suite de if/elseif s'il y a des trop gros trous dans la table

Il fait un arbre binaire de if/elseif, sauf dans TIGCC en -Os où il fait une chaîne (parce que c'est plus petit).
Le patch TIGCC en question
diff -Naur gcc-4.1.2.orig/gcc/stmt.c gcc-4.1.2-src/gcc/stmt.c
--- gcc-4.1.2.orig/gcc/stmt.c	2006-05-29 08:50:07.000000000 +0200
+++ gcc-4.1.2-src/gcc/stmt.c	2007-02-19 02:32:34.000000000 +0100
@@ -2515,6 +2515,9 @@
 	  use_cost_table
 	    = (TREE_CODE (orig_type) != ENUMERAL_TYPE
 	       && estimate_case_costs (case_list));
+/* (TIGCC 20030907) Don't balance the tree when optimizing for size. A linear
+                    decision tree gives far smaller code. -- Kevin Kofler  */
+	  if (!optimize_size)
 	  balance_case_nodes (&case_list, NULL);
 	  emit_case_nodes (index, case_list, default_label, index_type);
 	  emit_jump (default_label);
@@ -3083,10 +3086,17 @@
 	     does not have any children and is single valued; it would
 	     cost too much space to save so little time.  */
 
+	  /* (TIGCC 20030907) Also omit the conditional branch to default if we are
+	                      optimizing for size. -- Kevin Kofler
+         (TIGCC 20040719) But don't omit branches which are needed for
+                          correctness in case ranges. -- Kevin Kofler  */
+
 	  if (node->right->right || node->right->left
 	      || !tree_int_cst_equal (node->right->low, node->right->high))
 	    {
-	      if (!node_has_low_bound (node, index_type))
+	      if (!node_has_low_bound (node, index_type)
+	          && (!optimize_size
+	              || !tree_int_cst_equal (node->right->low, node->right->high)))
 		{
 		  emit_cmp_and_jump_insns (index,
 					   convert_modes
mais je ne sais pas exactement quels sont les seuils (ça doit dépendre des switches d'optimisation).

range > 3 * count en -Os, range > 10 * count sinon.
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é

148

C'est marrant, le kernel résoud silencieusement les problèmes de pseudo-constantes avec des ram calls, les problèmes de f-line etc... grin

149

Folco (./148) :
le kernel résoud silencieusement les problèmes de pseudo-constantes avec des ram calls

Tu ne peux pas utiliser un _RAM_CALL dans un switch non plus.
les problèmes de f-line

s/le kernel/PreOs/ alors, il est le seul à proposer un handler F-Line (du coup ton programme va planter lamentablement si tu utilises un autre kernel). Et le handler était aussi bogué dans les anciennes versions (les sauts F-Line n'étaient pas gérés, donc il faisait foirer des programmes écrits pour le handler de AMS).
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é

150

Kevin Kofler (./147) :
TiEmu reconnaît les routines de gris courantes (y compris la version standard de Grib) pour ses "gris parfaits",

Il ne reconnait toujours pas celle de genlib qui va trop vite pour lui roll
Kevin Kofler (./147) :
PpHd dans sa sagesse infinie a ignoré tous mes arguments,

Merci pour ces compliments. Ca fait plaisir de se savoir devenu sage love