aboutsummaryrefslogtreecommitdiff
path: root/gcc/config/nvptx/nvptx.md
diff options
context:
space:
mode:
Diffstat (limited to 'gcc/config/nvptx/nvptx.md')
-rw-r--r--gcc/config/nvptx/nvptx.md39
1 files changed, 39 insertions, 0 deletions
diff --git a/gcc/config/nvptx/nvptx.md b/gcc/config/nvptx/nvptx.md
index 50dd42e..f2ed63b 100644
--- a/gcc/config/nvptx/nvptx.md
+++ b/gcc/config/nvptx/nvptx.md
@@ -63,6 +63,9 @@
UNSPECV_JOIN
UNSPECV_NOUNROLL
+
+ UNSPECV_SIMT_ENTER
+ UNSPECV_SIMT_EXIT
])
(define_attr "subregs_ok" "false,true"
@@ -1184,6 +1187,42 @@
;; Patterns for OpenMP SIMD-via-SIMT lowering
+(define_insn "omp_simt_enter_insn"
+ [(set (match_operand 0 "nvptx_register_operand" "=R")
+ (unspec_volatile [(match_operand 1 "nvptx_nonmemory_operand" "Ri")
+ (match_operand 2 "nvptx_nonmemory_operand" "Ri")]
+ UNSPECV_SIMT_ENTER))]
+ ""
+{
+ return nvptx_output_simt_enter (operands[0], operands[1], operands[2]);
+})
+
+(define_expand "omp_simt_enter"
+ [(match_operand 0 "nvptx_register_operand" "=R")
+ (match_operand 1 "nvptx_nonmemory_operand" "Ri")
+ (match_operand 2 "const_int_operand" "n")]
+ ""
+{
+ if (!CONST_INT_P (operands[1]))
+ cfun->machine->simt_stack_size = HOST_WIDE_INT_M1U;
+ else
+ cfun->machine->simt_stack_size = MAX (UINTVAL (operands[1]),
+ cfun->machine->simt_stack_size);
+ cfun->machine->simt_stack_align = MAX (UINTVAL (operands[2]),
+ cfun->machine->simt_stack_align);
+ cfun->machine->has_simtreg = true;
+ emit_insn (gen_omp_simt_enter_insn (operands[0], operands[1], operands[2]));
+ DONE;
+})
+
+(define_insn "omp_simt_exit"
+ [(unspec_volatile [(match_operand 0 "nvptx_register_operand" "R")]
+ UNSPECV_SIMT_EXIT)]
+ ""
+{
+ return nvptx_output_simt_exit (operands[0]);
+})
+
;; Implement IFN_GOMP_SIMT_LANE: set operand 0 to lane index
(define_insn "omp_simt_lane"
[(set (match_operand:SI 0 "nvptx_register_operand" "")