Fool-DupleX a écrit:
mais c'est normal qu'il gueule sur la libgcc, c'est une librairie de routines natives pour traiter des choses que gcc ne peut pas compiler en inline, par exemple des calculs floating point, une multiplication 64 bits, que sais-je ... par definition, elle n'existe pas encore pour nos Thomson. C'est different encore de la libc, qui contient l'implementation native des fonctions standard style getchar ou printf.
Oui c'est ce que je me suis dit, mais en fait il grogne sur l'absence d'une directory.. A croire qu'un mkdir a été oublié. Surtout que la page web dit qu'on doit bien trouver un libgcc.a au final:
Citation:
The main files installed by GCC are:
* '/usr/local/m6809/bin/gcc,' which is the frontend driver to the compiler
* '/usr/local/libexec/gcc/m6809/version/cc1,' which is the actual compiler
* '/usr/local/libexec/gcc/m6809/version/collect2,' a frontend to the linker
* '/usr/local/lib/gcc/m6809/version/libgcc.a,' a library of helper functions that is used for certain complex expressions that don't translate easily to 6809 instructions.
Bon c'est pas grave. J'ai bien cc1, collect2, le frontend.. C'est tout ce qu'il me fallait pour tester rapidement.
Citation:
Mais il y en a peut-etre une reutilisable dans le patch libc propose sur le meme site ?
Oui peut être... Mais la libc thomson de l'ancien gcc est pas mal remplie.
Citation:
Concernant l'optimisation, t'a essaye en forcant les soft registers ? peut-etre que ca aide ... c'est clair que le -O3 est utile plutot sur les processeurs genre ARM avec des tonnes de registres
Ben ca donne ceci sur le code suivant
Code:
int bit_count(int val) {
char c = 0;
while(val) {val &= val-1; ++c;}
return c;
}
GCC sans optim, int 16bits:
Code:
$ /usr/local/bin/m6809-unknown-none-gcc -S -msoft-reg-count=0 -mint16 -o - t.c
;;; gcc for m6809 : Mar 26 2009 11:32:20 [no tag]
;;; 4.3.1 (gcc6809)
;;; ABI version 1
;;; -mint16
.module t.c
.area .text
.globl _bit_count
_bit_count:
pshs u ;push register set
leas -5,s
leau ,s
stx 2,u
clr 4,u ;movqi: ZERO -> R:4,u
bra L2
L3:
ldd 2,u
addd #-1
ldx 2,u
pshs x ;movhi_push: R:x
anda ,s+ ;andqi: R:a &= ,s+
andb ,s+ ;andqi: R:b &= ,s+
std 2,u
inc 4,u ;addqi: 4,u ++
L2:
ldx 2,u
cmpx #0
bne L3
ldb 4,u ;movqi: 4,u -> R:b
clra ;zero_extendqihi: R:b -> R:d
std ,u
ldx ,u
leas 5,s
puls u,pc ;pop register set
;return is in puls
Idem en -O:
Code:
$ /usr/local/bin/m6809-unknown-none-gcc -S -msoft-reg-count=0 -mint16 -o - t.c -O
(..cut..)
_bit_count:
pshs u ;push register set
leas -1,s
tfr x,d
cmpx #0
bne L2
clr ,s ;movqi: ZERO -> R:,s
bra L3
L2: clr ,s ;movqi: ZERO -> R:,s
L4: ldu #-1
leax d,u
pshs x ;movhi_push: R:x
anda ,s+ ;andqi: R:a &= ,s+
andb ,s+ ;andqi: R:b &= ,s+
inc ,s ;addqi: ,s ++
cmpd #0
bne L4
L3: ldb ,s ;movqi: ,s -> R:b
clra ;zero_extendqihi: R:b -> R:d
tfr d,x
leas 1,s
puls u,pc ;pop register set
;return is in puls
En -O3 (le c*n! il bouffe une place de plus sur la pile):
Code:
$ /usr/local/bin/m6809-unknown-none-gcc -S -msoft-reg-count=0 -mint16 -o - t.c -O3
_bit_count:
pshs u ;push register set
leas -3,s
tfr x,d
cmpx #0
beq L8
clr 2,s ;movqi: ZERO -> R:2,s
L4: ldu #-1
leax d,u
pshs x ;movhi_push: R:x
anda ,s+ ;andqi: R:a &= ,s+
andb ,s+ ;andqi: R:b &= ,s+
inc 2,s ;addqi: 2,s ++
cmpd #0
bne L4
ldb 2,s ;movqi: 2,s -> R:b
clra ;zero_extendqihi: R:b -> R:d
std ,s
tfr d,x
L3: leas 3,s
puls u,pc ;pop register set
;return is in puls
L8: ldx #0
stx ,s
bra L3
Avec les soft-registers sans -O ca ne change rien, mais avec ca donne:
Code:
$ /usr/local/bin/m6809-unknown-none-gcc -S -msoft-reg-count=4 -mint16 -o - t.c -O
_bit_count:
pshs u ;push register set
tfr x,d
cmpx #0
bne L2
clr *m1 ;movqi: ZERO -> R:*m1
bra L3
L2: clr *m1 ;movqi: ZERO -> R:*m1
L4: ldu #-1
leax d,u
pshs x ;movhi_push: R:x
anda ,s+ ;andqi: R:a &= ,s+
andb ,s+ ;andqi: R:b &= ,s+
inc *m1 ;addqi: *m1 ++
cmpd #0
bne L4
L3: ldb *m1 ;movqi: *m1 -> R:b
clra ;zero_extendqihi: R:b -> R:d
tfr d,x
puls u,pc ;pop register set
;return is in puls
et en optim -O3:
Code:
$ /usr/local/bin/m6809-unknown-none-gcc -S -msoft-reg-count=4 -mint16 -o - t.c -O3
_bit_count:
pshs u ;push register set
tfr x,d
cmpx #0
beq L8
clr *m1 ;movqi: ZERO -> R:*m1
L4:
ldu #-1
leax d,u
pshs x ;movhi_push: R:x
anda ,s+ ;andqi: R:a &= ,s+
andb ,s+ ;andqi: R:b &= ,s+
inc *m1 ;addqi: *m1 ++
cmpd #0
bne L4
ldb *m1 ;movqi: *m1 -> R:b
clra ;zero_extendqihi: R:b -> R:d
std *m1
L3: ldx *m1
puls u,pc ;pop register set
;return is in puls
L8: ldd #0
std *m1
bra L3
Je le trouve pas top en -O3, même avec les soft-regs.. mais peut être que sur du vrai code interressant ca change des trucs.
Par ailleurs l'auteur du portager gcc4 dit qu'en fait il vaut mieux considérer le 6809 comme un 8 bit (donc sizeeof(int)==1) ce qui limite les problemes de "no spilled registers" lié aux expressions arithmétiques sur 16 bits qui bloquent D. En tout cas, avec -mint8 (entier 8bits), les soft regs changent pas mal de trucs: on empiette plus sur la pile mais on passe par un addressage direct-page bien plus efficace:
Code:
$ /usr/local/bin/m6809-unknown-none-gcc -S -msoft-reg-count=0 -mint8 -o - t.c -O
_bit_count:
leas -2,s
stb ,s ;movqi: R:b -> ,s
bne L2
clr 1,s ;movqi: ZERO -> R:1,s
bra L3
L2: clr 1,s ;movqi: ZERO -> R:1,s
L4: ldb ,s ;movqi: ,s -> R:b
decb ;addqi: R:b --
andb ,s ;andqi: R:b &= ,s
stb ,s ;movqi: R:b -> ,s
inc 1,s ;addqi: 1,s ++
tstb
bne L4
L3: ldb 1,s ;movqi: 1,s -> R:b
leas 2,s
rts
vs
Code:
$ /usr/local/bin/m6809-unknown-none-gcc -S -msoft-reg-count=4 -mint8 -o - t.c -O
_bit_count:
stb *m3 ;movqi: R:b -> *m3
tstb
bne L2
clr *m2 ;movqi: ZERO -> R:*m2
bra L3
L2: clr *m2 ;movqi: ZERO -> R:*m2
L4: ldb *m3 ;movqi: *m3 -> R:b
decb ;addqi: R:b --
stb *m1 ;movqi: R:b -> *m1
ldb *m3 ;movqi: *m3 -> R:b
andb *m1 ;andqi: R:b &= *m1
stb *m3 ;movqi: R:b -> *m3
inc *m2 ;addqi: *m2 ++
tstb
bne L4
L3: ldb *m2 ;movqi: *m2 -> R:b
rts
Bon dans tous les cas on se rend compte qu'il n'utilise pas assez le registre A ou qu'il manque une passe de peephole pour virer un "tstb" juste après un "stb *m3" ou de réorganiser les opcodes pour qu'un "stx Memoire.. trucs sans X...cmpx #O; bne label" devienne "..trucs sans X.. stx Memoire; bne label". Le codage à la main est quand même meilleurs là dessus.
Sinon question optim je trouve que "-O" avec des soft-regs est pas completement mauvais.