aboutsummaryrefslogtreecommitdiff
path: root/gcc/config/i386/sync.md
diff options
context:
space:
mode:
authorUros Bizjak <ubizjak@gmail.com>2009-12-17 09:34:27 +0100
committerUros Bizjak <uros@gcc.gnu.org>2009-12-17 09:34:27 +0100
commitca43f0efca4d2a74447d0e150730f6869877f374 (patch)
treecb2b3e7926710250674eb8c1cb53e19468b8539c /gcc/config/i386/sync.md
parent7ad86035e8e75ebb5b93278ec0d46a1120334a1a (diff)
downloadgcc-ca43f0efca4d2a74447d0e150730f6869877f374.zip
gcc-ca43f0efca4d2a74447d0e150730f6869877f374.tar.gz
gcc-ca43f0efca4d2a74447d0e150730f6869877f374.tar.bz2
sync.md (IMODE): Remove mode iterator.
* config/i386/sync.md (IMODE): Remove mode iterator. (modesuffix): Remove mode attribute. (modeconstraint): Ditto. (immconstraint): Ditto. (*sync_compare_and_swap<mode>): Use SWI mode iterator instead of IMODE mode iterator, imodesuffix mode attribute instead of modesuffix, <r> mode attribute instead of modeconstraint and <i> mode attribute instead of immconstraint. (sync_double_compare_and_swap<mode>): Ditto. (sync_old_add<mode>): Ditto. (sync_lock_test_and_set<mode>): Ditto. (sync_add<mode>): Ditto. (sync_sub<mode>): Ditto. (sync_and<mode>): Ditto. (sync_ior<mode>): Ditto. (sync_xor<mode>): Ditto. (sync_<code><mode>): Macroize insn pattern from sync_{and,ior,xor}<mode> using any_logic code iterator. From-SVN: r155304
Diffstat (limited to 'gcc/config/i386/sync.md')
-rw-r--r--gcc/config/i386/sync.md106
1 files changed, 41 insertions, 65 deletions
diff --git a/gcc/config/i386/sync.md b/gcc/config/i386/sync.md
index 7167a71..0df85c7 100644
--- a/gcc/config/i386/sync.md
+++ b/gcc/config/i386/sync.md
@@ -18,13 +18,9 @@
;; along with GCC; see the file COPYING3. If not see
;; <http://www.gnu.org/licenses/>.
-(define_mode_iterator IMODE [QI HI SI (DI "TARGET_64BIT")])
-(define_mode_attr modesuffix [(QI "b") (HI "w") (SI "l") (DI "q")])
-(define_mode_attr modeconstraint [(QI "q") (HI "r") (SI "r") (DI "r")])
-(define_mode_attr immconstraint [(QI "i") (HI "i") (SI "i") (DI "e")])
-
-(define_mode_iterator CASMODE [QI HI SI (DI "TARGET_64BIT || TARGET_CMPXCHG8B")
- (TI "TARGET_64BIT && TARGET_CMPXCHG16B")])
+(define_mode_iterator CASMODE
+ [QI HI SI (DI "TARGET_64BIT || TARGET_CMPXCHG8B")
+ (TI "TARGET_64BIT && TARGET_CMPXCHG16B")])
(define_mode_iterator DCASMODE
[(DI "!TARGET_64BIT && TARGET_CMPXCHG8B && !flag_pic")
(TI "TARGET_64BIT && TARGET_CMPXCHG16B")])
@@ -105,21 +101,21 @@
})
(define_insn "*sync_compare_and_swap<mode>"
- [(set (match_operand:IMODE 0 "register_operand" "=a")
- (match_operand:IMODE 1 "memory_operand" "+m"))
+ [(set (match_operand:SWI 0 "register_operand" "=a")
+ (match_operand:SWI 1 "memory_operand" "+m"))
(set (match_dup 1)
- (unspec_volatile:IMODE
+ (unspec_volatile:SWI
[(match_dup 1)
- (match_operand:IMODE 2 "register_operand" "a")
- (match_operand:IMODE 3 "register_operand" "<modeconstraint>")]
+ (match_operand:SWI 2 "register_operand" "a")
+ (match_operand:SWI 3 "register_operand" "<r>")]
UNSPECV_CMPXCHG))
(set (reg:CCZ FLAGS_REG)
(compare:CCZ
- (unspec_volatile:IMODE
+ (unspec_volatile:SWI
[(match_dup 1) (match_dup 2) (match_dup 3)] UNSPECV_CMPXCHG)
(match_dup 2)))]
"TARGET_CMPXCHG"
- "lock{%;| }cmpxchg{<modesuffix>}\t{%3, %1|%1, %3}")
+ "lock{%;| }cmpxchg{<imodesuffix>}\t{%3, %1|%1, %3}")
(define_insn "sync_double_compare_and_swap<mode>"
[(set (match_operand:DCASMODE 0 "register_operand" "=A")
@@ -169,31 +165,31 @@
"xchg{l}\t%%ebx, %3\;lock{%;| }cmpxchg8b\t%1\;xchg{l}\t%%ebx, %3")
(define_insn "sync_old_add<mode>"
- [(set (match_operand:IMODE 0 "register_operand" "=<modeconstraint>")
- (unspec_volatile:IMODE
- [(match_operand:IMODE 1 "memory_operand" "+m")] UNSPECV_XCHG))
+ [(set (match_operand:SWI 0 "register_operand" "=<r>")
+ (unspec_volatile:SWI
+ [(match_operand:SWI 1 "memory_operand" "+m")] UNSPECV_XCHG))
(set (match_dup 1)
- (plus:IMODE (match_dup 1)
- (match_operand:IMODE 2 "register_operand" "0")))
+ (plus:SWI (match_dup 1)
+ (match_operand:SWI 2 "register_operand" "0")))
(clobber (reg:CC FLAGS_REG))]
"TARGET_XADD"
- "lock{%;| }xadd{<modesuffix>}\t{%0, %1|%1, %0}")
+ "lock{%;| }xadd{<imodesuffix>}\t{%0, %1|%1, %0}")
;; Recall that xchg implicitly sets LOCK#, so adding it again wastes space.
(define_insn "sync_lock_test_and_set<mode>"
- [(set (match_operand:IMODE 0 "register_operand" "=<modeconstraint>")
- (unspec_volatile:IMODE
- [(match_operand:IMODE 1 "memory_operand" "+m")] UNSPECV_XCHG))
+ [(set (match_operand:SWI 0 "register_operand" "=<r>")
+ (unspec_volatile:SWI
+ [(match_operand:SWI 1 "memory_operand" "+m")] UNSPECV_XCHG))
(set (match_dup 1)
- (match_operand:IMODE 2 "register_operand" "0"))]
+ (match_operand:SWI 2 "register_operand" "0"))]
""
- "xchg{<modesuffix>}\t{%1, %0|%0, %1}")
+ "xchg{<imodesuffix>}\t{%1, %0|%0, %1}")
(define_insn "sync_add<mode>"
- [(set (match_operand:IMODE 0 "memory_operand" "+m")
- (unspec_volatile:IMODE
- [(plus:IMODE (match_dup 0)
- (match_operand:IMODE 1 "nonmemory_operand" "<modeconstraint><immconstraint>"))]
+ [(set (match_operand:SWI 0 "memory_operand" "+m")
+ (unspec_volatile:SWI
+ [(plus:SWI (match_dup 0)
+ (match_operand:SWI 1 "nonmemory_operand" "<r><i>"))]
UNSPECV_LOCK))
(clobber (reg:CC FLAGS_REG))]
""
@@ -201,19 +197,19 @@
if (TARGET_USE_INCDEC)
{
if (operands[1] == const1_rtx)
- return "lock{%;| }inc{<modesuffix>}\t%0";
+ return "lock{%;| }inc{<imodesuffix>}\t%0";
if (operands[1] == constm1_rtx)
- return "lock{%;| }dec{<modesuffix>}\t%0";
+ return "lock{%;| }dec{<imodesuffix>}\t%0";
}
- return "lock{%;| }add{<modesuffix>}\t{%1, %0|%0, %1}";
+ return "lock{%;| }add{<imodesuffix>}\t{%1, %0|%0, %1}";
})
(define_insn "sync_sub<mode>"
- [(set (match_operand:IMODE 0 "memory_operand" "+m")
- (unspec_volatile:IMODE
- [(minus:IMODE (match_dup 0)
- (match_operand:IMODE 1 "nonmemory_operand" "<modeconstraint><immconstraint>"))]
+ [(set (match_operand:SWI 0 "memory_operand" "+m")
+ (unspec_volatile:SWI
+ [(minus:SWI (match_dup 0)
+ (match_operand:SWI 1 "nonmemory_operand" "<r><i>"))]
UNSPECV_LOCK))
(clobber (reg:CC FLAGS_REG))]
""
@@ -221,40 +217,20 @@
if (TARGET_USE_INCDEC)
{
if (operands[1] == const1_rtx)
- return "lock{%;| }dec{<modesuffix>}\t%0";
+ return "lock{%;| }dec{<imodesuffix>}\t%0";
if (operands[1] == constm1_rtx)
- return "lock{%;| }inc{<modesuffix>}\t%0";
+ return "lock{%;| }inc{<imodesuffix>}\t%0";
}
- return "lock{%;| }sub{<modesuffix>}\t{%1, %0|%0, %1}";
+ return "lock{%;| }sub{<imodesuffix>}\t{%1, %0|%0, %1}";
})
-(define_insn "sync_ior<mode>"
- [(set (match_operand:IMODE 0 "memory_operand" "+m")
- (unspec_volatile:IMODE
- [(ior:IMODE (match_dup 0)
- (match_operand:IMODE 1 "nonmemory_operand" "<modeconstraint><immconstraint>"))]
- UNSPECV_LOCK))
- (clobber (reg:CC FLAGS_REG))]
- ""
- "lock{%;| }or{<modesuffix>}\t{%1, %0|%0, %1}")
-
-(define_insn "sync_and<mode>"
- [(set (match_operand:IMODE 0 "memory_operand" "+m")
- (unspec_volatile:IMODE
- [(and:IMODE (match_dup 0)
- (match_operand:IMODE 1 "nonmemory_operand" "<modeconstraint><immconstraint>"))]
- UNSPECV_LOCK))
- (clobber (reg:CC FLAGS_REG))]
- ""
- "lock{%;| }and{<modesuffix>}\t{%1, %0|%0, %1}")
-
-(define_insn "sync_xor<mode>"
- [(set (match_operand:IMODE 0 "memory_operand" "+m")
- (unspec_volatile:IMODE
- [(xor:IMODE (match_dup 0)
- (match_operand:IMODE 1 "nonmemory_operand" "<modeconstraint><immconstraint>"))]
+(define_insn "sync_<code><mode>"
+ [(set (match_operand:SWI 0 "memory_operand" "+m")
+ (unspec_volatile:SWI
+ [(any_logic:SWI (match_dup 0)
+ (match_operand:SWI 1 "nonmemory_operand" "<r><i>"))]
UNSPECV_LOCK))
(clobber (reg:CC FLAGS_REG))]
""
- "lock{%;| }xor{<modesuffix>}\t{%1, %0|%0, %1}")
+ "lock{%;| }<logicprefix>{<imodesuffix>}\t{%1, %0|%0, %1}")