Line data Source code
1 : /**
2 : * Copyright (c) 2025 Huawei Technologies Co., Ltd.
3 : * This program is free software, you can redistribute it and/or modify it under the terms and conditions of
4 : * CANN Open Software License Agreement Version 2.0 (the "License").
5 : * Please refer to the License for details. You may not use this file except in compliance with the License.
6 : * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED,
7 : * INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE.
8 : * See LICENSE in the root of the software repository for the full text of the License.
9 : */
10 :
11 : #include "ccu_rep.h"
12 :
13 : #include "string_util.h"
14 : #include "exception_util.h"
15 : #include "ccu_api_exception.h"
16 :
17 : namespace Hccl {
18 : namespace CcuRep {
19 :
20 547 : void CcuRepAdd::SetCommonInfo()
21 : {
22 547 : type = CcuRepType::ADD;
23 547 : instrCount = 1;
24 547 : }
25 :
26 8 : CcuRepAdd::CcuRepAdd(const Address &addrC, const Address &addrA, const Variable &varB)
27 8 : : subType(AddSubType::ADDR_PLUS_VAR_TO_ADDR), addrA(addrA), addrC(addrC), varB(varB)
28 : {
29 8 : SetCommonInfo();
30 8 : }
31 :
32 1 : CcuRepAdd::CcuRepAdd(const Address &addrC, const Address &addrA, const Address &addrB)
33 1 : : subType(AddSubType::ADDR_PLUS_ADDR_TO_ADDR), addrA(addrA), addrB(addrB), addrC(addrC)
34 : {
35 1 : SetCommonInfo();
36 1 : }
37 :
38 1 : CcuRepAdd::CcuRepAdd(const Variable &varC, const Variable &varA, const Variable &varB)
39 1 : : subType(AddSubType::VAR_PLUS_VAR_TO_VAR), varA(varA), varB(varB),
40 2 : varC(varC)
41 : {
42 1 : SetCommonInfo();
43 1 : }
44 :
45 508 : CcuRepAdd::CcuRepAdd(const Address &addrA, const Variable &offset)
46 508 : : subType(AddSubType::SELF_ADD_ADDRESS), addrA(addrA), varB(offset)
47 : {
48 508 : SetCommonInfo();
49 508 : }
50 :
51 29 : CcuRepAdd::CcuRepAdd(const Variable &varA, const Variable &offset)
52 29 : : subType(AddSubType::SELF_ADD_VARIABLE), varA(varA), varB(offset)
53 : {
54 29 : SetCommonInfo();
55 29 : }
56 :
57 168 : bool CcuRepAdd::Translate(CcuInstr *&instr, uint16_t &instrId, const TransDep &dep)
58 : {
59 168 : CHECK_NULLPTR(instr, "[CcuRepAdd::Translate] instr is nullptr!");
60 168 : this->instrId = instrId;
61 168 : translated = true;
62 :
63 168 : switch (subType) {
64 8 : case AddSubType::ADDR_PLUS_VAR_TO_ADDR: {
65 8 : LoadGSAXnInstr(instr++, addrC.Id(), addrA.Id(), varB.Id());
66 8 : break;
67 : }
68 1 : case AddSubType::ADDR_PLUS_ADDR_TO_ADDR: {
69 1 : LoadGSAGSAInstr(instr++, addrC.Id(), addrA.Id(), addrB.Id());
70 1 : break;
71 : }
72 1 : case AddSubType::VAR_PLUS_VAR_TO_VAR: {
73 1 : LoadXXInstr(instr++, varC.Id(), varA.Id(), varB.Id());
74 1 : break;
75 : }
76 144 : case AddSubType::SELF_ADD_ADDRESS: {
77 144 : LoadGSAXnInstr(instr++, addrA.Id(), addrA.Id(), varB.Id());
78 144 : break;
79 : }
80 14 : case AddSubType::SELF_ADD_VARIABLE: {
81 14 : LoadXXInstr(instr++, varA.Id(), varA.Id(), varB.Id());
82 14 : break;
83 : }
84 0 : default: {
85 0 : THROW<CcuApiException>("Invalid Add");
86 : }
87 : }
88 :
89 168 : CHK_PRT_THROW((instrId > UINT16_MAX - instrCount),
90 : HCCL_ERROR("[CcuRepAdd::Translate]uint16 integer overflow occurs, instrId = [%hu], instrCount = [%hu]", instrId, instrCount),
91 : InternalException, "integer overflow");
92 168 : instrId += instrCount;
93 :
94 168 : return translated;
95 : }
96 :
97 232 : std::string CcuRepAdd::Describe()
98 : {
99 232 : switch (subType) {
100 10 : case AddSubType::ADDR_PLUS_VAR_TO_ADDR: {
101 10 : return StringFormat("Address[%u] = Address[%u] + Variable[%u]", addrC.Id(), addrA.Id(), varB.Id());
102 : }
103 2 : case AddSubType::ADDR_PLUS_ADDR_TO_ADDR: {
104 2 : return StringFormat("Address[%u] = Address[%u] + Address[%u]", addrC.Id(), addrA.Id(), addrB.Id());
105 : }
106 2 : case AddSubType::VAR_PLUS_VAR_TO_VAR: {
107 2 : return StringFormat("Variable[%u] = Variable[%u] + Variable[%u]", varC.Id(), varA.Id(), varB.Id());
108 : }
109 200 : case AddSubType::SELF_ADD_ADDRESS: {
110 200 : return StringFormat("Address[%u] += Variable[%u]", addrA.Id(), varB.Id());
111 : }
112 18 : case AddSubType::SELF_ADD_VARIABLE: {
113 18 : return StringFormat("Variable[%u] += Variable[%u]", varA.Id(), varB.Id());
114 : }
115 0 : default: {
116 0 : return StringFormat("Invalid Add");
117 : }
118 : }
119 : }
120 :
121 : }; // namespace CcuRep
122 : }; // namespace Hccl
|