summaryrefslogtreecommitdiff
path: root/gcc/config/i386/i386.md
diff options
context:
space:
mode:
Diffstat (limited to 'gcc/config/i386/i386.md')
-rw-r--r--gcc/config/i386/i386.md195
1 files changed, 8 insertions, 187 deletions
diff --git a/gcc/config/i386/i386.md b/gcc/config/i386/i386.md
index f1948468db5..eb77ef3c08f 100644
--- a/gcc/config/i386/i386.md
+++ b/gcc/config/i386/i386.md
@@ -62,7 +62,7 @@
;; ; -- print a semicolon (after prefixes due to bug in older gas).
;; ~ -- print "i" if TARGET_AVX2, "f" otherwise.
;; ^ -- print addr32 prefix if TARGET_64BIT and Pmode != word_mode
-;; ! -- print MPX or NOTRACK prefix for jxx/call/ret instructions if required.
+;; ! -- print NOTRACK prefix for jxx/call/ret instructions if required.
(define_c_enum "unspec" [
;; Relocation specifiers
@@ -550,9 +550,6 @@
(const_int 0)
(and (eq_attr "unit" "sse") (eq_attr "mode" "SF,DF"))
(const_int 1)
- (and (eq_attr "type" "ibr,call,callv")
- (match_test "ix86_bnd_prefixed_insn_p (insn)"))
- (const_int 1)
]
(const_int 0)))
@@ -596,9 +593,6 @@
]
(const_int 0)))
-;; Set when BND opcode prefix may be used.
-(define_attr "maybe_prefix_bnd" "" (const_int 0))
-
;; Prefix used: original, VEX or maybe VEX.
(define_attr "prefix" "orig,vex,maybe_vex,evex,maybe_evex"
(cond [(eq_attr "mode" "OI,V8SF,V4DF")
@@ -1074,17 +1068,6 @@
(define_mode_iterator BND [(BND32 "!TARGET_LP64")
(BND64 "TARGET_LP64")])
-;; Pointer mode corresponding to bound mode.
-(define_mode_attr bnd_ptr [(BND32 "SI") (BND64 "DI")])
-
-;; MPX check types
-(define_int_iterator BNDCHECK [UNSPEC_BNDCL UNSPEC_BNDCU UNSPEC_BNDCN])
-
-;; Check name
-(define_int_attr bndcheck [(UNSPEC_BNDCL "cl")
- (UNSPEC_BNDCU "cu")
- (UNSPEC_BNDCN "cn")])
-
;; Instruction suffix for integer modes.
(define_mode_attr imodesuffix [(QI "b") (HI "w") (SI "l") (DI "q")])
@@ -12601,8 +12584,7 @@
(lt (minus (match_dup 0) (pc))
(const_int 128)))
(const_int 2)
- (const_int 6)))
- (set_attr "maybe_prefix_bnd" "1")])
+ (const_int 6)))])
;; In general it is not safe to assume too much about CCmode registers,
;; so simplify-rtx stops when it sees a second one. Under certain
@@ -12670,8 +12652,7 @@
(lt (minus (match_dup 0) (pc))
(const_int 128)))
(const_int 2)
- (const_int 5)))
- (set_attr "maybe_prefix_bnd" "1")])
+ (const_int 5)))])
(define_expand "indirect_jump"
[(set (pc) (match_operand 0 "indirect_branch_operand"))]
@@ -12691,8 +12672,7 @@
!= indirect_branch_keep)")
(const_string "multi")
(const_string "ibr")))
- (set_attr "length_immediate" "0")
- (set_attr "maybe_prefix_bnd" "1")])
+ (set_attr "length_immediate" "0")])
(define_expand "tablejump"
[(parallel [(set (pc) (match_operand 0 "indirect_branch_operand"))
@@ -12746,8 +12726,7 @@
!= indirect_branch_keep)")
(const_string "multi")
(const_string "ibr")))
- (set_attr "length_immediate" "0")
- (set_attr "maybe_prefix_bnd" "1")])
+ (set_attr "length_immediate" "0")])
;; Convert setcc + movzbl to xor + setcc if operands don't overlap.
@@ -13444,8 +13423,7 @@
[(set_attr "length" "1")
(set_attr "atom_unit" "jeu")
(set_attr "length_immediate" "0")
- (set_attr "modrm" "0")
- (set_attr "maybe_prefix_bnd" "1")])
+ (set_attr "modrm" "0")])
(define_insn "interrupt_return"
[(simple_return)
@@ -13480,8 +13458,7 @@
[(set_attr "length" "3")
(set_attr "atom_unit" "jeu")
(set_attr "length_immediate" "2")
- (set_attr "modrm" "0")
- (set_attr "maybe_prefix_bnd" "1")])
+ (set_attr "modrm" "0")])
(define_expand "simple_return_indirect_internal"
[(parallel
@@ -13498,8 +13475,7 @@
!= indirect_branch_keep)")
(const_string "multi")
(const_string "ibr")))
- (set_attr "length_immediate" "0")
- (set_attr "maybe_prefix_bnd" "1")])
+ (set_attr "length_immediate" "0")])
(define_insn "nop"
[(const_int 0)]
@@ -20844,161 +20820,6 @@
[(set_attr "length" "3")
(set_attr "memory" "unknown")])
-;; MPX instructions
-
-(define_expand "<mode>_mk"
- [(set (match_operand:BND 0 "register_operand")
- (unspec:BND
- [(mem:<bnd_ptr>
- (match_par_dup 3
- [(match_operand:<bnd_ptr> 1 "register_operand")
- (match_operand:<bnd_ptr> 2 "address_mpx_no_base_operand")]))]
- UNSPEC_BNDMK))]
- "TARGET_MPX"
-{
- operands[3] = gen_rtx_UNSPEC (Pmode, gen_rtvec (2, operands[1],
- operands[2]),
- UNSPEC_BNDMK_ADDR);
-})
-
-(define_insn "*<mode>_mk"
- [(set (match_operand:BND 0 "register_operand" "=w")
- (unspec:BND
- [(match_operator:<bnd_ptr> 3 "bnd_mem_operator"
- [(unspec:<bnd_ptr>
- [(match_operand:<bnd_ptr> 1 "register_operand" "r")
- (match_operand:<bnd_ptr> 2 "address_mpx_no_base_operand" "Tb")]
- UNSPEC_BNDMK_ADDR)])]
- UNSPEC_BNDMK))]
- "TARGET_MPX"
- "bndmk\t{%3, %0|%0, %3}"
- [(set_attr "type" "mpxmk")])
-
-(define_expand "mov<mode>"
- [(set (match_operand:BND 0 "general_operand")
- (match_operand:BND 1 "general_operand"))]
- "TARGET_MPX"
- "ix86_expand_move (<MODE>mode, operands); DONE;")
-
-(define_insn "*mov<mode>_internal_mpx"
- [(set (match_operand:BND 0 "nonimmediate_operand" "=w,m")
- (match_operand:BND 1 "general_operand" "wm,w"))]
- "TARGET_MPX"
- "bndmov\t{%1, %0|%0, %1}"
- [(set_attr "type" "mpxmov")])
-
-(define_expand "<mode>_<bndcheck>"
- [(parallel
- [(unspec
- [(match_operand:BND 0 "register_operand")
- (match_operand:<bnd_ptr> 1 "address_no_seg_operand")] BNDCHECK)
- (set (match_dup 2)
- (unspec:BLK [(match_dup 2)] UNSPEC_MPX_FENCE))])]
- "TARGET_MPX"
-{
- operands[2] = gen_rtx_MEM (BLKmode, operands[1]);
- MEM_VOLATILE_P (operands[2]) = 1;
-})
-
-(define_insn "*<mode>_<bndcheck>"
- [(unspec
- [(match_operand:BND 0 "register_operand" "w")
- (match_operand:<bnd_ptr> 1 "address_no_seg_operand" "Ts")] BNDCHECK)
- (set (match_operand:BLK 2 "bnd_mem_operator")
- (unspec:BLK [(match_dup 2)] UNSPEC_MPX_FENCE))]
- "TARGET_MPX"
- "bnd<bndcheck>\t{%a1, %0|%0, %a1}"
- [(set_attr "type" "mpxchk")])
-
-(define_expand "<mode>_ldx"
- [(parallel
- [(set (match_operand:BND 0 "register_operand")
- (unspec:BND
- [(mem:<bnd_ptr>
- (match_par_dup 3
- [(match_operand:<bnd_ptr> 1 "address_mpx_no_index_operand")
- (match_operand:<bnd_ptr> 2 "register_operand")]))]
- UNSPEC_BNDLDX))
- (use (mem:BLK (match_dup 1)))])]
- "TARGET_MPX"
-{
- /* Avoid registers which cannot be used as index. */
- if (!index_register_operand (operands[2], Pmode))
- operands[2] = copy_addr_to_reg (operands[2]);
-
- operands[3] = gen_rtx_UNSPEC (Pmode, gen_rtvec (2, operands[1],
- operands[2]),
- UNSPEC_BNDLDX_ADDR);
-})
-
-(define_insn "*<mode>_ldx"
- [(set (match_operand:BND 0 "register_operand" "=w")
- (unspec:BND
- [(match_operator:<bnd_ptr> 3 "bnd_mem_operator"
- [(unspec:<bnd_ptr>
- [(match_operand:<bnd_ptr> 1 "address_mpx_no_index_operand" "Ti")
- (match_operand:<bnd_ptr> 2 "register_operand" "l")]
- UNSPEC_BNDLDX_ADDR)])]
- UNSPEC_BNDLDX))
- (use (mem:BLK (match_dup 1)))]
- "TARGET_MPX"
- "bndldx\t{%3, %0|%0, %3}"
- [(set_attr "type" "mpxld")])
-
-(define_expand "<mode>_stx"
- [(parallel
- [(unspec
- [(mem:<bnd_ptr>
- (match_par_dup 3
- [(match_operand:<bnd_ptr> 0 "address_mpx_no_index_operand")
- (match_operand:<bnd_ptr> 1 "register_operand")]))
- (match_operand:BND 2 "register_operand")]
- UNSPEC_BNDSTX)
- (set (match_dup 4)
- (unspec:BLK [(match_dup 4)] UNSPEC_MPX_FENCE))])]
- "TARGET_MPX"
-{
- /* Avoid registers which cannot be used as index. */
- if (!index_register_operand (operands[1], Pmode))
- operands[1] = copy_addr_to_reg (operands[1]);
-
- operands[3] = gen_rtx_UNSPEC (Pmode, gen_rtvec (2, operands[0],
- operands[1]),
- UNSPEC_BNDLDX_ADDR);
- operands[4] = gen_rtx_MEM (BLKmode, operands[0]);
- MEM_VOLATILE_P (operands[4]) = 1;
-})
-
-(define_insn "*<mode>_stx"
- [(unspec
- [(match_operator:<bnd_ptr> 3 "bnd_mem_operator"
- [(unspec:<bnd_ptr>
- [(match_operand:<bnd_ptr> 0 "address_mpx_no_index_operand" "Ti")
- (match_operand:<bnd_ptr> 1 "register_operand" "l")]
- UNSPEC_BNDLDX_ADDR)])
- (match_operand:BND 2 "register_operand" "w")]
- UNSPEC_BNDSTX)
- (set (match_operand:BLK 4 "bnd_mem_operator")
- (unspec:BLK [(match_dup 4)] UNSPEC_MPX_FENCE))]
- "TARGET_MPX"
- "bndstx\t{%2, %3|%3, %2}"
- [(set_attr "type" "mpxst")])
-
-(define_insn "move_size_reloc_<mode>"
- [(set (match_operand:SWI48 0 "register_operand" "=r")
- (unspec:SWI48
- [(match_operand:SWI48 1 "symbol_operand")]
- UNSPEC_SIZEOF))]
- "TARGET_MPX"
-{
- if (x86_64_immediate_size_operand (operands[1], VOIDmode))
- return "mov{l}\t{%1@SIZE, %k0|%k0, %1@SIZE}";
- else
- return "movabs{q}\t{%1@SIZE, %0|%0, %1@SIZE}";
-}
- [(set_attr "type" "imov")
- (set_attr "mode" "<MODE>")])
-
;; RDPKRU and WRPKRU
(define_expand "rdpkru"