atari-home.de - Foren

Software => Coding => Thema gestartet von: czietz am Sa 06.08.2016, 14:15:46

Titel: gcc, GEMDOS Super und Stackzerstörung
Beitrag von: czietz am Sa 06.08.2016, 14:15:46
Hallo,

ich habe aus Neugier mal meinen RAM-Tester YAART [1] von Pure C auf gcc und libcmini portiert, was mit sehr wenigen Änderungen möglich war. Ein hinterhältiger Bug hat mich aber doch Zeit gekostet. Daher beschreibe ich ihn hier kurz, in der Hoffnung anderen damit zu helfen.

Ich benutze die GEMDOS-Funktion Super, um innerhalb des Codes in den Supervisor-Modus zu schalten und später wieder zurück:

/* switch to supervisor mode so we can manipulate memory */
suret = Super(0);

/* Dinge, die nur im Supervisor-Modus möglich sind */
/* [...] */

/* back to user mode */
Super((void *)suret);

Nun hat der gcc-Optimierer die -- an sich nette -- Eigenschaft, den Stack nicht nach jedem Funktionsaufruf zu korrigieren, sondern die Korrekturen zu sammeln und an späterer Stelle en bloc durchzuführen. Dummerweise stellt aber bereits Super((void *)suret); den Stack zurück. gcc hat nun in meinem Fall die Stackkorrekturen für die Funktionsaufrufe, die im Supervisor-Modus ausgeführt wurden, erst danach gemacht. Dadurch wird der Stack beschädigt und spätestens beim nächsten return fliegt einem das ganze mit Bömbchen um die Ohren.

Glücklicherweise gibt es eine Lösung, ohne dass man diese sinnvolle Optimierung ganz abschalten muss. Man deklariert die Funktion, in der die Super-Aufrufe sind, als

void foobar(void) __attribute__ ((optimize ("no-defer-pop")));
und aktiviert somit nur lokal für diese Funktion die sofortige Stackkorrektur nach jedem Funktionsaufruf.

Noch besser wäre es natürlich, könnte man gcc mitteilen, dass Super eine Funktion ist, die den Stack modifiziert und deshalb alle Stackkorrekturen nur bis zum nächsten Aufruf von Super gesammelt werden können. Eine Art Barriere also. Weiß jemand, ob das geht?

[1] http://forum.atari-home.de/index.php?topic=13002.msg208583#msg208583 (http://forum.atari-home.de/index.php?topic=13002.msg208583#msg208583)
Titel: Re: gcc, GEMDOS Super und Stackzerstörung
Beitrag von: czietz am Sa 06.08.2016, 16:57:24
OK, nach einem Hinweis, gefunden mit Google, dass gcc (sinnigerweise) vor einem goto alle noch ausstehenden Stack-Korrekturen durchführt, habe ich mir folgende Konstruktion basteln können:

#ifdef __GNUC__
/* BARRIER2 is here to expand __LINE__. */
#define BARRIER3(x) goto _barrier##x; _barrier##x:
#define BARRIER2(x) BARRIER3(x)
#define BARRIER BARRIER2(__LINE__)
#else
#define BARRIER
#endif

Ein BARRIER jeweils von den Super-Aufrufen sorgt nun dafür, dass der Stack heile bleibt. Das unnütze goto wird später vom Optimierer wieder entfernt. Schön ist das aber auch nicht...
Titel: Re: gcc, GEMDOS Super und Stackzerstörung
Beitrag von: simonsunnyboy am Sa 06.08.2016, 17:04:19
Also nocheinfacher ohne gcc Eigenschaften, packe deinen Code in eine eigene Funktion und rufe diese über XBIOS Supexec() auf. Da kümmert sich das TOS selbst um Stack und alles, das ist Compilerunabhängig.  Geht mit jeder void ...(void) Funktion
Titel: Re: gcc, GEMDOS Super und Stackzerstörung
Beitrag von: mfro am Sa 06.08.2016, 17:45:36
Um Stack-Fehler zu vermeiden, gibt's in den Bindings (osbind.h) die SuperToUser()-Funktion, die den Stackpointer explizit setzt. Ich hab' mir jetzt deinen Fall nicht genau angesehen, nehme aber einfach mal an, daß der auch abgedeckt wird.

Supexec() ist aber tatsächlich in den meisten Fällen die bessere Wahl.
Titel: Re: gcc, GEMDOS Super und Stackzerstörung
Beitrag von: czietz am Sa 06.08.2016, 17:58:02
SuperToUser() dürfte tatsächlich eine Lösung sein. Supexec() ist hier nicht so toll, weil ich -- anders im Beispiel mit foobar() -- schon Parameter an die Funktion übergeben will, am liebsten ohne globale Variablen dafür zu verwenden.

Aber das Experiment ist ohnehin mehr oder weniger beendet, weil gcc (selbst mit -O2) unglaublich ineffizienten Code generiert. Die "Moving Inversions" in YAART brauchen ca. 50%(!) länger als in der mit Pure C compilierten Version. Darin werden keine Bibliotheksfunktionen aufgerufen, es ist also wirklich der generierte Code.

Titel: Re: gcc, GEMDOS Super und Stackzerstörung
Beitrag von: mfro am Sa 06.08.2016, 18:14:58
Aber das Experiment ist ohnehin mehr oder weniger beendet, weil gcc (selbst mit -O2) unglaublich ineffizienten Code generiert. Die "Moving Inversions" in YAART brauchen ca. 50%(!) länger als in der mit Pure C compilierten Version. Darin werden keine Bibliotheksfunktionen aufgerufen, es ist also wirklich der generierte Code.

Das interessiert mich, kannst Du den Code mal zeigen?
Titel: Re: gcc, GEMDOS Super und Stackzerstörung
Beitrag von: czietz am Sa 06.08.2016, 18:59:33
Ich gucke mal, ob ich den Code soweit herunterbrechen kann, dass ich ihn hier posten kann. Das wird aber nur niedrige Priorität haben, mit Pure C bin ich soweit glücklich, dass ich ehrlich gesagt keine große Energie in Ursachenanalyse mit dem gcc stecken will.
Titel: Re: gcc, GEMDOS Super und Stackzerstörung
Beitrag von: mfro am Sa 06.08.2016, 19:07:19
... Geht mit jeder void ...(void) Funktion

Nicht void. Supexec() erwartet eine Funktion, die einen long-Wert zurückgibt. Den serviert sie dann auch dem Aufrufer.
Titel: Re: gcc, GEMDOS Super und Stackzerstörung
Beitrag von: simonsunnyboy am Sa 06.08.2016, 20:22:29
Offiziell ja, inoffiziell geht es genauso auch gut mit void ;)
Titel: Re: gcc, GEMDOS Super und Stackzerstörung
Beitrag von: czietz am Sa 06.08.2016, 21:29:54
Das interessiert mich, kannst Du den Code mal zeigen?

Anbei eine deutlich reduzierte Version der "Moving Inversions" aus YAART zum Testen. Hier benötigt die gcc-Version immer noch 25% länger als die Pure-C-Version. yrt_tim.prg ist mit Pure C compiliert, yrt_tim.tos mit gcc -O2.

Profiling mit Hatari zeigt, dass sich Pure C deutlich schlauer anstellt, was die Adressen von häufig vorkommenden Speicherzugriffen angeht und sie in ein Adressregister packt. gcc greift auch in einer Schleife jedesmal auf die Adresse direkt zu und braucht so z.B. mit...
move.w    $160dc,d0
move.w    d0,(a0)+

... viel länger als Pure C mit einmalig initialisiertem A3 und ...
move.w    (a3),(a0)+.

6 304 768 Zyklen vs. 3 151 944 Zyklen!
Titel: Pure C vs. gcc -- Wer ist schneller
Beitrag von: czietz am So 07.08.2016, 10:48:10
... und bevor jemand kommentiert "Ja, aber globale Variablen benutzt man ja auch nicht": Wenn ich alle Variablen der Funktion als Argument übergebe, wird es zwar generell schneller, weil diese dann sowohl bei Pure C als auch bei gcc in Registern vorgehalten werden, jedoch ist der mit gcc generierte Code immer noch ca. 20% langsamer als der mit Pure C generierte.

Insbesondere braucht diese Schleife mit gcc ca. 40%(!) länger als mit Pure C.

while (p>start_local) {
if ((x = *(--p)) != patt2_local) {
bad = x;
}
*p = patt1_local;
}

Ich hätte ja gedacht, dass ein moderner Compiler gegen einen aus dem vergangenen Jahrtausend meilenweit überlegen ist. Wohl falsch gedacht...
Titel: Re: gcc, GEMDOS Super und Stackzerstörung
Beitrag von: simonsunnyboy am So 07.08.2016, 11:44:56
O3 hilft vielleicht noch mehr?
Titel: Pure C vs. gcc -- Wer ist schneller
Beitrag von: czietz am So 07.08.2016, 12:01:10
Mit -O3 braucht die gepostete Schleife mit gcc nur noch 15% länger als mit Pure C. Immer noch nicht toll.

gcc -O3 hält den Pointer p in zwei Adressregistern vor, einen zum Lesen und Beschreiben der Speicherstelle und einen zum Vergleich mit start. So müssen beide Register in jeder Schleife synchronisiert werden und das kostet unnötig Zeit.
Titel: Re: gcc, GEMDOS Super und Stackzerstörung
Beitrag von: Börr am So 07.08.2016, 17:56:01
Könnten wir mal ein Atari Coding Workshop Wochenende machen?
Titel: Re: Pure C vs. gcc -- Wer ist schneller
Beitrag von: mfro am Fr 12.08.2016, 16:56:25
Mit -O3 braucht die gepostete Schleife mit gcc nur noch 15% länger als mit Pure C. Immer noch nicht toll.

gcc -O3 hält den Pointer p in zwei Adressregistern vor, einen zum Lesen und Beschreiben der Speicherstelle und einen zum Vergleich mit start. So müssen beide Register in jeder Schleife synchronisiert werden und das kostet unnötig Zeit.

Hmmm.

Mit -O3:

Zitat
Took 185 Ticks.

mit -O2:

Zitat
Took 204 Ticks.

mit -Os:

Zitat
Took 171 Ticks


... da scheint was mit der Optimierung im Argen zu sein ...
Titel: Re: Pure C vs. gcc -- Wer ist schneller
Beitrag von: czietz am Fr 12.08.2016, 17:49:05
Du hast einen schnelleren Rechner als ich  ;). Auf einem 1040ST (original mit 8 MHz) bekomme ich:

gcc -O02579 ticks
gcc -O11424 ticks
gcc -O21155 ticks
gcc -O31048 ticks
gcc -Os994 ticks (schneller als O3, wie bei Dir)
Pure C940 ticks (Gewinner!)

Die -- nicht im Forum gepostete -- Variante mit lokalen statt mit globalen Variablen liefert:

gcc -O02365 ticks
gcc -O1779 ticks
gcc -O2806 ticks (langsamer als O1!)
gcc -O3725 ticks
gcc -Os672 ticks
Pure C672 ticks (gleichauf mit gcc -Os)

Zitat
... da scheint was mit der Optimierung im Argen zu sein ...

Das sehe ich auch so.
Titel: Re: Pure C vs. gcc -- Wer ist schneller
Beitrag von: mfro am Fr 12.08.2016, 23:14:23
Du hast einen schnelleren Rechner als ich  ;). Auf einem 1040ST (original mit 8 MHz)...

... einen (fast) originalen TT.

Lustigerweise wird's da auch mit -O3 -mcpu=68030 -mtune=68030 nur unwesentlich schneller, das mit Abstand beste Ergebnis liefert auch da der 68000 code mit -Os ...
Titel: Re: gcc, GEMDOS Super und Stackzerstörung
Beitrag von: simonsunnyboy am Sa 13.08.2016, 10:50:56
Kurz und wenig Befehle kann auch schnell sein, muss nicht automatisch, aber kann....
Titel: Re: gcc, GEMDOS Super und Stackzerstörung
Beitrag von: ari.tao am So 14.08.2016, 08:41:57
ad Topic:
SuperToUser() dürfte tatsächlich eine Lösung sein. Supexec() ist hier nicht so toll, weil ich -- anders im Beispiel mit foobar() -- schon Parameter an die Funktion übergeben will, am liebsten ohne globale Variablen dafür zu verwenden.
Man kann SuperExec (XBIOS_38) grundsätzlich auch für Prozeduren mit Parametern verwenden. Falls es noch interessiert, kann ich ein Bsp. für M2(TDI) zeigen, mit C kenne ich mich nicht aus. Alles nur eine Frage des Bindings. Übrigens kann man auch mittels GEMDOS_32 ein SuperExec ´zusammenbinden´.

ad offTopic:
Mit großem Interesse verfolge ich, wie Eure C-Compiler ´ticken´ . Weiß jmd., wie gcc die genannten ´ticks´ berechnet? Würde mich stark interessieren! Ich habe mich mal sehr intensiv mit Takt-zählen für Code-Stücke befaßt. Auf den kleinen STs ist das ganz einfach (man schaut in´s MC68000-Manual und addiert), auf einer 68030-Maschine ungleich schwieriger! Der Proz.-Cache sowie die unterschiedlichen MHze für Bus, P.-extern & P.-intern machen eine Berechnung nur an Hand des Codes imho unmöglich! Ich habe daraufhin eine Meßmethode programmiert. Funzt grundsätzlich, aber die Sache ist derart kompliziert, daß ich bis heutigen Tags nicht sicher bin, ob alles ok ist.
Du hast einen schnelleren Rechner als ich  ;). Auf einem 1040ST (original mit 8 MHz)...
... einen (fast) originalen TT.
Lustigerweise wird's da auch mit -O3 -mcpu=68030 -mtune=68030 nur unwesentlich schneller, das mit Abstand beste Ergebnis liefert auch da der 68000 code mit -Os ...
Die Performance kann man afaik immer nur für das Gesamt-System vergleichen, also die Kombi Maschine + Compiler. Das macht man (auf Ataris) mit dem Dhrystone-Test. Die ´ticks´ alleine dürften ziemlich irreführend sein!

ad @mfro :
Könnte sich Deine Biene, bitte bitte, auch mal setzen? Das Viech ist derart lästig, daß ich mich davon immer in den H... gestochen fühle  :'(

Titel: Re: gcc, GEMDOS Super und Stackzerstörung
Beitrag von: czietz am So 14.08.2016, 10:32:59
Man kann SuperExec (XBIOS_38) grundsätzlich auch für Prozeduren mit Parametern verwenden. Falls es noch interessiert, kann ich ein Bsp. für M2(TDI) zeigen, mit C kenne ich mich nicht aus. Alles nur eine Frage des Bindings.

Auch wenn das Problem mittlerweile gelöst ist, würde mich das Beispiel (auch wenn's in Modula 2 ist) interessieren.

ad offTopic:
Mit großem Interesse verfolge ich, wie Eure C-Compiler ´ticken´ . Weiß jmd., wie gcc die genannten ´ticks´ berechnet? Würde mich stark interessieren!

Die "ticks", die mein Testprogramm auswirft, sind einfach aus dem 200-Hz-Timer (Systemvariable hz_200) abgeleitet und somit proportional zur Zeit, die für die Ausführung des "Moving inversions"-Algorithmus benötigt wird. Das ist ja das, was letztlich der Benutzer (von YAART) merkt: Wieviel Zeit vergeht für einen Testdurchlauf. Und das dauert in der gcc-compilierten Version eben länger als in der Pure-C-compilierten Version.

Wenn ich oben hingegen von Zyklen gesprochen habe, waren CPU-Taktzyklen gemeint und sie waren mit dem Profiler von Hatari aufgenommen. Für die Emulation eines MC68000, dürfte sie ziemlich genau der Realität entsprechen. Für einen MC68030 weiß ich es nicht, wobei ich seit YAART immerhin weiß, dass Hatari durchaus den Cache des MC68030 emulieren kann.

Zitat
Die Performance kann man afaik immer nur für das Gesamt-System vergleichen, also die Kombi Maschine + Compiler. Das macht man (auf Ataris) mit dem Dhrystone-Test. Die ´ticks´ alleine dürften ziemlich irreführend sein!

Das denke ich nicht. Die ticks (aka die vergangene Zeit) ist genau das, was der Benutzer spürt, siehe oben.
Titel: Re: gcc, GEMDOS Super und Stackzerstörung
Beitrag von: mfro am So 14.08.2016, 10:56:16
ad @mfro :
Könnte sich Deine Biene, bitte bitte, auch mal setzen? Das Viech ist derart lästig, daß ich mich davon immer in den H... gestochen fühle  :'(

Nee, tut mir außerordentlich leid, das kann die nicht (ist ja schließlich eine BusyBee). Aber wenn's dir derart auf die Nerven geht:

about: config

image.animation_mode: once

Dann fliegt sie beim Laden der Seite nur noch einmal im Kringel rum und setzt sich dann hin. Zumindest, wenn Du Firefox benutzt.
Titel: Benchmarking
Beitrag von: czietz am So 14.08.2016, 14:28:14
Die Performance kann man afaik immer nur für das Gesamt-System vergleichen, also die Kombi Maschine + Compiler. Das macht man (auf Ataris) mit dem Dhrystone-Test. Die ´ticks´ alleine dürften ziemlich irreführend sein!

Nochwas zum Thema Benchmarks: Soweit ich weiß, krankt der Dhrystone-Test daran, dass es einige Dinge darin gibt, die ein "schlauer" Compiler einfach vorberechnen kann. Somit wäre der gcc hier vermutlich einem Pure C von vor 25 Jahren überlegen.

Nur finde ich genau das dann irreführend. Was nützt es mir, wenn gcc für einen synthetischen Benchmark tollen Code erzeugt, meine tatsächliche Anwendung aber mit gcc compiliert langsamer wird? YAART (und der gepostete Auszug yrt_tim.c) sind ja keine Benchmarks, sondern eine konkrete Anwendung, die natürlich so schnell wie möglich auf dem ST laufen soll.
Titel: Re: gcc, GEMDOS Super und Stackzerstörung
Beitrag von: ari.tao am So 14.08.2016, 15:33:16
Ja. Also einfach den Test laufen lassen mit der Stoppuhr in der Hand, anstatt ticks zählen. Ach, ich sehe gerade, das hast Du ja praktisch getan mit dem HZ200.
Wo hast Du denn von Zyklen geschrieben? Ich habe immer nur ´ticks´ gelesen. Für die 5msec-Intervalle des HZ200 ist mW. der Ausdruck ´jiffies´ gebräuchlich.
Das M2-Bsp. werde ich bei nächster Gelegenheit mal raussuchen.

PS: Ich glaube nicht, daß ausgerechnet der gcc aus der VW-Kategorie stammt.
Titel: Re: Benchmarking
Beitrag von: czietz am So 14.08.2016, 15:51:50
Ja. Also einfach den Test laufen lassen mit der Stoppuhr in der Hand, anstatt ticks zählen.

Die "ticks" sind wie eine Stoppuhr! Das kommt auf gleiche hinaus, wie ich in meinem anderen Posting erklärt habe: http://forum.atari-home.de/index.php?topic=13075.msg209672#msg209672 (http://forum.atari-home.de/index.php?topic=13075.msg209672#msg209672).

EDIT: "Zyklen", gemessen mit Hatari, kommen z.B. in folgendem Post vor: http://forum.atari-home.de/index.php?topic=13075.msg209381#msg209381 (http://forum.atari-home.de/index.php?topic=13075.msg209381#msg209381)

Zitat
PS: Ich glaube nicht, daß ausgerechnet der gcc aus der VW-Kategorie stammt.

Das hat nichts mit Mogeln seitens des gcc zu tun, wenn er Dinge vorausberechnet, die schon zur Compile-Zeit bekannt sind! Es verfälscht nur Benchmarks, die das nicht bedenken. Ein kleines Beispiel: Der Optimierer von gcc wird...
if (strlen("Hello") == 42) {
printf("ERROR!");
}
... komplett weg-optimieren, da er das Resultat von strlen schon kennt. Versuchte man, mit solchem Code die String-Performance zu benchmarken, fiele man ganz schön auf die Nase.
Titel: Re: gcc, GEMDOS Super und Stackzerstörung
Beitrag von: ari.tao am So 14.08.2016, 16:11:43
Das sehe ich genau umgekehrt: Wenn der Compiler so schlau ist - hat er dann nicht zu Recht die Nase vorn?!
Ach, jetzt sind wir ein wenig um die Wette gelaufen, die ´Zyklen´ hatte ich inzwischen schon gefunden. Wie (& wo) hast Du die gemessen? Hatari kenne ich nicht.
Titel: Re: Benchmarking
Beitrag von: czietz am So 14.08.2016, 16:17:32
Oder ein realistischeres Beispiel: Nehmen wir an, jemand wollte die Integer-Performance einer CPU (Additionen, Multiplikationen, Shifts) mittels folgendem Benchmark testen:

#include <stdio.h>
#include <string.h>
#include <stdint.h>

static uint32_t int_performance(uint32_t input) {

input <<=  7;
input += 255;
input *= 3;
input -= 11;

return input;
}

int main(void) {

int loop;
uint32_t res;

for (loop=0; loop<50000; loop++) {
res = int_performance(42);
if (res != 16882) {
printf("Error\r\n");
}

res = int_performance(111);
if (res != 43378) {
printf("Error\r\n");
}
}

return 0;
}

gcc (m68k-atari-mint-gcc, version 4.6.4) optimiert ab -O2 die komplette for-Schleife(!) weg, sodass der Benchmark nur noch aus return 0; besteht.

Deshalb bevorzuge ich echte Applikationen als Benchmark. Ich habe schon zu viele Tests wie oben gesehen, die nicht berücksichtigen, wie gut moderne Optimierer in manchen Fällen sind.

Das sehe ich genau umgekehrt: Wenn der Compiler so schlau ist - hat er dann nicht zu Recht die Nase vorn?!

Wenn sich das auf die reale Performance niederschlägt, dann ja. Dummerweise sind in manchen Benchmarks aber viele Dinge vorberechnbar (s. oben), in realen Anwendungen hingegen nicht. Fakt ist: Selbst mit -O3 (oder -Os) läuft mein RAM-Test YAART schneller, wenn ich ihn mit Pure C compiliere.

Zitat
Ach, jetzt sind wir ein wenig um die Wette gelaufen, die ´Zyklen´ hatte ich inzwischen schon gefunden. Wie (& wo) hast Du die gemessen?

Schrieb ich doch: Hatari-Profiler: https://hg.tuxfamily.org/mercurialroot/hatari/hatari/raw-file/tip/doc/manual.html#Profiling (https://hg.tuxfamily.org/mercurialroot/hatari/hatari/raw-file/tip/doc/manual.html#Profiling)

Titel: Re: gcc, GEMDOS Super und Stackzerstörung
Beitrag von: ari.tao am So 14.08.2016, 16:56:17
Danke @czietz , für den Link. Puh, das ist ja ein Universum! Das ist etwas für lange Winterabende... Jetzt mach´ ich erst mal Pause und geh´ in die Sonne.
Titel: Re: gcc, GEMDOS Super und Stackzerstörung
Beitrag von: ari.tao am Mo 15.08.2016, 06:49:11
Danke, @mfro , für den Hinweis. Ich benutze den Explorer. Da habe ich trotz einiger Suche kein Menue ´config´ gefunden. Das ist jetzt mal ein echter Grund, endlich FireFox zu installieren!
Titel: Re: gcc, GEMDOS Super und Stackzerstörung
Beitrag von: mfro am Mo 15.08.2016, 08:14:17
... Ich benutze den Explorer...

Da geht so was auch:
http://praxistipps.chip.de/internet-explorer-gif-bilder-deaktivieren_15640

Der Internet-Explorer ist trotzdem nervig.
Titel: Re: gcc, GEMDOS Super und Stackzerstörung
Beitrag von: 1ST1 am Mo 15.08.2016, 10:14:56
Und vor allem gefährlich (Sicherheitslücken!)
Titel: Re: Benchmarking
Beitrag von: czietz am Mo 15.08.2016, 19:52:13
Um zu zeigen, dass nicht alles schlecht ist mit dem gcc, habe ich mal den CoreMark [1] compiliert und laufen lassen. Das ist recht moderner CPU-Benchmark, der über die Kommandozeile parametriert wird, damit der Compiler eben nichts vorberechnen kann.

Hier die Resultate -- jeweils auf einem Atari ST mit 8 MHz, oder vielmehr dessen zyklusgenauer Emulation in Steem. Größere Zahl ist hier besser:

CoreMark 1.0 : 0.814332 / PureC 1.1  / STACK
CoreMark 1.0 : 0.363438 / GCC4.6.4 (MiNT 20130415) -O0 -mcpu=68000 -fomit-frame-pointer -DPERFORMANCE_RUN=1   / STACK
CoreMark 1.0 : 1.167202 / GCC4.6.4 (MiNT 20130415) -O1 -mcpu=68000 -fomit-frame-pointer -DPERFORMANCE_RUN=1   / STACK
CoreMark 1.0 : 1.716738 / GCC4.6.4 (MiNT 20130415) -O2 -mcpu=68000 -fomit-frame-pointer -DPERFORMANCE_RUN=1   / STACK
CoreMark 1.0 : 1.722653 / GCC4.6.4 (MiNT 20130415) -O3 -mcpu=68000 -fomit-frame-pointer -DPERFORMANCE_RUN=1   / STACK
CoreMark 1.0 : 1.465738 / GCC4.6.4 (MiNT 20130415) -Os -mcpu=68000 -fomit-frame-pointer -DPERFORMANCE_RUN=1   / STACK

Wie man sieht, muss sich hier PureC dem gcc-Optimierer (teilweise deutlich) geschlagen geben. Und gcc verhält sich plausibel, was die Optimierungsstufen angeht: -O3 ist schneller als -O2 ist schneller als -O1.

Mit meinem yrt_tim.c hingegen stelle ich den gcc-Optimierer wohl auf eine (zu harte) Probe...

[1] http://www.eembc.org/coremark/index.php
Titel: Re: gcc, GEMDOS Super und Stackzerstörung
Beitrag von: mfro am Mo 15.08.2016, 21:23:36
Ahja. Jetzt stimmt mein Weltbild wieder. Danke!
Titel: Re: gcc, GEMDOS Super und Stackzerstörung
Beitrag von: 1ST1 am Mo 15.08.2016, 21:51:27
Sehr beeindruckendes Ergebnis. Da sieht man dann schon, was 20 Jahre Optimierungen im Compiler so bringen können. Würde man jegliche ST-Software damit kompilieren, wäre der ST ja gleich doppelt so schnell, ganz ohne eine Turbokarte einzubauen. Wow!
Titel: Re: gcc, GEMDOS Super und Stackzerstörung
Beitrag von: ari.tao am Di 16.08.2016, 16:34:31
... Ich benutze den Explorer...
Da geht so was auch:
http://praxistipps.chip.de/internet-explorer-gif-bilder-deaktivieren_15640
Danke an @mfro . Erstmal hilft die ESC-Taste (aus og. praxistipps).
Kann der Firefox parallel installiert werden, oder muß ich zuerst den Explorer entfernen?
.......

Man kann SuperExec (XBIOS_38) grundsätzlich auch für Prozeduren mit Parametern verwenden. Falls es noch interessiert, kann ich ein Bsp. für M2(TDI) zeigen, mit C kenne ich mich nicht aus. Alles nur eine Frage des Bindings. 
Auch wenn das Problem mittlerweile gelöst ist, würde mich das Beispiel (auch wenn's in Modula 2 ist) interessieren.
Hatha das versprochene Bsp. (hat ebbs gedauert, weil ich aus den vorhandenen ein zur Demo geeignetes heraussuchent & didaktisch aufbereiten mußte):
(* IMPLEMENTATION *) MODULE SUP_DEMO;
(* ½ 2016 Ari.Tao * 15.08.16  TDI-M2                      .

     Two examples how to use XBIOS_38 (SuperExec) with parameters:
       SupExec (long out par. only)
       PeekL   (long in & long out par.)

*)(*$T-,$S-,$A+ mini *)
IMPORT GT;
FROM SYSTEM
IMPORT ADR,ADDRESS, WORD, SETREG,CODE;

CONST  RTS  = 4E75H;
       UNLK = 4E5EH;
       TRAP = 4E40H;
      XTRAP = TRAP+14; (* XBIOS *)
      PUSHW = 3F3CH;   (* MOVE.W #*,-(A7) ;          Word-Konstante.*)
      PUSHV = 2F2EH;   (* MOVE.L s(A6),-(A7); Long- v VAR-Parameter.*)
       RETL = 2D40H;   (* MOVE.L D0,d(A6) ;          Long-Ergebnis. *)

CONST SUPER = 38; D0 = 0; PM = 8;

TYPE  SuperPar = RECORD Op: CARDINAL; Code: PROC END;
TYPE  HANDLE   = POINTER TO ADDRESS;

(* Beispiel_1: *)

PROCEDURE SuperExec (Code: PROC);
 BEGIN CODE (PUSHV,PM, PUSHW,SUPER, XTRAP) END SuperExec;
PROCEDURE   SupExec (Code: PROC): (*D0 via Code:*) LONGINT;
 BEGIN CODE (PUSHV,PM, PUSHW,SUPER, XTRAP, RETL,PM+4, UNLK,RTS) END SupExec;

(* Beispiel_2: *)

PROCEDURE peekL; VAR h: HANDLE; p: POINTER TO RECORD q,z: HANDLE END;(*$S-*)
 BEGIN CODE (RETL+14,-4); p := h^+PM; p^.z := p^.q^ END peekL;       (*$S=*)
PROCEDURE PeekL(a: ADDRESS): (*Val:*) ADDRESS;  VAR P: SuperPar;
 BEGIN P.Op := SUPER; P.Code := peekL; CODE (XTRAP, UNLK,RTS) END PeekL;

(* Test: *)

PROCEDURE TestCode; (*$S-*) BEGIN SETREG (D0, 13H) END TestCode; (*$S=*)
CONST MEMTOP = 436H;

BEGIN (* .TOS *)
      GT.wHexL (SupExec (TestCode), 10);
      GT.wHexL (PeekL (MEMTOP),  10);
  END SUP_DEMO .

Hinweise:
   1) Das Phragma $S- unterdrückt den StackTest des TDI-Compilers.
   2) Selbstverständlich sind die Bindings Compiler-abhängig, also nur bedingt portabel.
   3) Die Idee stammt aus einem Zeitschriften-Artikel. Leider ging mir die Quelle verloren.
   4) Das fertig kompilierte Prg. -> Anhang (ziemlich uninteressant, nur zur Vollständigkeit)
.......

Ad Benchmarking:
Zitat
Deshalb bevorzuge ich echte Applikationen als Benchmark. 
Klaro, dacour.
Es liegt mir fern, den CoreMark in Zweifel zu ziehen. Aber der dient doch in erster Linie dazu, Prozessoren zu vergleichen? Beim RAM-Test spielt der Bus eine wesentliche Rolle.
Ist der CoreMark (nomen est omen?) dafür denn auch zuständig? Wenn nicht, dann ist
Zitat
Fakt ist: Selbst mit -O3 (oder -Os) läuft mein RAM-Test YAART schneller, wenn ich ihn mit Pure C compiliere. 
überhaupt kein Wunder. Der gcc wurde vermutlich dem CoreMark angepaßt, aber PureC dem Dhrystone oä.
Übrigens wird im BegleitText zum Dhrystone die von Dir @czietz angesprochene Optimierungs-Problematik durchaus berücksichtigt. Deshalb halte ich imho diesen mittelalterlichen Test für unsere OldTimer immer noch für gut geeignet. An ein paar wenigen Dhrystones Unterschied würde ich keine Bewertung festmachen, aber bei einem Faktor von ca. 2 gibt es am Dhrystone wohl nix herumzukritteln. Man kann jedenfalls gut sehen, daß der TT mehr Leistung hat als ein F30 mit 32MHz oder auch die groben Unterschiede in verschiedenen Compiler-Designs oder auch den Einfluß des BusTakts oder auch, wieviel Performance eine höhere Grafik-Auflösung im Falcon kostet; und das ist alles sehr plausibel.
.......

@czietz , wo bitte genau finde ich im Hatari-Universum das Stückchen Code, das für die ´Zyklen´ zuständig ist?

Eine jede Wissenschaft hat ein sog. Hauptproblem. Dasjenige der Informatik ist nicht etwa, Information zu erzeugen, sondern, sie (wieder-)zufinden!
Titel: Re: gcc, GEMDOS Super und Stackzerstörung
Beitrag von: 1ST1 am Di 16.08.2016, 17:03:16
Offtopic, ari.tao schrieb:
Zitat
Kann der Firefox parallel installiert werden, oder muß ich zuerst den Explorer entfernen?
Du musst den Exploder nicht entfernen, kannst du unter Windows nichtmal. Du darfst gerne neben dem Firefox auch noch Chrome, Opera, ... parallel installieren und gleichzeitig starten und mit allen gleichzeitig surfen! Und dann legst du dir einen der neuen Browser als Standard fest und hast in Zukunft Ruhe vor dem IE, wenn du möchtest. Mindestens der Firefox kann auch all deine Lesezeichen usw. vom IE importieren.
Titel: Re: Benchmarking
Beitrag von: czietz am Di 16.08.2016, 18:56:07
Hatha das versprochene Bsp. (hat ebbs gedauert, weil ich aus den vorhandenen ein zur Demo geeignetes heraussuchent & didaktisch aufbereiten mußte):

Danke. Wenn ich das richtig verstehe -- da bin ich mir nicht sicher, baut dieser Code darauf auf, dass in TDI Modula-2 offenbar auf Parameter und Rückgabewerte über A6 zugegriffen werden kann und er vertraut darauf, dass dieses Adressregister vom XBIOS-Aufruf nicht überschrieben wird.

Das ist nach C nicht wirklich umsetzbar. Je nach Aufrufkonvention landen die Parameter dort entweder auf dem Stack oder in den Registern D0 - Dx. Es ist nirgendwo dokumentiert, wie Stack und Register aussehen, wenn das XBIOS die eigene Funktion im Supervisor-Modus aufruft.

Und selbst wenn man eine Lösung konstruieren würde, die funktioniert, ist dann nicht gesagt, dass sie das mit jeder TOS-Version (oder EmuTOS oder...) auch tut.

Zitat
Es liegt mir fern, den CoreMark in Zweifel zu ziehen. Aber der dient doch in erster Linie dazu, Prozessoren zu vergleichen? Beim RAM-Test spielt der Bus eine wesentliche Rolle.
Ist der CoreMark (nomen est omen?) dafür denn auch zuständig?

Das EEMBC schreibt: "[Coremark]  will be useful for testing a processor’s pipeline operation, memory (or cache if any) access, and handling of integer operations." Aber letztlich will ich ja keine Maschinen vergleichen, sondern Compiler. RAM und Integerperformance der CPU sind gleich, nur was der Compiler aus dem Code macht nicht. Und da bleibe ich dabei, dass mit YAART wohl eine Schwachstelle im gcc-Optimierer triggere.

Zitat
Übrigens wird im BegleitText zum Dhrystone die von Dir @czietz angesprochene Optimierungs-Problematik durchaus berücksichtigt.

Das Problem ist, dass seit der Veröffentlichung von Dhrystone vor 30(?) Jahren die Optimierer durchaus "schlauer" geworden sind und Dinge vorberechnen, die die Macher nicht berücksichtigt haben. Der Dhrystone-Code in C, den ich kenne, ist so verworren, dass ich dafür aber kein konkretes Beispiel liefern kann.

Zitat
@czietz , wo bitte genau finde ich im Hatari-Universum das Stückchen Code, das für die ´Zyklen´ zuständig ist?

Was meinst Du damit? Wo das im Quelltext von Hatari ist? Das weiß ich nicht, die hatari-devel-Mailingliste aber wahrscheinlich schon. Es wird vermutlich kein "Stückchen" Code geben. Die taktzyklusgenau simulierte CPU weiß natürlich, wie viele Zyklen sie für jede Instruktion gebraucht hat (auch die Zugriffsgeschwindigkeiten auf RAM, ROM etc. werden von Hatari für den ST korrekt simuliert), aber wie das an den Profiler herausgegeben wird, keine Ahnung.
Titel: Re: gcc, GEMDOS Super und Stackzerstörung
Beitrag von: ari.tao am Do 18.08.2016, 05:56:18
Zitat
  ...dass in TDI Modula-2 offenbar auf Parameter und Rückgabewerte über A6 zugegriffen werden kann und er vertraut darauf, dass dieses Adressregister vom XBIOS-Aufruf nicht überschrieben wird. 
Darauf darf jeder vertrauen. -> ProfiBuch (10) S. 36 & 202.
Zitat
Das ist nach C nicht wirklich umsetzbar. Je nach Aufrufkonvention landen die Parameter dort entweder auf dem Stack oder in den Registern D0 - Dx. 
Doch, doch. Das ist für M2- und andere Compiler auch nicht viel anders. TDI-M2 packt alle Parameter grundsätzlich auf den Stack, mit wenigen Ausnahmen (zB. die in TDI eingebaute IEEE-Arithmetik). Siehe Anhänge.
Zitat
Es ist nirgendwo dokumentiert, wie Stack und Register aussehen, wenn das XBIOS die eigene Funktion im Supervisor-Modus aufruft.   
Rtfm zu XBIOS_38.
Vielleicht kennt ja jmd. den Zeitschriften-Artikel, der mir verloren ging? (Muß _vor_ 1998 gewesen sein). Möglicherweise war der sogar mit C formuliert?
Zitat
nicht gesagt, dass sie das mit jeder TOS-Version (oder EmuTOS oder...) auch tut. 
Alle mir bekannten TOS-Versionen halten sich an das dargelegte, und alle Emulatoren sollten das gefälligst auch tun. (Das ProfiBuch nennt zwar an der zitierten Stelle nicht explizit die Quelle, aber ich denke mal, daß die richtig aus der Atari-Doku abgeschrieben haben.) Aber ich habe das fertig kompilierte Sup_Demo.TOS ja gepostet, kannste also selbst ausprobieren.
Zitat
...Schwachstelle im gcc-Optimierer triggere.
Dazu habe ich meine Meinung ja deutlich kundgetan. Noch weiter lehne ich mich nicht aus dem Fenster.
Zitat
Der Dhrystone-Code in C, den ich kenne,...   
In der ST-C.-PD338 gab es eine C-Portierung des Dhry; ich habe da nie hineingeschaut. Der Dhrystone wurde mW. ursprünglich in ADA geschrieben, die Portierungen nach PASCAL und MODULA waren wohl mehr oder weniger ´straightforward´. Meine M2-Versionen habe ich ja gepostet. Im .MOD sind auch meine Test-Ergebnisse notiert.
Zitat
Zitat
@czietz , wo bitte genau finde ich im Hatari-Universum das Stückchen Code, das für die ´Zyklen´ zuständig ist?
Was meinst Du damit? Wo das im Quelltext von Hatari ist? 
Ja, exakt.
Zitat
Die taktzyklusgenau simulierte CPU ...
Das halte ich entweder für ein Wunder, oder aber, wahrscheinlicher, für Blendwerk & Zauberei. Zum Taktzählen habe ich mich oben in Posting #18 ja schon geäußert. Niemand kann imho vorhersagen, wann ein (im Kontext eingebettetes) Stück Code im Proz.-Cache landet und wann nicht, zumal der Cache des 68030 ja nicht gerade riesig ist. Vielleicht ist genau das der Grund für die Unterschiede bei Deinem YAART (und damit wäre der gcc-Optimierer vielleicht ganz unschuldig, es könnte auch eine Frage der eingebundenen Libs sein).
Titel: Re: gcc, GEMDOS Super und Stackzerstörung
Beitrag von: mfro am Do 18.08.2016, 07:40:42
Zitat
  ...dass in TDI Modula-2 offenbar auf Parameter und Rückgabewerte über A6 zugegriffen werden kann und er vertraut darauf, dass dieses Adressregister vom XBIOS-Aufruf nicht überschrieben wird. 
Darauf darf jeder vertrauen. -> ProfiBuch (10) S. 36 & 202.

Daß deine Methode bei dir funktioniert, glaub' ich gleich.

Daß sie immer funktionieren muß, sehe ich ganz und gar nicht als garantiert.

Im Profibuch (und anderswo) steht lediglich, welche Register beim XBIOS-Aufruf gerettet und danach wiederhergestellt werden.

Wenn ich richtig verstehe (ist ein bißchen verwirrend, weil man den - offensichtlich von TDI-Modula eingeschobenen - Funktionsprolog LINK a6,xxx nicht sieht), übergibt dein Code auf dem Stack einen Zeiger auf die lokalen Variablen der aufrufenden Prozedur (relativ zu A6, daß wäre bei gcc sehr ähnlich, zumindest wenn man ohne -fomit-frame-pointer compiliert) und läßt die von der im Supervisor-Mode aufgerufenen Funktion befüllen.

Daß der Stack beim Supexec()-Aufruf so aussieht, wie er eben aussieht, wenn das XBIOS den Supervisor-Mode aktiviert hat und deine Routine als Callback aufruft, garantiert niemand (kann ich zumindest in den von dir geposteten Verweisen nicht rauslesen). Noch nicht einmal, daß das überhaupt derselbe Stack ist (der Stackpointer könnte ganz ohne Konflikt mit den zugesicherten Eigenschaften auch ganz woanders hinzeigen).

Es wird lediglich garantiert, daß die genannten Register nach dem Trap wieder genauso aussehen wie vorher. Mein Fazit: kann so funktionieren, muß aber nicht.

Titel: Re: gcc, GEMDOS Super und Stackzerstörung
Beitrag von: czietz am Do 18.08.2016, 07:44:09
Darauf darf jeder vertrauen. -> ProfiBuch (10) S. 36 & 202.

Dort steht, welche Register vor der Rückkehr aus dem Trap wiederhergestellt werden. Dort steht nicht, welche Register im Trap erhalten bleiben. Und genau im Trap bin ich ja, wenn das XBIOS (Supexec) meine Funktion aufruft. Fakt ist: Keine der von Dir zitierten Stellen sagt etwas zur Belegung der Register, die meine von Supexec aufgerufene Funktion sieht.

Zitat
Zitat
Es ist nirgendwo dokumentiert, wie Stack und Register aussehen, wenn das XBIOS die eigene Funktion im Supervisor-Modus aufruft.   
Rtfm zu XBIOS_38.

Vielleicht magst Du genauer werden? Fakt ist: Weder im Profibuch noch in Ataris Hitchhiker Guide to the BIOS wird dokumentiert, wie die Registerbelegung ist, wenn Supexec meine Funktion aufruft. Damit darf ich mich nicht darauf verlassen, wo ich den User Stack vorfinde, auf dem meine Parameter wären.

PS: Und @mfro formuliert diesen Punkt noch besser, als ich es könnte.

Zitat
Zitat
...Schwachstelle im gcc-Optimierer triggere.
Dazu habe ich meine Meinung ja deutlich kundgetan. Noch weiter lehne ich mich nicht aus dem Fenster.

Fakt ist: YAART und yrt_tim laufen mit gcc langsamer. Das lässt sich durch noch so viel Diskussion nicht wegdiskutieren. Fakt ist auch: Ich habe mir den generierten Assembler-Code angesehen und er ist unbestreitbar ineffizienter als der von Pure C. Meine Erkenntnisse kannst Du weiter oben im Thread bereits nachlesen.

Zitat
Zitat
Die taktzyklusgenau simulierte CPU ...
Das halte ich entweder für ein Wunder, oder aber, wahrscheinlicher, für Blendwerk & Zauberei. Zum Taktzählen habe ich mich oben in Posting #18 ja schon geäußert. Niemand kann imho vorhersagen, wann ein (im Kontext eingebettetes) Stück Code im Proz.-Cache landet und wann nicht, zumal der Cache des 68030 ja nicht gerade riesig ist.

Ich weiß nicht, warum Du immer wieder mit dem 68030 um die Ecke kommst. YAART ist für STs geschrieben, entsprechend findet das ganze Benchmarking mit einem 68000 statt. Fakt ist: Für einen ST ist Hatari zyklusgenau. Das magst Du bezweifeln, es ist aber so. Übrigens: Wäre das nicht der Fall liefen viele Demos und Spiele nicht in Hatari. Auf der Hatari-devel-Mailingliste beantwortet man sicherlich gerne Deine Zweifel.

Zitat
Vielleicht ist genau das der Grund für die Unterschiede bei Deinem YAART (und damit wäre der gcc-Optimierer vielleicht ganz unschuldig, es könnte auch eine Frage der eingebundenen Libs sein).

Ich schreibe es zum wiederholten Mal: 1. Es geht um einen 68000. 2. Es werden im getesteten Code keine Bibliotheksfunktionen aufgerufen. 3. Der Code ist unwiderlegbar ineffizient, ich habe ihn mir angesehen.
Titel: Re: gcc, GEMDOS Super und Stackzerstörung
Beitrag von: czietz am Do 18.08.2016, 08:15:23
PS: Ich habe mir für die in http://forum.atari-home.de/index.php?topic=13075.msg209397#msg209397 (http://forum.atari-home.de/index.php?topic=13075.msg209397#msg209397) gepostete Schleife den Assembler-Quelltext vorgenommen und mit YACHT http://nemesis.hacking-cult.org/MegaDrive/Documentation/Yacht.txt (http://nemesis.hacking-cult.org/MegaDrive/Documentation/Yacht.txt) die CPU-Taktzyklen darin gezählt, für einen 68000 natürlich. Man kommt auch bei Handzählung auf dasselbe Verhältnis PureC zu gcc. Damit ist für mich noch einmal gezeigt, dass Hataris Profiler kein "Blendwerk & Zauberei" ist sondern vollkommen richtig liegt. Wo ist der Gegenbeweis?
Titel: Re: gcc, GEMDOS Super und Stackzerstörung
Beitrag von: ari.tao am Fr 19.08.2016, 02:20:52
Zitat
Daß deine Methode bei dir funktioniert, glaub' ich gleich. 
Noch einmal: Das ist nicht _meine_ Methode. Ich habe sie auch bloß (dankbar) gelernt. Inzwischen habe ich die Literaturangabe wiedergefunden: ST-C. 12/90 S.79 (aber leider habe ich momentan keinen Zugang dazu).
Zitat
Daß sie immer funktionieren muß, sehe ich ganz und gar nicht als garantiert.
Da musse ma gaanz, gaanz schaaf hingucken, dann wird die nackerte Maya schamrot und verschwindet  >:D !
Und: Ich garantiere für gar nix! Was ich hier im Thread absondere, könnt ihr benutzen oder nicht benutzen - aber immer auf eigenes Risiko! Vorsichtshalber stelle ich es unter GPL (soweit mein eigenes CopyRite betroffen ist)  ;D .
Zitat
Im Profibuch (und anderswo) steht lediglich, welche Register beim XBIOS-Aufruf gerettet und danach wiederhergestellt werden. 
Nee. Da steht bloß, daß sie _gerettet_ werden. Vermutlich geht es um ihre Seelen  >:D .
Aber das führt jetzt zu einer ganz anderen Diskussion, nämlich darüber, was das an XBIOS_38 übergebene Unterprogramm - nennen wir es ´Client´ - tun darf oder muß - oder eben auch nicht.
Zitat
... weil man den - offensichtlich von TDI-Modula eingeschobenen - Funktionsprolog LINK a6,xxx nicht sieht ...
Eben weil ich solch ein Argument vorhersah, habe ich das Disassembling gepostet. Seufz.
Ein ASM-Programmierer sollte damit überhaupt kein Problem haben. Was das M2-Bsp. zeigt, ist lediglich, daß die Parameter-Übergabe an den Client auch aus einer Hochsprache heraus geht - wenn man die CallingSequenz des Compilers kennt.
Zitat
übergibt dein Code auf dem Stack ... die lokalen Variablen der aufrufenden Prozedur ... und läßt die von der im Supervisor-Mode aufgerufenen Funktion befüllen.
Das hast Du fast richtig gesehen. Alle Parameter _und_ alle lokalen Variablen liegen auf dem Stack! Das ist der ganze Trick.
Ich habe das Gefühl, daß bei Euch immer der Stackwechsel im Kopf herumgeistert, den GEMDOS_32 (Super) vornimmt. Den gibt´s aber bei SupExec gar nicht! Ich habe da noch ebbs in meinen NotiZen gefunden "Benutzt aber den UserStack & Reg. A0, siehe ´Atari intern´ S.320". (Aber auch diese Lit. ist mir derzeit unzugänglich. A0 ist vielleicht ein Schreibfehler, müßte imho heißen D0).
Zitat
... zugesicherten Eigenschaften ...
Was soll diese jur. Formulierung? Bin ich etwa ein Händler? Ich habe nix ´zugesichert´!
Zitat
Daß der Stack beim Supexec()-Aufruf so aussieht, wie er eben aussieht, wenn das XBIOS den Supervisor-Mode aktiviert hat und deine Routine ... 
Ganz ohne Garantie: Es ist so und es bleibt so  ;) .
Zitat
... als Callback aufruft, ... 
Dieser Ausdruck bezeichnet afaik eine völlig andere Mimik. Auf Deutsch: Das ist kein CallBack (wie zB. wenn Du Dich in SystemVektoren einklinkst).
Zitat
... daß das überhaupt derselbe Stack ist ... 
Eben doch. Nirgends in der Beschreibung von XBIOS_38 steht, daß der Stack gewechselt wird! (Und, aber das ist wie oben bemerkt eine ganz andere Diskussion, wenn es etwa der Client tut, ist der auch selber dafür verantwortlich!)
Zitat
... Fazit: ... 
Mein Fazit: Tief durchatmen. Ich sehe mich schon wieder gezwungen, alles bis zur letzten Schraube auszubuchstabieren, was doch offensichtlich vor Augen liegt.
-------

Zitat

Zitat von: ari.tao am ...
Zitat
Darauf darf jeder vertrauen. -> ProfiBuch (10) S. 36 & 202.
Dort steht, welche Register vor der Rückkehr aus dem Trap wiederhergestellt werden. 
Nee, steht dort nicht, siehe oben.
Zitat
... welche Register im Trap erhalten bleiben ... 
Wie schon angedeutet: Alle, die der Client unberührt läßt bzw. nach eig. Gebrauch wieder restauriert. (Andere XBIOS-Funktionen setzen uU. D0; hier aber darf es der Client!)
Zitat
Keine der von Dir zitierten Stellen sagt etwas zur Belegung der Register, die meine von Supexec aufgerufene Funktion sieht. 
Ist ja, wie dargelegt, auch völlig unnötig. Im Super(Visor)Mode kann ja kein anderes UserPrg. dazwischenspucken, und wenn Du nicht willst, daß der Client bei seiner Arbeit vom TOS unterbrochen wird, ... Alles Fragen zu og. Thema "Was darf/muß der Client?" - Und das ist alles auch relevant beim Aufruf von SupExec _ohne_ Parameter. Wenn ich dazu auch noch vortragen muß, dann verlange ich Honorar  :P ).
Zitat
Vielleicht magst Du genauer werden? Fakt ist: Weder im Profibuch noch in Ataris Hitchhiker Guide to the BIOS wird dokumentiert, wie die Registerbelegung ist,... 
War das nun genau genug? Fakt ist, daß die Doku dazu gar nix sagen muß, weil die Registerbelegung überhaupt nicht tangiert ist. Die Programmierung läuft genauso wie sonst auch. (Natürlich unter Beachtung der Regeln für den SuperMode sowie TOS-Calls).
-------

Ad Benchmarking:
Dazu ist doch wohl alles schon gesagt?
Zitat
Ich schreibe es zum wiederholten Mal: 1. Es geht um einen 68000.   
Soweit ich weiß, geht es um das Testen den ST-RAMS. Daß Du nur das am 68000er meinst, habe ich so nicht verstanden. Und ich habe Dir ja auch nicht verheimlicht, daß ich damit das ST-RAM im F30 und im TT getestet habe.
Nochmals vielen Dank, @czietz , für das Teil!
(Obzwar ich selten in die Verlegenheit komme, einen RAM-Test machen zu _müssen_ (in den letzten zehn Jahren gerade zwei mal). Und ja, gerade weil TT & F30 so viel mehr RAM haben (können), ist die Geschwindigkeit nicht ganz uninteressant.).
Zitat
  Für einen ST ist Hatari zyklusgenau. Das magst Du bezweifeln, es ist aber so. 
Du meinst: für einen 68000er. Das habe ich doch gar nicht bezweifelt.
Zitat
3. Der Code ist unwiderlegbar ineffizient, ich habe ihn mir angesehen. 
Das nun ist ein wirklich durchschlagendes Argument ;) .

Habe ich das falsch verstanden, daß der Hatari auch den Falcon emulieren kann?
Zitat
  Für einen ST ist Hatari zyklusgenau. 
Du meinst sicherlich: Für einen 68000er... (und nicht etwa eine PAK oder so).
Das klang für mich vorher so, als beziehe sich Deine Aussage auch auf vom Hatari emulierte 68030er. Und da bleibe ich bei meinem (personalisierten) Vorbehalt - bis zum Beweis des Gegenteils.
Daß ich für den 68000er problemlos Takt-Zählen kann, hatte ich ja schon kundgetan. Kann ich ganz ohne Hatari. Dennoch herzlichen Dank für den Link zu YACHT!
Titel: Re: gcc, GEMDOS Super und Stackzerstörung
Beitrag von: czietz am Fr 19.08.2016, 07:32:10
Ich kürz das mal ab: Wenn Du aus dem Programm im User Mode das XBIOS aufrufst -- nein, sogar bei jedem TRAP -- wechselt die CPU automatisch den Stackpointer (also A7) vom User Stack Pointer (USP) zum Supervisor Stack Pointer (SSP). Damit zeigt der Stackpointer erst einmal ganz woanders hin als auf Deine Parameter. Irgendwo bevor der XBIOS-Dispatcher die Supexec übergebene Funktion aufruft, macht er ein MOVE USP, A7 um den Stack wieder auf den User Stack Pointer zurückzustellen. Nur deshalb funktioniert der Code in SUP_TEST.

Dummerweise steht in keiner (mir bekannten) Dokumentation zu Supexec, dass das XBIOS immer aktiv den Stack-Pointer mit MOVE USP, A7 zurückstellt! Das heißt: Doch, anders als Du glaubst, gibt es auch bei Supexec einen Stack-Wechsel, der nur vom XBIOS-Code wieder rückgängig gemacht wird. Es kann aber TOS-Versionen geben, die den Stack belassen wie er ist und dann findet die Funktion ihre Parameter nicht. => Keine saubere Lösung.
Titel: Re: gcc, GEMDOS Super und Stackzerstörung
Beitrag von: mfro am Fr 19.08.2016, 07:36:38
in der STC 12/90 habe ich nichts entsprechendes gefunden, in 4/88 gibt's dagegen was sehr Ähnliches (ST PASCAL):
http://www.stcarchiv.de/stc1988/04/fonts-unter-st-pascal-plus

Folgt leider (genau wie dein Code auch) der auf dem ST sehr verbreiteten Attitüde "wenn's tut, ist's richtig, egal was in der Dokumentation steht", die Atari arge Probleme bereitet hat (z.B. beim TT oder beim Falcon, wo Vieles, was Usus, aber nicht dokumentiert war, eben nicht mehr tat).

Ein API (das XBIOS ist ein solches) macht Zusicherungen. Und zwar nur genau die, die da stehen, keine anderen.

Aber das werden wir heute nicht mehr richten, dafür ist's schon ein paar Jahrzehnte zu spät.
Titel: Re: gcc, GEMDOS Super und Stackzerstörung
Beitrag von: KarlMüller am Fr 19.08.2016, 08:54:38
in der STC 12/90 habe ich nichts entsprechendes gefunden
Steht, wie er schrieb, ab Seite 79.

Allerdings schreibt der Autor schon das es eine undokumentiere Eigenschaft des Trap-Handler ist, an der er sich orientiert und bis TOS 1.04 so ist. Womit schon fraglich ist ob es mit EmuTOS geht.
Titel: Re: gcc, GEMDOS Super und Stackzerstörung
Beitrag von: ari.tao am Fr 19.08.2016, 14:44:56
Ich kürze das auch mal ab:
Wenn der Client im Zweifel ist, welcher Stack gilt, kann er ja selber den nötigen setzen. Wie schon gesagt, auf ASM-Ebene hätte wohl kaum einer ein Problem damit.
Im übrigen geht die Diskussion jetzt wohl darum, ob man tun darf, was nicht verboten ist, oder nur das, was explizit erlaubt wurde. Im letzteren Fall dürfte man XBIOS_38 wohl gar nicht benutzen...
Man lese das Vorwort im ProfiBuch(10) S.2 .

Folgt leider (genau wie dein Code auch) der auf dem ST sehr verbreiteten Attitüde "wenn's tut, ist's richtig, egal was in der Dokumentation steht"
Gegen diesen Anwurf möchte ich mich strikt verwahren.  Ich folge der vorh. Doku. ProfiBuch(10) S.36 sagt deutlich: "BIOS & XBIOS nehmen ihre Parameter auf dem Stack entgegen". In der Beschreibung zu XBIOS_38 steht nix gegenteiliges.

in der STC 12/90 habe ich nichts entsprechendes gefunden
Steht, wie er schrieb, ab Seite 79.
Sehr bedauerlich, daß das STC-Archiv da offenbar eine Lücke hat.

Zitat
und bis TOS 1.04 so ist. Womit schon fraglich ist ob es mit EmuTOS geht. 
Bis TOS 4.04 funzt es jedenfalls. Bevor wir da weiter im luftleeren Raum diskutieren: Kann vielleichtl jemand SUP_TEST.TOS einfach mal unter EMUTOS, HATARI, MILAN , FIREBEE oder was auch immer laufen lassen und die Ergebnisse mitteilen? Auch wenn ich überzeugt bin, daß es überall laufen müßte, hätte ich doch gern mal den Praxis-Test.
Titel: Re: gcc, GEMDOS Super und Stackzerstörung
Beitrag von: mfro am Fr 19.08.2016, 16:32:31
Im übrigen geht die Diskussion jetzt wohl darum, ob man tun darf, was nicht verboten ist, oder nur das, was explizit erlaubt wurde. Im letzteren Fall dürfte man XBIOS_38 wohl gar nicht benutzen...
Man lese das Vorwort im ProfiBuch(10) S.2 .
Die Bemerkung verstehe ich nicht. Supexec() ist offiziell von Atari dokumentiert (Originaltext s.u.). Bloß deine Art der Anwendung eben nicht.

Folgt leider (genau wie dein Code auch) der auf dem ST sehr verbreiteten Attitüde "wenn's tut, ist's richtig, egal was in der Dokumentation steht"
Gegen diesen Anwurf möchte ich mich strikt verwahren.  Ich folge der vorh. Doku. ProfiBuch(10) S.36 sagt deutlich: "BIOS & XBIOS nehmen ihre Parameter auf dem Stack entgegen". In der Beschreibung zu XBIOS_38 steht nix gegenteiliges.

Soweit so gut. Haben wir nie bestritten. Supexec() (die XBIOS-Funktion) nimmt seinen Parameter (die Adresse der auszuführenden Funktion) auf dem Stack entgegen.

Die originale Atari-Dokumentation (die - wie Vieles, was schriftlich von Atari kam - leider ein wenig schwach ist) sagt übrigens genau das (und nicht mehr):

Zitat
(38)
supexec
VOID supexec(LONG codeptr);

codeptr points to a piece of code, ending in an RTS, that is executed in supervisor  mode. The code cannot perform BIOS or GEMDOS calls. This function is meant to allow programs to hack hardware and protected locations without having to fiddle with GEMDOS get/set supervisor mode call.

Dein Code (der kein Bestandteil des XBIOS ist) setzt aber weiterhin voraus, daß dein vorher noch weiter oben angelegter Stackframe aus deiner Funktion heraus genauso erreichbar ist. Davon steht kein Wort in der Dokumentation. Die Tatsache, daß das funktioniert - davon bringst Du mich nicht ab - ist meiner Ansicht nach reiner Zufall beziehungsweise eine undokumentierte Eigenschaft der Supexec()-Funktion. Womit wir wieder bei "wenn's funktioniert, ist's richtig" wären.

Offensichtlich bist Du nicht der Einzige, der sich darauf verläßt. Ich habe mal im MiNT-Kernel nachgeschaut, wie der das macht. Eigentlich völlig anders, trotzdem baut er einen Stackframe mit evt. vorhandenen (5) Parametern auf, so daß dein "Trick" auch dort funktionieren würde.
Warum gerade 5? Keine Ahnung. Wahrscheinlich, weil die MiNT-Entwickler ein Programm gefunden haben, das sich genauso auf diese undokumentierte Eigenschaft verlassen hat, das sie gerne mit MiNT lauffähig gehabt hätten. Das brauchte halt 5 Parameter. Der Nächste, der mit 6 Parametern daherkommt, guckt in die Röhre.

Die "fünf Parameter-Sache" ist übrigens auch in MiNT undokumentiert (man sollte sich also lieber nicht drauf verlassen) und war mir bislang unbekannt.
Titel: Re: gcc, GEMDOS Super und Stackzerstörung
Beitrag von: ari.tao am Sa 20.08.2016, 04:41:04
Die Bemerkung verstehe ich nicht.
Dann will ich das noch mal anders (und konkreter) formulieren:
   Deine Argumentation:
        Daß der Stack bei XBIOS_38 im Trap erhalten bleibt, darf man nicht
        annehmen, weil das nicht dokumentiert ist.
   Meine Argumentation:
        Würde der Stack bei XBIOS_38 im Trap gewechselt, so müßte das
        in der Doku stehen (ähnlich wie bei GEMDOS_32). Da in der Doku
        nichts dergleichen steht, _muß_ man annehmen, daß der Stack im
        Trap erhalten bleibt.
Welche Argumentation die richtige ist, werde ich mit wiedergefundener Doku weiter unten beweisen.
  Soweit so gut.
Nein, gar nicht gut. Der Nachsatz
... egal was in der Dokumentation steht ...   
sowie die nachfolgenden Zeilen stellen mich in eine Ecke mit Pfuschern, Freibeutern und anderen Halunken, die Atari geschadet haben.
Da bin ich empfindlich.
Zitat
Die originale Atari-Dokumentation ... 
Kannst Du bitte mal genauer zitieren? Das, was Du da gepostet hast über SupExec, scheint mir entweder veraltet oder falsch oder falsch zitiert zu sein. Das ProfiBuch (10) (ich gehe mal davon aus, daß das jeder hat und erspare mir die Abschreiberei) lautet jedenfalls anders. Und das Atari-Compendium, Part_1, p. 4.103 auch. (Ibs. LONG statt VOID!)

So, nun zum hoffentlich endgültig letzten Wort über den Stack in XBIOS_38:
Ich habe die andere der beiden zitierten Literaturen wiedergefunden, nämlich
      Brückmann et al. "Atari ST intern" Data Becker GmbH, Düsseldorf 1985
      ISBN 3-89011-119-X
Das Buch enthält ab S.207 ´Das BIOS Listing´. Da man davon ausgehen darf, daß es sich nicht um eine Raubkopie handelt, gehört das somit zur offiziellen Doku von Atari. Auf S.220 findet man SupExec; es ist ziemlich kurz:

           move.l   4(A7), A0
           jmp        (A0)

Man sieht, daß mit dem gleichen Stack, von dem der Parameter (im ProfiBuch codeptr genannt) geholt wird, direkt in den Client gesprungen wird.
Ist dies nun endlich überzeugend?
-------

Zitat
  ...im MiNT-Kernel nachgeschaut... 
Wo genau bitte?!
Zitat
...auch in MiNT undokumentiert ... 
Die MiNT-Quellen sind doch offen, hast Du ja selber grad gesagt, daß Du ´reingeschaut hast! Das _ist_ doch die Doku, was willst Du noch mehr?!
Titel: Re: gcc, GEMDOS Super und Stackzerstörung
Beitrag von: czietz am Sa 20.08.2016, 08:45:03

           move.l   4(A7), A0
           jmp        (A0)

Man sieht, daß mit dem gleichen Stack, von dem der Parameter (im ProfiBuch codeptr genannt) geholt wird, direkt in den Client gesprungen wird.

Weil dieser Stack ein paar Zeilen darüber mit MOVE.L USP, A7 explizit wiederhergestellt wird...

Zitat
Ist dies nun endlich überzeugend?

Bestätigt ein BIOS-Listing aus dem Jahr 1985 (also vermutlich von TOS 1.00), dass alle anderen TOS-Versionen auch das MOVE.L USP, A7 im XBIOS-Dispatcher haben? Vielleicht haben sie es, vielleicht haben sie es nicht. Ich möchte mich nicht darauf verlassen, ohne in jeder einzelnen TOS-Version nachgesehen zu haben und bleibe daher für die entsprechende Stelle in YAART bei Super() in der mit Parametern aufgerufenen Funktion -- bedanke mich aber dennoch für die interessante Diskussion.

Zitat
Zitat
  ...im MiNT-Kernel nachgeschaut... 
Wo genau bitte?!

Dort wo man es vermuten würde: in xbios.c.
Titel: Re: gcc, GEMDOS Super und Stackzerstörung
Beitrag von: mfro am Sa 20.08.2016, 09:17:30
...
   Deine Argumentation:
        Daß der Stack bei XBIOS_38 im Trap erhalten bleibt, darf man nicht
        annehmen, weil das nicht dokumentiert ist.
...
   Meine Argumentation:
        Würde der Stack bei XBIOS_38 im Trap gewechselt, so müßte das
        in der Doku stehen (ähnlich wie bei GEMDOS_32). Da in der Doku
        nichts dergleichen steht, _muß_ man annehmen, daß der Stack im
        Trap erhalten bleibt.
Ersteres _darf_ man nicht nur deswegen nicht annehmen, weil es nicht dokumentiert ist, sondern sogar _weil_ es dokumentiert ist. Zwar nicht von Atari (die haben nur dokumentiert, daß ein mc68000 drin ist, außen auf der Schachtel) aber von Motorola. Der Prozessor wurde (in bester Absicht und aus gutem Grund) so gebaut, daß er bei einem Trap in den Supervisor Mode schaltet und ab da das Betriebssystem bis zum abschließenden RTE seinen sorgfältig gehüteten eigenen Supervisor-Stack nutzt, um sich nicht auf "schlampige" (oder sogar bösartige) User-Mode Programme (mit möglicherweise verhunztem Stack) verlassen zu müssen.

Zu erwarten, dass ein Betriebssystem diesen ausgeklügelten Mechanismus (der dazu gedacht ist, das OS vor wildgewordenen User-Programmen zu schützen) aushebelt, aufwendig alles wieder rückgängig macht und noch dazu den Stack im Trap (abhängig vom Prozessor und seinem spezifischen Stackframe-Format) so aufbereitet, daß er aussieht, als ob nichts passiert wäre, ist (für mich zumindest) nicht unbedingt naheliegend (und - aus heutiger Sicht - für ein OS m.E. sogar mehr als hanebüchen).

Nichtsdestotrotz macht TOS genau das (ohne es irgendwo zu dokumentieren) und Du verläßt dich drauf.

Anmerkung: MiNT macht's übrigens richtig und schaufelt - wie bereits geschrieben - (wiederum undokumentiert) lediglich aus Kompatibilitätsgründen die genannten fünf Parameter auf seinen eigenen "heiligen" OS-Stack (xbios.c, Zeile 85ff.).

Welche Argumentation die richtige ist, werde ich mit wiedergefundener Doku weiter unten beweisen.

Auf deine (meiner Ansicht nach fragwürdigen) "Beweise" werde ich nicht im einzelnen eingehen. Die (nach meiner Kenntnis nach einzige) offizielle Atari-Dokumentation zu Supexec() habe ich (buchstabengetreu und komplett) gepostet. Sie stammt aus "A Hitchhiker's Guide to the BIOS" (http://dev-docs.atariforge.org/files/BIOS_Guide_11-26-1985.pdf) (ich meine mich darüber hinaus noch an einen gleichlautenden, schlecht kopierten "Fresszettel" im Atari-Developer's Kit zu erinnern, finde den aber gerade nicht). Alles andere ist entweder dort abgeschrieben oder eine mehr (Profibuch) oder weniger (die mit dem roten Einband) professionelle Interpretation des ROM-Inhalts (die Einschätzung der Professionalität ist meine eigene, der muss man nicht unbedingt folgen). Jedenfalls ist das *nicht* die offizielle Dokumentation (die konnte nur von Atari kommen).

Dass bei derart dünner Dokumentation die Interpretationen herhalten mussten, daran ist Atari - zumindest zum Teil - natürlich selbst schuld. Ich will auch das Profibuch ganz bestimmt nicht schlecht machen. Angesichts der außerordentlich knappen Atari-Doku war es toll, daß es "die Bibel" überhaupt gab und die Jungs waren die ersten und einzigen, die zwischen "offiziell dokumentiert" und "aus dem Verhalten interpretiert" unterschieden haben. Nichtsdestotrotz ist es eben *nicht* die offizielle Doku.

Die MiNT-Quellen sind doch offen, hast Du ja selber grad gesagt, daß Du ´reingeschaut hast! Das _ist_ doch die Doku, was willst Du noch mehr?!
Hier zeigt sich m.E. (d)ein grundsätzliches Mißverständnis. Wenn der Quellcode (oder auch das Disassembly) die Dokumentation wäre, könnte man ja nicht einen einzigen Buchstaben mehr dran ändern (es könnte sich ja jemand auf genau den verlassen haben).

Eine API-Dokumentation beschreibt das Interface und so viel vom Verhalten, wie sich nicht mehr ändern wird. Alles andere ist Interpretation.
Titel: Re: Pure C vs. gcc -- Wer ist schneller
Beitrag von: mfro am Sa 20.08.2016, 12:32:12
... Insbesondere braucht diese Schleife mit gcc ca. 40%(!) länger als mit Pure C.

while (p>start_local) {
if ((x = *(--p)) != patt2_local) {
bad = x;
}
*p = patt1_local;
}

Ich hätte ja gedacht, dass ein moderner Compiler gegen einen aus dem vergangenen Jahrtausend meilenweit überlegen ist. Wohl falsch gedacht...

Irgendwie will mir das noch nicht ganz aus dem Kopf. Ich habe den leisen Verdacht, daß das mit pointer aliasing zu tun hat und sich der gcc dadurch in einen Optimierungsversuch versteigt, der letztendlich in schlechterem Code resultiert.

Zitat
gcc -O3 hält den Pointer p in zwei Adressregistern vor, einen zum Lesen und Beschreiben der Speicherstelle und einen zum Vergleich mit start.

Pointer aliasing könnte der Grund dafür sein. p könnte ja schließlich patt2 überlaufen.
Daraufhin habe ich versucht, p als __restrict__ zu definieren, aber "unser" gcc kennt zwar das Schlüsselwort und akzeptiert es, erzeugt aber genau denselben Code (scheint also nichts Rechtes damit anzufangen zu wissen).
Titel: Re: gcc, GEMDOS Super und Stackzerstörung
Beitrag von: 1ST1 am Sa 20.08.2016, 13:05:58
Zur Qualität des Profibuchs: Aus meinem damaligen Umfeld habe ich mitbekommen, dass Reschke und die anderen Autoren des Profibuchs sehr viel mit Herrn H.Müller, Softwareabteilung, Entwicklerbetreuung bei ATARI Raunheim kommuniziert haben, teils auch direkt oder indirekt mit Leuten aus Sunnyvale. Das Profibuch ist sehr fehlerfrei, die Autoren haben viele schwammige, unpräzise Aussagen in den Atari-Dokus mit den Leuten abgeklopft, manches auch erst mit Testprogrammen "festgezurrt" wo es die Atari-Leute selbszt nicht so genau wussten. Diese Leute, auch z.B. der Krohmke (KAOS, Magic), Kowalewsky (bevor er den Job selbst übernahm) gingen in Raunheim ein und aus.

Die Data-Becker Bücher haben allgemein einen nicht so guten Ruf. Aber so schlecht waren sie auch wieder nicht. Das ST-Intern kenne ich nicht (habe aber inzwischen eins im Schrank stehen) aber das 64-Intern, welches als Knüller das 64er ROM-Listing kommentiert drin hatte, das hab ich damals geliebt.

Ich glaube auch nicht, dass ATARI das Verhalten einer so wichtigen Systemfunktion so inkompatibel von TOS 1.00 zu späteren Versionen im Verhalten einfach ändern könnte, das hätte ja eine dokumentierte Inkompatibilität bedeutet, die man nur mit erschwertem Workarround (TOS-Version abfragen, verschiedene Varianten des Systemaufrufs verwenden) hätte umschiffen können. Nein, daran gaube ich nicht. Sowas muss sich unter gleicher Funktionsnummer gleich verhalten, egal unter welcher TOS-Version.
Titel: Re: gcc, GEMDOS Super und Stackzerstörung
Beitrag von: mfro am Sa 20.08.2016, 13:41:03
... das hätte ja eine dokumentierte Inkompatibilität bedeutet ...

Eben nicht. Darum geht's ja hier seitenlang. Die Funktionalität ist *nicht* dokumentiert.
Titel: Re: gcc, GEMDOS Super und Stackzerstörung
Beitrag von: 1ST1 am Sa 20.08.2016, 14:40:04
Haltet euch einfach an das was im Profibuch steht.
Titel: Profibuch immer richtig?
Beitrag von: KarlMüller am Sa 20.08.2016, 19:19:36
Haltet euch einfach an das was im Profibuch steht.
Auch das Profibuch ist nicht an allen Stellen richtig. Es gibt von Julian F. Reschke ein Datei mit Korrekturen und Ergänzung zur 10. und 11. Auflage. Rainer Seitel hat auch soetwas erstellt.
Titel: Re: gcc, GEMDOS Super und Stackzerstörung
Beitrag von: ari.tao am Mo 22.08.2016, 13:17:58
Zitat
... bleibe daher für die entsprechende Stelle in YAART bei Super() ... 
Das ist völlig legitim @czietz , niemand zwingt Dich (und ich schon gar nicht)  8)
-------

Zitat
..., sondern sogar _weil_ es dokumentiert ist. Zwar nicht von Atari ..... aber von Motorola. 
Nee. Das ist ja Dein Fehler, @mfro , daß Du hier die Doku über die Prozessor-Familie zu Hilfe nimmst. Wenn das wahr wäre, dann könnte/dürfte das XBIOS ja nie auf einen anderen Prozessor portiert werden... Ich bin ganz bewußt nicht auf dein Argument vom doppelten Stackwechsel beim TRAPping eingestiegen (Glaubst Du etwa, ich wüßte nicht, wie TRAP funzt?!), sondern verlasse mich in meiner Argumentation nur auf die Atari-Doku.
Der ´Hitchhiker´s Guide´ ist übrigens auch von 1985. Und in meinem Developer´s Kit vom Dez. 1993 (vermutlich eines der letzten, die Atari ausgeliefert hat,) habe ich genau wie Du nix gefunden.
Zitat
  Wenn der Quellcode ... die Dokumentation wäre ...
Wenn nix anderes da ist, dann haben wir eben nur das! Dein Argument, ich würde interpretieren, kehrt sich gegen Dich selbst!
-------

Zitat
Sowas muss sich unter gleicher Funktionsnummer gleich verhalten, egal unter welcher TOS-Version.   
Das, @1ST1 , ist genau auch meine Meinung!
-------

Auch das Profibuch ist nicht an allen Stellen richtig. Es gibt ... Korrekturen ...
Stimmt. Ich habe drei verschiedene KorrekturDateien. Und dennoch gibt´s weitere Fehler. Ich habe oben in Posting #40 dezent auf einen hingewiesen, ausgerechnet in SupExec:
Zitat
Andere XBIOS-Funktionen setzen uU. D0; hier aber darf es der Client! 
Das widerspricht doch dem, was ProfiBuch & Compendium behaupten?
Titel: Re: gcc, GEMDOS Super und Stackzerstörung
Beitrag von: mfro am Mo 22.08.2016, 13:42:06
Ich geb's auf. Mach' wie Du denkst.
Titel: Re: gcc, GEMDOS Super und Stackzerstörung
Beitrag von: ari.tao am Di 23.08.2016, 11:18:28
Ich danke Dir, @mfro , für Deinen hartnäckigen Widerstand. Auf diese Weise ist wohl jedem Mitlesenden deutlich geworden, in welchem Dilemma wir stecken, und erst recht diejenigen, die sich um eine Weiterentwicklung bemühen. Ich habe mir das von Dir zitierte MiNT-Binding mit sehr gemischten Gefühlen angesehen... Was immer sich die Entwickler bei dieser Akrobatik gedacht haben - es ist jedenfalls ein (durch die Umkopiererei) sehr ´langsames´ Binding. Das ´schnellste´ Binding, das ich mal sah (wo war denn das bloß? Mac?  kann´s nicht wiederfinden), war direkt ´im Compiler eingebaut´ (dh. es genügte das .DEF, der .IMP-Teil entfiel), das war ´am nächsten dran´ am Prozessor. Womit wir noch einmal beim Thema Optimierung wären. Ich kann Euch alle nur warnen, um weniger Prozentchen willen großen Aufwand zu treiben - es lohnt sich nicht, wenn dann nach kurzer Zeit der Fortschritt bei der Hardware nicht nur durch so viele Prozente mehr die Anstrengung obsolet macht, sondern auch noch die Portabilität behindert.
Schade, daß niemand bereit war, meiner Bitte aus Posting #44 nachzukommen und SUP_TEST.TOS mal auf alternativen TOSsen laufen zu lassen; so weiß ich nun immer noch nicht genau, ob ich meine Lib an ca. fünf Stellen ändern sollte, oder ob alles so bleiben kann  :-\.
Titel: Re: gcc, GEMDOS Super und Stackzerstörung
Beitrag von: mfro am Di 23.08.2016, 11:43:24
... Ich habe mir das von Dir zitierte MiNT-Binding mit sehr gemischten Gefühlen angesehen... Was immer sich die Entwickler bei dieser Akrobatik gedacht haben - es ist jedenfalls ein (durch die Umkopiererei) sehr ´langsames´ Binding...


Titel: Re: gcc, GEMDOS Super und Stackzerstörung
Beitrag von: ari.tao am Di 23.08.2016, 13:46:13
Zitat
...  kein "Binding", sondern die Implementierung des Einsprungs in eine Betriebssystemfunktion. 
Danke für die Korrektur. Da habe ich wohl nicht genau genug hingeschaut. Mir ist C bis heute immer noch ein Greuel.
Zitat
... Speicherschutz ...   
Ich hatte MiNT genau ein einziges Mal ohne np am Laufen - und habe das dann wieder bleiben lassen: Zu viel Atari-Software, die damit schlecht klarkommt.
Zitat
... ein Workaround für nicht API-konforme Programme ... 
Wo kein API ausformuliert ist, kann man nicht konform sein. Und im Sinne von 1ST1 , siehe oben, sollte man Kontinuität waren, wenn etwa eins neu formuliert wird. Davon gehe ich nicht ab.
Zitat
... trotz "kreativer Überinterpretation" der Dokumentation ... (sorry, aber das konnte ich mir jetzt nicht verkneifen) 
Ja, tatsächlich, Du kneifst gerne. Und weil ich kein Masochist bin, weise ich das zurück. Wenn Du´s nochmal tust, kriegst Du von mir einen neuen Spitznamen verpaßt!  >:D
Titel: Re: Pure C vs. gcc -- Wer ist schneller
Beitrag von: mfro am So 15.07.2018, 16:13:49
Du hast einen schnelleren Rechner als ich  ;). Auf einem 1040ST (original mit 8 MHz) bekomme ich:

gcc -O02579 ticks
gcc -O11424 ticks
gcc -O21155 ticks
gcc -O31048 ticks
gcc -Os994 ticks (schneller als O3, wie bei Dir)
Pure C940 ticks (Gewinner!)

Die -- nicht im Forum gepostete -- Variante mit lokalen statt mit globalen Variablen liefert:

gcc -O02365 ticks
gcc -O1779 ticks
gcc -O2806 ticks (langsamer als O1!)
gcc -O3725 ticks
gcc -Os672 ticks
Pure C672 ticks (gleichauf mit gcc -Os)

Zitat
... da scheint was mit der Optimierung im Argen zu sein ...

Das sehe ich auch so.

Ich hatte heute ein wenig Musse, mit Thorsten Otto's gcc 8.1-Toolchain (@Thorsten Otto an dieser Stelle ein "danke" dafür) rumzuspielen und mich dabei an diesen Thread erinnert.

Siehe da, obwohl sich (wahrscheinlich) kein Entwickler mehr ernsthaft mit dem m68k-Backend beschäftigt, bringen neue Compilerversionen auch für unsere Oldtimer noch die ein oder andere Überraschung mit:

gcc -O2 322 ticks

(wg. Terrasse auf Hatari 2.1 als ST mono 8 MHz; dass das mit rechten Dingen zugeht, habe ich mit dem "alten" Compiler verifiziert - damit komme ich zwar nicht *exakt* auf deine damaligen Werte, aber ziemlich in die Nähe: 724 Ticks).

Der "neue" Compiler erzeugt die inneren Schleifen nur noch aus drei Befehlen:

  188:       30c1            movew %d1,%a0@+
  18a:       b1c0            cmpal %d0,%a0
  18c:       65fa            bcss 188 <movinv+0x2e>
 

Das ist zwar offensichtlich ein ziemlich spezieller Anwendungsfall, aber schön zu sehen, dass auch für uns mit neuen Compilern hin und wieder ein Bröckchen abfällt ;)
Titel: Re: Pure C vs. gcc -- Wer ist schneller
Beitrag von: Thorsten Otto am Mo 16.07.2018, 03:13:47
Siehe da, obwohl sich (wahrscheinlich) kein Entwickler mehr ernsthaft mit dem m68k-Backend beschäftigt, bringen neue Compilerversionen auch für unsere Oldtimer noch die ein oder andere Überraschung mit:

Ja, habe ich auch schon festgestellt. Liegt vermutlich daran, daß ein grossteil der Optimierungen auf einer Ebene gemacht wird, die völlig unabhängig vom m68k-backend ist. Sieht man auch daran, daß mittlerweile die 192k-versionen von EmuTOS damit kompiliert ~500 bytes kleiner sind (nicht dramatisch, aber immerhin).

Gibt aber wohl auch Gegenbeispiele. Zum einen führt die nicht mehr besonders intensiv duchgeführte Pflege von m68k dazu, daß einige Code-Sequenzen die aus dem Optimierer heraus kommen, nicht mehr erkannt werden und verschiedene, m68k-spezifische Optimierungen, dadurch manchmal nicht durchgeführt werden. Zum anderen sind neuere Compiler-Versionen sehr viel empfindlicher geworden was pointer-aliasing angeht, und alte Sourcen, bei denen das ignoriert wurde weil es sowieso keine Rolle spielte, erzeugen dadurch manchmal mittlerweile tatsächlich ungültigen code wenn man die Warnungen ignoriert.
Titel: Re: Pure C vs. gcc -- Wer ist schneller
Beitrag von: mfro am Mo 16.07.2018, 05:27:52
Gibt aber wohl auch Gegenbeispiele. Zum einen führt die nicht mehr besonders intensiv duchgeführte Pflege von m68k dazu, daß einige Code-Sequenzen die aus dem Optimierer heraus kommen, nicht mehr erkannt werden und verschiedene, m68k-spezifische Optimierungen, dadurch manchmal nicht durchgeführt werden.
Hast Du dafür konkrete Beispiele?

Zum anderen sind neuere Compiler-Versionen sehr viel empfindlicher geworden was pointer-aliasing angeht, und alte Sourcen, bei denen das ignoriert wurde weil es sowieso keine Rolle spielte, erzeugen dadurch manchmal mittlerweile tatsächlich ungültigen code wenn man die Warnungen ignoriert.

Das finde ich nicht sooo schlimm. Das eine (agressive Optimierung) geht eben nicht ohne das andere (der Compiler muss davon ausgehen können, dass der Code diesbezüglich "richtig" ist). So funktioniert "modernes C" eben.
Titel: Re: Pure C vs. gcc -- Wer ist schneller
Beitrag von: Thorsten Otto am Mo 16.07.2018, 06:25:31
Hast Du dafür konkrete Beispiele?

Ne, momentan nicht. Bei den ersten Versuchen mit dem neuen Compiler EmuTOS zu übersetzen, war das Ergebnis aber etwas unbefriedigend (unter anderem war da der Code noch ca. 1k grösser als vorher), was ua. an solchen Sachen lag.

Zitat
So funktioniert "modernes C" eben.

Ja, schon klar. Ist aber 'n Problem wenn man versucht damit alte Sourcen zu übersetzen in der Hoffnung damit Geschwindigkeit herauszuholen. Ohne Anpassungen geht das meistens in die Hose.