diff -ur g_orig/gcc-4.2.2/gcc/config/i386/i386.c gcc-4.2.2/gcc/config/i386/i386.c --- g_orig/gcc-4.2.2/gcc/config/i386/i386.c 2007-09-01 17:28:30.000000000 +0200 +++ gcc-4.2.2/gcc/config/i386/i386.c 2007-11-25 03:43:35.000000000 +0100 @@ -7126,7 +7128,11 @@ rtx temp = gen_reg_rtx (Pmode); rtx val = force_operand (XEXP (x, 1), temp); if (val != temp) + { + if(GET_MODE(val) != Pmode) + val = convert_to_mode (Pmode, val, 0); emit_move_insn (temp, val); + } XEXP (x, 1) = temp; return x; @@ -7137,7 +7143,11 @@ rtx temp = gen_reg_rtx (Pmode); rtx val = force_operand (XEXP (x, 0), temp); if (val != temp) + { + if(GET_MODE(val) != Pmode) + val = convert_to_mode (Pmode, val, 0); emit_move_insn (temp, val); + } XEXP (x, 0) = temp; return x; @@ -8967,7 +8978,7 @@ } } - if (flag_pic && mode == Pmode && symbolic_operand (op1, Pmode)) + if (flag_pic && symbolic_operand (op1, mode)) // && mode == Pmode && symbolic_operand (op1, Pmode)) { if (TARGET_MACHO && !TARGET_64BIT) { @@ -8991,9 +9002,13 @@ else { if (GET_CODE (op0) == MEM) - op1 = force_reg (Pmode, op1); + op1 = force_reg (mode, op1); else op1 = legitimize_address (op1, op1, Pmode); + if(mode != Pmode) + { + op1 = convert_to_mode (mode, op1, 0); + } } } else Only in gcc-4.2.2/gcc/config/i386: i386.c~ diff -ur g_orig/gcc-4.2.2/gcc/config/i386/i386.h gcc-4.2.2/gcc/config/i386/i386.h --- g_orig/gcc-4.2.2/gcc/config/i386/i386.h 2007-09-01 17:28:30.000000000 +0200 +++ gcc-4.2.2/gcc/config/i386/i386.h 2007-11-25 04:33:31.000000000 +0100 @@ -535,7 +535,7 @@ #define SHORT_TYPE_SIZE 16 #define INT_TYPE_SIZE 32 #define FLOAT_TYPE_SIZE 32 -#define LONG_TYPE_SIZE BITS_PER_WORD +#define LONG_TYPE_SIZE 32 #define DOUBLE_TYPE_SIZE 64 #define LONG_LONG_TYPE_SIZE 64 @@ -1804,6 +1804,8 @@ After generation of rtl, the compiler makes no further distinction between pointers and any other objects of this machine mode. */ #define Pmode (TARGET_64BIT ? DImode : SImode) +#define POINTER_SIZE 32 +#define POINTERS_EXTEND_UNSIGNED 1 /* A function address in a call instruction is a byte address (for indexing purposes) Only in gcc-4.2.2/gcc/config/i386: i386.h~ diff -ur g_orig/gcc-4.2.2/gcc/config/i386/i386.md gcc-4.2.2/gcc/config/i386/i386.md --- g_orig/gcc-4.2.2/gcc/config/i386/i386.md 2007-09-01 17:28:30.000000000 +0200 +++ gcc-4.2.2/gcc/config/i386/i386.md 2007-11-25 03:34:55.000000000 +0100 @@ -4962,7 +4962,7 @@ && GET_MODE (operands[0]) == GET_MODE (operands[1]) && GET_MODE (operands[0]) == GET_MODE (operands[2]) && (GET_MODE (operands[0]) == GET_MODE (operands[3]) - || GET_MODE (operands[3]) == VOIDmode)" + || GET_MODE (operands[3]) == VOIDmode) && !SYMBOLIC_CONST(operands[3])" "#" "&& reload_completed" [(const_int 0)] @@ -4988,7 +4988,7 @@ (plus:SI (plus:SI (match_operand:SI 1 "index_register_operand" "l") (match_operand:SI 2 "register_operand" "r")) (match_operand:SI 3 "immediate_operand" "i"))))] - "TARGET_64BIT" + "TARGET_64BIT && !SYMBOLIC_CONST(operands[3])" "#" "&& reload_completed" [(set (match_dup 0) @@ -5013,7 +5013,7 @@ && (!TARGET_PARTIAL_REG_STALL || optimize_size) && GET_MODE (operands[0]) == GET_MODE (operands[1]) && (GET_MODE (operands[0]) == GET_MODE (operands[3]) - || GET_MODE (operands[3]) == VOIDmode)" + || GET_MODE (operands[3]) == VOIDmode) && !SYMBOLIC_CONST(operands[3])" "#" "&& reload_completed" [(const_int 0)] @@ -5038,7 +5038,7 @@ (plus:SI (mult:SI (match_operand:SI 1 "index_register_operand" "l") (match_operand:SI 2 "const248_operand" "n")) (match_operand:SI 3 "nonmemory_operand" "ri"))))] - "TARGET_64BIT" + "TARGET_64BIT && !SYMBOLIC_CONST(operands[3])" "#" "&& reload_completed" [(set (match_dup 0) @@ -5062,7 +5062,7 @@ || (TARGET_64BIT && GET_MODE (operands[0]) == SImode)) && (!TARGET_PARTIAL_REG_STALL || optimize_size) && GET_MODE (operands[0]) == GET_MODE (operands[1]) - && GET_MODE (operands[0]) == GET_MODE (operands[3])" + && GET_MODE (operands[0]) == GET_MODE (operands[3]) && !SYMBOLIC_CONST(operands[3]) && !SYMBOLIC_CONST(operands[4])" "#" "&& reload_completed" [(const_int 0)] @@ -5093,7 +5093,7 @@ (match_operand:SI 2 "const248_operand" "n")) (match_operand:SI 3 "register_operand" "r")) (match_operand:SI 4 "immediate_operand" "i"))))] - "TARGET_64BIT" + "TARGET_64BIT && !SYMBOLIC_CONST(operands[3])" "#" "&& reload_completed" [(set (match_dup 0) @@ -5431,7 +5431,7 @@ (plus (match_operand 1 "register_operand" "") (match_operand 2 "nonmemory_operand" ""))) (clobber (reg:CC FLAGS_REG))] - "reload_completed + "0 && reload_completed && true_regnum (operands[0]) != true_regnum (operands[1])" [(const_int 0)] { @@ -5467,7 +5467,7 @@ switch (get_attr_type (insn)) { case TYPE_LEA: - operands[2] = SET_SRC (XVECEXP (PATTERN (insn), 0, 0)); + operands[2] = XEXP(SET_SRC (XVECEXP (PATTERN (insn), 0, 0)), 0); return "lea{l}\t{%a2, %k0|%k0, %a2}"; case TYPE_INCDEC: @@ -5513,7 +5513,7 @@ (plus:SI (match_operand:SI 1 "register_operand" "") (match_operand:SI 2 "nonmemory_operand" "")))) (clobber (reg:CC FLAGS_REG))] - "TARGET_64BIT && reload_completed + "0 && TARGET_64BIT && reload_completed && true_regnum (operands[0]) != true_regnum (operands[1])" [(set (match_dup 0) (zero_extend:DI (subreg:SI (plus:DI (match_dup 1) (match_dup 2)) 0)))] diff -ur g_orig/gcc-4.2.2/gcc/expr.c gcc-4.2.2/gcc/expr.c --- g_orig/gcc-4.2.2/gcc/expr.c 2007-09-01 17:28:30.000000000 +0200 +++ gcc-4.2.2/gcc/expr.c 2007-11-25 03:52:33.000000000 +0100 @@ -8138,6 +8138,8 @@ /* Check for a multiplication with matching signedness. */ else if (TREE_CODE (TREE_OPERAND (exp, 0)) == NOP_EXPR && TREE_CODE (type) == INTEGER_TYPE + && TREE_CODE (TREE_TYPE (TREE_OPERAND (exp, 0))) == INTEGER_TYPE + && TREE_CODE (TREE_TYPE (TREE_OPERAND (TREE_OPERAND (exp, 0), 0))) == INTEGER_TYPE && (TYPE_PRECISION (TREE_TYPE (TREE_OPERAND (TREE_OPERAND (exp, 0), 0))) < TYPE_PRECISION (TREE_TYPE (TREE_OPERAND (exp, 0)))) && ((TREE_CODE (TREE_OPERAND (exp, 1)) == INTEGER_CST