- switch (get_mode_sort(sm)) {
- case irms_int_number:
- switch (get_mode_sort(lm)) {
- case irms_int_number:
- if (get_mode_arithmetic(sm) != get_mode_arithmetic(lm))
- return 0;
-
- /* only two complement implemented */
- assert(get_mode_arithmetic(sm) == irma_twos_complement);
-
- /* integers are convertable if
- * - both have the same sign and lm is the larger one
- * - lm is the signed one and is at least two bits larger
- * (one for the sign, one for the highest bit of sm)
- * - sm & lm are two_complement and lm has greater or equal number of bits
- */
- if (mode_is_signed(sm)) {
- if (!mode_is_signed(lm))
- return 0;
- return sm_bits <= lm_bits;
- } else {
- if (mode_is_signed(lm)) {
- return sm_bits < lm_bits;
- }
- return sm_bits <= lm_bits;
- }
- break;
-
- case irms_float_number:
- /* int to float works if the float is large enough */
- return 0;
-
- default:
- break;
- }
- break;
-
- case irms_float_number:
- if (get_mode_arithmetic(sm) == get_mode_arithmetic(lm)) {
- if ( (get_mode_sort(lm) == irms_float_number)
- && (get_mode_size_bits(lm) >= get_mode_size_bits(sm)) )
- return 1;
- }
- break;
-
- case irms_reference:
- /* do exist machines out there with different pointer lenghts ?*/