Mercurial > hg > CbC > CbC_gcc
diff gcc/config/nvptx/nvptx.md @ 131:84e7813d76e9
gcc-8.2
author | mir3636 |
---|---|
date | Thu, 25 Oct 2018 07:37:49 +0900 |
parents | 04ced10e8804 |
children | 1830386684a0 |
line wrap: on
line diff
--- a/gcc/config/nvptx/nvptx.md Fri Oct 27 22:46:09 2017 +0900 +++ b/gcc/config/nvptx/nvptx.md Thu Oct 25 07:37:49 2018 +0900 @@ -1,5 +1,5 @@ ;; Machine description for NVPTX. -;; Copyright (C) 2014-2017 Free Software Foundation, Inc. +;; Copyright (C) 2014-2018 Free Software Foundation, Inc. ;; Contributed by Bernd Schmidt <bernds@codesourcery.com> ;; ;; This file is part of GCC. @@ -55,6 +55,8 @@ UNSPECV_CAS UNSPECV_XCHG UNSPECV_BARSYNC + UNSPECV_MEMBAR + UNSPECV_MEMBAR_CTA UNSPECV_DIM_POS UNSPECV_FORK @@ -994,6 +996,20 @@ "" "") +(define_insn "exit" + [(const_int 1)] + "" + "exit;") + +(define_insn "fake_nop" + [(const_int 2)] + "" + "{ + .reg .u32 %%nop_src; + .reg .u32 %%nop_dst; + mov.u32 %%nop_dst, %%nop_src; + }") + (define_insn "return" [(return)] "" @@ -1085,14 +1101,14 @@ (define_insn "trap" [(trap_if (const_int 1) (const_int 0))] "" - "trap;") + "trap; exit;") (define_insn "trap_if_true" [(trap_if (ne (match_operand:BI 0 "nvptx_register_operand" "R") (const_int 0)) (const_int 0))] "" - "%j0 trap;" + "%j0 trap; %j0 exit;" [(set_attr "predicable" "false")]) (define_insn "trap_if_false" @@ -1100,7 +1116,7 @@ (const_int 0)) (const_int 0))] "" - "%J0 trap;" + "%J0 trap; %J0 exit;" [(set_attr "predicable" "false")]) (define_expand "ctrap<mode>4" @@ -1424,7 +1440,6 @@ (define_code_iterator any_logic [and ior xor]) (define_code_attr logic [(and "and") (ior "or") (xor "xor")]) -;; Currently disabled until we add better subtarget support - requires sm_32. (define_insn "atomic_fetch_<logic><mode>" [(set (match_operand:SDIM 1 "memory_operand" "+m") (unspec_volatile:SDIM @@ -1434,7 +1449,7 @@ UNSPECV_LOCK)) (set (match_operand:SDIM 0 "nvptx_register_operand" "=R") (match_dup 1))] - "0" + "<MODE>mode == SImode || TARGET_SM35" "%.\\tatom%A1.b%T0.<logic>\\t%0, %1, %2;" [(set_attr "atomic" "true")]) @@ -1445,6 +1460,43 @@ "\\tbar.sync\\t%0;" [(set_attr "predicable" "false")]) +(define_expand "memory_barrier" + [(set (match_dup 0) + (unspec_volatile:BLK [(match_dup 0)] UNSPECV_MEMBAR))] + "" +{ + operands[0] = gen_rtx_MEM (BLKmode, gen_rtx_SCRATCH (Pmode)); + MEM_VOLATILE_P (operands[0]) = 1; +}) + +;; Ptx defines the memory barriers membar.cta, membar.gl and membar.sys +;; (corresponding to cuda functions threadfence_block, threadfence and +;; threadfence_system). For the insn memory_barrier we use membar.sys. This +;; may be overconservative, but before using membar.gl instead we'll need to +;; explain in detail why it's safe to use. For now, use membar.sys. +(define_insn "*memory_barrier" + [(set (match_operand:BLK 0 "" "") + (unspec_volatile:BLK [(match_dup 0)] UNSPECV_MEMBAR))] + "" + "\\tmembar.sys;" + [(set_attr "predicable" "false")]) + +(define_expand "nvptx_membar_cta" + [(set (match_dup 0) + (unspec_volatile:BLK [(match_dup 0)] UNSPECV_MEMBAR_CTA))] + "" +{ + operands[0] = gen_rtx_MEM (BLKmode, gen_rtx_SCRATCH (Pmode)); + MEM_VOLATILE_P (operands[0]) = 1; +}) + +(define_insn "*nvptx_membar_cta" + [(set (match_operand:BLK 0 "" "") + (unspec_volatile:BLK [(match_dup 0)] UNSPECV_MEMBAR_CTA))] + "" + "\\tmembar.cta;" + [(set_attr "predicable" "false")]) + (define_insn "nvptx_nounroll" [(unspec_volatile [(const_int 0)] UNSPECV_NOUNROLL)] ""