|
DataMuseum.dkPresents historical artifacts from the history of: DKUUG/EUUG Conference tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about DKUUG/EUUG Conference tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - downloadIndex: T m
Length: 56867 (0xde23) Types: TextFile Names: »m88k.md«
└─⟦a05ed705a⟧ Bits:30007078 DKUUG GNU 2/12/89 └─⟦d53cfc7b2⟧ »./gcc-1.35.tar.Z« └─⟦90f628c1d⟧ └─⟦this⟧ »gcc-1.35/config/m88k.md«
;;- Machine description for the Motorola 88000 for GNU C compiler ;; Copyright (C) 1988 Free Software Foundation, Inc. ;; Contributed by Michael Tiemann (tiemann@mcc.com) ;; This file is part of GNU CC. ;; GNU CC 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 1, or (at your option) ;; any later version. ;; GNU CC 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 GNU CC; see the file COPYING. If not, write to ;; the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. ;;- See file "rtl.def" for documentation on define_insn, match_*, et. al. ;;- cpp macro #define NOTICE_UPDATE_CC in file tm.h handles condition code ;;- updates for most instructions. ;;- Operand classes for the register allocator: \f ;; Compare instructions. ;; This pattern is used for generating an "insn" ;; which does just a compare and sets a (fictitious) condition code. ;; The actual the m88000 insns are compare-and-conditional-jump. ;; The define_peephole's below recognize the combinations of ;; compares and jumps, and output each pair as a single assembler insn. ;; This controls RTL generation and register allocation. (define_insn "cmpsi" [(set (cc0) (compare (match_operand:SI 0 "arith_operand" "rI") (match_operand:SI 1 "arith_operand" "rI")))] "" "* { if (GET_CODE (operands[0]) == CONST_INT) { cc_status.flags |= CC_REVERSED; return \"cmp r25,%1,%0\"; } return \"cmp r25,%0,%1\"; }") (define_insn "cmpdf" [(set (cc0) (compare (match_operand:DF 0 "nonmemory_operand" "rG") (match_operand:DF 1 "nonmemory_operand" "rG")))] "" "* { if (GET_CODE (operands[0]) == CONST_DOUBLE) { cc_status.flags |= CC_REVERSED | CC_IN_FCCR; return \"fcmp.sdd r25,%1,%0\"; } cc_status.flags |= CC_IN_FCCR; return \"fcmp.sdd r25,%0,%1\"; }") (define_insn "cmpsf" [(set (cc0) (compare (match_operand:SF 0 "nonmemory_operand" "rG") (match_operand:SF 1 "nonmemory_operand" "rG")))] "" "* { if (GET_CODE (operands[0]) == CONST_DOUBLE) { cc_status.flags |= CC_REVERSED | CC_IN_FCCR; return \"fcmp.sss r25,%1,%0\"; } cc_status.flags |= CC_IN_FCCR; return \"fcmp.sss r25,%0,%1\"; }") ;; We have to have this because cse can optimize the previous pattern ;; into this one. (define_insn "tstsi" [(set (cc0) (match_operand:SI 0 "register_operand" "r"))] "" "cmp r25,%0,0") (define_insn "tstdf" [(set (cc0) (match_operand:DF 0 "register_operand" "r"))] "" "* { cc_status.flags |= CC_IN_FCCR; return \"fcmp.sds r25,%0,r0\"; }") (define_insn "tstsf" [(set (cc0) (match_operand:SF 0 "register_operand" "r"))] "" "* { cc_status.flags |= CC_IN_FCCR; return \"fcmp.sss r25,%0,r0\"; }") ;; These control RTL generation for conditional jump insns ;; and match them for register allocation. (define_insn "beq" [(set (pc) (if_then_else (eq (cc0) (const_int 0)) (label_ref (match_operand 0 "" "")) (pc)))] "" "bb1 eq,r25,%l0") (define_peephole [(set (cc0) (match_operand:SI 0 "register_operand" "r")) (set (pc) (if_then_else (eq (cc0) (const_int 0)) (label_ref (match_operand 1 "" "")) (pc)))] "" "* { CC_STATUS_INIT; return \"bcnd eq0,%0,%l1\"; }") (define_insn "bne" [(set (pc) (if_then_else (ne (cc0) (const_int 0)) (label_ref (match_operand 0 "" "")) (pc)))] "" "bb1 ne,r25,%l0") (define_peephole [(set (cc0) (match_operand:SI 0 "register_operand" "r")) (set (pc) (if_then_else (ne (cc0) (const_int 0)) (label_ref (match_operand 1 "" "")) (pc)))] "" "* { CC_STATUS_INIT; return \"bcnd ne0,%0,%l1\"; }") (define_insn "bgt" [(set (pc) (if_then_else (gt (cc0) (const_int 0)) (label_ref (match_operand 0 "" "")) (pc)))] "" "bb1 gt,r25,%l0") (define_insn "bgtu" [(set (pc) (if_then_else (gtu (cc0) (const_int 0)) (label_ref (match_operand 0 "" "")) (pc)))] "" "bb1 hi,r25,%l0") (define_insn "blt" [(set (pc) (if_then_else (lt (cc0) (const_int 0)) (label_ref (match_operand 0 "" "")) (pc)))] "" "bb1 lt,r25,%l0") (define_insn "bltu" [(set (pc) (if_then_else (ltu (cc0) (const_int 0)) (label_ref (match_operand 0 "" "")) (pc)))] "" "bb1 lo,r25,%l0") (define_insn "bge" [(set (pc) (if_then_else (ge (cc0) (const_int 0)) (label_ref (match_operand 0 "" "")) (pc)))] "" "bb1 ge,r25,%l0") (define_insn "bgeu" [(set (pc) (if_then_else (geu (cc0) (const_int 0)) (label_ref (match_operand 0 "" "")) (pc)))] "" "bb1 hs,r25,%l0") (define_insn "ble" [(set (pc) (if_then_else (le (cc0) (const_int 0)) (label_ref (match_operand 0 "" "")) (pc)))] "" "bb1 le,r25,%l0") (define_insn "bleu" [(set (pc) (if_then_else (leu (cc0) (const_int 0)) (label_ref (match_operand 0 "" "")) (pc)))] "" "bb1 ls,r25,%l0") \f ;; These match inverted jump insns for register allocation. (define_insn "" [(set (pc) (if_then_else (eq (cc0) (const_int 0)) (pc) (label_ref (match_operand 0 "" ""))))] "" "bb0 eq,r25,%l0") (define_peephole [(set (cc0) (match_operand:SI 0 "register_operand" "r")) (set (pc) (if_then_else (eq (cc0) (const_int 0)) (pc) (label_ref (match_operand 1 "" ""))))] "" "* { CC_STATUS_INIT; return \"bcnd ne0,%0,%l1\"; }") (define_insn "" [(set (pc) (if_then_else (ne (cc0) (const_int 0)) (pc) (label_ref (match_operand 0 "" ""))))] "" "bb0 ne,r25,%l0") (define_peephole [(set (cc0) (match_operand:SI 0 "register_operand" "r")) (set (pc) (if_then_else (ne (cc0) (const_int 0)) (pc) (label_ref (match_operand 1 "" ""))))] "" "* { CC_STATUS_INIT; return \"bcnd eq0,%0,%l1\"; }") (define_insn "" [(set (pc) (if_then_else (gt (cc0) (const_int 0)) (pc) (label_ref (match_operand 0 "" ""))))] "" "bb0 gt,r25,%l0") (define_insn "" [(set (pc) (if_then_else (gtu (cc0) (const_int 0)) (pc) (label_ref (match_operand 0 "" ""))))] "" "bb0 hi,r25,%l0") (define_insn "" [(set (pc) (if_then_else (lt (cc0) (const_int 0)) (pc) (label_ref (match_operand 0 "" ""))))] "" "bb0 lt,r25,%l0") (define_insn "" [(set (pc) (if_then_else (ltu (cc0) (const_int 0)) (pc) (label_ref (match_operand 0 "" ""))))] "" "bb0 lo,r25,%l0") (define_insn "" [(set (pc) (if_then_else (ge (cc0) (const_int 0)) (pc) (label_ref (match_operand 0 "" ""))))] "" "bb0 ge,r25,%l0") (define_insn "" [(set (pc) (if_then_else (geu (cc0) (const_int 0)) (pc) (label_ref (match_operand 0 "" ""))))] "" "bb0 hs,r25,%l0") (define_insn "" [(set (pc) (if_then_else (le (cc0) (const_int 0)) (pc) (label_ref (match_operand 0 "" ""))))] "" "bb0 le,r25,%l0") (define_insn "" [(set (pc) (if_then_else (leu (cc0) (const_int 0)) (pc) (label_ref (match_operand 0 "" ""))))] "" "bb0 ls,r25,%l0") \f ;; Move instructions (define_insn "swapsi" [(set (match_operand:SI 0 "general_operand" "g") (match_operand:SI 1 "general_operand" "g")) (set (match_dup 1) (match_dup 0))] "" "* { if (GET_CODE (operands[0]) == MEM && GET_CODE (operands[1]) == MEM) { CC_STATUS_INIT; return \"ld r25,%0\;xmem r25,%1\;st r25,%0\"; } if (! REG_P (operands[1])) return \"xmem %0,%1\"; if (REG_P (operands[0])) { if (REGNO (operands[0]) == REGNO (operands[1])) return \"\"; return \"xor %0,%0,%1\;xor %1,%1,%0\;xor %0,%0,%1\"; } return \"xmem %1,%0\"; }") (define_peephole [(set (match_operand:SI 0 "register_operand" "=r") (match_operand:SI 1 "memory_operand" "m")) (set (match_operand:SI 2 "register_operand" "=r") (match_operand:SI 3 "memory_operand" "m")) (set (match_dup 1) (match_dup 2)) (set (match_dup 3) (match_dup 0))] "" "* { CC_STATUS_INIT; return \"ld r25,%1\;xmem r25,%3\;st r25,%1\"; }") (define_insn "swapqi" [(set (match_operand:QI 0 "general_operand" "g") (match_operand:QI 1 "general_operand" "g")) (set (match_dup 1) (match_dup 0))] "" "* { if (GET_CODE (operands[0]) == MEM && GET_CODE (operands[1]) == MEM) { CC_STATUS_INIT; return \"ld.bu r25,%0\;xmem.bu r25,%1\;st.bu r25,%0\"; } if (! REG_P (operands[1])) return \"xmem.bu %0,%1\"; if (REG_P (operands[0])) { if (REGNO (operands[0]) == REGNO (operands[1])) return \"\"; return \"xor %0,%0,%1\;xor %1,%1,%0\;xor %0,%0,%1\"; } return \"xmem.bu %1,%0\"; }") (define_peephole [(set (match_operand:QI 0 "register_operand" "=r") (match_operand:QI 1 "memory_operand" "m")) (set (match_operand:QI 2 "register_operand" "=r") (match_operand:QI 3 "memory_operand" "m")) (set (match_dup 1) (match_dup 2)) (set (match_dup 3) (match_dup 0))] "" "* { CC_STATUS_INIT; return \"ld.bu r25,%1\;xmem.bu r25,%3\;st.bu r25,%1\"; }") (define_insn "" [(set (match_operand:SI 0 "general_operand" "g") (const_int 0))] "" "* { if (REG_P (operands[0])) return \"or %0,r0,0\"; return \"st r0,%0\"; }") (define_insn "movsi" [(set (match_operand:SI 0 "general_operand" "=g,r") (match_operand:SI 1 "general_operand" "r,mi"))] "" "* { if (REG_P (operands[0])) { if (GET_CODE (operands[1]) == MEM) return \"ld %0,%1\"; if (GET_CODE (operands[1]) == CONST_INT) return output_store_const_int (SImode, operands); if (GET_CODE (operands[1]) == LABEL_REF || GET_CODE (operands[1]) == SYMBOL_REF) return \"lda %0,r0,%1\"; return \"or %0,r0,%1\"; } return \"st %1,%0\"; }") ;; Simulate pre inc. Post inc/dec is automatically optimized ;; by sheer luck. ?? In which phase should this really be done?? (define_insn "" [(set (match_operand:SI 0 "register_operand" "r") (mem:SI (plus:SI (match_operand:SI 1 "register_operand" "r") (match_operand:SI 2 "arith_operand" "rI")))) (set (match_dup 1) (plus:SI (match_dup 1) (match_dup 2)))] "" "ld %0,%1,%2\\t;; pipelined!\;addu %1,%1,%2\\t;; /") (define_insn "" [(set (mem:SI (plus:SI (match_operand:SI 0 "register_operand" "r") (match_operand:SI 1 "arith_operand" "rI"))) (match_operand:SI 2 "register_operand" "r")) (set (match_dup 0) (plus:SI (match_dup 0) (match_dup 1)))] "" "st %2,%0,%1\\t;; pipelined!\;addu %0,%0,%1\\t;; /") (define_insn "" [(set (match_operand:HI 0 "general_operand" "g") (const_int 0))] "" "* { if (REG_P (operands[0])) return \"or %0,r0,0\"; return \"st.h r0,%0\"; }") (define_insn "movhi" [(set (match_operand:HI 0 "general_operand" "=g,r") (match_operand:HI 1 "general_operand" "r,mn"))] "" "* { if (REG_P (operands[0])) { if (GET_CODE (operands[1]) == MEM) return \"ld.h %0,%1\"; if (GET_CODE (operands[1]) == CONST_INT) return output_store_const_int (HImode, operands); return \"or %0,r0,%1\"; } return \"st.h %1,%0\"; }") (define_insn "" [(set (match_operand:SI 0 "register_operand" "r") (sign_extend:SI (mem:HI (plus:SI (match_operand:SI 1 "register_operand" "r") (match_operand:SI 2 "arith_operand" "rI"))))) (set (match_dup 1) (plus:SI (match_dup 1) (match_dup 2)))] "" "ld.h %0,%1,%2\\t;; pipelined!\;addu %1,%1,%2\\t;; /") (define_insn "" [(set (match_operand:SI 0 "register_operand" "r") (zero_extend:SI (mem:HI (plus:SI (match_operand:SI 1 "register_operand" "r") (match_operand:SI 2 "arith_operand" "rI"))))) (set (match_dup 1) (plus:SI (match_dup 1) (match_dup 2)))] "" "ld.hu %0,%1,%2\\t;; pipelined!\;addu %1,%1,%2\\t;; /") (define_insn "" [(set (mem:HI (plus:SI (match_operand:SI 0 "register_operand" "r") (match_operand:SI 1 "arith_operand" "rI"))) (match_operand:SI 2 "register_operand" "r")) (set (match_dup 0) (plus:SI (match_dup 0) (match_dup 1)))] "" "st.h %2,%0,%1\\t;; pipelined!\;addu %0,%0,%1\\t;; /") (define_insn "" [(set (match_operand:QI 0 "general_operand" "g") (const_int 0))] "" "* { if (REG_P (operands[0])) return \"or %0,r0,0\"; return \"st.b r0,%0\"; }") (define_insn "movqi" [(set (match_operand:QI 0 "general_operand" "=g,r") (match_operand:QI 1 "general_operand" "r,mn"))] "" "* { if (REG_P (operands[0])) { if (GET_CODE (operands[1]) == MEM) return \"ld.b %0,%1\"; if (GET_CODE (operands[1]) == CONST_INT) return output_store_const_int (QImode, operands); return \"or %0,r0,%1\"; } return \"st.b %1,%0\"; }") (define_insn "" [(set (match_operand:SI 0 "register_operand" "r") (sign_extend:SI (mem:QI (plus:SI (match_operand:SI 1 "register_operand" "r") (match_operand:SI 2 "arith_operand" "rI"))))) (set (match_dup 1) (plus:SI (match_dup 1) (match_dup 2)))] "" "ld.b %0,%1,%2\\t;; pipelined!\;addu %1,%1,%2\\t;; /") (define_insn "" [(set (match_operand:SI 0 "register_operand" "r") (zero_extend:SI (mem:QI (plus:SI (match_operand:SI 1 "register_operand" "r") (match_operand:SI 2 "arith_operand" "rI"))))) (set (match_dup 1) (plus:SI (match_dup 1) (match_dup 2)))] "" "ld.bu %0,%1,%2\\t;; pipelined!\;addu %1,%1,%2\\t;; /") (define_insn "" [(set (mem:QI (plus:SI (match_operand:SI 0 "register_operand" "r") (match_operand:SI 1 "arith_operand" "rI"))) (match_operand:SI 2 "register_operand" "r")) (set (match_dup 0) (plus:SI (match_dup 0) (match_dup 1)))] "" "st.b %2,%0,%1\\t;; pipelined!\;addu %0,%0,%1\\t;; /") ;; The definition of this insn does not really explain what it does, ;; but it should suffice ;; that anything generated as this insn will be recognized as one ;; and that it won't successfully combine with anything. (define_insn "movstrsi" [(set (match_operand:BLK 0 "general_operand" "=g") (match_operand:BLK 1 "general_operand" "g")) (use (match_operand:SI 2 "arith32_operand" "rn")) (clobber (reg:SI 10)) (clobber (reg:SI 11)) (clobber (reg:SI 12))] "" "* output_block_move (operands);") \f ;; This pattern forces (set (reg:DF ...) (const_double ...)) ;; to be reloaded by putting the constant into memory. ;; It must come before the more general movdf pattern. (define_insn "" [(set (match_operand:DF 0 "general_operand" "=r,o") (match_operand:DF 1 "" "mG,G"))] "GET_CODE (operands[1]) == CONST_DOUBLE" "* { if (operands[1] == dconst0_rtx && GET_CODE (operands[0]) == REG) { operands[1] = gen_rtx (REG, SImode, REGNO (operands[0]) + 1); return \"add %0,r0,0\;add %1,r0,0\"; } if (operands[1] == dconst0_rtx && GET_CODE (operands[0]) == MEM) { operands[1] = adj_offsetable_operand (operands[0], 4); return \"st r0,%0\;st r0,%1\"; } return output_move_double (operands); } ") (define_insn "movdf" [(set (match_operand:DF 0 "general_operand" "=r,m") (match_operand:DF 1 "general_operand" "rm,r"))] "" "* return output_move_double (operands);") (define_insn "movdi" [(set (match_operand:DI 0 "general_operand" "=r,m") (match_operand:DI 1 "general_operand" "rm,r"))] "" "* return output_move_double (operands);") (define_insn "movsf" [(set (match_operand:SF 0 "general_operand" "=g,r") (match_operand:SF 1 "general_operand" "r,mF"))] "" "* { if (REG_P (operands[0])) { if (GET_CODE (operands[1]) == MEM) return \"ld %0,%1\"; if (GET_CODE (operands[1]) == CONST_DOUBLE) return output_store_const_float (SFmode, operands); return \"or %0,r0,%1\"; } return \"st %1,%0\"; }") \f ;;- load effective address (define_insn "" [(set (match_operand:SI 0 "register_operand" "=r") (match_operand:QI 1 "address_operand" "p"))] "" "lda.b %0,%a1") (define_insn "" [(set (match_operand:SI 0 "register_operand" "=r") (match_operand:HI 1 "address_operand" "p"))] "" "lda.w %0,%a1") (define_insn "" [(set (match_operand:SI 0 "register_operand" "=r") (match_operand:SI 1 "address_operand" "p"))] "" "lda %0,%a1") (define_insn "" [(set (match_operand:SI 0 "register_operand" "=r") (match_operand:DI 1 "address_operand" "p"))] "" "lda.d %0,%a1") (define_insn "" [(set (match_operand:SI 0 "register_operand" "=r") (match_operand:SF 1 "address_operand" "p"))] "" "lda %0,%a1") (define_insn "" [(set (match_operand:SI 0 "register_operand" "=r") (match_operand:DF 1 "address_operand" "p"))] "" "lda.d %0,%a1") \f ;;- truncation instructions (define_insn "truncsiqi2" [(set (match_operand:QI 0 "general_operand" "=g") (truncate:QI (match_operand:SI 1 "register_operand" "r")))] "" "* { if (GET_CODE (operands[0]) == MEM) return \"st.b %1,%0\"; return \"or %0,r0,%1\"; }") (define_insn "trunchiqi2" [(set (match_operand:QI 0 "general_operand" "=g") (truncate:QI (match_operand:HI 1 "register_operand" "r")))] "" "* { if (GET_CODE (operands[0]) == MEM) return \"st.b %1,%0\"; return \"or %0,r0,%1\"; }") (define_insn "truncsihi2" [(set (match_operand:HI 0 "general_operand" "=g") (truncate:HI (match_operand:SI 1 "register_operand" "r")))] "" "* { if (GET_CODE (operands[0]) == MEM) return \"st.h %1,%0\"; return \"or %0,r0,%1\"; }") \f ;;- zero extension instructions ;; Note that the one starting from HImode comes before those for QImode ;; so that a constant operand will match HImode, not QImode. (define_insn "zero_extendhisi2" [(set (match_operand:SI 0 "register_operand" "=r") (zero_extend:SI (match_operand:HI 1 "general_operand" "g")))] "" "* { if (REG_P (operands[1])) return \"mask %0,%1,0xffff\"; if (GET_CODE (operands[1]) == CONST_INT) return output_store_const_int (SImode, operands); return \"ld.hu %0,%1\"; }") (define_insn "zero_extendqihi2" [(set (match_operand:HI 0 "register_operand" "=r") (zero_extend:HI (match_operand:QI 1 "general_operand" "g")))] "" "* { if (REG_P (operands[1])) return \"mask %0,%1,0xff\"; if (GET_CODE (operands[1]) == CONST_INT) return output_store_const_int (SImode, operands); return \"ld.bu %0,%1\"; }") (define_insn "zero_extendqisi2" [(set (match_operand:SI 0 "register_operand" "=r") (zero_extend:SI (match_operand:QI 1 "general_operand" "g")))] "" "* { if (REG_P (operands[1])) return \"mask %0,%1,0xff\"; if (GET_CODE (operands[1]) == CONST_INT) return output_store_const_int (SImode, operands); return \"ld.bu %0,%1\"; }") \f ;;- sign extension instructions ;; Note that the one starting from HImode comes before those for QImode ;; so that a constant operand will match HImode, not QImode. (define_insn "extendhisi2" [(set (match_operand:SI 0 "register_operand" "=r") (sign_extend:SI (match_operand:HI 1 "general_operand" "g")))] "" "* { if (REG_P (operands[1])) return \"ext %0,%1,16<0>\"; if (GET_CODE (operands[1]) == CONST_INT) return output_store_const_int (SImode, operands); return \"ld.h %0,%1\"; }") (define_insn "extendqihi2" [(set (match_operand:HI 0 "register_operand" "=r") (sign_extend:HI (match_operand:QI 1 "general_operand" "g")))] "" "* { if (REG_P (operands[1])) return \"ext %0,%1,8<0>\"; if (GET_CODE (operands[1]) == CONST_INT) return output_store_const_int (SImode, operands); return \"ld.b %0,%1\"; }") (define_insn "extendqisi2" [(set (match_operand:SI 0 "register_operand" "=r") (sign_extend:SI (match_operand:QI 1 "general_operand" "g")))] "" "* { if (REG_P (operands[1])) return \"ext %0,%1,8<0>\"; if (GET_CODE (operands[1]) == CONST_INT) return output_store_const_int (SImode, operands); return \"ld.b %0,%1\"; }") \f ;; Conversions between float and double. (define_insn "extendsfdf2" [(set (match_operand:DF 0 "general_operand" "=r") (float_extend:DF (match_operand:SF 1 "general_operand" "r")))] "" "fadd.dss %0,r0,%1") (define_insn "truncdfsf2" [(set (match_operand:SF 0 "general_operand" "=r") (float_truncate:SF (match_operand:DF 1 "general_operand" "r")))] "" "fadd.ssd %0,r0,%1") ;; Conversions between floating point and integer (define_insn "floatsidf2" [(set (match_operand:DF 0 "general_operand" "=r") (float:DF (match_operand:SI 1 "general_operand" "r")))] "" "flt.ds %0,%1") (define_insn "floatsisf2" [(set (match_operand:SF 0 "general_operand" "=r") (float:SF (match_operand:SI 1 "general_operand" "r")))] "" "flt.ss %0,%1") (define_insn "fixdfsi2" [(set (match_operand:SI 0 "general_operand" "=r") (fix:SI (fix:DF (match_operand:DF 1 "general_operand" "r"))))] "" "int.sd %0,%1") (define_insn "fixsfsi2" [(set (match_operand:SI 0 "general_operand" "=r") (fix:SI (fix:SF (match_operand:SF 1 "general_operand" "r"))))] "" "int.ss %0,%1") \f ;;- arithmetic instructions ;;- add instructions (define_insn "addsi3" [(set (match_operand:SI 0 "register_operand" "=r") (plus:SI (match_operand:SI 1 "arith32_operand" "%r") (match_operand:SI 2 "arith32_operand" "rn")))] "" "* { unsigned int i; if (REG_P (operands[2])) return \"addu %0,%1,%2\"; i = INTVAL (operands[2]); if (INT_FITS_16_BITS (i)) return \"addu %0,%1,%2\"; if (INT_FITS_16_BITS (-i)) { operands[2] = gen_rtx (CONST_INT, VOIDmode, -i); return \"subu %0,%1,%2\"; } return \"or.u %0,r0,hi16(%2)\;or %0,%0,lo16(%2)\;addu %0,%1,%0\"; }") (define_insn "adddf3" [(set (match_operand:DF 0 "register_operand" "=r") (plus:DF (match_operand:DF 1 "register_operand" "%r") (match_operand:DF 2 "register_operand" "r")))] "" "fadd.ddd %0,%1,%2") ;; a bunch more can go in here! (define_insn "addsf3" [(set (match_operand:SF 0 "register_operand" "=r") (plus:SF (match_operand:SF 1 "register_operand" "%r") (match_operand:SF 2 "register_operand" "r")))] "" "fadd.sss %0,%1,%2") \f ;;- subtract instructions (define_insn "subsi3" [(set (match_operand:SI 0 "register_operand" "=r") (minus:SI (match_operand:SI 1 "register_operand" "r") (match_operand:SI 2 "arith32_operand" "rn")))] "" "* { unsigned int i; if (REG_P (operands[2])) return \"subu %0,%1,%2\"; i = INTVAL (operands[2]); if (INT_FITS_16_BITS (i)) return \"subu %0,%1,%2\"; if (INT_FITS_16_BITS (-i)) { operands[2] = gen_rtx (CONST_INT, VOIDmode, -i); return \"addu %0,%1,%2\"; } return \"or.u %0,r0,hi16(%2)\;or %0,%0,lo16(%2)\;subu %0,%1,%0\"; }") (define_insn "subdf3" [(set (match_operand:DF 0 "register_operand" "=r") (minus:DF (match_operand:DF 1 "register_operand" "%r") (match_operand:DF 2 "register_operand" "r")))] "" "fsub.ddd %0,%1,%2") (define_insn "subsf3" [(set (match_operand:SF 0 "register_operand" "=r") (minus:SF (match_operand:SF 1 "register_operand" "%r") (match_operand:SF 2 "register_operand" "r")))] "" "fsub.sss %0,%1,%2") \f ;;- multiply instructions (define_insn "mulsi3" [(set (match_operand:SI 0 "register_operand" "=r") (mult:SI (match_operand:SI 1 "register_operand" "%r") (match_operand:SI 2 "arith32_operand" "rn")))] "" "* { unsigned int i; if (REG_P (operands[2])) return \"mul %0,%1,%2\"; i = INTVAL (operands[2]); if (INT_FITS_16_BITS (i)) return \"mul %0,%1,%2\"; return \"or.u %0,r0,hi16(%2)\;or %0,%0,lo16(%2)\;mul %0,%1,%0\"; }") (define_insn "umulsi3" [(set (match_operand:SI 0 "register_operand" "=r") (umult:SI (match_operand:SI 1 "register_operand" "%r") (match_operand:SI 2 "arith_operand" "rI")))] "" "mul %0,%1,%2") (define_insn "muldf3" [(set (match_operand:DF 0 "register_operand" "=r") (mult:DF (match_operand:DF 1 "register_operand" "%r") (match_operand:DF 2 "register_operand" "r")))] "" "fmul.ddd %0,%1,%2") (define_insn "mulsf3" [(set (match_operand:SF 0 "register_operand" "=r") (mult:SF (match_operand:SF 1 "register_operand" "%r") (match_operand:SF 2 "register_operand" "r")))] "" "fmul.sss %0,%1,%2") \f ;;- divide instructions (define_insn "divsi3" [(set (match_operand:SI 0 "register_operand" "=r") (div:SI (match_operand:SI 1 "register_operand" "r") (match_operand:SI 2 "arith32_operand" "rn")))] "" "* { unsigned int i; if (REG_P (operands[2])) return \"div %0,%1,%2\"; i = INTVAL (operands[2]); if (INT_FITS_16_BITS (i)) return \"div %0,%1,%2\"; return \"or.u %0,r0,hi16(%2)\;or %0,%0,lo16(%2)\;div %0,%1,%0\"; }") (define_insn "udivsi3" [(set (match_operand:SI 0 "register_operand" "=r") (udiv:SI (match_operand:SI 1 "register_operand" "r") (match_operand:SI 2 "arith_operand" "rI")))] "" "div %0,%1,%2") (define_insn "divdf3" [(set (match_operand:DF 0 "register_operand" "=r") (div:DF (match_operand:DF 1 "register_operand" "r") (match_operand:DF 2 "register_operand" "r")))] "" "fdiv.ddd %0,%1,%2") (define_insn "divsf3" [(set (match_operand:SF 0 "register_operand" "=r") (div:SF (match_operand:SF 1 "register_operand" "r") (match_operand:SF 2 "register_operand" "r")))] "" "fdiv.sss %0,%1,%2") \f ;; Remainder instructions. (define_insn "modsi3" [(set (match_operand:SI 0 "register_operand" "=r") (mod:SI (match_operand:SI 1 "register_operand" "r") (match_operand:SI 2 "arith32_operand" "rn")))] "" "* { unsigned int i; if (REG_P (operands[2])) return \"div %0,%1,%2\;mul %0,%0,%2\;sub %0,%1,%0\"; i = INTVAL (operands[2]); if (INT_FITS_16_BITS (i)) return \"div %0,%1,%2\;mul %0,%0,%2\;sub %0,%1,%0\"; if (INT_FITS_16_BITS (-i)) fatal (\"implement negative case for mod\"); fatal (\"implement 32 bit case for mod\"); }") (define_insn "umodsi3" [(set (match_operand:SI 0 "register_operand" "=r") (umod:SI (match_operand:SI 1 "register_operand" "r") (match_operand:SI 2 "arith_operand" "rI")))] "" "* { unsigned int i; if (REG_P (operands[2])) return \"div %0,%1,%2\;mul %0,%0,%2\;sub %0,%1,%0\"; i = INTVAL (operands[2]); if (INT_FITS_16_BITS (i)) return \"div %0,%1,%2\;mul %0,%0,%2\;sub %0,%1,%0\"; if (INT_FITS_16_BITS (-i)) fatal (\"implement negative case for umod\"); fatal (\"implement 32 bit case for umod\"); }") (define_insn "divmodsi4" [(set (match_operand:SI 0 "register_operand" "=r") (div:SI (match_operand:SI 1 "register_operand" "r") (match_operand:SI 2 "arith_operand" "rI"))) (set (match_operand:SI 3 "register_operand" "=r") (mod:SI (match_dup 1) (match_dup 2)))] "" "div %0,%1,%2\;mul %3,%0,%2\;sub %3,%1,%3") (define_insn "udivmodsi4" [(set (match_operand:SI 0 "register_operand" "=r") (udiv:SI (match_operand:SI 1 "register_operand" "r") (match_operand:SI 2 "arith_operand" "rI"))) (set (match_operand:SI 3 "register_operand" "=r") (umod:SI (match_dup 1) (match_dup 2)))] "" "div %0,%1,%2\;mul %3,%0,%2\;sub %3,%1,%3") \f ;;- and instructions (with complement also) (define_insn "andsi3" [(set (match_operand:SI 0 "register_operand" "=r") (and:SI (match_operand:SI 1 "register_operand" "%r") (match_operand:SI 2 "arith32_operand" "rn")))] "" "* { unsigned int i; if (REG_P (operands[2])) return \"and %0,%1,%2\"; i = INTVAL (operands[2]); if (INT_FITS_16_BITS (i)) return \"mask %0,%1,%2\"; if (INT_FITS_16_BITS (-i)) { operands[2] = gen_rtx (CONST_INT, VOIDmode, i & 0xffff); return \"and %0,%1,%2\"; } return \"and.u %0,%1,hi16(%2)\;and %0,%1,lo16(%2)\"; }") (define_insn "andcbsi3" [(set (match_operand:SI 0 "register_operand" "=r") (and:SI (match_operand:SI 1 "register_operand" "%r") (not:SI (match_operand:SI 2 "register_operand" "r"))))] "" "and.c %0,%1,%2") \f ;;- Bit set (inclusive or) instructions (with complement also) (define_insn "iorsi3" [(set (match_operand:SI 0 "register_operand" "=r") (ior:SI (match_operand:SI 1 "register_operand" "%r") (match_operand:SI 2 "arith32_operand" "rn")))] "" "* { unsigned int i; if (REG_P (operands[2])) return \"or %0,%1,%2\"; i = INTVAL (operands[2]); if (INT_FITS_16_BITS (i)) return \"or %0,%1,%2\"; return \"or.u %0,%1,hi16(%2)\;or %0,%1,lo16(%2)\"; }") (define_insn "iorcbsi3" [(set (match_operand:SI 0 "register_operand" "=r") (ior:SI (match_operand:SI 1 "register_operand" "%r") (not:SI (match_operand:SI 2 "register_operand" "r"))))] "" "or.c %0,%1,%2") \f ;;- xor instructions (with complement also) (define_insn "xorsi3" [(set (match_operand:SI 0 "register_operand" "=r") (xor:SI (match_operand:SI 1 "register_operand" "%r") (match_operand:SI 2 "arith32_operand" "rn")))] "" "* { unsigned int i; if (REG_P (operands[2])) return \"xor %0,%1,%2\"; i = INTVAL (operands[2]); if (INT_FITS_16_BITS (i)) return \"xor %0,%1,%2\"; if ((i & 0xffff) == 0) return \"xor.u %0,%1,hi16(%2)\"; return \"xor.u %0,%1,hi16(%2)\;xor %0,%1,lo16(%2)\"; }") (define_insn "xorcbsi3" [(set (match_operand:SI 0 "register_operand" "=r") (xor:SI (match_operand:SI 1 "register_operand" "%r") (not:SI (match_operand:SI 2 "register_operand" "r"))))] "" "xor.c %0,%1,%2") \f ;;- one complement instructions (define_insn "one_cmplsi2" [(set (match_operand:SI 0 "register_operand" "=r") (not:SI (match_operand:SI 1 "register_operand" "r")))] "" "xor.c %0,%1,r0") \f ;; Optimized special case of shifting. ;; Must precede the general case. (define_insn "" [(set (match_operand:SI 0 "register_operand" "=r") (ashiftrt:SI (match_operand:SI 1 "memory_operand" "m") (const_int 24)))] "" "ld.b %0,%1") (define_insn "" [(set (match_operand:SI 0 "register_operand" "=r") (lshiftrt:SI (match_operand:SI 1 "memory_operand" "m") (const_int 24)))] "" "ld.bu %0,%1") \f ;;- arithmetic shift instructions (define_insn "ashlsi3" [(set (match_operand:SI 0 "register_operand" "=r") (ashift:SI (match_operand:SI 1 "register_operand" "r") (match_operand:SI 2 "arith_operand" "rI")))] "" "* { if (GET_CODE (operands[2]) == CONST_INT) return \"mak %0,%1,0<%2>\"; return \"mask %0,%2,0x1f\;mak %0,%1,%0\"; }") (define_insn "ashrsi3" [(set (match_operand:SI 0 "register_operand" "=r") (ashiftrt:SI (match_operand:SI 1 "register_operand" "r") (match_operand:SI 2 "arith_operand" "rI")))] "" "* { if (GET_CODE (operands[2]) == CONST_INT) return \"ext %0,%1,0<%2>\"; return \"mask %0,%2,0x1f\;ext %0,%1,%0\"; }") \f ;;- logical shift instructions (define_insn "lshrsi3" [(set (match_operand:SI 0 "register_operand" "=r") (lshiftrt:SI (match_operand:SI 1 "register_operand" "r") (match_operand:SI 2 "arith_operand" "rI")))] "" "* { if (GET_CODE (operands[2]) == CONST_INT) return \"extu %0,%1,0<%2>\"; return \"mask %0,%2,0x1f\;extu %0,%1,%0\"; }") \f ;;- rotate instructions (define_insn "rotlsi3" [(set (match_operand:SI 0 "register_operand" "=r") (rotate:SI (match_operand:SI 1 "register_operand" "r") (match_operand:SI 2 "arith_operand" "rI")))] "" "* { if (GET_CODE (operands[2]) == CONST_INT) { operands[2] = gen_rtx (CONST_INT, SImode, 32 - INTVAL (operands[2])); return \"rot %0,%1,%2\"; } return \"or %0,r0,32\;sub %0,%2,%0\;rot %0,%1,%0\"; }") (define_insn "rotrsi3" [(set (match_operand:SI 0 "register_operand" "=r") (rotatert:SI (match_operand:SI 1 "register_operand" "r") (match_operand:SI 2 "arith_operand" "rI")))] "" "rot %0,%1,%2") \f ;; Special cases of bit-field insns which we should ;; recognize in preference to the general case. ;; These handle aligned 8-bit and 16-bit fields, ;; which can usually be done with move instructions. (define_insn "" [(set (zero_extract:SI (match_operand:SI 0 "general_operand" "+ro") (match_operand:SI 1 "int5_operand" "K") (match_operand:SI 2 "int5_operand" "K")) (match_operand:SI 3 "register_operand" "r"))] "(INTVAL (operands[1]) == 8 || INTVAL (operands[1]) == 16) && INTVAL (operands[2]) % INTVAL (operands[1]) == 0" "* { if (REG_P (operands[0])) { if (INTVAL (operands[1]) + INTVAL (operands[2]) != 32) return \"mak %0,%3,%1<%2>\"; } else operands[0] = adj_offsetable_operand (operands[0], INTVAL (operands[2]) / 8); if (GET_CODE (operands[3]) == MEM) operands[3] = adj_offsetable_operand (operands[3], (32 - INTVAL (operands[1])) / 8); if (INTVAL (operands[1]) == 8) return \"st.b %3,%0\"; return \"st.w %3,%0\"; }") (define_insn "" [(set (match_operand:SI 0 "register_operand" "=&r") (zero_extract:SI (match_operand:SI 1 "general_operand" "ro") (match_operand:SI 2 "int5_operand" "K") (match_operand:SI 3 "int5_operand" "K")))] "(INTVAL (operands[2]) == 8 || INTVAL (operands[2]) == 16) && INTVAL (operands[3]) % INTVAL (operands[2]) == 0" "* { if (REG_P (operands[1])) { if (INTVAL (operands[2]) + INTVAL (operands[3]) != 32) return \"extu %0,%1,%2<%3>\"; } else operands[1] = adj_offsetable_operand (operands[1], INTVAL (operands[3]) / 8); if (GET_CODE (operands[0]) == MEM) operands[0] = adj_offsetable_operand (operands[0], (32 - INTVAL (operands[1])) / 8); if (INTVAL (operands[2]) == 8) return \"ld.bu %0,%1\"; return \"ld.hu %0,%1\"; }") (define_insn "" [(set (match_operand:SI 0 "register_operand" "=r") (sign_extract:SI (match_operand:SI 1 "general_operand" "ro") (match_operand:SI 2 "int5_operand" "K") (match_operand:SI 3 "int5_operand" "K")))] "(INTVAL (operands[2]) == 8 || INTVAL (operands[2]) == 16) && INTVAL (operands[3]) % INTVAL (operands[2]) == 0" "* { if (REG_P (operands[1])) { if (INTVAL (operands[2]) + INTVAL (operands[3]) != 32) return \"extu %0,%1,%2<%3>\"; } else operands[1] = adj_offsetable_operand (operands[1], INTVAL (operands[3]) / 8); if (INTVAL (operands[2]) == 8) return \"ld.b %0,%1\"; return \"ld.h %0,%1\"; }") \f ;; Bit field instructions. (define_insn "extv" [(set (match_operand:SI 0 "register_operand" "=r,r") (sign_extract:SI (match_operand:QI 1 "register_operand" "r,r") (match_operand:SI 2 "arith_operand" "K,rK") (match_operand:SI 3 "arith_operand" "K,&r")))] "" "* { if (GET_CODE (operands[3]) == CONST_INT) return \"ext %0,%1,%2<%3>\"; if (GET_CODE (operands[2]) == CONST_INT) { operands[2] = gen_rtx (CONST_INT, VOIDmode, (INTVAL (operands[2]) & 0x1f) << 5); return \"mask %3,%3,0x1f\;or %3,%3,%2\;ext %0,%1,%3\"; } return \"mak %0,%2,5<5>\;mask %3,%3,0x1f\;or %3,%3,%0\;ext %0,%1,%3\"; }") (define_insn "" [(set (match_operand:SI 0 "register_operand" "=r,r") (sign_extract:SI (match_operand:SI 1 "register_operand" "r,r") (match_operand:SI 2 "arith_operand" "K,rK") (match_operand:SI 3 "arith_operand" "K,&r")))] "" "* { if (GET_CODE (operands[3]) == CONST_INT) return \"ext %0,%1,%2<%3>\"; if (GET_CODE (operands[2]) == CONST_INT) { operands[2] = gen_rtx (CONST_INT, VOIDmode, (INTVAL (operands[2]) & 0x1f) << 5); return \"mask %3,%3,0x1f\;or %3,%3,%2\;ext %0,%1,%3\"; } return \"mak %0,%2,5<5>\;mask %3,%3,0x1f\;or %3,%3,%0\;ext %0,%1,%3\"; }") (define_insn "extzv" [(set (match_operand:SI 0 "register_operand" "=r,r") (zero_extract:SI (match_operand:QI 1 "register_operand" "r,r") (match_operand:SI 2 "arith_operand" "K,Kr") (match_operand:SI 3 "arith_operand" "K,&r")))] "" "* { if (GET_CODE (operands[3]) == CONST_INT) return \"extu %0,%1,%2<%3>\"; if (GET_CODE (operands[2]) == CONST_INT) { operands[2] = gen_rtx (CONST_INT, VOIDmode, (INTVAL (operands[2]) & 0x1f) << 5); return \"mask %3,%3,0x1f\;or %3,%3,%2\;extu %0,%1,%3\"; } return \"mak %0,%2,5<5>\;mask %3,%3,0x1f\;or %3,%3,%0\;ext %0,%1,%3\"; }") (define_insn "" [(set (match_operand:SI 0 "register_operand" "=r,r") (zero_extract:SI (match_operand:SI 1 "register_operand" "r,r") (match_operand:SI 2 "arith_operand" "K,Kr") (match_operand:SI 3 "arith_operand" "K,&r")))] "" "* { if (GET_CODE (operands[3]) == CONST_INT) return \"extu %0,%1,%2<%3>\"; if (GET_CODE (operands[2]) == CONST_INT) { operands[2] = gen_rtx (CONST_INT, VOIDmode, (INTVAL (operands[2]) & 0x1f) << 5); return \"mask %3,%3,0x1f\;or %3,%3,%2\;extu %0,%1,%3\"; } return \"mak %0,%2,5<5>\;mask %3,%3,0x1f\;or %3,%3,%0\;ext %0,%1,%3\"; }") (define_insn "" [(set (zero_extract:SI (match_operand:SI 0 "register_operand" "r,r,r") (match_operand:SI 1 "arith_operand" "K,K,&r") (match_operand:SI 2 "arith_operand" "K,&r,&")) (const_int 0))] "" "* { if (GET_CODE (operands[2]) == CONST_INT) return \"clr %0,%0,%1<%2>\"; if (GET_CODE (operands[1]) == CONST_INT) { operands[1] = gen_rtx (CONST_INT, VOIDmode, (INTVAL (operands[1]) & 0x1f) << 5); return \"mask %2,%2,0x1f\;or %2,%2,%1\;clr %0,%0,%2\"; } return \"mak %1,%1,5<5>\;mask %2,%2,0x1f\;or %2,%2,%1\;clr %0,%0,%2\"; }") (define_insn "" [(set (zero_extract:SI (match_operand:SI 0 "register_operand" "r,r,r") (match_operand:SI 1 "arith_operand" "K,K,&r") (match_operand:SI 2 "arith_operand" "K,&r,&r")) (const_int -1))] "" "* { if (GET_CODE (operands[2]) == CONST_INT) return \"set %0,%0,%1<%2>\"; if (GET_CODE (operands[1]) == CONST_INT) { operands[1] = gen_rtx (CONST_INT, VOIDmode, (INTVAL (operands[1]) & 0x1f) << 5); return \"mask %2,%2,0x1f\;or %2,%2,%1\;set %0,%0,%2\"; } return \"mak %1,%1,5<5>\;mask %2,%2,0x1f\;or %2,%2,%1\;set %0,%0,%2\"; }") (define_insn "insv" [(set (zero_extract:SI (match_operand:SI 0 "register_operand" "r,r,r") (match_operand:SI 1 "arith_operand" "K,K,&r") (match_operand:SI 2 "arith_operand" "K,&r,&r")) (match_operand:SI 3 "register_operand" "&r,&r,r"))] "" "* { if (GET_CODE (operands[2]) == CONST_INT) return \"mak %3,%3,%1<%2>\;clr %0,%0,%1<%2>\;or %0,%0,%3\"; if (GET_CODE (operands[1]) == CONST_INT) { operands[1] = gen_rtx (CONST_INT, VOIDmode, (INTVAL (operands[1]) & 0x1f) << 5); return \"mask %2,%2,0x1f\;or %2,%2,%1\;mak %3,%3,%2\;clr %0,%0,%2\;or %0,%0,%3\"; } return \"mak %1,%1,5<5>\;mask %2,%2,0x1f\;or %2,%2,%1\;mak %1,%3,%2\;clr %0,%0,%2\;or %0,%0,%1\"; }") \f ;; negate insns (define_insn "negsi2" [(set (match_operand:SI 0 "register_operand" "=r") (neg:SI (match_operand:SI 1 "arith_operand" "rI")))] "" "sub %0,r0,%1") (define_insn "negdf2" [(set (match_operand:DF 0 "register_operand" "=r") (neg:DF (match_operand:DF 1 "register_operand" "r")))] "" "fsub.dsd %0,r0,%1") (define_insn "negsf2" [(set (match_operand:SF 0 "register_operand" "=r") (neg:SF (match_operand:SF 1 "register_operand" "r")))] "" "fsub.sss %0,r0,%1") \f ;; Store condition code values into registers (define_insn "seq" [(set (match_operand:SI 0 "general_operand" "=g") (eq (cc0) (const_int 0)))] "" "* { CC_STATUS_INIT; if (REG_P (operands[0])) return \"extu %0,r25,1<eq>\"; return \"extu r25,r25,1<eq>\;st r25,%0\"; }") (define_peephole [(set (cc0) (match_operand:SI 0 "register_operand" "r")) (set (match_operand:SI 1 "general_operand" "=g") (eq (cc0) (const_int 0)))] "" "* { CC_STATUS_INIT; if (REG_P (operands[1])) return \"cmp r25,%0,0\;extu %1,r25,1<eq>\"; return \"cmp r25,%0,0\;extu r25,r25,1<eq>\;st r25,%1\"; }") (define_peephole [(set (cc0) (compare (match_operand:SI 0 "arith_operand" "r") (match_operand:SI 1 "arith_operand" "rI"))) (set (match_operand:SI 2 "general_operand" "=g") (eq (cc0) (const_int 0)))] "" "* { CC_STATUS_INIT; if (REG_P (operands[2])) return \"cmp r25,%0,%1\;extu %2,r25,1<eq>\"; return \"cmp r25,%0,%1\;extu r25,r25,1<eq>\;st r25,%2\"; }") (define_insn "sne" [(set (match_operand:SI 0 "general_operand" "=g") (ne (cc0) (const_int 0)))] "" "* { CC_STATUS_INIT; if (REG_P (operands[0])) return \"extu %0,r25,1<ne>\"; return \"extu r25,r25,1<ne>\;st r25,%0\"; }") (define_peephole [(set (cc0) (match_operand:SI 0 "register_operand" "r")) (set (match_operand:SI 1 "general_operand" "=g") (ne (cc0) (const_int 0)))] "" "* { CC_STATUS_INIT; if (REG_P (operands[1])) return \"cmp r25,%0,0\;extu %1,r25,1<ne>\"; return \"cmp r25,%0,0\;extu r25,r25,1<ne>\;st r25,%1\"; }") (define_peephole [(set (cc0) (compare (match_operand:SI 0 "arith_operand" "r") (match_operand:SI 1 "arith_operand" "rI"))) (set (match_operand:SI 2 "general_operand" "=g") (ne (cc0) (const_int 0)))] "" "* { CC_STATUS_INIT; if (REG_P (operands[2])) return \"cmp r25,%0,%1\;extu %2,r25,1<ne>\"; return \"cmp r25,%0,%1\;extu r25,r25,1<ne>\;st r25,%2\"; }") (define_insn "sgt" [(set (match_operand:SI 0 "general_operand" "=g") (gt (cc0) (const_int 0)))] "" "* { CC_STATUS_INIT; if (REG_P (operands[0])) return \"extu %0,r25,1<gt>\"; return \"extu r25,r25,1<gt>\;st r25,%0\"; }") (define_peephole [(set (cc0) (match_operand:SI 0 "register_operand" "r")) (set (match_operand:SI 1 "general_operand" "=g") (gt (cc0) (const_int 0)))] "" "* { CC_STATUS_INIT; if (REG_P (operands[1])) return \"cmp r25,%0,0\;extu %1,r25,1<gt>\"; return \"cmp r25,%0,0\;extu r25,r25,1<gt>\;st r25,%1\"; }") (define_peephole [(set (cc0) (compare (match_operand:SI 0 "arith_operand" "r") (match_operand:SI 1 "arith_operand" "rI"))) (set (match_operand:SI 2 "general_operand" "=g") (gt (cc0) (const_int 0)))] "" "* { CC_STATUS_INIT; if (REG_P (operands[2])) return \"cmp r25,%0,%1\;extu %2,r25,1<gt>\"; return \"cmp r25,%0,%1\;extu r25,r25,1<gt>\;st r25,%2\"; }") (define_insn "sgtu" [(set (match_operand:SI 0 "general_operand" "=g") (gtu (cc0) (const_int 0)))] "" "* { CC_STATUS_INIT; if (REG_P (operands[0])) return \"extu %0,r25,1<hi>\"; return \"extu r25,r25,1<hi>\;st r25,%0\"; }") (define_peephole [(set (cc0) (match_operand:SI 0 "register_operand" "r")) (set (match_operand:SI 1 "general_operand" "=g") (gtu (cc0) (const_int 0)))] "" "* { CC_STATUS_INIT; if (REG_P (operands[1])) return \"cmp r25,%0,0\;extu %1,r25,1<hi>\"; return \"cmp r25,%0,0\;extu r25,r25,1<hi>\;st r25,%1\"; }") (define_peephole [(set (cc0) (compare (match_operand:SI 0 "arith_operand" "r") (match_operand:SI 1 "arith_operand" "rI"))) (set (match_operand:SI 2 "general_operand" "=g") (gtu (cc0) (const_int 0)))] "" "* { CC_STATUS_INIT; if (REG_P (operands[2])) return \"cmp r25,%0,%1\;extu %2,r25,1<hi>\"; return \"cmp r25,%0,%1\;extu r25,r25,1<hi>\;st r25,%2\"; }") (define_insn "slt" [(set (match_operand:SI 0 "general_operand" "=g") (lt (cc0) (const_int 0)))] "" "* { CC_STATUS_INIT; if (REG_P (operands[0])) return \"extu %0,r25,1<lt>\"; return \"extu r25,r25,1<lt>\;st r25,%0\"; }") (define_peephole [(set (cc0) (match_operand:SI 0 "register_operand" "r")) (set (match_operand:SI 1 "general_operand" "=g") (lt (cc0) (const_int 0)))] "" "* { CC_STATUS_INIT; if (REG_P (operands[1])) return \"cmp r25,%0,0\;extu %1,r25,1<lt>\"; return \"cmp r25,%0,0\;extu r25,r25,1<lt>\;st r25,%1\"; }") (define_peephole [(set (cc0) (compare (match_operand:SI 0 "arith_operand" "r") (match_operand:SI 1 "arith_operand" "rI"))) (set (match_operand:SI 2 "general_operand" "=g") (lt (cc0) (const_int 0)))] "" "* { CC_STATUS_INIT; if (REG_P (operands[2])) return \"cmp r25,%0,%1\;extu %2,r25,1<lt>\"; return \"cmp r25,%0,%1\;extu r25,r25,1<lt>\;st r25,%2\"; }") (define_insn "sltu" [(set (match_operand:SI 0 "general_operand" "=g") (ltu (cc0) (const_int 0)))] "" "* { CC_STATUS_INIT; if (REG_P (operands[0])) return \"extu %0,r25,1<lo>\"; return \"extu r25,r25,1<lo>\;st r25,%0\"; }") (define_peephole [(set (cc0) (match_operand:SI 0 "register_operand" "r")) (set (match_operand:SI 1 "general_operand" "=g") (ltu (cc0) (const_int 0)))] "" "* { CC_STATUS_INIT; if (REG_P (operands[1])) return \"cmp r25,%0,0\;extu %1,r25,1<lo>\"; return \"cmp r25,%0,0\;extu r25,r25,1<lo>\;st r25,%1\"; }") (define_peephole [(set (cc0) (compare (match_operand:SI 0 "arith_operand" "r") (match_operand:SI 1 "arith_operand" "rI"))) (set (match_operand:SI 2 "general_operand" "=g") (ltu (cc0) (const_int 0)))] "" "* { CC_STATUS_INIT; if (REG_P (operands[2])) return \"cmp r25,%0,%1\;extu %2,r25,1<lo>\"; return \"cmp r25,%0,%1\;extu r25,r25,1<lo>\;st r25,%2\"; }") (define_insn "sge" [(set (match_operand:SI 0 "general_operand" "=g") (ge (cc0) (const_int 0)))] "" "* { CC_STATUS_INIT; if (REG_P (operands[0])) return \"extu %0,r25,1<ge>\"; return \"extu r25,r25,1<ge>\;st r25,%0\"; }") (define_peephole [(set (cc0) (match_operand:SI 0 "register_operand" "r")) (set (match_operand:SI 1 "general_operand" "=g") (ge (cc0) (const_int 0)))] "" "* { CC_STATUS_INIT; if (REG_P (operands[1])) return \"cmp r25,%0,0\;extu %1,r25,1<ge>\"; return \"cmp r25,%0,0\;extu r25,r25,1<ge>\;st r25,%1\"; }") (define_peephole [(set (cc0) (compare (match_operand:SI 0 "arith_operand" "r") (match_operand:SI 1 "arith_operand" "rI"))) (set (match_operand:SI 2 "general_operand" "=g") (ge (cc0) (const_int 0)))] "" "* { CC_STATUS_INIT; if (REG_P (operands[2])) return \"cmp r25,%0,%1\;extu %2,r25,1<ge>\"; return \"cmp r25,%0,%1\;extu r25,r25,1<ge>\;st r25,%2\"; }") (define_insn "sgeu" [(set (match_operand:SI 0 "general_operand" "=g") (geu (cc0) (const_int 0)))] "" "* { CC_STATUS_INIT; if (REG_P (operands[0])) return \"extu %0,r25,1<hs>\"; return \"extu r25,r25,1<hs>\;st r25,%0\"; }") (define_peephole [(set (cc0) (match_operand:SI 0 "register_operand" "r")) (set (match_operand:SI 1 "general_operand" "=g") (geu (cc0) (const_int 0)))] "" "* { CC_STATUS_INIT; if (REG_P (operands[1])) return \"cmp r25,%0,0\;extu %1,r25,1<hs>\"; return \"cmp r25,%0,0\;extu r25,r25,1<hs>\;st r25,%1\"; }") (define_peephole [(set (cc0) (compare (match_operand:SI 0 "arith_operand" "r") (match_operand:SI 1 "arith_operand" "rI"))) (set (match_operand:SI 2 "general_operand" "=g") (geu (cc0) (const_int 0)))] "" "* { CC_STATUS_INIT; if (REG_P (operands[2])) return \"cmp r25,%0,%1\;extu %2,r25,1<hs>\"; return \"cmp r25,%0,%1\;extu r25,r25,1<hs>\;st r25,%2\"; }") (define_insn "sle" [(set (match_operand:SI 0 "general_operand" "=g") (le (cc0) (const_int 0)))] "" "* { CC_STATUS_INIT; if (REG_P (operands[0])) return \"extu %0,r25,1<le>\"; return \"extu r25,r25,1<le>\;st r25,%0\"; }") (define_peephole [(set (cc0) (match_operand:SI 0 "register_operand" "r")) (set (match_operand:SI 1 "general_operand" "=g") (le (cc0) (const_int 0)))] "" "* { CC_STATUS_INIT; if (REG_P (operands[1])) return \"cmp r25,%0,0\;extu %1,r25,1<le>\"; return \"cmp r25,%0,0\;extu r25,r25,1<le>\;st r25,%1\"; }") (define_peephole [(set (cc0) (compare (match_operand:SI 0 "arith_operand" "r") (match_operand:SI 1 "arith_operand" "rI"))) (set (match_operand:SI 2 "general_operand" "=g") (le (cc0) (const_int 0)))] "" "* { CC_STATUS_INIT; if (REG_P (operands[2])) return \"cmp r25,%0,%1\;extu %2,r25,1<le>\"; return \"cmp r25,%0,%1\;extu r25,r25,1<le>\;st r25,%2\"; }") (define_insn "sleu" [(set (match_operand:SI 0 "general_operand" "=g") (leu (cc0) (const_int 0)))] "" "* { CC_STATUS_INIT; if (REG_P (operands[0])) return \"extu %0,r25,1<ls>\"; return \"extu r25,r25,1<ls>\;st r25,%0\"; }") (define_peephole [(set (cc0) (match_operand:SI 0 "register_operand" "r")) (set (match_operand:SI 1 "general_operand" "=g") (leu (cc0) (const_int 0)))] "" "* { CC_STATUS_INIT; if (REG_P (operands[1])) return \"cmp r25,%0,0\;extu %1,r25,1<ls>\"; return \"cmp r25,%0,0\;extu r25,r25,1<ls>\;st r25,%1\"; }") (define_peephole [(set (cc0) (compare (match_operand:SI 0 "arith_operand" "r") (match_operand:SI 1 "arith_operand" "rI"))) (set (match_operand:SI 2 "general_operand" "=g") (leu (cc0) (const_int 0)))] "" "* { CC_STATUS_INIT; if (REG_P (operands[2])) return \"cmp r25,%0,%1\;extu %2,r25,1<ls>\"; return \"cmp r25,%0,%1\;extu r25,r25,1<ls>\;st r25,%2\"; }") \f ;; Unconditional and other jump instructions (define_insn "jump" [(set (pc) (label_ref (match_operand 0 "" "")))] "" "br %l0") (define_insn "" [(set (pc) (label_ref (match_operand 0 "" ""))) (clobber (const_int 1))] "" "br.n %l0") (define_insn "tablejump" [(set (pc) (match_operand:SI 0 "register_operand" "r")) (use (label_ref (match_operand 1 "" "")))] "" "jmp %0") ;;- jump to subroutine (define_insn "call" [(call (match_operand:SI 0 "memory_operand" "m") (match_operand:SI 1 "general_operand" "g")) (use (reg:SI 1))] ;;- Don't use operand 1 for most machines. "" "* { operands[0] = XEXP (operands[0], 0); if (REG_P (operands[0])) return \"jsr %0\"; return \"bsr %0\"; }") (define_insn "" [(call (match_operand:SI 0 "memory_operand" "m") (match_operand:SI 1 "general_operand" "g")) (clobber (const_int 1)) (use (reg:SI 1))] ;;- Don't use operand 1 for most machines. "" "* { operands[0] = XEXP (operands[0], 0); if (REG_P (operands[0])) return \"jsr.n %0\"; return \"bsr.n %0\"; }") ;;- jump to subroutine (define_insn "call_value" [(set (match_operand 0 "" "r") (call (match_operand:SI 1 "memory_operand" "m") (match_operand:SI 2 "general_operand" "g"))) (use (reg:SI 1))] ;;- Don't use operand 2 for most machines. "" "* { operands[1] = XEXP (operands[1], 0); if (REG_P (operands[1])) return \"jsr %1\"; return \"bsr %1\"; }") (define_insn "" [(set (match_operand 0 "" "r") (call (match_operand:SI 1 "memory_operand" "m") (match_operand:SI 2 "general_operand" "g"))) (use (reg:SI 1)) (clobber (const_int 2))] ;;- Don't use operand 2 for most machines. "" "* { operands[1] = XEXP (operands[1], 0); if (REG_P (operands[1])) return \"jsr.n %1\"; return \"bsr.n %1\"; }") ;; A memory ref with constant address is not normally valid. ;; But it is valid in a call insns. This pattern allows the ;; loading of the address to combine with the call. (define_insn "" [(call (mem:SI (match_operand:SI 0 "" "i")) (match_operand:SI 1 "general_operand" "g")) (use (reg:SI 1))] ;;- Don't use operand 1 for most machines. "GET_CODE (operands[0]) == SYMBOL_REF" "bsr %0") (define_insn "" [(call (mem:SI (match_operand:SI 0 "" "i")) (match_operand:SI 1 "general_operand" "g")) (clobber (const_int 1)) (use (reg:SI 1))] ;;- Don't use operand 1 for most machines. "GET_CODE (operands[0]) == SYMBOL_REF" "bsr.n %0") \f ;; Recognize jbs and jbc instructions. (define_insn "" [(set (pc) (if_then_else (ne (sign_extract:SI (match_operand:SI 0 "register_operand" "r") (const_int 1) (match_operand:SI 1 "int5_operand" "K")) (const_int 0)) (label_ref (match_operand 2 "" "")) (pc)))] "" "bb1 %1,%0,%l2") (define_insn "" [(set (pc) (if_then_else (eq (sign_extract:SI (match_operand:SI 0 "register_operand" "r") (const_int 1) (match_operand:SI 1 "int5_operand" "K")) (const_int 0)) (label_ref (match_operand 2 "" "")) (pc)))] "" "bb0 %1,%0,%l2") (define_insn "" [(set (pc) (if_then_else (ne (sign_extract:SI (match_operand:SI 0 "register_operand" "r") (const_int 1) (match_operand:SI 1 "int5_operand" "K")) (const_int 0)) (pc) (label_ref (match_operand 2 "" ""))))] "" "bb0 %1,%0,%l2") (define_insn "" [(set (pc) (if_then_else (eq (sign_extract:SI (match_operand:SI 0 "register_operand" "r") (const_int 1) (match_operand:SI 1 "int5_operand" "K")) (const_int 0)) (pc) (label_ref (match_operand 2 "" ""))))] "" "bb1 %1,%0,%l2") (define_insn "" [(set (pc) (if_then_else (ne (sign_extract:SI (match_operand:SI 0 "general_operand" "r") (const_int 1) (match_operand:SI 1 "int5_operand" "K")) (const_int 0)) (label_ref (match_operand 2 "" "")) (pc)))] "" "bb1 %1,%0,%l2") (define_insn "" [(set (pc) (if_then_else (eq (sign_extract:SI (match_operand:SI 0 "general_operand" "r") (const_int 1) (match_operand:SI 1 "int5_operand" "K")) (const_int 0)) (label_ref (match_operand 2 "" "")) (pc)))] "" "bb0 %1,%0,%l2") (define_insn "" [(set (pc) (if_then_else (eq (and:SI (match_operand:SI 0 "register_operand" "r") (match_operand:SI 1 "int5_operand" "K")) (const_int 0)) (pc) (label_ref (match_operand 2 "" ""))))] "exact_log2 (INTVAL (operands[1])) >= 0" "* { operands[1] = gen_rtx (CONST_INT, VOIDmode, exact_log2 (INTVAL (operands[1]))); return \"bb1 %1,%0,%l2\"; }") (define_insn "" [(set (pc) (if_then_else (eq (and:SI (match_operand:SI 0 "register_operand" "r") (match_operand:SI 1 "int5_operand" "K")) (const_int 0)) (label_ref (match_operand 2 "" "")) (pc)))] "exact_log2 (INTVAL (operands[1])) >= 0" "* { operands[1] = gen_rtx (CONST_INT, VOIDmode, exact_log2 (INTVAL (operands[1]))); return \"bb0 %1,%0,%l2\"; }") (define_insn "" [(set (pc) (if_then_else (ne (and:SI (match_operand:SI 0 "register_operand" "r") (match_operand:SI 1 "int5_operand" "K")) (const_int 0)) (pc) (label_ref (match_operand 2 "" ""))))] "exact_log2 (INTVAL (operands[1])) >= 0" "* { operands[1] = gen_rtx (CONST_INT, VOIDmode, exact_log2 (INTVAL (operands[1]))); return \"bb0 %1,%0,%l2\"; }") (define_insn "" [(set (pc) (if_then_else (ne (and:SI (match_operand:SI 0 "register_operand" "r") (match_operand:SI 1 "int5_operand" "K")) (const_int 0)) (label_ref (match_operand 2 "" "")) (pc)))] "exact_log2 (INTVAL (operands[1])) >= 0" "* { operands[1] = gen_rtx (CONST_INT, VOIDmode, exact_log2 (INTVAL (operands[1]))); return \"bb1 %1,%0,%l2\"; }") (define_insn "" [(set (pc) (if_then_else (ne (sign_extract:SI (match_operand:SI 0 "general_operand" "r") (const_int 1) (match_operand:SI 1 "int5_operand" "K")) (const_int 0)) (pc) (label_ref (match_operand 2 "" ""))))] "" "bb0 %1,%0,%l2") (define_insn "" [(set (pc) (if_then_else (eq (sign_extract:SI (match_operand:SI 0 "general_operand" "r") (const_int 1) (match_operand:SI 1 "int5_operand" "K")) (const_int 0)) (pc) (label_ref (match_operand 2 "" ""))))] "" "bb1 %1,%0,%l2") (define_insn "" [(set (pc) (if_then_else (ne (and:SI (match_operand:SI 0 "register_operand" "r") (const_int 1)) (const_int 0)) (label_ref (match_operand 1 "" "")) (pc)))] "" "bb1 0,%0,%l1") (define_insn "" [(set (pc) (if_then_else (eq (and:SI (match_operand:SI 0 "register_operand" "r") (const_int 1)) (const_int 0)) (label_ref (match_operand 1 "" "")) (pc)))] "" "bb0 0,%0,%l1") (define_insn "" [(set (pc) (if_then_else (ne (and:SI (match_operand:SI 0 "register_operand" "r") (const_int 1)) (const_int 0)) (pc) (label_ref (match_operand 1 "" ""))))] "" "bb0 0,%0,%l1") (define_insn "" [(set (pc) (if_then_else (eq (and:SI (match_operand:SI 0 "register_operand" "r") (const_int 1)) (const_int 0)) (pc) (label_ref (match_operand 1 "" ""))))] "" "bb1 0,%0,%l1") ;; These four entries allow a jlbc or jlbs,to be made ;; by combination with a bic. (define_insn "" [(set (pc) (if_then_else (ne (and:SI (match_operand:SI 0 "register_operand" "r") (not:SI (const_int -2))) (const_int 0)) (label_ref (match_operand 1 "" "")) (pc)))] "" "bb1 0,%0,%l1") (define_insn "" [(set (pc) (if_then_else (eq (and:SI (match_operand:SI 0 "register_operand" "r") (not:SI (const_int -2))) (const_int 0)) (label_ref (match_operand 1 "" "")) (pc)))] "" "bb0 0,%0,%l1") (define_insn "" [(set (pc) (if_then_else (ne (and:SI (match_operand:SI 0 "register_operand" "r") (not:SI (const_int -2))) (const_int 0)) (pc) (label_ref (match_operand 1 "" ""))))] "" "bb0 0,%0,%l1") (define_insn "" [(set (pc) (if_then_else (eq (and:SI (match_operand:SI 0 "register_operand" "r") (not:SI (const_int -2))) (const_int 0)) (pc) (label_ref (match_operand 1 "" ""))))] "" "bb1 0,%0,%l1") ;;- Local variables: ;;- mode:emacs-lisp ;;- comment-start: ";;- " ;;- eval: (set-syntax-table (copy-sequence (syntax-table))) ;;- eval: (modify-syntax-entry ?[ "(]") ;;- eval: (modify-syntax-entry ?] ")[") ;;- eval: (modify-syntax-entry ?{ "(}") ;;- eval: (modify-syntax-entry ?} "){") ;;- End: