satz@CISCO.COM (01/04/89)
gcc 1.32 on a Sun 3/280 running SunOS 3.5 manages to botch the extraction of an unsigned short from an unsigned integer that is passed into a function. this occurs whether you use the new style function prototype declartion syntax or not. long test (arg) unsigned int arg; { unsigned short code; code = arg; switch (code) { case 0x0800: return(1); case 0x0806: return(2); case 0x0200: return(3); case 0x0201: return(4); case 0x8035: return(5); case 0x0804: return(6); case 0x6003: return(7); case 0x9000: return(8); case 0x0600: return(9); case 0x8038: return(10); default: return(-1); case 0: return(-2); } } main() { printf("result = %d\n",test(0x9000)); } The resulting output should be 8 but is -2. Note that the compiler generated longword tests when it wasn't told to cast the variable in the switch statement. Generated code: #NO_APP gcc_compiled.: .text .even .globl _test _test: link a6,#0 clrl d0 movew a6@(8),d0 #shouldn't this be a6@(10)? cmpl #2052,d0 jeq L8 jgt L16 cmpl #513,d0 jeq L6 jgt L17 tstl d0 jeq L14 cmpl #512,d0 jeq L5 jra L13 L17: cmpl #1536,d0 jeq L11 cmpl #2048,d0 jeq L3 jra L13 L16: cmpl #32821,d0 jeq L7 jgt L18 cmpl #2054,d0 jeq L4 cmpl #24579,d0 jeq L9 jra L13 L18: cmpl #32824,d0 jeq L12 cmpl #36864,d0 jeq L10 jra L13 L3: moveq #1,d0 jra L1 L4: moveq #2,d0 jra L1 L5: moveq #3,d0 jra L1 L6: moveq #4,d0 jra L1 L7: moveq #5,d0 jra L1 L8: moveq #6,d0 jra L1 L9: moveq #7,d0 jra L1 L10: moveq #8,d0 jra L1 L11: moveq #9,d0 jra L1 L12: moveq #10,d0 jra L1 L13: moveq #-1,d0 jra L1 L14: moveq #-2,d0 L1: unlk a6 rts LC0: .ascii "result = %d\12\0" .even .globl _main _main: link a6,#0 movel #36864,sp@- jbsr _test movel d0,sp@- pea LC0 jbsr _printf unlk a6 rts