;; builtin definitions for DEC VAX. ;; Copyright (C) 2007-2015 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_constants [
(VUNSPEC_LOCK 100) ; sync lock and test
(VUNSPEC_UNLOCK 101) ; sync lock release
] )
(define_expand "ffssi2" [(set (match_operand:SI 0 "nonimmediate_operand" "")
(ffs:SI (match_operand:SI 1 "general_operand" "")))]
"" " { rtx label = gen_label_rtx (); emit_insn (gen_ffssi2_internal (operands[0], operands[1])); emit_jump_insn (gen_bne (label)); emit_insn (gen_negsi2 (operands[0], const1_rtx)); emit_label (label); emit_insn (gen_addsi3 (operands[0], operands[0], const1_rtx)); DONE; }")
(define_insn "ffssi2_internal" [(set (match_operand:SI 0 "nonimmediate_operand" "=rQ")
(ffs:SI (match_operand:SI 1 "general_operand" "nrmT")))
(set (cc0) (match_dup 0))] "" "ffs $0,$32,%1,%0")
(define_expand "sync_lock_test_and_set" [(set (match_operand:VAXint 0 "nonimmediate_operand" "=&g")
(unspec:VAXint [(match_operand:VAXint 1 "memory_operand" "+m")
(match_operand:VAXint 2 "const_int_operand" "n")
] VUNSPEC_LOCK))]
"" " { rtx label;
if (operands[2] != const1_rtx)
FAIL;
label = gen_label_rtx (); emit_move_insn (operands[0], const1_rtx); emit_jump_insn (gen_jbbssi (operands[1], const0_rtx, label, operands[1])); emit_move_insn (operands[0], const0_rtx); emit_label (label); DONE; }")
(define_insn "jbbssiqi" [(parallel
[(set (pc)
(if_then_else
(ne (zero_extract:SI (match_operand:QI 0 "memory_operand" "g")
(const_int 1)
(match_operand:SI 1 "general_operand" "nrm"))
(const_int 0))
(label_ref (match_operand 2 "" ""))
(pc)))
(set (zero_extract:SI (match_operand:QI 3 "memory_operand" "+0")
(const_int 1)
(match_dup 1))
(const_int 1))])]
"" "jbssi %1,%0,%l2")
(define_insn "jbbssihi" [(parallel
[(set (pc)
(if_then_else
(ne (zero_extract:SI (match_operand:HI 0 "memory_operand" "Q")
(const_int 1)
(match_operand:SI 1 "general_operand" "nrm"))
(const_int 0))
(label_ref (match_operand 2 "" ""))
(pc)))
(set (zero_extract:SI (match_operand:HI 3 "memory_operand" "+0")
(const_int 1)
(match_dup 1))
(const_int 1))])]
"" "jbssi %1,%0,%l2")
(define_insn "jbbssisi" [(parallel
[(set (pc)
(if_then_else
(ne (zero_extract:SI (match_operand:SI 0 "memory_operand" "Q")
(const_int 1)
(match_operand:SI 1 "general_operand" "nrm"))
(const_int 0))
(label_ref (match_operand 2 "" ""))
(pc)))
(set (zero_extract:SI (match_operand:SI 3 "memory_operand" "+0")
(const_int 1)
(match_dup 1))
(const_int 1))])]
"" "jbssi %1,%0,%l2")
(define_expand "sync_lock_release" [(set (match_operand:VAXint 0 "memory_operand" "+m")
(unspec:VAXint [(match_operand:VAXint 1 "const_int_operand" "n")
] VUNSPEC_UNLOCK))]
"" " { rtx label; if (operands[1] != const0_rtx)
FAIL;
#if 1 label = gen_label_rtx (); emit_jump_insn (gen_jbbcci (operands[0], const0_rtx, label, operands[0])); emit_label (label); #else emit_move_insn (operands[0], const0_rtx); #endif DONE; }")
(define_insn "jbbcciqi" [(parallel
[(set (pc)
(if_then_else
(eq (zero_extract:SI (match_operand:QI 0 "memory_operand" "g")
(const_int 1)
(match_operand:SI 1 "general_operand" "nrm"))
(const_int 0))
(label_ref (match_operand 2 "" ""))
(pc)))
(set (zero_extract:SI (match_operand:QI 3 "memory_operand" "+0")
(const_int 1)
(match_dup 1))
(const_int 0))])]
"" "jbcci %1,%0,%l2")
(define_insn "jbbccihi" [(parallel
[(set (pc)
(if_then_else
(eq (zero_extract:SI (match_operand:HI 0 "memory_operand" "Q")
(const_int 1)
(match_operand:SI 1 "general_operand" "nrm"))
(const_int 0))
(label_ref (match_operand 2 "" ""))
(pc)))
(set (zero_extract:SI (match_operand:HI 3 "memory_operand" "+0")
(const_int 1)
(match_dup 1))
(const_int 0))])]
"" "jbcci %1,%0,%l2")
(define_insn "jbbccisi" [(parallel
[(set (pc)
(if_then_else
(eq (zero_extract:SI (match_operand:SI 0 "memory_operand" "Q")
(const_int 1)
(match_operand:SI 1 "general_operand" "nrm"))
(const_int 0))
(label_ref (match_operand 2 "" ""))
(pc)))
(set (zero_extract:SI (match_operand:SI 3 "memory_operand" "+0")
(const_int 1)
(match_dup 1))
(const_int 0))])]
"" "jbcci %1,%0,%l2")