aboutsummaryrefslogtreecommitdiff
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.md69
1 files changed, 63 insertions, 6 deletions
diff --git a/gcc/config/i386/i386.md b/gcc/config/i386/i386.md
index 97b1ca3..1ba352a 100644
--- a/gcc/config/i386/i386.md
+++ b/gcc/config/i386/i386.md
@@ -289,8 +289,15 @@
UNSPECV_WRUSS
UNSPECV_SETSSBSY
UNSPECV_CLRSSBSY
+
+ ;; For MOVDIRI and MOVDIR64B support
UNSPECV_MOVDIRI
UNSPECV_MOVDIR64B
+
+ ;; For WAITPKG support
+ UNSPECV_UMWAIT
+ UNSPECV_UMONITOR
+ UNSPECV_TPAUSE
])
;; Constants to represent rounding modes in the ROUND instruction
@@ -20960,22 +20967,72 @@
"wbnoinvd"
[(set_attr "type" "other")])
+;; MOVDIRI and MOVDIR64B
+
(define_insn "movdiri<mode>"
- [(unspec_volatile:SWI48[(match_operand:SWI48 0 "memory_operand" "m")
- (match_operand:SWI48 1 "register_operand" "r")]
- UNSPECV_MOVDIRI)]
+ [(unspec_volatile:SWI48 [(match_operand:SWI48 0 "memory_operand" "m")
+ (match_operand:SWI48 1 "register_operand" "r")]
+ UNSPECV_MOVDIRI)]
"TARGET_MOVDIRI"
"movdiri\t{%1, %0|%0, %1}"
[(set_attr "type" "other")])
(define_insn "movdir64b_<mode>"
- [(unspec_volatile:XI[(match_operand:P 0 "register_operand" "r")
- (match_operand:XI 1 "memory_operand")]
- UNSPECV_MOVDIR64B)]
+ [(unspec_volatile:XI [(match_operand:P 0 "register_operand" "r")
+ (match_operand:XI 1 "memory_operand")]
+ UNSPECV_MOVDIR64B)]
"TARGET_MOVDIR64B"
"movdir64b\t{%1, %0|%0, %1}"
[(set_attr "type" "other")])
+;; WAITPKG
+
+(define_insn "umwait"
+ [(set (reg:CCC FLAGS_REG)
+ (unspec_volatile:CCC [(match_operand:SI 0 "register_operand" "r")
+ (match_operand:DI 1 "register_operand" "A")]
+ UNSPECV_UMWAIT))]
+ "!TARGET_64BIT && TARGET_WAITPKG"
+ "umwait\t%0"
+ [(set_attr "length" "3")])
+
+(define_insn "umwait_rex64"
+ [(set (reg:CCC FLAGS_REG)
+ (unspec_volatile:CCC [(match_operand:SI 0 "register_operand" "r")
+ (match_operand:SI 1 "register_operand" "a")
+ (match_operand:SI 2 "register_operand" "d")]
+ UNSPECV_UMWAIT))]
+ "TARGET_64BIT && TARGET_WAITPKG"
+ "umwait\t%0"
+ [(set_attr "length" "3")])
+
+(define_insn "umonitor_<mode>"
+ [(unspec_volatile [(match_operand:P 0 "register_operand" "r")]
+ UNSPECV_UMONITOR)]
+ "TARGET_WAITPKG"
+ "umonitor\t%0"
+ [(set (attr "length")
+ (symbol_ref ("(Pmode != word_mode) + 3")))])
+
+(define_insn "tpause"
+ [(set (reg:CCC FLAGS_REG)
+ (unspec_volatile:CCC [(match_operand:SI 0 "register_operand" "r")
+ (match_operand:DI 1 "register_operand" "A")]
+ UNSPECV_TPAUSE))]
+ "!TARGET_64BIT && TARGET_WAITPKG"
+ "tpause\t%0"
+ [(set_attr "length" "3")])
+
+(define_insn "tpause_rex64"
+ [(set (reg:CCC FLAGS_REG)
+ (unspec_volatile:CCC [(match_operand:SI 0 "register_operand" "r")
+ (match_operand:SI 1 "register_operand" "a")
+ (match_operand:SI 2 "register_operand" "d")]
+ UNSPECV_TPAUSE))]
+ "TARGET_64BIT && TARGET_WAITPKG"
+ "tpause\t%0"
+ [(set_attr "length" "3")])
+
(include "mmx.md")
(include "sse.md")
(include "sync.md")