| Index: gcc/gcc/config/i386/i386.c
|
| diff --git a/gcc/gcc/config/i386/i386.c b/gcc/gcc/config/i386/i386.c
|
| index 04c18dc8432bcae951259f667be6db705977562d..c9746d41f74ec8906222e6dfc4f1c1f2b458c771 100644
|
| --- a/gcc/gcc/config/i386/i386.c
|
| +++ b/gcc/gcc/config/i386/i386.c
|
| @@ -7483,23 +7483,26 @@ ix86_file_end (void)
|
| }
|
|
|
| if (TARGET_NACL)
|
| - {
|
| - xops[0] = gen_rtx_REG (Pmode, regno);
|
| - output_asm_insn ("pop{l}\t%0", xops);
|
| - if (TARGET_64BIT) {
|
| - xops[0] = simplify_gen_subreg(SImode, xops[0], Pmode, 0);
|
| - output_asm_insn ("nacljmp\t%0,%%r15", xops+1);
|
| - } else {
|
| - output_asm_insn ("nacljmp\t%0", xops);
|
| - }
|
| - }
|
| + {
|
| + xops[0] = gen_rtx_REG (Pmode, regno);
|
| + output_asm_insn ("pop{l}\t%0", xops);
|
| + if (TARGET_64BIT)
|
| + {
|
| + xops[0] = simplify_gen_subreg (SImode, xops[0], Pmode, 0);
|
| + output_asm_insn ("nacljmp\t%0,%%r15", xops + 1);
|
| + }
|
| + else
|
| + {
|
| + output_asm_insn ("nacljmp\t%0", xops);
|
| + }
|
| + }
|
| else
|
| - {
|
| - xops[0] = gen_rtx_REG (Pmode, regno);
|
| - xops[1] = gen_rtx_MEM (Pmode, stack_pointer_rtx);
|
| - output_asm_insn ("mov%z0\t{%1, %0|%0, %1}", xops);
|
| - output_asm_insn ("ret", xops);
|
| - }
|
| + {
|
| + xops[0] = gen_rtx_REG (Pmode, regno);
|
| + xops[1] = gen_rtx_MEM (Pmode, stack_pointer_rtx);
|
| + output_asm_insn ("mov%z0\t{%1, %0|%0, %1}", xops);
|
| + output_asm_insn ("ret", xops);
|
| + }
|
| }
|
|
|
| if (NEED_INDICATE_EXEC_STACK)
|
| @@ -8634,9 +8637,10 @@ ix86_expand_epilogue (int style)
|
| + frame.padding0),
|
| style);
|
| /* If not an i386, mov & pop is faster than "leave". */
|
| - else if (!TARGET_NACL &&
|
| - (TARGET_USE_LEAVE || optimize_function_for_size_p (cfun)
|
| - || !cfun->machine->use_fast_prologue_epilogue))
|
| + else if (!TARGET_NACL
|
| + && (TARGET_USE_LEAVE
|
| + || optimize_function_for_size_p (cfun)
|
| + || !cfun->machine->use_fast_prologue_epilogue))
|
| emit_insn ((*ix86_gen_leave) ());
|
| else
|
| {
|
| @@ -8721,8 +8725,6 @@ ix86_expand_epilogue (int style)
|
| if (style == 0)
|
| return;
|
|
|
| -#define gen_nacl_return_indirect \
|
| - (TARGET_64BIT ? gen_nacl_return_indirectdi : gen_nacl_return_indirectsi)
|
| if (crtl->args.pops_args && crtl->args.size)
|
| {
|
| rtx popc = GEN_INT (crtl->args.pops_args);
|
| @@ -8733,9 +8735,9 @@ ix86_expand_epilogue (int style)
|
|
|
| if (crtl->args.pops_args >= 65536 || TARGET_NACL)
|
| {
|
| - /* x86_64 dedicates R11 for call-scratch needs */
|
| + /* x86_64 dedicates R11 for call-scratch needs */
|
| rtx reg1 = gen_rtx_REG (Pmode, TARGET_64BIT ? R11_REG : CX_REG);
|
| - rtx reg2 = gen_rtx_REG (SImode, TARGET_64BIT ? R11_REG : CX_REG);
|
| + rtx reg2 = gen_rtx_REG (SImode, TARGET_64BIT ? R11_REG : CX_REG);
|
|
|
| emit_insn ((*ix86_gen_pop1) (reg1));
|
| emit_insn ((*ix86_gen_add3) (stack_pointer_rtx, stack_pointer_rtx, popc));
|
| @@ -8756,10 +8758,10 @@ ix86_expand_epilogue (int style)
|
| rtx reg2 = gen_rtx_REG (SImode, TARGET_64BIT ? R11_REG : CX_REG);
|
|
|
| emit_insn ((*ix86_gen_pop1) (reg1));
|
| - emit_jump_insn (gen_nacl_return_indirectsi (reg2));
|
| - }
|
| + emit_jump_insn (gen_nacl_return_indirectsi (reg2));
|
| + }
|
| else
|
| - emit_jump_insn (gen_return_internal ());
|
| + emit_jump_insn (gen_return_internal ());
|
| }
|
| }
|
|
|
| @@ -8978,7 +8980,7 @@ lea_match_address_operand (rtx op, enum machine_mode mode)
|
| }
|
|
|
| static int
|
| -gen_r15(rtx reg)
|
| +gen_r15 (rtx reg)
|
| {
|
| rtx base_reg;
|
|
|
| @@ -8988,7 +8990,7 @@ gen_r15(rtx reg)
|
| if (!reg)
|
| return 1;
|
| base_reg = GET_CODE (reg) == SUBREG ? SUBREG_REG (reg) : reg;
|
| - switch (REGNO(base_reg))
|
| + switch (REGNO (base_reg))
|
| {
|
| case R15_REG:
|
| case STACK_POINTER_REGNUM:
|
| @@ -9021,16 +9023,14 @@ ix86_decompose_address (rtx addr, struct ix86_address *out)
|
|
|
| if (REG_P (addr) || GET_CODE (addr) == SUBREG)
|
| {
|
| - if (!base && gen_r15(addr))
|
| - {
|
| + if (!base && gen_r15 (addr))
|
| + {
|
| seg = SEG_NACL;
|
| base = gen_rtx_REG (Pmode, R15_REG);
|
| index = addr;
|
| - }
|
| + }
|
| else
|
| - {
|
| - base = addr;
|
| - }
|
| + base = addr;
|
| }
|
| else if (GET_CODE (addr) == PLUS)
|
| {
|
| @@ -9042,16 +9042,16 @@ ix86_decompose_address (rtx addr, struct ix86_address *out)
|
| {
|
| if (n >= 4)
|
| return 0;
|
| - if (GET_CODE(XEXP (op, 1)) == PLUS)
|
| + if (GET_CODE (XEXP (op, 1)) == PLUS)
|
| {
|
| addends[n++] = XEXP (op, 0);
|
| op = XEXP (op, 1);
|
| }
|
| else
|
| {
|
| - addends[n++] = XEXP (op, 1);
|
| - op = XEXP (op, 0);
|
| - }
|
| + addends[n++] = XEXP (op, 1);
|
| + op = XEXP (op, 0);
|
| + }
|
| }
|
| while (GET_CODE (op) == PLUS);
|
| if (n >= 4)
|
| @@ -9067,7 +9067,7 @@ ix86_decompose_address (rtx addr, struct ix86_address *out)
|
| if (index)
|
| return 0;
|
| index = XEXP (op, 0);
|
| - if (!base && gen_r15(index))
|
| + if (!base && gen_r15 (index))
|
| {
|
| seg = SEG_NACL;
|
| base = gen_rtx_REG (Pmode, R15_REG);
|
| @@ -9077,8 +9077,8 @@ ix86_decompose_address (rtx addr, struct ix86_address *out)
|
|
|
| case UNSPEC:
|
| if (XINT (op, 1) == UNSPEC_TP
|
| - && TARGET_TLS_DIRECT_SEG_REFS
|
| - && seg == SEG_DEFAULT)
|
| + && TARGET_TLS_DIRECT_SEG_REFS
|
| + && seg == SEG_DEFAULT)
|
| seg = TARGET_64BIT ? SEG_FS : SEG_GS;
|
| else
|
| return 0;
|
| @@ -9086,14 +9086,14 @@ ix86_decompose_address (rtx addr, struct ix86_address *out)
|
|
|
| case REG:
|
| case SUBREG:
|
| - if (!base && TARGET_64BIT)
|
| + if (!base && TARGET_64BIT)
|
| {
|
| - if (gen_r15(op))
|
| + if (gen_r15 (op))
|
| {
|
| - seg = SEG_NACL;
|
| - base = gen_rtx_REG (Pmode, R15_REG);
|
| - if (index)
|
| - return 0;
|
| + seg = SEG_NACL;
|
| + base = gen_rtx_REG (Pmode, R15_REG);
|
| + if (index)
|
| + return 0;
|
| index = op;
|
| }
|
| else
|
| @@ -9131,7 +9131,7 @@ ix86_decompose_address (rtx addr, struct ix86_address *out)
|
| else if (GET_CODE (addr) == MULT)
|
| {
|
| index = XEXP (addr, 0); /* index*scale */
|
| - if (!base && gen_r15(index))
|
| + if (!base && gen_r15 (index))
|
| {
|
| seg = SEG_NACL;
|
| base = gen_rtx_REG (Pmode, R15_REG);
|
| @@ -9144,7 +9144,7 @@ ix86_decompose_address (rtx addr, struct ix86_address *out)
|
|
|
| /* We're called for lea too, which implements ashift on occasion. */
|
| index = XEXP (addr, 0);
|
| - if (!base && gen_r15(index))
|
| + if (!base && gen_r15 (index))
|
| {
|
| seg = SEG_NACL;
|
| base = gen_rtx_REG (Pmode, R15_REG);
|
| @@ -9172,48 +9172,47 @@ ix86_decompose_address (rtx addr, struct ix86_address *out)
|
| base_reg = base && GET_CODE (base) == SUBREG ? SUBREG_REG (base) : base;
|
| index_reg = index && GET_CODE (index) == SUBREG ? SUBREG_REG (index) : index;
|
|
|
| - if (!base_reg && !index_reg && CONST_INT_P (disp) && gen_r15(0))
|
| + if (!base_reg && !index_reg && CONST_INT_P (disp) && gen_r15 (0))
|
| {
|
| base_reg = base = gen_rtx_REG (Pmode, R15_REG);
|
| }
|
|
|
| /* Disallow positive constant displacement followed by a register offset for
|
| - * NaCl64. This may hurt when a symbol is referenced with integer overflow in
|
| - * mind. NaCl64 will miss overflow because of sandboxing base addition in the
|
| - * middle.
|
| - *
|
| - * Example problem code:
|
| - * static struct ppp* zzz[16 * 2 + 1];
|
| - * int main() {
|
| - * for (int i = -16; i <= 16; i++)
|
| - * zzz[i + 16] = NULL;
|
| - * return 0;
|
| - * }
|
| - *
|
| - * Incorrect assembly generated with -O2:
|
| - * movl $-16, %eax
|
| - * .L2:
|
| - * mov %eax, %edx
|
| - * addl $1, %eax
|
| - * cmpl $17, %eax
|
| - * movl $0, %nacl:_ZL3zzz+64(%r15,%rdx,4)
|
| - * jne .L2
|
| - * */
|
| - if (TARGET_64BIT && TARGET_NACL &&
|
| - index_reg &&
|
| - disp && GET_CODE(disp) == CONST)
|
| - {
|
| - rtx opcode = XEXP(disp, 0);
|
| - if (GET_CODE(opcode) == PLUS)
|
| - {
|
| - rtx cnst = XEXP(opcode, 1);
|
| - if (GET_CODE(cnst) != CONST_INT || INTVAL(cnst) > 0)
|
| + NaCl64. This may hurt when a symbol is referenced with integer overflow in
|
| + mind. NaCl64 will miss overflow because of sandboxing base addition in the
|
| + middle.
|
| +
|
| + Example problem code:
|
| + static struct ppp* zzz[16 * 2 + 1];
|
| + int main ()
|
| + {
|
| + for (int i = -16; i <= 16; i++)
|
| + zzz[i + 16] = NULL;
|
| + return 0;
|
| + }
|
| +
|
| + Incorrect assembly generated with -O2:
|
| + movl $-16, %eax
|
| + .L2:
|
| + mov %eax, %edx
|
| + addl $1, %eax
|
| + cmpl $17, %eax
|
| + movl $0, %nacl:_ZL3zzz+64(%r15,%rdx,4)
|
| + jne .L2 */
|
| + if (TARGET_64BIT && TARGET_NACL
|
| + && index_reg && disp && GET_CODE (disp) == CONST)
|
| + {
|
| + rtx opcode = XEXP (disp, 0);
|
| + if (GET_CODE (opcode) == PLUS)
|
| + {
|
| + rtx cnst = XEXP (opcode, 1);
|
| + if (GET_CODE (cnst) != CONST_INT || INTVAL (cnst) > 0)
|
| return 0;
|
| }
|
| - else if (GET_CODE(opcode) == MINUS)
|
| + else if (GET_CODE (opcode) == MINUS)
|
| {
|
| - rtx cnst = XEXP(opcode, 1);
|
| - if (GET_CODE(cnst) != CONST_INT || INTVAL(cnst) < 0)
|
| + rtx cnst = XEXP (opcode, 1);
|
| + if (GET_CODE (cnst) != CONST_INT || INTVAL (cnst) < 0)
|
| return 0;
|
| }
|
| }
|
| @@ -9666,7 +9665,7 @@ legitimate_address_parts_p (const struct ix86_address *parts, int strict)
|
| goto report_error;
|
| }
|
|
|
| - /* Allow 32bit addr in 64bit mode - usually makes no sense except in LEA */
|
| + /* Allow 32bit addr in 64bit mode - usually makes no sense except in LEA. */
|
| if (GET_MODE (base) != SImode && (!TARGET_64BIT || GET_MODE (base) != DImode))
|
| {
|
| reason = "base is not in proper mode";
|
| @@ -9893,7 +9892,7 @@ legitimize_pic_address (rtx orig, rtx reg)
|
| rtx base;
|
| enum machine_mode orig_mode;
|
|
|
| - orig_mode = GET_MODE(orig);
|
| + orig_mode = GET_MODE (orig);
|
| #if TARGET_MACHO
|
| if (TARGET_MACHO && !TARGET_64BIT)
|
| {
|
| @@ -10556,17 +10555,17 @@ legitimize_address (rtx x, rtx oldx ATTRIBUTE_UNUSED, enum machine_mode mode)
|
| if (val != temp)
|
| {
|
| /* NaCl uses mixed 32bit/64bit mode and sometimes we need to move
|
| - 32bit register to 64bit register at this point. x86-64 ABI
|
| + 32bit register to 64bit register at this point. x86-64 ABI
|
| clears top half of 64bit register in all mov instructions thus
|
| we can just use subregister move here. */
|
| if (TARGET_64BIT && GET_MODE (val) == SImode)
|
| {
|
| - emit_move_insn(simplify_gen_subreg (SImode, temp,
|
| - GET_MODE(temp), 0), val);
|
| + emit_move_insn (simplify_gen_subreg (SImode, temp,
|
| + GET_MODE (temp), 0), val);
|
| }
|
| else
|
| {
|
| - emit_move_insn (temp, val);
|
| + emit_move_insn (temp, val);
|
| }
|
| }
|
|
|
| @@ -10581,17 +10580,17 @@ legitimize_address (rtx x, rtx oldx ATTRIBUTE_UNUSED, enum machine_mode mode)
|
| if (val != temp)
|
| {
|
| /* NaCl uses mixed 32bit/64bit mode and sometimes we need to move
|
| - 32bit register to 64bit register at this point. x86-64 ABI
|
| + 32bit register to 64bit register at this point. x86-64 ABI
|
| clears top half of 64bit register in all mov instructions thus
|
| we can just use subregister move here. */
|
| if (TARGET_64BIT && GET_MODE (val) == SImode)
|
| {
|
| - emit_move_insn(simplify_gen_subreg (SImode, temp,
|
| - GET_MODE(temp), 0), val);
|
| + emit_move_insn (simplify_gen_subreg (SImode, temp,
|
| + GET_MODE (temp), 0), val);
|
| }
|
| else
|
| {
|
| - emit_move_insn (temp, val);
|
| + emit_move_insn (temp, val);
|
| }
|
| }
|
|
|
| @@ -12832,20 +12831,20 @@ ix86_expand_move (enum machine_mode mode, rtx operands[])
|
| if (Pmode == ptr_mode || model)
|
| {
|
| tmp = expand_simple_binop (ptr_mode, PLUS, tmp, addend,
|
| - op0, 1, OPTAB_DIRECT);
|
| + op0, 1, OPTAB_DIRECT);
|
| if (tmp == op0)
|
| return;
|
| }
|
| - else
|
| - {
|
| - /* Lower the size of the constant ref operand in non-Pmode */
|
| - tmp = gen_rtx_UNSPEC(ptr_mode, gen_rtvec(1, symbol), UNSPEC_TPOFF);
|
| - tmp = gen_rtx_CONST(ptr_mode, tmp);
|
| - tmp = gen_lowpart(ptr_mode, tmp);
|
| - tmp = expand_simple_binop (ptr_mode, PLUS, tmp, addend,
|
| - op0, 1, OPTAB_DIRECT);
|
| - op1 = tmp;
|
| - }
|
| + else
|
| + {
|
| + /* Lower the size of the constant ref operand in non-Pmode. */
|
| + tmp = gen_rtx_UNSPEC (ptr_mode, gen_rtvec (1, symbol), UNSPEC_TPOFF);
|
| + tmp = gen_rtx_CONST (ptr_mode, tmp);
|
| + tmp = gen_lowpart (ptr_mode, tmp);
|
| + tmp = expand_simple_binop (ptr_mode, PLUS, tmp, addend,
|
| + op0, 1, OPTAB_DIRECT);
|
| + op1 = tmp;
|
| + }
|
| }
|
| }
|
|
|
| @@ -12926,10 +12925,10 @@ ix86_expand_move (enum machine_mode mode, rtx operands[])
|
| }
|
|
|
| /* NaCl uses mixed 32bit/64bit mode and sometimes we need to move
|
| - 32bit register to 64bit register at this point. x86-64 ABI
|
| + 32bit register to 64bit register at this point. x86-64 ABI
|
| clears top half of 64bit register in all mov instructions thus
|
| we can just use subregister move here. */
|
| - if (TARGET_64BIT && GET_MODE (op0) == SImode && GET_MODE(op1) == DImode)
|
| + if (TARGET_64BIT && GET_MODE (op0) == SImode && GET_MODE (op1) == DImode)
|
| op1 = simplify_gen_subreg (SImode, op1, DImode, 0);
|
| emit_insn (gen_rtx_SET (VOIDmode, op0, op1));
|
| }
|
| @@ -19274,7 +19273,7 @@ ix86_expand_call (rtx retval, rtx fnaddr, rtx callarg1,
|
| if (Pmode != ptr_mode)
|
| {
|
| fnaddr = gen_lowpart (Pmode, fnaddr);
|
| - fnaddr = force_reg(Pmode, fnaddr);
|
| + fnaddr = force_reg (Pmode, fnaddr);
|
| }
|
| fnaddr = gen_rtx_MEM (QImode, fnaddr);
|
| }
|
|
|