1;; Predicate definitions for FT32 2;; Copyright (C) 2015-2017 Free Software Foundation, Inc. 3;; Contributed by FTDI <support@ftdi.com> 4 5;; This file is part of GCC. 6 7;; GCC is free software; you can redistribute it and/or modify it 8;; under the terms of the GNU General Public License as published 9;; by the Free Software Foundation; either version 3, or (at your 10;; option) any later version. 11 12;; GCC is distributed in the hope that it will be useful, but WITHOUT 13;; ANY WARRANTY; without even the implied warranty of MERCHANTABILITY 14;; or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public 15;; License for more details. 16 17;; You should have received a copy of the GNU General Public License 18;; along with GCC; see the file COPYING3. If not see 19;; <http://www.gnu.org/licenses/>. 20 21;; ------------------------------------------------------------------------- 22;; Predicates 23;; ------------------------------------------------------------------------- 24 25;; Nonzero if OP can be source of a simple move operation. 26 27(define_predicate "ft32_general_movsrc_operand" 28 (match_code "mem,const_int,reg,subreg,symbol_ref,label_ref,const") 29{ 30 /* Any (MEM LABEL_REF) is OK. That is a pc-relative load. */ 31 if (MEM_P (op) && GET_CODE (XEXP (op, 0)) == LABEL_REF) 32 return 1; 33 34 if (MEM_P (op) 35 && GET_CODE (XEXP (op, 0)) == PLUS 36 && GET_CODE (XEXP (XEXP (op, 0), 0)) == REG 37 && GET_CODE (XEXP (XEXP (op, 0), 1)) == CONST) 38 return 1; 39 40 return general_operand (op, mode); 41}) 42 43(define_predicate "ft32_general_movdst_operand" 44 (match_code "mem,const_int,reg,subreg,symbol_ref,label_ref,const") 45{ 46 if (MEM_P (op) 47 && GET_CODE (XEXP (op, 0)) == PLUS 48 && GET_CODE (XEXP (XEXP (op, 0), 0)) == REG 49 && CONST_INT_P (XEXP (XEXP (op, 0), 1))) 50 return 1; 51 if (MEM_P (op) && GET_CODE (XEXP (op, 0)) == SYMBOL_REF) 52 return 1; 53 return REG_P(op) || 54 (MEM_P(op) && REG_P(XEXP (op, 0))); 55}) 56 57(define_predicate "reg_indirect" 58 (match_code "mem") 59{ 60 return (MEM_P(op) && REG_P(XEXP (op, 0))); 61}) 62 63;; Nonzero if OP can be an operand to an add/inc/dec instruction. 64 65(define_predicate "ft32_add_operand" 66 (ior (match_code "reg") 67 (and (match_code "const_int") 68 (match_test "IN_RANGE (INTVAL (op), -32768, 32767)")))) 69 70;; Nonzero if OP can be an operand to an sub/dec instruction. 71 72(define_predicate "ft32_sub_operand" 73 (ior (match_code "reg") 74 (and (match_code "const_int") 75 (match_test "IN_RANGE (INTVAL (op), -32767, 32768)")))) 76 77 78(define_predicate "ft32_rimm_operand" 79 (ior (match_code "reg") 80 (and (match_code "const_int") 81 (match_test "IN_RANGE (INTVAL (op), -512, 511)")))) 82 83(define_predicate "ft32_imm_operand" 84 (and (match_code "const_int") 85 (match_test "IN_RANGE (INTVAL (op), -512, 511)"))) 86 87(define_predicate "ft32_bwidth_operand" 88 (and (match_code "const_int") 89 (match_test "IN_RANGE (INTVAL (op), 1, 16)"))) 90