Hi! Maybe this bug can interest you: when using byte swaping in le16_to_cpu for example, mips gcc 2.95.2 and 2.91.66 sometime do not generate correct code : the u16 to u32 convertion is missing. I found this bug while compiling drivers/mtd/ftl.c in build_maps(). Here is a sample source to reproduce the bug: typedef unsigned short __u16; extern __inline__ __const__ __u16 le16_to_cpu(__u16 x) { return ((__u16)( \ (((__u16)(x) & (__u16)0x00ffU) << 8) | \ (((__u16)(x) & (__u16)0xff00U) >> 8) )); } int test(int xtrans, int xvalid, __u16 *ptr) { if ((xvalid+xtrans != le16_to_cpu(*ptr))) { return -1; } return 0; } The generated asm is : test: .frame $sp,0,$31 # vars= 0, regs= 0/0, args= 0, extra= 0 .mask 0x00000000,0 .fmask 0x00000000,0 .set noreorder .cpload $25 .set reorder lhu $3,0($7) addu $5,$6,$5 sll $4,$3,8 srl $3,$3,8 or $4,$4,$3 .set noreorder .set nomacro bne $5,$4,$L7 li $2,-1 # 0xffffffff .set macro .set reorder move $2,$0 $L7: j $31 .end test The andi op is missing. egcs-1.0.3 seems to be OK. I have no experience in submitting gcc bugs, so if someone could forward this mail to the relevant gcc mailing list... Fabrice.