| 572 | } |
| 573 | |
| 574 | void SValue::div(const Value* a, const Value* b) { |
| 575 | const SValue* aval = (const SValue*)a; |
| 576 | const SValue* bval = (const SValue*)b; |
| 577 | m_size = (aval->m_size > bval->m_size) ? aval->m_size : bval->m_size; |
| 578 | if (bval->m_value.s_int == 0) { |
| 579 | m_valid = 0; |
| 580 | m_value.s_int = 0; |
| 581 | m_negative = 0; |
| 582 | } else { |
| 583 | switch (aval->getType()) { |
| 584 | case Value::Type::Scalar: |
| 585 | m_negative = 0; |
| 586 | m_value.u_int = aval->m_value.u_int / bval->m_value.u_int; |
| 587 | m_type = Value::Type::Unsigned; |
| 588 | break; |
| 589 | case Value::Type::Double: |
| 590 | m_negative = ((aval->m_value.d_int / bval->m_value.d_int) < 0); |
| 591 | m_value.d_int = aval->m_value.d_int / bval->m_value.d_int; |
| 592 | m_type = Value::Type::Double; |
| 593 | break; |
| 594 | case Value::Type::Integer: |
| 595 | m_negative = ((aval->m_value.s_int / bval->m_value.s_int) < 0); |
| 596 | m_value.s_int = aval->m_value.s_int / bval->m_value.s_int; |
| 597 | m_type = Value::Type::Integer; |
| 598 | break; |
| 599 | default: |
| 600 | m_negative = 0; |
| 601 | m_value.u_int = aval->m_value.u_int / bval->m_value.u_int; |
| 602 | m_type = Value::Type::Unsigned; |
| 603 | break; |
| 604 | } |
| 605 | m_valid = a->isValid() && b->isValid(); |
| 606 | } |
| 607 | } |
| 608 | |
| 609 | void SValue::mod(const Value* a, const Value* b) { |
| 610 | const SValue* aval = (const SValue*)a; |