aboutsummaryrefslogtreecommitdiffstats
path: root/gcc-4.9/gcc/config/mmix/constraints.md
diff options
context:
space:
mode:
Diffstat (limited to 'gcc-4.9/gcc/config/mmix/constraints.md')
-rw-r--r--gcc-4.9/gcc/config/mmix/constraints.md116
1 files changed, 116 insertions, 0 deletions
diff --git a/gcc-4.9/gcc/config/mmix/constraints.md b/gcc-4.9/gcc/config/mmix/constraints.md
new file mode 100644
index 000000000..2911cae14
--- /dev/null
+++ b/gcc-4.9/gcc/config/mmix/constraints.md
@@ -0,0 +1,116 @@
+;; MMIX constraints
+;; Copyright (C) 2012-2014 Free Software Foundation, Inc.
+;;
+;; This file is part of GCC.
+;;
+;; GCC is free software; you can redistribute it and/or modify it
+;; under the terms of the GNU General Public License as published by
+;; the Free Software Foundation; either version 3, or (at your option)
+;; any later version.
+;;
+;; GCC is distributed in the hope that it will be useful, but WITHOUT
+;; ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+;; or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
+;; License for more details.
+;;
+;; You should have received a copy of the GNU General Public License
+;; along with GCC; see the file COPYING3. If not see
+;; <http://www.gnu.org/licenses/>. */
+
+(define_register_constraint "x" "SYSTEM_REGS"
+ "@internal")
+
+(define_register_constraint "y" "REMAINDER_REG"
+ "@internal")
+
+(define_register_constraint "z" "HIMULT_REG"
+ "@internal")
+
+(define_constraint "I"
+ "A 8-bit unsigned integer"
+ (and (match_code "const_int")
+ (match_test "IN_RANGE (ival, 0, 255)")))
+
+(define_constraint "J"
+ "A 16-bit unsigned integer."
+ (and (match_code "const_int")
+ (match_test "IN_RANGE (ival, 0, 65535)")))
+
+(define_constraint "K"
+ "An integer between -255 and 0."
+ (and (match_code "const_int")
+ (match_test "IN_RANGE (ival, -255, 0)")))
+
+(define_constraint "L"
+ "@internal"
+ (and (match_code "const_int")
+ (match_test "mmix_shiftable_wyde_value (ival)")))
+
+(define_constraint "M"
+ "The value 0."
+ (and (match_code "const_int")
+ (match_test "ival == 0")))
+
+(define_constraint "N"
+ "@internal"
+ (and (match_code "const_int")
+ (match_test "mmix_shiftable_wyde_value (~ival)")))
+
+(define_constraint "O"
+ "The value 3, 5, 9, or 17."
+ (and (match_code "const_int")
+ (ior (match_test "ival == 3")
+ (match_test "ival == 5")
+ (match_test "ival == 9")
+ (match_test "ival == 17"))))
+
+;; FIXME: M (or G) is redundant.
+
+(define_constraint "G"
+ "Floating-point zero."
+ (and (match_code "const_double")
+ (match_test "op == CONST0_RTX (mode)")))
+
+;; R asks whether x is to be loaded with GETA or something else. Right
+;; now, only a SYMBOL_REF and LABEL_REF can fit for
+;; TARGET_BASE_ADDRESSES.
+;;
+;; Only constant symbolic addresses apply. With TARGET_BASE_ADDRESSES,
+;; we just allow straight LABEL_REF or SYMBOL_REFs with SYMBOL_REF_FLAG
+;; set right now; only function addresses and code labels. If we change
+;; to let SYMBOL_REF_FLAG be set on other symbols, we have to check
+;; inside CONST expressions. When TARGET_BASE_ADDRESSES is not in
+;; effect, a "raw" constant check together with mmix_constant_address_p
+;; is all that's needed; we want all constant addresses to be loaded
+;; with GETA then.
+
+(define_constraint "R"
+ "@internal"
+ (and (not (match_code "const_int,const_double"))
+ (match_test "mmix_constant_address_p (op)")
+ (ior (match_test "!TARGET_BASE_ADDRESSES")
+ (match_code "LABEL_REF")
+ (and (match_code "SYMBOL_REF")
+ (match_test "SYMBOL_REF_FLAG (op)")))))
+
+;; FIXME: L (or S) is redundant.
+
+(define_constraint "S"
+ "@internal"
+ (and (match_code "const_int,const_double")
+ (match_test "mmix_shiftable_wyde_value (mmix_intval (op))")))
+
+;; FIXME: N (or T) is redundant.
+
+(define_constraint "T"
+ "@internal"
+ (and (match_code "const_int,const_double")
+ (match_test "mmix_shiftable_wyde_value (~mmix_intval (op))")))
+
+(define_address_constraint "U"
+ "@internal"
+ (match_operand 0 "mmix_address_operand"))
+
+(define_constraint "Yf"
+ "@internal"
+ (match_operand 0 "frame_pointer_operand"))