diff options
Diffstat (limited to 'gcc/config/nvptx/nvptx.md')
-rw-r--r-- | gcc/config/nvptx/nvptx.md | 39 |
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" "") |