- case CEE_LDIND_I1:
- value_kind = MONO_INTEGER_VALUE_SIZE_1;
- goto handle_load;
- case CEE_LDIND_U1:
- value_kind = MONO_UNSIGNED_INTEGER_VALUE_SIZE_1;
- goto handle_load;
- case CEE_LDIND_I2:
- value_kind = MONO_INTEGER_VALUE_SIZE_2;
- goto handle_load;
- case CEE_LDIND_U2:
- value_kind = MONO_UNSIGNED_INTEGER_VALUE_SIZE_2;
- goto handle_load;
- case CEE_LDIND_I4:
- value_kind = MONO_INTEGER_VALUE_SIZE_4;
- goto handle_load;
- case CEE_LDIND_U4:
- value_kind = MONO_UNSIGNED_INTEGER_VALUE_SIZE_4;
- goto handle_load;
- case CEE_LDIND_I8:
- value_kind = MONO_INTEGER_VALUE_SIZE_8;
- goto handle_load;
- case CEE_LDIND_I:
- value_kind = SIZEOF_VOID_P;
-handle_load:
- if ((value->inst_left->opcode == OP_LOCAL) || (value->inst_left->opcode == OP_ARG)) {
- value_kind = summarize_integer_value (area, value->inst_left, result, result_value_kind);
- } else {
- MAKE_VALUE_ANY (*result);
- }
- break;
- case CEE_ADD: {
- MonoSummarizedValue left_value;
- MonoSummarizedValue right_value;
- summarize_integer_value (area, value->inst_left, &left_value, result_value_kind);
- summarize_integer_value (area, value->inst_right, &right_value, result_value_kind);
-
- if (left_value.type == MONO_VARIABLE_SUMMARIZED_VALUE) {
- if (right_value.type == MONO_CONSTANT_SUMMARIZED_VALUE) {
- result->type = MONO_VARIABLE_SUMMARIZED_VALUE;
- result->value.variable.variable = left_value.value.variable.variable;
- result->value.variable.delta = left_value.value.variable.delta + right_value.value.constant.value;
- } else {
- MAKE_VALUE_ANY (*result);
- }
- } else if (right_value.type == MONO_VARIABLE_SUMMARIZED_VALUE) {
- if (left_value.type == MONO_CONSTANT_SUMMARIZED_VALUE) {
- result->type = MONO_VARIABLE_SUMMARIZED_VALUE;
- result->value.variable.variable = right_value.value.variable.variable;
- result->value.variable.delta = left_value.value.constant.value + right_value.value.variable.delta;
- } else {
- MAKE_VALUE_ANY (*result);
- }
- } else if ((right_value.type == MONO_CONSTANT_SUMMARIZED_VALUE) && (left_value.type == MONO_CONSTANT_SUMMARIZED_VALUE)) {
- /* This should not happen if constant folding has been done */
- result->type = MONO_CONSTANT_SUMMARIZED_VALUE;
- result->value.constant.value = left_value.value.constant.value + right_value.value.constant.value;
- } else {
- MAKE_VALUE_ANY (*result);
- }
- if (result->type == MONO_VARIABLE_SUMMARIZED_VALUE) {
- check_delta_safety (area, result);
- }
- break;
- }
- case CEE_SUB: {
- MonoSummarizedValue left_value;
- MonoSummarizedValue right_value;
- summarize_integer_value (area, value->inst_left, &left_value, result_value_kind);
- summarize_integer_value (area, value->inst_right, &right_value, result_value_kind);
-
- if (left_value.type == MONO_VARIABLE_SUMMARIZED_VALUE) {
- if (right_value.type == MONO_CONSTANT_SUMMARIZED_VALUE) {
- result->type = MONO_VARIABLE_SUMMARIZED_VALUE;
- result->value.variable.variable = left_value.value.variable.variable;
- result->value.variable.delta = left_value.value.variable.delta - right_value.value.constant.value;
- } else {
- MAKE_VALUE_ANY (*result);
- }
- } else if ((right_value.type == MONO_CONSTANT_SUMMARIZED_VALUE) && (left_value.type == MONO_CONSTANT_SUMMARIZED_VALUE)) {
- /* This should not happen if constant folding has been done */
- result->type = MONO_CONSTANT_SUMMARIZED_VALUE;
- result->value.constant.value = left_value.value.constant.value - right_value.value.constant.value;
- } else {
- MAKE_VALUE_ANY (*result);
- }
- if (result->type == MONO_VARIABLE_SUMMARIZED_VALUE) {
- check_delta_safety (area, result);
- }
- break;
- }
- case CEE_AND: {
- MonoSummarizedValue left_value;
- MonoSummarizedValue right_value;
- int constant_operand_value;
-
- summarize_integer_value (area, value->inst_left, &left_value, result_value_kind);
- summarize_integer_value (area, value->inst_right, &right_value, result_value_kind);
-
- if (left_value.type == MONO_CONSTANT_SUMMARIZED_VALUE) {
- constant_operand_value = left_value.value.constant.value;
- } else if (right_value.type == MONO_CONSTANT_SUMMARIZED_VALUE) {
- constant_operand_value = right_value.value.constant.value;
- } else {
- constant_operand_value = 0;
- }
-
- if (constant_operand_value > 0) {
- if (constant_operand_value <= 0xff) {
- if ((result_value_kind & MONO_INTEGER_VALUE_SIZE_BITMASK) > 1) {
- value_kind = MONO_UNSIGNED_INTEGER_VALUE_SIZE_1;
- }
- } else if (constant_operand_value <= 0xffff) {
- if ((result_value_kind & MONO_INTEGER_VALUE_SIZE_BITMASK) > 2) {
- value_kind = MONO_UNSIGNED_INTEGER_VALUE_SIZE_2;
- }
- }
- }
-
- MAKE_VALUE_ANY (*result);
- break;
- }
- case CEE_CONV_I1:
- case CEE_CONV_OVF_I1:
- case CEE_CONV_OVF_I1_UN:
- value_kind = MONO_INTEGER_VALUE_SIZE_1;
- MAKE_VALUE_ANY (*result);