|
|
1.1 ! root 1: *** expmed.c Fri Apr 8 10:07:44 1994 ! 2: --- expmed.c.next Fri Apr 1 12:53:32 1994 ! 3: *************** ! 4: *** 421,429 **** ! 5: /* If xop0 is a register, we need it in MAXMODE ! 6: to make it acceptable to the format of insv. */ ! 7: if (GET_CODE (xop0) == SUBREG) ! 8: ! /* We can't just change the mode, because this might clobber op0, ! 9: ! and we will need the original value of op0 if insv fails. */ ! 10: ! xop0 = gen_rtx (SUBREG, maxmode, SUBREG_REG (xop0), SUBREG_WORD (xop0)); ! 11: if (GET_CODE (xop0) == REG && GET_MODE (xop0) != maxmode) ! 12: xop0 = gen_rtx (SUBREG, maxmode, xop0, 0); ! 13: ! 14: --- 421,427 ---- ! 15: /* If xop0 is a register, we need it in MAXMODE ! 16: to make it acceptable to the format of insv. */ ! 17: if (GET_CODE (xop0) == SUBREG) ! 18: ! PUT_MODE (xop0, maxmode); ! 19: if (GET_CODE (xop0) == REG && GET_MODE (xop0) != maxmode) ! 20: xop0 = gen_rtx (SUBREG, maxmode, xop0, 0); ! 21: ! 22: *************** ! 23: *** 517,533 **** ! 24: int all_zero = 0; ! 25: int all_one = 0; ! 26: ! 27: - /* If VALUE is a floating-point mode, access it as an integer of the ! 28: - corresponding size. This can occur on a machine with 64 bit registers ! 29: - that uses SFmode for float. This can also occur for unaligned float ! 30: - structure fields. */ ! 31: - if (GET_MODE_CLASS (GET_MODE (value)) == MODE_FLOAT) ! 32: - { ! 33: - if (GET_CODE (value) != REG) ! 34: - value = copy_to_reg (value); ! 35: - value = gen_rtx (SUBREG, word_mode, value, 0); ! 36: - } ! 37: - ! 38: /* There is a case not handled here: ! 39: a structure with a known alignment of just a halfword ! 40: and a field split across two aligned halfwords within the structure. ! 41: --- 515,520 ---- ! 42: *************** ! 43: *** 569,584 **** ! 44: ! 45: total_bits = GET_MODE_BITSIZE (mode); ! 46: ! 47: - /* Make sure bitpos is valid for the chosen mode. Adjust BITPOS to ! 48: - be be in the range 0 to total_bits-1, and put any excess bytes in ! 49: - OFFSET. */ ! 50: - if (bitpos >= total_bits) ! 51: - { ! 52: - offset += (bitpos / total_bits) * (total_bits / BITS_PER_UNIT); ! 53: - bitpos -= ((bitpos / total_bits) * (total_bits / BITS_PER_UNIT) ! 54: - * BITS_PER_UNIT); ! 55: - } ! 56: - ! 57: /* Get ref to an aligned byte, halfword, or word containing the field. ! 58: Adjust BITPOS to be position within a word, ! 59: and OFFSET to be the offset of that word. ! 60: --- 556,561 ---- ! 61: *************** ! 62: *** 633,638 **** ! 63: --- 610,626 ---- ! 64: ! 65: if (GET_MODE (value) != mode) ! 66: { ! 67: + /* If VALUE is a floating-point mode, access it as an integer ! 68: + of the corresponding size, then convert it. This can occur on ! 69: + a machine with 64 bit registers that uses SFmode for float. */ ! 70: + if (GET_MODE_CLASS (GET_MODE (value)) == MODE_FLOAT) ! 71: + { ! 72: + if (GET_CODE (value) != REG) ! 73: + value = copy_to_reg (value); ! 74: + value ! 75: + = gen_rtx (SUBREG, word_mode, value, 0); ! 76: + } ! 77: + ! 78: if ((GET_CODE (value) == REG || GET_CODE (value) == SUBREG) ! 79: && GET_MODE_SIZE (mode) < GET_MODE_SIZE (GET_MODE (value))) ! 80: value = gen_lowpart (mode, value); ! 81: *************** ! 82: *** 703,709 **** ! 83: { ! 84: rtx word = gen_lowpart_common (word_mode, value); ! 85: ! 86: ! if (word && (value != word)) ! 87: value = word; ! 88: else ! 89: value = gen_lowpart_common (word_mode, ! 90: --- 691,697 ---- ! 91: { ! 92: rtx word = gen_lowpart_common (word_mode, value); ! 93: ! 94: ! if (word) ! 95: value = word; ! 96: else ! 97: value = gen_lowpart_common (word_mode, ! 98: *************** ! 99: *** 733,751 **** ! 100: >> (bitsize - bitsdone - thissize)) ! 101: & (((HOST_WIDE_INT) 1 << thissize) - 1)); ! 102: else ! 103: ! { ! 104: ! /* The args are chosen so that the last part ! 105: ! includes the lsb. */ ! 106: ! int bit_offset = 0; ! 107: ! /* If the value isn't in memory, then it must be right aligned ! 108: ! if a register, so skip past the padding on the left. If it ! 109: ! is in memory, then there is no padding on the left. */ ! 110: ! if (GET_CODE (value) != MEM) ! 111: ! bit_offset = BITS_PER_WORD - bitsize; ! 112: ! part = extract_fixed_bit_field (word_mode, value, 0, thissize, ! 113: ! bit_offset + bitsdone, ! 114: ! NULL_RTX, 1, align); ! 115: ! } ! 116: #else ! 117: /* Fetch successively more significant portions. */ ! 118: if (GET_CODE (value) == CONST_INT) ! 119: --- 721,731 ---- ! 120: >> (bitsize - bitsdone - thissize)) ! 121: & (((HOST_WIDE_INT) 1 << thissize) - 1)); ! 122: else ! 123: ! /* The args are chosen so that the last part ! 124: ! includes the lsb. */ ! 125: ! part = extract_fixed_bit_field (word_mode, value, 0, thissize, ! 126: ! BITS_PER_WORD - bitsize + bitsdone, ! 127: ! NULL_RTX, 1, align); ! 128: #else ! 129: /* Fetch successively more significant portions. */ ! 130: if (GET_CODE (value) == CONST_INT) ! 131: *************** ! 132: *** 757,776 **** ! 133: #endif ! 134: ! 135: /* If OP0 is a register, then handle OFFSET here. ! 136: ! ! 137: ! When handling multiword bitfields, extract_bit_field may pass ! 138: ! down a word_mode SUBREG of a larger REG for a bitfield that actually ! 139: ! crosses a word boundary. Thus, for a SUBREG, we must find ! 140: ! the current word starting from the base register. */ ! 141: ! if (GET_CODE (op0) == SUBREG) ! 142: { ! 143: - word = operand_subword (SUBREG_REG (op0), ! 144: - SUBREG_WORD (op0) + offset, 1, ! 145: - GET_MODE (SUBREG_REG (op0))); ! 146: - offset = 0; ! 147: - } ! 148: - else if (GET_CODE (op0) == REG) ! 149: - { ! 150: word = operand_subword (op0, offset, 1, GET_MODE (op0)); ! 151: offset = 0; ! 152: } ! 153: --- 737,745 ---- ! 154: #endif ! 155: ! 156: /* If OP0 is a register, then handle OFFSET here. ! 157: ! In the register case, UNIT must be a whole word. */ ! 158: ! if (GET_CODE (op0) == SUBREG || GET_CODE (op0) == REG) ! 159: { ! 160: word = operand_subword (op0, offset, 1, GET_MODE (op0)); ! 161: offset = 0; ! 162: } ! 163: *************** ! 164: *** 928,942 **** ! 165: emit_move_insn (target_part, result_part); ! 166: } ! 167: ! 168: ! if (unsignedp) ! 169: ! return target; ! 170: ! /* Signed bit field: sign-extend with two arithmetic shifts. */ ! 171: ! target = expand_shift (LSHIFT_EXPR, mode, target, ! 172: ! build_int_2 (GET_MODE_BITSIZE (mode) - bitsize, 0), ! 173: ! NULL_RTX, 0); ! 174: ! return expand_shift (RSHIFT_EXPR, mode, target, ! 175: ! build_int_2 (GET_MODE_BITSIZE (mode) - bitsize, 0), ! 176: ! NULL_RTX, 0); ! 177: } ! 178: ! 179: /* From here on we know the desired field is smaller than a word ! 180: --- 897,903 ---- ! 181: emit_move_insn (target_part, result_part); ! 182: } ! 183: ! 184: ! return target; ! 185: } ! 186: ! 187: /* From here on we know the desired field is smaller than a word ! 188: *************** ! 189: *** 1524,1543 **** ! 190: thissize = MIN (thissize, unit - thispos); ! 191: ! 192: /* If OP0 is a register, then handle OFFSET here. ! 193: ! ! 194: ! When handling multiword bitfields, extract_bit_field may pass ! 195: ! down a word_mode SUBREG of a larger REG for a bitfield that actually ! 196: ! crosses a word boundary. Thus, for a SUBREG, we must find ! 197: ! the current word starting from the base register. */ ! 198: ! if (GET_CODE (op0) == SUBREG) ! 199: { ! 200: - word = operand_subword_force (SUBREG_REG (op0), ! 201: - SUBREG_WORD (op0) + offset, ! 202: - GET_MODE (SUBREG_REG (op0))); ! 203: - offset = 0; ! 204: - } ! 205: - else if (GET_CODE (op0) == REG) ! 206: - { ! 207: word = operand_subword_force (op0, offset, GET_MODE (op0)); ! 208: offset = 0; ! 209: } ! 210: --- 1485,1493 ---- ! 211: thissize = MIN (thissize, unit - thispos); ! 212: ! 213: /* If OP0 is a register, then handle OFFSET here. ! 214: ! In the register case, UNIT must be a whole word. */ ! 215: ! if (GET_CODE (op0) == SUBREG || GET_CODE (op0) == REG) ! 216: { ! 217: word = operand_subword_force (op0, offset, GET_MODE (op0)); ! 218: offset = 0; ! 219: } ! 220: *************** ! 221: *** 1642,1655 **** ! 222: ! 223: op1 = expand_expr (amount, NULL_RTX, VOIDmode, 0); ! 224: ! 225: - #if SHIFT_COUNT_TRUNCATED ! 226: - if (SHIFT_COUNT_TRUNCATED ! 227: - && GET_CODE (op1) == CONST_INT ! 228: - && (unsigned HOST_WIDE_INT) INTVAL (op1) >= GET_MODE_BITSIZE (mode)) ! 229: - op1 = GEN_INT ((unsigned HOST_WIDE_INT) INTVAL (op1) ! 230: - % GET_MODE_BITSIZE (mode)); ! 231: - #endif ! 232: - ! 233: if (op1 == const0_rtx) ! 234: return shifted; ! 235: ! 236: --- 1592,1597 ----
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.