| // Copyright 2023 Google LLC |
| // |
| // Licensed under the Apache License, Version 2.0 (the "License"); |
| // you may not use this file except in compliance with the License. |
| // You may obtain a copy of the License at |
| // |
| // https://www.apache.org/licenses/LICENSE-2.0 |
| // |
| // Unless required by applicable law or agreed to in writing, software |
| // distributed under the License is distributed on an "AS IS" BASIS, |
| // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| // See the License for the specific language governing permissions and |
| // limitations under the License. |
| |
| // Define an isa with two bundles. |
| isa Example { |
| namespace sim::example::isa; |
| bundles { |
| bundle_a; |
| bundle_b; |
| } |
| } |
| |
| int const1 = 1; |
| int my_const = const1 + 2; |
| |
| // Try some include files. |
| // Include file relative to test execution directory. |
| #include "mpact/sim/decoder/test/testfiles/include/empty_include.isa" |
| #include "mpact/sim/decoder/test/testfiles/include/bundle_a.isa" |
| |
| // This file is passed as another source file in invocation arguments. |
| // #include "mpact/sim/decoder/test/testfiles/bundle_b.isa" |
| |
| template<int base, int mult> |
| slot a_side_ops { |
| int base_plus_1 = base + 1; |
| int mult_plus_2 = mult + my_const; |
| default attributes = { one, two = 3, three = base, four = base_plus_1, five = 0}; |
| opcodes { |
| vctsf{(pred : sy : %reloc(dest)(base_plus_1))}; |
| cvtfs{(pred : sy : dest(base + 1))}; |
| adds{(pred : sy, sx : dest(base))}, |
| attributes: {five = 1, six}; |
| push{(pred : [rlist]: )}; |
| pop{(pred : : [rlist])}; |
| addf{(pred : sy, sx : dest(base))}; |
| subf{(pred : sy, sx : dest(base))}; |
| mulf{(pred : sy, sx : dest(mult_plus_2))}; |
| mulu{(pred : sy, sx : dest(mult + 1))}; |
| } |
| } |
| |
| slot a_side { |
| opcodes { |
| nop{()}; |
| delay{(pred : const)}; |
| settag{()}; |
| fence{()}; |
| } |
| } |
| |
| slot a_side_0 : a_side, a_side_ops<2, 2> { |
| default opcode = |
| semfunc: "[](Instruction *) {}"; |
| opcodes { |
| settag = delete; |
| addf = delete; |
| subf = delete; |
| br_abs{()}; |
| br_rel{()}; |
| br_ind{()}; |
| call_abs{()}; |
| call_rel{()}; |
| call_ind{()}; |
| } |
| } |
| |
| slot a_side_1 : a_side, a_side_ops<1, 4> { |
| default opcode = |
| semfunc: "[](Instruction *) {}"; |
| opcodes { |
| ld{(pred : %reloc(yop) : ),(: : dest)}, |
| disasm:"%dest = sld %pred [smem:%yop]"; |
| ld_offset{(pred : xop, yop : dest(abs(-2)))}; |
| st{(pred)}; |
| mulf = delete; |
| mulu = delete; |
| } |
| } |
| |
| slot other { |
| default opcode = |
| semfunc: "[](Instruction *) {}"; |
| } |
| |
| slot b_side_alu[4] { |
| default opcode = |
| semfunc: "[](Instruction *) {}"; |
| } |
| |
| slot b_side_store { |
| default opcode = |
| semfunc: "[](Instruction *) {}"; |
| } |
| |
| slot b_side_load[2] { |
| default opcode = |
| semfunc: "[](Instruction *) {}"; |
| } |
| |
| slot b_side_load_2 { |
| default opcode = |
| semfunc: "[](Instruction *) {}"; |
| } |