kategorie: ANSI C, C++
[#1] Cross-compiler C/C++ dla m68k-amigaos i ppc-amigaos.
W repozytorium https://github.com/cahirwpz/m68k-amigaos-toolchain pojawił się nowy skrypt build-ppc.py służący do budowania kompilatora skrośnego dla platformy ppc-amigaos (AmigaOS 4.x). Przetestowałem go na Ubuntu 14.04 LTS (32-bit / 64-bit), MacOSX 10.9 i Cygwin (Win7). Oczywiście jak zwykle nie wychwycę wszystkich błędów - jeśli ktoś chce mi pomóc - będę wdzięczny za testowanie i nadsyłanie łatek.

Oprócz tego od dłuższego czasu jest tam skrypt do budowania kompilatora skrośnego dla AmigaOS na m68k. Jest już całkiem nieźle przetestowany - używałem go do robienia "We Can Code Again", "Sunglasses at Night" i "Sushi Boyz".
[#2] Re: Cross-compiler C/C++ dla m68k-amigaos i ppc-amigaos.

@cahir, post #1

Przydałby się gcc dla m68k i wos/pup w wersji 3.4.
[#3] Re: Cross-compiler C/C++ dla m68k-amigaos i ppc-amigaos.

@Artur Jarosik, post #2

WOS/PUP to bardzo niszowe konfiguracje w świecie Amigi. Przykro mi, ale nie zamierzam ich w ogóle wspierać.

Jeśli chodzi o GCC 3.4.x to też szkoda czasu - lepiej poświęcić go na prace nad GCC 4.9 i w miarę świeżym GNU binutils.

Ostatnia aktualizacja: 23.08.2015 16:02:17 przez cahir
[#4] Re: Cross-compiler C/C++ dla m68k-amigaos i ppc-amigaos.

@cahir, post #3

WOS/PUP to bardzo niszowe konfiguracje w świecie Amigi. Przykro mi, ale nie zamierzam ich w ogóle wspierać.


Niszowa!? Tai, tak jak cały nasz amigowy świat ok, racja
Echh- szkoda
[#5] Re: Cross-compiler C/C++ dla m68k-amigaos i ppc-amigaos.

@BULI, post #4

Niszowa!? Tai, tak jak cały nasz amigowy świat

Cóż... statystyki aminet.net i produkcje ukazujące się na pouet.net mówią same za siebie. WOS/PUP są już faktycznie martwe. Większość ludzi robi na AmigaOS 4.x lub MorphOS... i trudno się dziwić.
[#6] Re: Cross-compiler C/C++ dla m68k-amigaos i ppc-amigaos.

@cahir, post #5

Jeśli ktoś potrzebuje WOS albo PUPa to cały czas vbcc ma dla nich wsparcie. Przygotowanie środowiska do cross-kompilacji pod WOS czy PUP nie różni się prawie wcale od OS3 68k. Róznica jest tylko taka że instaluje się inny target...
[#7] Re: Cross-compiler C/C++ dla m68k-amigaos i ppc-amigaos.

@strim_, post #6

Mój toolchain jest oparty o GCC i GNU Binutils. VBCC jest jakoby na dokładkę. Optymalizacje VBCC pozostawiają dużo do życzenia. Ujmę to wprost - są na bardzo słabym poziomie - sporo gorszym niż GCC czy SAS/C - Kiero/Elude może potwierdzić.

BTW. W trakcie zabaw z GCC 4.9 dla targetu m68k-elf wyszło, że przy kompilowaniu kodu dla procesorów ColdFire, kompilator generuje świetny kod dla 68060 (a przynajmniej Kiero był bardzo pozytywnie zaskoczony).

Ostatnia aktualizacja: 24.08.2015 21:20:05 przez cahir
[#8] Re: Cross-compiler C/C++ dla m68k-amigaos i ppc-amigaos.

@cahir, post #7

Troche offtopowo.

Czy to oznacza, że GCC 4.9 nie używa rozkazów które tylko są dla procesora ColdFire (takich jak mov3q i inne takie ) a których nie ma w mc680x0 ? I jak rozumiem to kompilowanie było dla procka w wersji 4.

A propos optymalizacji to jak pamiętam CodeWarrior dobrze sobie radził.
[#9] Re: Cross-compiler C/C++ dla m68k-amigaos i ppc-amigaos.

@asman, post #8

Używało rozkazów specyficznych dla coldfire ale to był tylko eksperyment. Chodzi ogólnie o to, że przy kompilacji dla 060 nie jest robiona optymalizacja dla 2 potoków. Chcieliśmy po prostu zobaczyć jak to wygląda w przypadku coldfire.
[#10] Re: Cross-compiler C/C++ dla m68k-amigaos i ppc-amigaos.

@cahir, post #7

Witam.
Nie znam sie jeszcze na programowaniu, ale zauważyłem ze prędkość działania dema massive/skarla nie jest dużo większa na 060@66 w stos. do 040@40.
Życzę megaudanych optymalizacji i czekam na nowa falę "produkcji".
Pozdr
[#11] Re: Cross-compiler C/C++ dla m68k-amigaos i ppc-amigaos.

@asman, post #8

Czy to oznacza, że GCC 4.9 nie używa rozkazów które tylko są dla procesora ColdFire (takich jak mov3q i inne takie ) a których nie ma w mc680x0 ?

Nie, ale wygląda na to, że da się go nauczyć:

https://github.com/gcc-mirror/gcc/blob/master/gcc/config/m68k/m68k.c#L644

Pod powyższym odnośnikiem znajduje się kawałek kodu, który wybiera planistę instrukcji (ang. instruction scheduler) dla konkretnego procesora m68k. Trzeba by było zrobić eksperyment i spróbować włączyć jeden z nich dla 68060.

A propos optymalizacji to jak pamiętam CodeWarrior dobrze sobie radził.

A wiesz jak wejść w posiadanie kopii - niekoniecznie drogą kupna?
[#12] Re: Cross-compiler C/C++ dla m68k-amigaos i ppc-amigaos.

@cahir, post #11

A wiesz jak wejść w posiadanie kopii - niekoniecznie drogą kupna?
Ja to robiłem w ten sposób, że instalowałem Basilisk II na Windows a CodeWarrior znajdziesz w ogrodzie macintosha, ostatnia wersja wspierająca linie 68k to 6.
[#13] Re: Cross-compiler C/C++ dla m68k-amigaos i ppc-amigaos.

@kiero, post #9

Używało rozkazów specyficznych dla coldfire ale to był tylko eksperyment. Chodzi ogólnie o to, że przy kompilacji dla 060 nie jest robiona optymalizacja dla 2 potoków. Chcieliśmy po prostu zobaczyć jak to wygląda w przypadku coldfire.

@kiero: Jak masz czas przetestuj następujący eksperyment: W linii https://github.com/gcc-mirror/gcc/blob/master/gcc/config/m68k/m68k.c#L651 zastąp (TUNE_CFV4) przy pomocy (TUNE_CFV4 || TUNE_68060).

Jak na moje oko scheduling się włączył i działa całkiem nieźle:

Porównanie na funkcji crc32.


Skrypt do budowania najnowszego GCC dla m68k-elf jest w moim repo: https://github.com/cahirwpz/m68k-amigaos-toolchain/blob/master/toolchain-dev

Ostatnia aktualizacja: 26.08.2015 18:56:27 przez cahir
[#14] Re: Cross-compiler C/C++ dla m68k-amigaos i ppc-amigaos.

@cahir, post #13

Nastąpiły drobne zmiany w organizacji repozytorium z budowaczką kompilatora, poniżej nowy link:

AmigaOS cross compiler for Linux / MacOSX / Windows

Skypty do budowania toolchainów nazywają się odpowiednio toolchain-m68k i toolchain-ppc.

BTW. Widzę, że urwało link do porównania kodu z poprzedniego posta - zamieszczam poprawkę: https://www.dropbox.com/s/yuv7ltl3yjkmqjm/Zrzut%20ekranu%20z%202015-08-26%2018-45-07.png.
[#15] Re: Cross-compiler C/C++ dla m68k-amigaos i ppc-amigaos.

@cahir, post #13

Heja, bylem na wakacjach wiec nic nie kompilowalem;)

Pewnie jakow po RW bede mial troche czasu zeby powalczyc. Zobaczymy wtedy co i jak.
[#16] Re: Cross-compiler C/C++ dla m68k-amigaos i ppc-amigaos.

@kiero, post #15

A ma ktoś skompilowaną wersję dla leniwych na Win? Ewentualnie na AmigaOS?
[#17] Re: Cross-compiler C/C++ dla m68k-amigaos i ppc-amigaos.

@cahir, post #3

Na OS4/MOS to chyba nigdy nie wyszło demo specjalnie dla klasyka?
[#18] Re: Cross-compiler C/C++ dla m68k-amigaos i ppc-amigaos.

@sanjyuubi, post #16

A ma ktoś skompilowaną wersję dla leniwych na Win?

Nie ma - jest zbyt dużo problemów z przygotowaniem binarnych paczek tak by działały na każdej wersji danego systemu. Z drugiej strony na moim (już leciwym) MacBooku budowanie trwa około 8 minut.
Ewentualnie na AmigaOS?

Niestety to jest kompilator skrośny i nie ma możliwości skompilowania go na AmigaOS.
[#19] Re: Cross-compiler C/C++ dla m68k-amigaos i ppc-amigaos.

@cahir, post #1

Nastąpiło trochę zmian. Przede wszystkim ze skryptem do budowania kompilatora została zintegrowana funkcjonalność instalowania dodatkowych SDK. Po wywołaniu polecenia np. toolchain-m68k install-sdk mui będziemy mogli się cieszyć poinstalowanymi plikami (tj. nagłówkowymi, bibliotekami, itd.) w odpowiednich katalogach kompilatora. W tej chwili w repo są następujące SDK:

  • ahi 6.0 : retargetable audio library
  • cgx 4.2 : CyberGraphX retargetable graphics system
  • guigfx 20.0 : Application layer for pixel graphics
  • mcc_betterstring 11.29 : BetterString custom class for MUI
  • mcc_nlist 0.120 : NList custom classes for MUI
  • mcc_texteditor 15.46 : TextEditor custom class for MUI
  • mcc_thebar 26.16 : Next Generation Toolbar MUI Custom Class
  • mmu 43.11 : m68k MMU control library
  • mui 3.8 : Magic User Interface
  • pccard 1.1 : Library to parse PC Card information
  • render 40.8 : Image processing kernel
  • warp3d 4.0 : Driver system for 3D hardware on the Amiga

Oprócz tego w katalogu examples można znaleźć przykładowe programy oraz plik Makefile z odpowiednimi opcjami dla kompilatora. Kompilator jest też w stanie kompilować amigowe biblioteki oraz urządzenia (przykład również w katalogu examples).
[#20] Re: Cross-compiler C/C++ dla m68k-amigaos i ppc-amigaos.

@cahir, post #19

A jak tam wersja 4.8 ? Faktycznie jest szybsza ?
[#21] Re: Cross-compiler C/C++ dla m68k-amigaos i ppc-amigaos.

@Artur Jarosik, post #20

A jak tam wersja 4.8 ? Faktycznie jest szybsza ?

Może najpierw kilka wyjaśnień. Wersja deweloperska gcc ma wersję 6.0 i to na niej przeprowadzamy eksperymenty (jak idzie Kiero?). Wstępne oględziny kodu wygenerowanego przez gcc 6.0 dla 68060 wskazują na to, że różnica w wydajności kodu będzie warta tego by się tym zająć na poważnie.

Co do samego pytania... to jest błędnie zadane. Gdybym miał odpowiedzieć "czy wersja 4.8 jest szybsza?" to odpowiedziałbym "nie". Każda nowsza wersja kompilatora używa bardziej złożonych metod optymalizacji w związku z tym jest wolniejsza.

Co do stwierdzenia czy wygenerowany kod jest szybszy - no cóż - trzeba by mieć zestaw benchmarków, zbierać i porównywać wyniki. Przez benchmarki mam na myśli źródła kilku programów dobrze obciążających procesor. Każdy z tych programów musi być o innej specyfice obliczeń (np. obliczenia na obrazkach, dźwięku, bazie danych, tekście, kompilacja, kompresja danych itd.).

Z reguły jest tak, że kolejna wersja kompilatora dla niektórych programów generuje szybszy kod, dla niektórych wolniejszy, ale dla innych nie widać różnicy. Pomnóż to przez ilość procesorów z serii m68k dla których chcielibyśmy to mierzyć - co najmniej 68000, 68020, 68020+fpu i 68060 - i okazuje się, że to całkiem skompilkowane odpowiedzieć na pytanie "czy nowsza wersja kompilatora generuje szybszy kod".
[#22] Re: Cross-compiler C/C++ dla m68k-amigaos i ppc-amigaos.

@cahir, post #21

kolejna wersja kompilatora dla niektórych programów generuje szybszy kod, dla niektórych wolniejszy, ale dla innych nie widać różnic


Dokładnie tak, pytanie dotyczy więc konfiguracji docelowej dla danej produkcji, mnie interesuje "najbardziej popularny" konfig dla amigowych dem, czyli optymalizacja dla 060.
[#23] Re: Cross-compiler C/C++ dla m68k-amigaos i ppc-amigaos.

@cahir, post #21

Jeżeli ktoś programuje obiektowo, a w szczególności używa kontenerów stl i różnorakiego rodzaju operacji gdzie budowane są obiekty tymczasowe, wygenerowany kod z gcc 4.8 powinien być szybszy niż z archaicznego chyba 2.8 z Amigi. Gdyż 4.8 używa standardu C++11, gdzie można wykryć l-value i r-value, przez co zamiast kopiować wew. obiekty, można wykorzystać obiekt tymczasowy. Przy dużych obiektach, zawierających wiele obiektów, przyspieszenie będzie bardzo duże.
Ale jak ktoś programował coś na Ami, to przeważnie nie robił takich rzeczy, więc wprowadzenie C++11 nie da nic, tylko inne opcje optymalizacji mogą przyspieszyć wykonywanie programu.
[#24] Re: Cross-compiler C/C++ dla m68k-amigaos i ppc-amigaos.

@BULI, post #22

Dokładnie tak, pytanie dotyczy więc konfiguracji docelowej dla danej produkcji, mnie interesuje "najbardziej popularny" konfig dla amigowych dem, czyli optymalizacja dla 060.

Proszę bardzo. Zainstaluj kompilatory GCC, VBCC i SAS/C, a następnie skompiluj następujący benchmark. Po czym odpal 3 wersje binarek na amidze z 68060@50 i podziel się z nami wynikami.
[#25] Re: Cross-compiler C/C++ dla m68k-amigaos i ppc-amigaos.

@cahir, post #1

Mały update... wraz z toolchainem instaluje się również IRA - disasembler dla M680x0 / FPU / MMU. Zapraszam do testowania.
[#26] Re: Cross-compiler C/C++ dla m68k-amigaos i ppc-amigaos.

@cahir, post #24

Kusisz- dopisuję do listy "Do zrobienia", jest tego trochę, więc prędko się nie pochwalę wynikami
[#27] Re: Cross-compiler C/C++ dla m68k-amigaos i ppc-amigaos.

@cahir, post #18

OK. Pytam się, bo z kompilowaniem kompilatorów mam małe doświadczenie, tak jak z programowaniem ogólnie, zastanawiam się na czym to skompilować na Win, czy może taki code:blocks się nada?


VBCC też jest kompilatorem skrośnym, a na AOS też jest.
[#28] Re: Cross-compiler C/C++ dla m68k-amigaos i ppc-amigaos.

@sanjyuubi, post #27

z kompilowaniem kompilatorów mam małe doświadczenie, tak jak z programowaniem ogólnie, zastanawiam się na czym to skompilować na Win

Aby zbudować mój toolchain pod windowsem musisz zainstalować cygwin. Potem należy doinstalować kilka pakietów, ściągnąć moje repo i odpalić z niego skrypt, co jest opisane tutaj. Cały proces będzie dokładnie opisany niebawem na łamach któregoś z polskojęzycznych amigowych czasopism.

Na co dzień nie korzystam z windowsa w ogóle (obrzydzenie zostało mi z czasów świetności Amigi) więc głównie dbam o prawidłowe działanie toolchaina pod Linuksem i MacOSX.

VBCC też jest kompilatorem skrośnym, a na AOS też jest.

Ok. Źle się wyraziłem. Chodzi o to, że gcc z mojego toolchaina nie wspiera możliwości budowania go pod AmigaOS. W takim sensie jest kompilatorem czysto skrośnym.
[#29] Re: Cross-compiler C/C++ dla m68k-amigaos i ppc-amigaos.

@cahir, post #1

Oczywiście jak zwykle nie wychwycę wszystkich błędów - jeśli ktoś chce mi pomóc - będę wdzięczny za testowanie i nadsyłanie łatek.


Generalnie super robota. Dzięki. Zainstalowałem na macbooku z najnowszą wersją systemu 10.12.2 bez najmniejszego problemu. Jedyna trudność pojawiła się gdy chciałem skompilować kod C++ przy pomocy m68k-amigaos-g++. Dostałem serię błędów "badly punctuated parameter list in `#define'" w plikach nagłówkowych NDK. Okazało się, że składnia tych plików jest zgodna z gcc 3.x.x, a wersja 2.x.x ma z nimi problem. Obejście problemu polega na modyfikacji plików w następujący sposób (przykład) :

oryginalny fragment:

#ifndef NO_INLINE_VARARGS
#define EasyRequest(___window, ___easyStruct, ___idcmpPtr, ...) \
     ({_sfdc_vararg _args[] = { __VA_ARGS__ }; EasyRequestArgs((___window), (___easyStruct), (___idcmpPtr), (const APTR) _args); })
#endif /* !NO_INLINE_VARARGS */


zamieniamy na:

#ifndef NO_INLINE_VARARGS
#define EasyRequest(___window, ___easyStruct, ___idcmpPtr, ARGS...) \
     ({_sfdc_vararg _args[] = { ##ARGS }; EasyRequestArgs((___window), (___easyStruct), (___idcmpPtr), (const APTR) _args); })
#endif /* !NO_INLINE_VARARGS */


czyli zmiana polega na zastąpieniu:
"..." => "ARGS..."
"__VA_ARGS__" => "##ARGS".


Ostatnia aktualizacja: 25.01.2017 15:05:31 przez g0trek
[#30] Re: Cross-compiler C/C++ dla m68k-amigaos i ppc-amigaos.

@cahir, post #7

Optymalizacje VBCC pozostawiają dużo do życzenia. Ujmę to wprost - są na bardzo słabym poziomie - sporo gorszym niż GCC czy SAS/C - Kiero/Elude może potwierdzić.


Przedmówca pisał o vbcc dla WOS i PUP, czyli o wersji dla PPC benchmarki http://sun.hasenbraten.de/vbcc/index.php?view=benchmarks
Na stronie www.PPA.pl, podobnie jak na wielu innych stronach internetowych, wykorzystywane są tzw. cookies (ciasteczka). Służą ona m.in. do tego, aby zalogować się na swoje konto, czy brać udział w ankietach. Ze względu na nowe regulacje prawne jesteśmy zobowiązani do poinformowania Cię o tym w wyraźniejszy niż dotychczas sposób. Dalsze korzystanie z naszej strony bez zmiany ustawień przeglądarki internetowej będzie oznaczać, że zgadzasz się na ich wykorzystywanie.
OK, rozumiem