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

Reply via email to