From 011891abfae060903f76d5c7aee23208cd295e71 Mon Sep 17 00:00:00 2001 From: JRPAN <25518778+JRPan@users.noreply.github.com> Date: Tue, 1 Feb 2022 20:36:24 -0500 Subject: Update Copyrights --- src/cuda-sim/ptx.l | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) (limited to 'src/cuda-sim/ptx.l') diff --git a/src/cuda-sim/ptx.l b/src/cuda-sim/ptx.l index 7706f0b..15b3cf7 100644 --- a/src/cuda-sim/ptx.l +++ b/src/cuda-sim/ptx.l @@ -1,6 +1,7 @@ /* -Copyright (c) 2009-2021, Tor M. Aamodt, Vijay Kandiah, Nikos Hardavellas -The University of British Columbia, Northwestern University +Copyright (c) 2009-2021, Tor M. Aamodt, Vijay Kandiah, Nikos Hardavellas, +Mahmoud Khairy, Junrui Pan, Timothy G. Rogers +The University of British Columbia, Northwestern University, Purdue University All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: -- cgit v1.3 From 081da0abacbc3595b090094b1a66fc37d35bd82a Mon Sep 17 00:00:00 2001 From: Cesar Avalos Date: Fri, 9 Aug 2024 18:42:11 -0400 Subject: Add support for SHF ptx instruction (#70) --- src/cuda-sim/instructions.cc | 32 ++++++++++++++++++++++++++++++++ src/cuda-sim/opcodes.def | 1 + src/cuda-sim/ptx.l | 8 +++++++- src/cuda-sim/ptx.y | 8 ++++++++ src/cuda-sim/ptx_ir.cc | 14 ++++++++++++++ src/cuda-sim/ptx_ir.h | 4 ++++ 6 files changed, 66 insertions(+), 1 deletion(-) (limited to 'src/cuda-sim/ptx.l') diff --git a/src/cuda-sim/instructions.cc b/src/cuda-sim/instructions.cc index 4792efc..2314bef 100644 --- a/src/cuda-sim/instructions.cc +++ b/src/cuda-sim/instructions.cc @@ -5441,6 +5441,38 @@ void shfl_impl(const ptx_instruction *pI, core_t *core, warp_inst_t inst) { } } +void shf_impl(const ptx_instruction *pI, ptx_thread_info *thread) { + ptx_reg_t a,b,c,d; + const operand_info &dst = pI->dst(); + const operand_info &src1 = pI->src1(); + const operand_info &src2 = pI->src2(); + const operand_info &src3 = pI->src3(); + + // Only b32 is allowed + unsigned i_type = pI->get_type(); + a = thread->get_operand_value(src1, dst, i_type, thread, 1); + b = thread->get_operand_value(src2, dst, i_type, thread, 1); + c = thread->get_operand_value(src3, dst, i_type, thread, 1); + + if(i_type != B32_TYPE) + printf("Only the b32 data_type is allowed per the ISA\n"); + + unsigned clamp_mode = pI->clamp_mode(); + unsigned n = c.u32 & 0x1f; + if(clamp_mode) { + if(c.u32 < 32) + n = c; + else + n = 32; + } + if(pI->left_mode()) + d.u32 = (b.u32 << n) | (a.u32 >> (32-n)); + else + d.u32 = (b.u32 << (32-n)) | (a.u32 >> n); + + thread->set_operand_value(dst, d, i_type, thread, pI); +} + void shl_impl(const ptx_instruction *pI, ptx_thread_info *thread) { ptx_reg_t a, b, d; const operand_info &dst = pI->dst(); diff --git a/src/cuda-sim/opcodes.def b/src/cuda-sim/opcodes.def index f5bf156..83a23ea 100644 --- a/src/cuda-sim/opcodes.def +++ b/src/cuda-sim/opcodes.def @@ -103,6 +103,7 @@ OP_DEF(SELP_OP,selp_impl,"selp",1,1) OP_DEF(SETP_OP,setp_impl,"setp",1,1) OP_DEF(SET_OP,set_impl,"set",1,1) OP_W_DEF(SHFL_OP,shfl_impl,"shfl",1,10) +OP_DEF(SHF_OP,shf_impl,"shf",1,1) OP_DEF(SHL_OP,shl_impl,"shl",1,1) OP_DEF(SHR_OP,shr_impl,"shr",1,1) OP_DEF(SIN_OP,sin_impl,"sin",1,4) diff --git a/src/cuda-sim/ptx.l b/src/cuda-sim/ptx.l index 15b3cf7..0810ef6 100644 --- a/src/cuda-sim/ptx.l +++ b/src/cuda-sim/ptx.l @@ -134,6 +134,7 @@ selp TC; yylval->int_value = SELP_OP; return OPCODE; setp TC; yylval->int_value = SETP_OP; return OPCODE; set TC; yylval->int_value = SET_OP; return OPCODE; shfl TC; yylval->int_value = SHFL_OP; return OPCODE; +shf TC; yylval->int_value = SHF_OP; return OPCODE; shl TC; yylval->int_value = SHL_OP; return OPCODE; shr TC; yylval->int_value = SHR_OP; return OPCODE; sin TC; yylval->int_value = SIN_OP; return OPCODE; @@ -317,6 +318,9 @@ breakaddr TC; yylval->int_value = BREAKADDR_OP; return OPCODE; \.sat TC; return SAT_OPTION; +\.l TC; return LEFT_OPTION; +\.r TC; return RIGHT_OPTION; + \.eq TC; return EQ_OPTION; \.ne TC; return NE_OPTION; \.lt TC; return LT_OPTION; @@ -354,6 +358,8 @@ breakaddr TC; yylval->int_value = BREAKADDR_OP; return OPCODE; \.arrive TC; return ARRIVE_OPTION; \.red TC; return RED_OPTION; +\.clamp TC; return CLAMP_OPTION; +\.wrap TC; return WRAP_OPTION; \.approx TC; return APPROX_OPTION; \.full TC; return FULL_OPTION; @@ -488,4 +494,4 @@ int ptx_error( yyscan_t yyscanner, ptx_recognizer* recognizer, const char *s ) fflush(stdout); //exit(1); return 0; -} \ No newline at end of file +} diff --git a/src/cuda-sim/ptx.y b/src/cuda-sim/ptx.y index b38f783..61183e8 100644 --- a/src/cuda-sim/ptx.y +++ b/src/cuda-sim/ptx.y @@ -220,6 +220,10 @@ class ptx_recognizer; %token PRMT_RC16_MODE; %token PRMT_ECL_MODE; %token PRMT_ECR_MODE; +%token WRAP_OPTION; +%token CLAMP_OPTION; +%token LEFT_OPTION; +%token RIGHT_OPTION; %type function_decl_header %type function_decl @@ -507,6 +511,10 @@ option: type_spec | DOWN_OPTION { recognizer->add_option(DOWN_OPTION); } | BFLY_OPTION { recognizer->add_option(BFLY_OPTION); } | IDX_OPTION { recognizer->add_option(IDX_OPTION); } + | WRAP_OPTION { recognizer->add_option(WRAP_OPTION); } + | CLAMP_OPTION { recognizer->add_option(CLAMP_OPTION); } + | LEFT_OPTION { recognizer->add_option(LEFT_OPTION); } + | RIGHT_OPTION { recognizer->add_option(RIGHT_OPTION); } ; atomic_operation_spec: ATOMIC_AND { recognizer->add_option(ATOMIC_AND); } diff --git a/src/cuda-sim/ptx_ir.cc b/src/cuda-sim/ptx_ir.cc index d309542..1399209 100644 --- a/src/cuda-sim/ptx_ir.cc +++ b/src/cuda-sim/ptx_ir.cc @@ -1227,6 +1227,8 @@ ptx_instruction::ptx_instruction( m_rounding_mode = RN_OPTION; m_compare_op = -1; m_saturation_mode = 0; + m_clamp_mode = 0; + m_left_mode = 0; m_geom_spec = 0; m_vector_spec = 0; m_atomic_spec = 0; @@ -1293,6 +1295,18 @@ ptx_instruction::ptx_instruction( case SAT_OPTION: m_saturation_mode = 1; break; + case WRAP_OPTION: + m_clamp_mode = 0; + break; + case CLAMP_OPTION: + m_clamp_mode = 1; + break; + case LEFT_OPTION: + m_left_mode = 1; + break; + case RIGHT_OPTION: + m_left_mode = 0; + break; case RNI_OPTION: case RZI_OPTION: case RMI_OPTION: diff --git a/src/cuda-sim/ptx_ir.h b/src/cuda-sim/ptx_ir.h index 8b1f19c..46f183b 100644 --- a/src/cuda-sim/ptx_ir.h +++ b/src/cuda-sim/ptx_ir.h @@ -1085,6 +1085,8 @@ class ptx_instruction : public warp_inst_t { unsigned cache_option() const { return m_cache_option; } unsigned rounding_mode() const { return m_rounding_mode; } unsigned saturation_mode() const { return m_saturation_mode; } + unsigned clamp_mode() const {return m_clamp_mode;} + unsigned left_mode() const { return m_left_mode; } unsigned dimension() const { return m_geom_spec; } unsigned barrier_op() const { return m_barrier_op; } unsigned shfl_op() const { return m_shfl_op; } @@ -1159,6 +1161,8 @@ class ptx_instruction : public warp_inst_t { unsigned m_rounding_mode; unsigned m_compare_op; unsigned m_saturation_mode; + unsigned m_clamp_mode; + unsigned m_left_mode; unsigned m_barrier_op; unsigned m_shfl_op; unsigned m_prmt_op; -- cgit v1.3