;; builtin definitions for DEC VAX.
;; Copyright (C) 2007-2020 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
;; .
(define_constants
[
(VUNSPEC_LOCK 100) ; sync lock and test
(VUNSPEC_UNLOCK 101) ; sync lock release
]
)
(define_expand "condjump"
[(set (pc)
(if_then_else (match_operand 0)
(label_ref (match_operand 1))
(pc)))])
(define_expand "ffssi2"
[(set (match_operand:SI 0 "nonimmediate_operand" "")
(ffs:SI (match_operand:SI 1 "general_operand" "")))
(set (cc0)
(compare (match_dup 0) (const_int 0)))
]
""
"
{
rtx label = gen_label_rtx ();
emit_insn (gen_count_zero (operands[0], operands[1]));
emit_jump_insn (gen_condjump (gen_rtx_NE(VOIDmode, cc0_rtx, const0_rtx), label));
emit_move_insn (operands[0], constm1_rtx);
emit_label (label);
emit_insn (gen_addsi3 (operands[0], operands[0], const1_rtx));
DONE;
}")
(define_insn "ctzsi2"
[(set (match_operand:SI 0 "nonimmediate_operand" "=rQ")
(ctz:SI (match_operand:SI 1 "general_operand" "nrQT")))
(set (cc0)
(compare (match_dup 0) (const_int 0)))
]
""
"ffs $0,$32,%1,%0\;tstl %0")
(define_insn "count_zero"
[ (set (match_operand:SI 0 "nonimmediate_operand" "")
(ctz:SI (match_operand:SI 1 "general_operand" "")))
(set (cc0)
(compare (match_dup 0)
(const_int 33)))
]
""
"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));
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 "volatile_mem_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_dup 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 "volatile_mem_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_dup 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 "volatile_mem_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_dup 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")