On Wed, Jul 20, 2011 at 6:41 AM, Uros Bizjak <ubiz...@gmail.com> wrote:
> On Wed, Jul 20, 2011 at 3:18 PM, H.J. Lu <hjl.to...@gmail.com> wrote:
>> On Wed, Jul 20, 2011 at 1:19 AM, Uros Bizjak <ubiz...@gmail.com> wrote:
>>> On Wed, Jul 20, 2011 at 9:53 AM, Uros Bizjak <ubiz...@gmail.com> wrote:
>>>
>>>>>>>> since Pmode is used in non-PIC tablejump, we have to put 64bit value 
>>>>>>>> for
>>>>>>>> labels with 0 upper 32bits in tablejump for x32.
>>>>>>>
>>>>>>> The mode is completely controled by CASE_VECTOR_MODE.
>>>>>>>
>>>>>>
>>>>>> Here is the updated patch.  OK for trunk?
>>>>>>
>>>>>
>>>>> A small change.  It always use 64bit register for indirect branch.
>>>>
>>>> -         ix86_print_operand (file, x, 0);
>>>> +         /* Always use 64bit register for indirect branch.  */
>>>> +         ix86_print_operand (file, x,
>>>> +                             REG_P (x) && TARGET_64BIT ? 'q' : 0);
>>>>          return;
>>>>
>>>> /* Always use 64bit register for indirect branch.  */
>>>> if (REG_P (x) && TARGET_64BIT)
>>>>  print_reg (x, 'q', file);
>>>> else
>>>>  ix86_print_operand (file, x, 0);
>>>>
>>>>  (define_insn "*indirect_jump"
>>>> -  [(set (pc) (match_operand:P 0 "nonimmediate_operand" "rm"))]
>>>> +  [(set (pc) (match_operand:P 0 "x32_indirect_branch_operand" "rm"))]
>>>>
>>>> Just name it "indirect_branch_operand".
>>>>
>>>>  (define_insn_and_split "*call_vzeroupper"
>>>> -  [(call (mem:QI (match_operand:P 0 "call_insn_operand" "<c>zm"))
>>>> +  [(call (mem:QI (match_operand:P 0 "x32_call_insn_operand" "<c>zm"))
>>>>
>>>> Don't introduce new predicate, change call_insn_operand instead to
>>>> conditionally disable memory_operand on x32. You will need to change
>>>> "<c>zm" register constraint to "<c>z" on x32, otherwise you will get
>>>> ICEs.
>>>
>>> Use new constraint here, something like (untested):
>>>
>>> Index: constraints.md
>>> ===================================================================
>>> --- constraints.md      (revision 176494)
>>> +++ constraints.md      (working copy)
>>> @@ -127,6 +127,11 @@
>>>   "@internal Constant call address operand."
>>>   (match_operand 0 "constant_call_address_operand"))
>>>
>>> +(define_constraint "w"
>>> +  "@internal Call memory operand."
>>> +  (and (match_test "!TARGET_X32")
>>> +       (match_operand 0 "memory_operand"))
>>> +
>>>  ;; Integer constant constraints.
>>>  (define_constraint "I"
>>>   "Integer constant in the range 0 @dots{} 31, for 32-bit shifts."
>>>
>>> Uros.
>>>
>>
>> Here is the updated patch.  OK for trunk?
>>
>> Thanks.
>>
>> --
>> H.J.
>> -----
>> 2011-07-20  H.J. Lu  <hongjiu...@intel.com>
>>            Uros Bizjak  <ubiz...@gmail.com>
>>
>>        * config/i386/constraints.md (w): New.
>>
>>        * config/i386/i386.c (ix86_print_operand): Always use 64bit
>>        register for indirect branch.
>>        (ix86_output_addr_vec_elt): Check TARGET_LP64 instead of
>>        TARGET_64BIT for ASM_QUAD.
>>
>>        * config/i386/i386.h (CASE_VECTOR_MODE): Check TARGET_LP64
>>        instead of TARGET_64BIT.
>>
>>        * config/i386/i386.md (*indirect_jump): Replace
>>        nonimmediate_operand with indirect_branch_operand.
>>        (*tablejump_1): Likewise.
>>        (*call_vzeroupper): Replace constraint "m" with "w".
>>        (*call): Likewise.
>>        (*call_rex64_ms_sysv_vzeroupper): Likewise.
>>        (*call_rex64_ms_sysv): Likewise.
>>        (*call_value_vzeroupper): Likewise.
>>        (*call_value): Likewise.
>>        (*call_value_rex64_ms_sysv_vzeroupper): Likewise.
>>        (*call_value_rex64_ms_sysv): Likewise.
>>        (*tablejump_1_x32): New.
>>        (set_got_offset_rex64): Check TARGET_LP64 instead of
>>        TARGET_64BIT.
>>
>>        * config/i386/predicates.md (indirect_branch_operand): New.
>>        (call_insn_operand): Support x32.
>>
>
> +
> +(define_insn "*tablejump_1_x32"
> +  [(set (pc) (match_operand:SI 0 "register_operand" "r"))
> +   (use (label_ref (match_operand 1 "" "")))]
> +  "TARGET_X32"
> +  "jmp\t%A0"
> +  [(set_attr "type" "ibr")
> +   (set_attr "length_immediate" "0")])
>
> This pattern should include zero_extend from operand 0. Please fix the
> tablejump expander to generate correct pattern.
>
> Also, indirect jump needs to generate zero_extend from SImode register for 
> x32.
>

I am testing this patch on top of the last one. We don't need to zero-extend
indirect jump since it takes operand 0 in Pmode, which is DImode.


-- 
H.J.
---
diff --git a/gcc/config/i386/i386.md b/gcc/config/i386/i386.md
index 708cfa5..43a753d 100644
--- a/gcc/config/i386/i386.md
+++ b/gcc/config/i386/i386.md
@@ -10982,7 +10982,7 @@
    (set_attr "modrm" "0")])

 (define_expand "indirect_jump"
-  [(set (pc) (match_operand 0 "nonimmediate_operand" ""))])
+  [(set (pc) (match_operand 0 "indirect_branch_operand" ""))])

 (define_insn "*indirect_jump"
   [(set (pc) (match_operand:P 0 "indirect_branch_operand" "rw"))]
@@ -10992,7 +10992,7 @@
    (set_attr "length_immediate" "0")])

 (define_expand "tablejump"
-  [(parallel [(set (pc) (match_operand 0 "nonimmediate_operand" ""))
+  [(parallel [(set (pc) (match_operand 0 "indirect_branch_operand" ""))
              (use (label_ref (match_operand 1 "" "")))])]
   ""
 {
@@ -11027,6 +11027,8 @@
       operands[0] = expand_simple_binop (Pmode, code, op0, op1, NULL_RTX, 0,
                                         OPTAB_DIRECT);
     }
+  else if (TARGET_X32)
+    operands[0] = gen_rtx_ZERO_EXTEND (Pmode, operands[0]);
 })

 (define_insn "*tablejump_1"
@@ -11038,7 +11040,8 @@
    (set_attr "length_immediate" "0")])

 (define_insn "*tablejump_1_x32"
-  [(set (pc) (match_operand:SI 0 "register_operand" "r"))
+  [(set (pc) (zero_extend:DI
+              (match_operand:SI 0 "register_operand" "r")))
    (use (label_ref (match_operand 1 "" "")))]
   "TARGET_X32"
   "jmp\t%A0"

Reply via email to