- ANNOUNCE();
- assert(mode);
-
- if (get_mode_n_vector_elems(mode) > 1) {
- /* vector arithmetic not implemented yet */
- return tarval_bad;
- }
-
- switch(get_mode_sort(mode))
- {
- case irms_reference:
- case irms_control_flow:
- case irms_memory:
- case irms_auxiliary:
- assert(0);
- break;
-
- case irms_internal_boolean:
- return tarval_b_true;
-
- case irms_float_number:
- switch(get_mode_size_bits(mode))
- {
- case 32:
- fc_get_max(8, 23, NULL);
- break;
- case 64:
- fc_get_max(11, 52, NULL);
- break;
- case 80:
- fc_get_max(15, 64, NULL);
- break;
- }
- return get_tarval(fc_get_buffer(), fc_get_buffer_length(), mode);
-
- case irms_int_number:
- case irms_character:
- sc_max_from_bits(get_mode_size_bits(mode), mode_is_signed(mode), NULL);
- return get_tarval(sc_get_buffer(), sc_get_buffer_length(), mode);
- }
- return tarval_bad;
-}
-
-tarval *get_tarval_min(ir_mode *mode)
-{
- ANNOUNCE();
- assert(mode);
-
- if (get_mode_n_vector_elems(mode) > 1) {
- /* vector arithmetic not implemented yet */
- return tarval_bad;
- }
-
- switch(get_mode_sort(mode))
- {
- case irms_reference:
- case irms_control_flow:
- case irms_memory:
- case irms_auxiliary:
- assert(0);
- break;
-
- case irms_internal_boolean:
- return tarval_b_false;
-
- case irms_float_number:
- switch(get_mode_size_bits(mode))
- {
- case 32:
- fc_get_min(8, 23, NULL);
- break;
- case 64:
- fc_get_min(11, 52, NULL);
- break;
- case 80:
- fc_get_min(15, 64, NULL);
- break;
- }
- return get_tarval(fc_get_buffer(), fc_get_buffer_length(), mode);
-
- case irms_int_number:
- case irms_character:
- sc_min_from_bits(get_mode_size_bits(mode), mode_is_signed(mode), NULL);
- return get_tarval(sc_get_buffer(), sc_get_buffer_length(), mode);
- }
- return tarval_bad;
-}
-
-static long _null_value;
-
-tarval *get_tarval_null(ir_mode *mode)
-{
- ANNOUNCE();
- assert(mode);
-
- if (get_mode_n_vector_elems(mode) > 1) {
- /* vector arithmetic not implemented yet */
- return tarval_bad;
- }
-
- switch(get_mode_sort(mode))
- {
- case irms_control_flow:
- case irms_memory:
- case irms_auxiliary:
- case irms_internal_boolean:
- assert(0);
- break;
-
- case irms_float_number:
- return new_tarval_from_double(0.0, mode);
-
- case irms_int_number:
- case irms_character:
- return new_tarval_from_long(0l, mode);
-
- case irms_reference:
- return new_tarval_from_long(_null_value, mode);
- }
- return tarval_bad;
-}
-
-tarval *get_tarval_one(ir_mode *mode)
-{
- ANNOUNCE();
- assert(mode);
-
- if (get_mode_n_vector_elems(mode) > 1) {
- /* vector arithmetic not implemented yet */
- return tarval_bad;
- }
-
- switch(get_mode_sort(mode))
- {
- case irms_control_flow:
- case irms_memory:
- case irms_auxiliary:
- case irms_internal_boolean:
- case irms_reference:
- assert(0);
- break;
-
- case irms_float_number:
- return new_tarval_from_double(1.0, mode);
-
- case irms_int_number:
- case irms_character:
- return new_tarval_from_long(1l, mode);
- break;
- }
- return tarval_bad;
-}
-
-tarval *get_tarval_minus_one(ir_mode *mode)
-{
- ANNOUNCE();
- assert(mode);
-
- if (get_mode_n_vector_elems(mode) > 1) {
- /* vector arithmetic not implemented yet */
- return tarval_bad;
- }
-
- switch(get_mode_sort(mode))
- {
- case irms_control_flow:
- case irms_memory:
- case irms_auxiliary:
- case irms_internal_boolean:
- case irms_reference:
- assert(0);
- break;
-
- case irms_float_number:
- return mode_is_signed(mode) ? new_tarval_from_double(-1.0, mode) : tarval_bad;
-
- case irms_int_number:
- case irms_character:
- return mode_is_signed(mode) ? new_tarval_from_long(-1l, mode) : tarval_bad;
- }
- return tarval_bad;
-}
-
-tarval *get_tarval_nan(ir_mode *mode)
-{
- ANNOUNCE();
- assert(mode);
-
- if (get_mode_n_vector_elems(mode) > 1) {
- /* vector arithmetic not implemented yet */
- return tarval_bad;
- }
-
- if (get_mode_sort(mode) == irms_float_number) {
- switch(get_mode_size_bits(mode))
- {
- case 32:
- fc_get_qnan(8, 23, NULL);
- break;
- case 64:
- fc_get_qnan(11, 52, NULL);
- break;
- case 80:
- fc_get_qnan(15, 64, NULL);
- break;
- }
- return get_tarval(fc_get_buffer(), fc_get_buffer_length(), mode);
- }
- else {
- assert(0 && "tarval is not floating point");
- return tarval_bad;
- }
-}
-
-tarval *get_tarval_plus_inf(ir_mode *mode)
-{
- ANNOUNCE();
- assert(mode);
-
- if (get_mode_n_vector_elems(mode) > 1) {
- /* vector arithmetic not implemented yet */
- return tarval_bad;
- }
-
- if (get_mode_sort(mode) == irms_float_number) {
- switch(get_mode_size_bits(mode))
- {
- case 32:
- fc_get_plusinf(8, 23, NULL);
- break;
- case 64:
- fc_get_plusinf(11, 52, NULL);
- break;
- case 80:
- fc_get_plusinf(15, 64, NULL);
- break;
- }
- return get_tarval(fc_get_buffer(), fc_get_buffer_length(), mode);
- }
- else {
- assert(0 && "tarval is not floating point");
- return tarval_bad;
- }
-}
-
-tarval *get_tarval_minus_inf(ir_mode *mode)
-{
- ANNOUNCE();
- assert(mode);
-
- if (get_mode_n_vector_elems(mode) > 1) {
- /* vector arithmetic not implemented yet */
- return tarval_bad;
- }
-
- if (get_mode_sort(mode) == irms_float_number) {
- switch(get_mode_size_bits(mode))
- {
- case 32:
- fc_get_minusinf(8, 23, NULL);
- break;
- case 64:
- fc_get_minusinf(11, 52, NULL);
- break;
- case 80:
- fc_get_minusinf(15, 64, NULL);
- break;
- }
- return get_tarval(fc_get_buffer(), fc_get_buffer_length(), mode);
- }
- else {
- assert(0 && "tarval is not floating point");
- return tarval_bad;
- }
+ return _get_tarval_unreachable();
+}
+
+ir_tarval *get_tarval_max(ir_mode *mode)
+{
+ const ieee_descriptor_t *desc;
+
+ assert(mode);
+ if (get_mode_n_vector_elems(mode) > 1) {
+ /* vector arithmetic not implemented yet */
+ return tarval_bad;
+ }
+
+ switch (get_mode_sort(mode)) {
+ case irms_control_flow:
+ case irms_memory:
+ case irms_auxiliary:
+ panic("mode %F does not support maximum value", mode);
+
+ case irms_internal_boolean:
+ return tarval_b_true;
+
+ case irms_float_number:
+ desc = get_descriptor(mode);
+ fc_get_max(desc, NULL);
+ return get_tarval(fc_get_buffer(), fc_get_buffer_length(), mode);
+
+ case irms_reference:
+ case irms_int_number:
+ sc_max_from_bits(get_mode_size_bits(mode), mode_is_signed(mode), NULL);
+ return get_tarval(sc_get_buffer(), sc_get_buffer_length(), mode);
+ }
+ return tarval_bad;
+}
+
+ir_tarval *get_tarval_min(ir_mode *mode)
+{
+ const ieee_descriptor_t *desc;
+
+ assert(mode);
+ if (get_mode_n_vector_elems(mode) > 1) {
+ /* vector arithmetic not implemented yet */
+ return tarval_bad;
+ }
+
+ switch (get_mode_sort(mode)) {
+ case irms_control_flow:
+ case irms_memory:
+ case irms_auxiliary:
+ panic("mode %F does not support minimum value", mode);
+
+ case irms_internal_boolean:
+ return tarval_b_false;
+
+ case irms_float_number:
+ desc = get_descriptor(mode);
+ fc_get_min(desc, NULL);
+ return get_tarval(fc_get_buffer(), fc_get_buffer_length(), mode);
+
+ case irms_reference:
+ case irms_int_number:
+ sc_min_from_bits(get_mode_size_bits(mode), mode_is_signed(mode), NULL);
+ return get_tarval(sc_get_buffer(), sc_get_buffer_length(), mode);
+ }
+ return tarval_bad;
+}
+
+/** The bit pattern for the pointer NULL */
+static long _null_value = 0;
+
+ir_tarval *get_tarval_null(ir_mode *mode)
+{
+ assert(mode);
+
+ if (get_mode_n_vector_elems(mode) > 1) {
+ /* vector arithmetic not implemented yet */
+ return tarval_bad;
+ }
+
+ switch (get_mode_sort(mode)) {
+ case irms_control_flow:
+ case irms_memory:
+ case irms_auxiliary:
+ panic("mode %F does not support null value", mode);
+
+ case irms_float_number:
+ return new_tarval_from_double(0.0, mode);
+
+ case irms_internal_boolean:
+ case irms_int_number:
+ return new_tarval_from_long(0l, mode);
+
+ case irms_reference:
+ return new_tarval_from_long(_null_value, mode);
+ }
+ return tarval_bad;
+}
+
+ir_tarval *get_tarval_one(ir_mode *mode)
+{
+ assert(mode);
+
+ if (get_mode_n_vector_elems(mode) > 1)
+ panic("vector arithmetic not implemented yet");
+
+ switch (get_mode_sort(mode)) {
+ case irms_control_flow:
+ case irms_memory:
+ case irms_auxiliary:
+ panic("mode %F does not support one value", mode);
+
+ case irms_internal_boolean:
+ return tarval_b_true;
+
+ case irms_float_number:
+ return new_tarval_from_double(1.0, mode);
+
+ case irms_reference:
+ case irms_int_number:
+ return new_tarval_from_long(1l, mode);
+ }
+ return tarval_bad;
+}
+
+ir_tarval *get_tarval_all_one(ir_mode *mode)
+{
+ assert(mode);
+
+ if (get_mode_n_vector_elems(mode) > 1)
+ panic("vector arithmetic not implemented yet");
+
+ switch (get_mode_sort(mode)) {
+ case irms_control_flow:
+ case irms_memory:
+ case irms_auxiliary:
+ panic("mode %F does not support all-one value", mode);
+
+ case irms_int_number:
+ case irms_internal_boolean:
+ case irms_reference:
+ return tarval_not(get_mode_null(mode));
+
+
+ case irms_float_number:
+ return new_tarval_from_double(1.0, mode);
+ }
+ return tarval_bad;
+}
+
+int tarval_is_constant(ir_tarval *tv)
+{
+ int num_res = sizeof(reserved_tv) / sizeof(reserved_tv[0]);
+
+ /* reserved tarvals are NOT constants. Note that although
+ tarval_b_true and tarval_b_false are reserved, they are constants of course. */
+ return (tv < &reserved_tv[2] || tv > &reserved_tv[num_res - 1]);
+}
+
+ir_tarval *get_tarval_minus_one(ir_mode *mode)
+{
+ assert(mode);
+
+ if (get_mode_n_vector_elems(mode) > 1)
+ panic("vector arithmetic not implemented yet");
+
+ switch (get_mode_sort(mode)) {
+ case irms_control_flow:
+ case irms_memory:
+ case irms_auxiliary:
+ case irms_internal_boolean:
+ panic("mode %F does not support minus one value", mode);
+
+ case irms_reference:
+ return tarval_bad;
+
+ case irms_float_number:
+ return mode_is_signed(mode) ? new_tarval_from_double(-1.0, mode) : tarval_bad;
+
+ case irms_int_number:
+ return new_tarval_from_long(-1l, mode);
+ }
+ return tarval_bad;
+}
+
+ir_tarval *get_tarval_nan(ir_mode *mode)
+{
+ const ieee_descriptor_t *desc;
+
+ assert(mode);
+ if (get_mode_n_vector_elems(mode) > 1)
+ panic("vector arithmetic not implemented yet");
+
+ if (get_mode_sort(mode) == irms_float_number) {
+ desc = get_descriptor(mode);
+ fc_get_qnan(desc, NULL);
+ return get_tarval(fc_get_buffer(), fc_get_buffer_length(), mode);
+ } else
+ panic("mode %F does not support NaN value", mode);
+}
+
+ir_tarval *get_tarval_plus_inf(ir_mode *mode)
+{
+ assert(mode);
+ if (get_mode_n_vector_elems(mode) > 1)
+ panic("vector arithmetic not implemented yet");
+
+ if (get_mode_sort(mode) == irms_float_number) {
+ const ieee_descriptor_t *desc = get_descriptor(mode);
+ fc_get_plusinf(desc, NULL);
+ return get_tarval(fc_get_buffer(), fc_get_buffer_length(), mode);
+ } else
+ panic("mode %F does not support +inf value", mode);
+}
+
+ir_tarval *get_tarval_minus_inf(ir_mode *mode)
+{
+ assert(mode);
+
+ if (get_mode_n_vector_elems(mode) > 1)
+ panic("vector arithmetic not implemented yet");
+
+ if (get_mode_sort(mode) == irms_float_number) {
+ const ieee_descriptor_t *desc = get_descriptor(mode);
+ fc_get_minusinf(desc, NULL);
+ return get_tarval(fc_get_buffer(), fc_get_buffer_length(), mode);
+ } else
+ panic("mode %F does not support -inf value", mode);