rt_gccstream/gcc/config/spu/constraints.md

180 lines
6.9 KiB
Markdown
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

;; Constraint definitions for SPU
;; Copyright (C) 2006, 2007 Free Software Foundation, Inc.
;;
;; This file 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 of the License, or (at your option)
;; any later version.
;; This file 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/>.
;; ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
;; GCC: ffffiiiiiiii x x x x xxxx xx
;; SPU: xxxx xxx xxxx xxxx x xxx xx x xxx xx
;; FREE: ffff i a a a a a aa aaa
;; x - used
;; a - available
;; i - available for integer immediates
;; f - available for floating point immediates
;; For most immediate constraints we have 3 variations to deal with the
;; fact const_int has no mode. One variation treats const_int as 32 bit,
;; another treats it as 64 bit, and the third sign extends it to 128 bit.
(define_constraint "A"
"An immediate which can be loaded with the il/ila/ilh/ilhu instructions. const_int is treated as a 32-bit value."
(ior (and (match_code "const_int,const_double,const_vector")
(match_test "immediate_load_p (op, SImode)"))
(match_code "symbol_ref,label_ref,high,const")))
(define_constraint "B"
"An immediate for arithmetic instructions (e.g., ai, ceqi). const_int is treated as a 32-bit value."
(and (match_code "const_int,const_double,const_vector")
(match_test "arith_immediate_p (op, SImode, -0x200, 0x1ff)")))
(define_constraint "C"
"An immediate for and/xor/or instructions. const_int is treated as a 32-bit value."
(and (match_code "const_int,const_double,const_vector")
(match_test "logical_immediate_p (op, SImode)")))
(define_constraint "D"
"An immediate for iohl instruction. const_int is treated as a 32-bit value."
(and (match_code "const_int,const_double,const_vector")
(match_test "iohl_immediate_p (op, SImode)")))
(define_constraint "U"
"An immediate which can be loaded with the il/ila/ilh/ilhu instructions. const_int is sign extended to 128 bit."
(and (match_code "const_int,const_double,const_vector")
(match_test "immediate_load_p (op, TImode)")))
(define_constraint "W"
"An immediate for shift and rotate instructions. const_int is treated as a 32-bit value."
(and (match_code "const_int,const_double,const_vector")
(match_test "arith_immediate_p (op, SImode, -0x80000000ll, 0x7fffffffll)")))
(define_constraint "Y"
"An immediate for and/xor/or instructions. const_int is sign extended as a 128 bit."
(and (match_code "const_int,const_double,const_vector")
(match_test "logical_immediate_p (op, TImode)")))
(define_constraint "Z"
"An immediate for iohl instruction. const_int is sign extended to 128 bit."
(and (match_code "const_int,const_double,const_vector")
(match_test "iohl_immediate_p (op, TImode)")))
(define_constraint "a"
"An immediate which can be loaded with the il/ila/ilh/ilhu instructions. const_int is treated as a 64-bit value."
(and (match_code "const_int")
(match_test "immediate_load_p (op, DImode)")))
(define_constraint "c"
"An immediate for and/xor/or instructions. const_int is treated as a 64-bit value."
(and (match_code "const_int")
(match_test "logical_immediate_p (op, DImode)")))
(define_constraint "d"
"An immediate for iohl instruction. const_int is treated as a 64-bit value."
(and (match_code "const_int")
(match_test "iohl_immediate_p (op, DImode)")))
(define_constraint "f"
"An immediate which can be loaded with fsmbi."
(and (match_code "const_int,const_double,const_vector")
(match_test "fsmbi_const_p (op)")))
(define_constraint "j"
"An immediate which can be loaded with one of the cbd/chd/cwd/cdd instructions. const_int is treated as a 32-bit value."
(and (match_code "const_int,const_double,const_vector")
(match_test "cpat_const_p (op, SImode)")))
(define_constraint "k"
"An immediate which can be loaded with one of the cbd/chd/cwd/cdd instructions. const_int is treated as a 64-bit value."
(and (match_code "const_int,const_double,const_vector")
(match_test "cpat_const_p (op, DImode)")))
(define_constraint "l"
"An immediate which can be loaded with one of the cbd/chd/cwd/cdd instructions."
(and (match_code "const_double,const_vector")
(match_test "cpat_const_p (op, TImode)")))
;; Integer constraints
(define_constraint "I"
"A constant in the range [-64, 63] for shift/rotate instructions."
(and (match_code "const_int")
(match_test "ival >= -0x40 && ival <= 0x3f")))
(define_constraint "J"
"An unsigned 7-bit constant for conversion/nop/channel instructions."
(and (match_code "const_int")
(match_test "ival >= 0 && ival <= 0x7f")))
(define_constraint "K"
"A signed 10-bit constant for most arithmetic instructions."
(and (match_code "const_int")
(match_test "ival >= -0x200 && ival <= 0x1ff")))
(define_constraint "M"
"A signed 16-bit immediate for @code{stop}."
(and (match_code "const_int")
(match_test "ival >= -0x8000ll && ival <= 0x7fffll")))
(define_constraint "N"
"An unsigned 16-bit constant for @code{iohl} and @code{fsmbi}."
(and (match_code "const_int")
(match_test "ival >= 0 && ival <= 0xffff")))
(define_constraint "O"
"An unsigned 7-bit constant whose 3 least significant bits are 0."
(and (match_code "const_int")
(match_test "(ival & 7) == 0")))
(define_constraint "P"
"An unsigned 3-bit constant for 16-byte rotates and shifts"
(and (match_code "const_int")
(match_test "ival >= 0 && ival <= 7")))
;; Memory constraints
(define_memory_constraint "R"
"Call operand, reg, for indirect calls"
(and (match_code "mem")
(match_test "GET_CODE(XEXP(op, 0)) == REG")))
(define_memory_constraint "S"
"Call operand, symbol, for relative calls."
(and (match_code "mem")
(match_test "!TARGET_LARGE_MEM
&& ((GET_CODE (XEXP (op, 0)) == SYMBOL_REF
|| GET_CODE (XEXP (op, 0)) == LABEL_REF))")))
(define_memory_constraint "T"
"Call operand, const_int, for absolute calls."
(and (match_code "mem")
(match_test "GET_CODE (XEXP (op, 0)) == CONST_INT
&& INTVAL (XEXP (op, 0)) >= 0
&& INTVAL (XEXP (op, 0)) <= 0x3ffff")))
;; Floating-point constant constraints.
(define_constraint "v"
"Floating point power of 2 with exponent in [0..127]"
(and (match_code "const_double,const_vector")
(match_test "exp2_immediate_p (op, VOIDmode, 0, 127)")))
(define_constraint "w"
"Floating point power of 2 with exponent in [-126..0]"
(and (match_code "const_double,const_vector")
(match_test "exp2_immediate_p (op, VOIDmode, -126, 0)")))