Hello,
I think that I detected a bug in the gcc mmix port.
If the example program 'jmpbug.c' (please see attachment) is compiled
with default options, it works; if it is compiled with '-O2' or '-O3'
option, it does not work (because jmp_buf is damaged):
C:\temp\bug>mmix-gcc -save-temps jmpbug.c
C:\temp\bug>mmix a.out
j = 0; 6000000000000000
j = 1; 0000000000000268
j = 2; 5FFFFFFFFFFFFFC0
j = 3; 6000000000000008
j = 4; 0000000000000000
C:\temp\bug>mv jmpbug.s nobug.s
C:\temp\bug>mmix-gcc -O2 -save-temps jmpbug.c
C:\temp\bug>mmix a.out
j = 0; 0000000000000000
j = 1; 0000000000000254
j = 2; 5FFFFFFFFFFFFFD0
j = 3; 6000000000000008
j = 4; 0000000000000000
1. 5fffffffffffffd8: 00000000 (TRAP) privileged instruction!
9744 instructions, 1850 mems, 11416 oops; 904 good guesses, 566 bad
(halted at location #5fffffffffffffd8)
I am using cygwin-1.5.25-15. To build the mmix gcc port I used
binutils-2.19, gcc-4.4.0, gmp-4.3.1, mpfr-2.4.1, and newlib-1.17.0.
There is also attached mmixal code produced by gcc for a working
version (nobug.s) and a version that does not work (jmpbug.s).
Thank you,
Andrew Makhorin
#include <setjmp.h>
#include <stdio.h>
#include <stdlib.h>
int main(void)
{ jmp_buf jb;
int j;
if (setjmp(jb)) return 0;
for (j = 0; j <= 4; j++)
printf("j = %d; %016lX\n", j, jb[j]);
longjmp(jb, 3);
return 123;
}
# 1 "jmpbug.c"
! mmixal:= 8H LOC Data_Section
.text ! mmixal:= 9H LOC 8B
.section .rodata
.p2align 2
LOC @+(4-@)&3
LC:0 IS @
BYTE "j = %d; %016lX",#a,#0
.text ! mmixal:= 9H LOC 8B
.p2align 2
LOC @+(4-@)&3
.global main
main IS @
SUBU $254,$254,64
STOU $253,$254,56
ADDU $253,$254,64
GET $1,rJ
SUBU $0,$253,64
STOU $1,$0,0
SUBU $0,$253,56
SET $3,$0
PUSHJ $2,setjmp
SUBU $0,$253,64
LDO $0,$0,0
PUT rJ,$0
SET $0,$2
SLU $0,$0,32
SR $0,$0,32
CMP $0,$0,0
BZ $0,L:2
SETL $0,0
LDO $253,$254,56
ADDU $254,$254,64
POP 1,0
L:2 IS @
SUBU $0,$253,12
SETL $1,0
STTU $1,$0,0
JMP L:3
L:4 IS @
SUBU $0,$253,12
LDT $0,$0,0
SUBU $1,$253,56
SLU $0,$0,32
SR $0,$0,32
SLU $0,$0,3
ADDU $0,$1,$0
LDO $1,$0,0
SUBU $0,$253,12
LDT $0,$0,0
SLU $0,$0,32
SR $0,$0,32
GETA $3,LC:0
SET $4,$0
SET $5,$1
PUSHJ $2,printf
SUBU $0,$253,64
LDO $0,$0,0
PUT rJ,$0
SUBU $0,$253,12
SUBU $1,$253,12
LDT $1,$1,0
ADDU $1,$1,1
STTU $1,$0,0
L:3 IS @
SUBU $0,$253,12
LDT $0,$0,0
SLU $0,$0,32
SR $0,$0,32
CMP $0,$0,4
BNP $0,L:4
SUBU $0,$253,56
SET $3,$0
SETL $4,#3
PUSHJ $2,longjmp
.data ! mmixal:= 8H LOC 9B
# 1 "jmpbug.c"
! mmixal:= 8H LOC Data_Section
.text ! mmixal:= 9H LOC 8B
.section .rodata
.p2align 2
LOC @+(4-@)&3
LC:0 IS @
BYTE "j = %d; %016lX",#a,#0
.text ! mmixal:= 9H LOC 8B
.p2align 2
LOC @+(4-@)&3
.global main
main IS @
SUBU $254,$254,48
GET $0,rJ
ADDU $3,$254,8
PUSHJ $2,setjmp
PUT rJ,$0
SLU $2,$2,32
SR $2,$2,32
BZ $2,L:5
SETL $0,0
ADDU $254,$254,48
POP 1,0
L:5 IS @
ADDU $0,$254,8
GETA $1,printf
GETA $3,LC:0
SET $4,$2
LDO $5,$0,0
PUSHGO $2,$1,0
GETA $3,LC:0
SETL $4,#1
LDO $5,$0,8
PUSHGO $2,$1,0
GETA $3,LC:0
SETL $4,#2
LDO $5,$0,16
PUSHGO $2,$1,0
GETA $3,LC:0
SETL $4,#3
LDO $5,$0,24
PUSHGO $2,$1,0
GETA $3,LC:0
SETL $4,#4
LDO $5,$0,32
PUSHGO $2,$1,0
SET $3,$0
SETL $4,#3
PUSHJ $2,longjmp
.data ! mmixal:= 8H LOC 9B