Mercurial > hg > CbC > CbC_gcc
diff gcc/config/s390/constraints.md @ 111:04ced10e8804
gcc 7
author | kono |
---|---|
date | Fri, 27 Oct 2017 22:46:09 +0900 |
parents | 77e2b8dfacca |
children | 84e7813d76e9 |
line wrap: on
line diff
--- a/gcc/config/s390/constraints.md Sun Aug 21 07:07:55 2011 +0900 +++ b/gcc/config/s390/constraints.md Fri Oct 27 22:46:09 2017 +0900 @@ -1,5 +1,5 @@ ;; Constraints definitions belonging to the gcc backend for IBM S/390. -;; Copyright (C) 2006, 2007, 2008 Free Software Foundation, Inc. +;; Copyright (C) 2006-2017 Free Software Foundation, Inc. ;; Written by Wolfgang Gellerich, using code and information found in ;; files s390.md, s390.h, and s390.c. ;; @@ -29,7 +29,16 @@ ;; c -- Condition code register 33. ;; d -- Any register from 0 to 15. ;; f -- Floating point registers. +;; j -- Multiple letter constraint for constant scalar and vector values +;; j00: constant zero scalar or vector +;; jm1: constant scalar or vector with all bits set +;; jxx: contiguous bitmask of 0 or 1 in all vector elements +;; jyy: constant consisting of byte chunks being either 0 or 0xff +;; jKK: constant vector with all elements having the same value and +;; matching K constraint +;; jm6: An integer operand with the lowest order 6 bits all ones. ;; t -- Access registers 36 and 37. +;; v -- Vector registers v0-v31. ;; C -- A signed 8-bit constant (-128..127) ;; D -- An unsigned 16-bit constant (0..65535) ;; G -- Const double zero operand @@ -45,6 +54,13 @@ ;; H,Q: mode of the part ;; D,S,H: mode of the containing operand ;; 0,F: value of the other parts (F - all bits set) +;; -- +;; xxDq satisfies s390_contiguous_bitmask_p for DImode +;; (with possible wraparound of the one-bit range) +;; xxSw satisfies s390_contiguous_bitmask_p for SImode +;; (with possible wraparound of the one-bit range) +;; xxSq satisfies s390_contiguous_bitmask_nowrap_p for SImode +;; (without wraparound of the one-bit range) ;; ;; The constraint matches if the specified part of a constant ;; has a value different from its other parts. If the letter x @@ -66,9 +82,9 @@ ;; B -- Multiple letter constraint followed by Q, R, S, or T: ;; Memory reference of the type specified by second letter that ;; does *not* refer to a literal pool entry. -;; U -- Pointer with short displacement. (deprecated - use ZQZR) -;; W -- Pointer with long displacement. (deprecated - use ZSZT) -;; Y -- Shift count operand. +;; U -- Pointer with short displacement. (deprecated - use ZR) +;; W -- Pointer with long displacement. (deprecated - use ZT) +;; Y -- Address style operand without index. ;; ZQ -- Pointer without index register and with short displacement. ;; ZR -- Pointer with index register and short displacement. ;; ZS -- Pointer without index register but with long displacement. @@ -107,6 +123,11 @@ Access registers 36 and 37") +(define_register_constraint "v" + "VEC_REGS" + "Vector registers v0-v31") + + ;; ;; General constraints for constants. ;; @@ -173,12 +194,12 @@ (define_address_constraint "Y" - "Shift count operand" + "Address style operand without index register" -;; Simply check for the basic form of a shift count. Reload will -;; take care of making sure we have a proper base register. +;; Simply check for base + offset style operands. Reload will take +;; care of making sure we have a proper base register. - (match_test "s390_decompose_shift_count (op, NULL, NULL)" )) + (match_test "s390_decompose_addrstyle_without_index (op, NULL, NULL)" )) ;; N -- Multiple letter constraint followed by 4 parameter letters. @@ -330,8 +351,20 @@ (and (match_code "const_int") (match_test "s390_N_constraint_str (\"xQH0\", ival)"))) +(define_constraint "NxxDw" + "@internal" + (and (match_code "const_int") + (match_test "s390_contiguous_bitmask_p (ival, true, 64, NULL, NULL)"))) +(define_constraint "NxxSq" + "@internal" + (and (match_code "const_int") + (match_test "s390_contiguous_bitmask_p (ival, false, 32, NULL, NULL)"))) +(define_constraint "NxxSw" + "@internal" + (and (match_code "const_int") + (match_test "s390_contiguous_bitmask_p (ival, true, 32, NULL, NULL)"))) ;; ;; Double-letter constraints starting with O follow. @@ -365,7 +398,43 @@ (match_test "s390_O_constraint_str ('n', ival)"))) +;; +;; Vector constraints follow. +;; +(define_constraint "j00" + "Zero scalar or vector constant" + (match_test "op == CONST0_RTX (GET_MODE (op))")) + +(define_constraint "jm1" + "All one bit scalar or vector constant" + (match_test "op == CONSTM1_RTX (GET_MODE (op))")) + +; vector generate mask operand - support for up to 64 bit elements +(define_constraint "jxx" + "@internal" + (and (match_code "const_vector") + (match_test "s390_contiguous_bitmask_vector_p (op, NULL, NULL)"))) + +; vector generate byte mask operand - this is only supposed to deal +; with real vectors 128 bit values of being either 0 or -1 are handled +; with j00 and jm1 +(define_constraint "jyy" + "@internal" + (and (match_code "const_vector") + (match_test "s390_bytemask_vector_p (op, NULL)"))) + +; vector replicate immediate operand - support for up to 64 bit elements +(define_constraint "jKK" + "@internal" + (and (and (and (match_code "const_vector") + (match_test "const_vec_duplicate_p (op)")) + (match_test "GET_MODE_UNIT_SIZE (GET_MODE (op)) <= 8")) + (match_test "satisfies_constraint_K (XVECEXP (op, 0, 0))"))) + +(define_constraint "jm6" + "@internal An integer operand with the lowest order 6 bits all ones." + (match_operand 0 "const_int_6bitset_operand")) ;; ;; Memory constraints follow. @@ -397,21 +466,12 @@ && s390_check_symref_alignment (XEXP (op, 0), GET_MODE_SIZE (GET_MODE (op)))")) -(define_memory_constraint "e" - "Matches all memory references available on the current architecture -level. This constraint will never be used and using it in an inline -assembly is *always* a bug since there is no instruction accepting all -those addresses. It just serves as a placeholder for a generic memory -constraint." - (match_test "strict_memory_address_p (GET_MODE (op), op)")) - ; This defines 'm' as normal memory constraint. This is only possible ; since the standard memory constraint is re-defined in s390.h using ; the TARGET_MEM_CONSTRAINT macro. (define_memory_constraint "m" "Matches the most general memory address for pre-z10 machines." - (match_test "s390_mem_constraint (\"R\", op) - || s390_mem_constraint (\"T\", op)")) + (match_test "s390_mem_constraint (\"T\", op)")) (define_memory_constraint "AQ" "@internal @@ -467,12 +527,12 @@ (define_address_constraint "U" - "Pointer with short displacement. (deprecated - use ZQZR)" - (match_test "s390_mem_constraint (\"U\", op)")) + "Pointer with short displacement. (deprecated - use ZR)" + (match_test "s390_mem_constraint (\"ZR\", op)")) (define_address_constraint "W" - "Pointer with long displacement. (deprecated - use ZSZT)" - (match_test "s390_mem_constraint (\"W\", op)")) + "Pointer with long displacement. (deprecated - use ZT)" + (match_test "s390_mem_constraint (\"ZT\", op)")) (define_address_constraint "ZQ"