Skip to content

Commit

Permalink
now supporting '%' and '/' on Data and in expressions (#151)
Browse files Browse the repository at this point in the history
  • Loading branch information
antoninbas authored Jun 20, 2016
1 parent 8ce6960 commit d6ff272
Show file tree
Hide file tree
Showing 5 changed files with 74 additions and 2 deletions.
13 changes: 12 additions & 1 deletion include/bm/bm_sim/data.h
Original file line number Diff line number Diff line change
Expand Up @@ -232,13 +232,24 @@ class Data {
export_bytes();
}

//! Performs a modulo operation
//! Performs a modulo operation. The following needs to be true: \p src1 >= 0
//! and \p src2 > 0.
void mod(const Data &src1, const Data &src2) {
assert(src1.arith && src2.arith);
assert(src1.value >= 0 && src2.value > 0);
value = src1.value % src2.value;
export_bytes();
}

//! Performs a division operation. The following needs to be true: \p src1 >=
//! 0 and \p src2 > 0.
void divide(const Data &src1, const Data &src2) {
assert(src1.arith && src2.arith);
assert(src1.value >= 0 && src2.value > 0);
value = src1.value / src2.value;
export_bytes();
}

//! NC
void multiply(const Data &src1, const Data &src2) {
assert(src1.arith && src2.arith);
Expand Down
2 changes: 1 addition & 1 deletion include/bm/bm_sim/expressions.h
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ namespace bm {
enum class ExprOpcode {
LOAD_FIELD, LOAD_HEADER, LOAD_BOOL, LOAD_CONST, LOAD_LOCAL,
LOAD_REGISTER_REF, LOAD_REGISTER_GEN,
ADD, SUB, MOD, MUL, SHIFT_LEFT, SHIFT_RIGHT,
ADD, SUB, MOD, DIV, MUL, SHIFT_LEFT, SHIFT_RIGHT,
EQ_DATA, NEQ_DATA, GT_DATA, LT_DATA, GET_DATA, LET_DATA,
AND, OR, NOT,
BIT_AND, BIT_OR, BIT_XOR, BIT_NEG,
Expand Down
17 changes: 17 additions & 0 deletions src/bm_sim/expressions.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,8 @@ ExprOpcodesMap::ExprOpcodesMap() {
{"load_register_gen", ExprOpcode::LOAD_REGISTER_GEN},
{"+", ExprOpcode::ADD},
{"-", ExprOpcode::SUB},
{"%", ExprOpcode::MOD},
{"/", ExprOpcode::DIV},
{"*", ExprOpcode::MUL},
{"<<", ExprOpcode::SHIFT_LEFT},
{">>", ExprOpcode::SHIFT_RIGHT},
Expand Down Expand Up @@ -297,6 +299,20 @@ Expression::eval_(const PHV &phv, ExprType expr_type,
data_temps_stack.push_back(&data_temps[op.data_dest_index]);
break;

case ExprOpcode::MOD:
rd = data_temps_stack.back(); data_temps_stack.pop_back();
ld = data_temps_stack.back(); data_temps_stack.pop_back();
data_temps[op.data_dest_index].mod(*ld, *rd);
data_temps_stack.push_back(&data_temps[op.data_dest_index]);
break;

case ExprOpcode::DIV:
rd = data_temps_stack.back(); data_temps_stack.pop_back();
ld = data_temps_stack.back(); data_temps_stack.pop_back();
data_temps[op.data_dest_index].divide(*ld, *rd);
data_temps_stack.push_back(&data_temps[op.data_dest_index]);
break;

case ExprOpcode::MUL:
rd = data_temps_stack.back(); data_temps_stack.pop_back();
ld = data_temps_stack.back(); data_temps_stack.pop_back();
Expand Down Expand Up @@ -479,6 +495,7 @@ Expression::assign_dest_registers() {
case ExprOpcode::ADD:
case ExprOpcode::SUB:
case ExprOpcode::MOD:
case ExprOpcode::DIV:
case ExprOpcode::MUL:
case ExprOpcode::SHIFT_LEFT:
case ExprOpcode::SHIFT_RIGHT:
Expand Down
22 changes: 22 additions & 0 deletions tests/test_conditionals.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -191,6 +191,28 @@ TEST_F(ConditionalsTest, Add) {
ASSERT_FALSE(c.eval(*phv));
}

TEST_F(ConditionalsTest, Divide) {
Conditional c("ctest", 0);

// we check that (2 == 7 / 3) && (1 == 7 % 3) evaluates to true
c.push_back_load_const(Data(2));
c.push_back_load_const(Data(7));
c.push_back_load_const(Data(3));
c.push_back_op(ExprOpcode::DIV);
c.push_back_op(ExprOpcode::EQ_DATA);

c.push_back_load_const(Data(1));
c.push_back_load_const(Data(7));
c.push_back_load_const(Data(3));
c.push_back_op(ExprOpcode::MOD);
c.push_back_op(ExprOpcode::EQ_DATA);

c.push_back_op(ExprOpcode::AND);

c.build();
ASSERT_TRUE(c.eval(*phv));
}

TEST_F(ConditionalsTest, And) {
Conditional c1("c1test", 0);
c1.push_back_load_bool(true);
Expand Down
22 changes: 22 additions & 0 deletions tests/test_data.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -114,6 +114,28 @@ TEST(Data, ShiftRight) {

namespace {

// negative operands are not supported
void test_divide(int a, int b) {
int q_exp = a / b;
int r_exp = a % b;
Data q, r;
q.divide(Data(a), Data(b));
r.mod(Data(a), Data(b));
ASSERT_EQ(q_exp, q.get_int());
ASSERT_EQ(r_exp, r.get_int());
}

} // namespace

TEST(Data, Divide) {
test_divide(7, 3);
test_divide(56343, 45);
test_divide(5, 5);
test_divide(0, 3);
}

namespace {

void test_two_comp_mod(int src, unsigned int width, int expected) {
Data dst;
dst.two_comp_mod(Data(src), Data(width));
Expand Down

0 comments on commit d6ff272

Please sign in to comment.