--- binutils-031228/include/opcode/h8300.h.orig Tue Dec 30 21:33:18 2003 +++ binutils-031228/include/opcode/h8300.h Tue Dec 30 21:33:10 2003 @@ -900,8 +900,8 @@ struct h8_opcode {code, AV_H8, 2, name, {{imm, RD8, E}}, {{op00, op01, imm, RD8, E}}}, \ {code, AV_H8, 6, name, {{imm, RDIND, E}}, {{op10, op11, B30 | RDIND, 0, op00, op01, imm, 0, E}}}, \ {code, AV_H8, 6, name, {{imm, ABS8DST, E}}, {{op20, op21, DSTABS8LIST, op00, op01, imm, 0, E}}}, \ - {code, AV_H8H, 6, name, {{imm, ABS16DST, E}}, {{0x6, 0xa, 0x1, op30, DST | ABS16LIST, op00, op01, imm, op4, E}}}, \ - {code, AV_H8H, 6, name, {{imm, ABS32DST, E}}, {{0x6, 0xa, 0x3, op30, DST | ABS32LIST, op00, op01, imm, op4, E}}} + {code, AV_H8H, 6, name, {{imm, ABS16DST, E}}, {{0x6, 0xa, 0x1, op30, DST | MEMRELAX | ABS16LIST , op00, op01, imm, op4, E}}}, \ + {code, AV_H8H, 6, name, {{imm, ABS32DST, E}}, {{0x6, 0xa, 0x3, op30, DST | MEMRELAX | ABS32LIST , op00, op01, imm, op4, E}}} #define BITOP_B(code, imm, name, op00, op01, op10, op11, op20, op21, op30, op4) \ {code, AV_H8SX, 0, name, {{imm, RDIND, E}}, {{op10, op11, B30 | RDIND, 0, op00, op01, imm, op4, E}}}, \ --- binutils-031228/gas/config/tc-h8300.c.orig Wed Dec 10 12:11:08 2003 +++ binutils-031228/gas/config/tc-h8300.c Tue Dec 30 00:53:26 2003 @@ -1580,7 +1580,21 @@ build_bytes (const struct h8_instruction /* Note if this is a movb instruction -- there's a special relaxation which only applies to them. */ - if (this_try->opcode->how == O (O_MOV, SB)) + if (this_try->opcode->how == O (O_MOV, SB) || + this_try->opcode->how == O (O_BCLR, SB) || + this_try->opcode->how == O (O_BAND, SB) || + this_try->opcode->how == O (O_BIAND, SB) || + this_try->opcode->how == O (O_BILD, SB) || + this_try->opcode->how == O (O_BIOR, SB) || + this_try->opcode->how == O (O_BIST, SB) || + this_try->opcode->how == O (O_BIXOR, SB) || + this_try->opcode->how == O (O_BLD, SB) || + this_try->opcode->how == O (O_BNOT, SB) || + this_try->opcode->how == O (O_BOR, SB) || + this_try->opcode->how == O (O_BSET, SB) || + this_try->opcode->how == O (O_BST, SB) || + this_try->opcode->how == O (O_BTST, SB) || + this_try->opcode->how == O (O_BXOR, SB) ) movb = 1; /* Output any fixes. */ --- binutils-031228/bfd/elf32-h8300.c.orig Fri Nov 28 00:19:37 2003 +++ binutils-031228/bfd/elf32-h8300.c Tue Dec 30 01:04:53 2003 @@ -1010,6 +1010,7 @@ elf32_h8_relax_section (bfd *abfd, asect if (value >= 0xffffff00u) { unsigned char code; + unsigned char temp_code; //used only in switch-case /* Note that we've changed the relocs, section contents, etc. */ @@ -1025,17 +1026,29 @@ elf32_h8_relax_section (bfd *abfd, asect abort (); code = bfd_get_8 (abfd, contents + irel->r_offset - 1); - - if ((code & 0xf0) == 0x00) - bfd_put_8 (abfd, - (code & 0xf) | 0x20, - contents + irel->r_offset - 2); - else if ((code & 0xf0) == 0x80) - bfd_put_8 (abfd, - (code & 0xf) | 0x30, - contents + irel->r_offset - 2); + if( (code & 0x10) != 0x10) + temp_code = code & 0xf0; else - abort (); + temp_code = code; + switch (temp_code) + { + case 0x00: + bfd_put_8 (abfd, (code & 0xf) | 0x20, + contents + irel->r_offset - 2); + break; + case 0x80: + bfd_put_8 (abfd, (code & 0xf) | 0x30, + contents + irel->r_offset - 2); + break; + case 0x18: + bfd_put_8 (abfd, 0x7f, contents + irel->r_offset - 2); + break; + case 0x10: + bfd_put_8 (abfd, 0x7e, contents + irel->r_offset - 2); + break; + default: + abort (); + } /* Fix the relocation's type. */ irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info), @@ -1066,6 +1079,7 @@ elf32_h8_relax_section (bfd *abfd, asect if (value >= 0xffffff00u) { unsigned char code; + unsigned char temp_code; //used only in switch-case /* Note that we've changed the relocs, section contents, etc. */ @@ -1081,20 +1095,29 @@ elf32_h8_relax_section (bfd *abfd, asect abort (); code = bfd_get_8 (abfd, contents + irel->r_offset - 1); - - switch (code & 0xf0) - { - case 0x20: - bfd_put_8 (abfd, (code & 0xf) | 0x20, - contents + irel->r_offset - 2); - break; - case 0xa0: - bfd_put_8 (abfd, (code & 0xf) | 0x30, - contents + irel->r_offset - 2); - break; - default: - abort (); - } + if( (code & 0x30) != 0x30) + temp_code = code & 0xf0; + else + temp_code = code; + switch (temp_code) + { + case 0x20: + bfd_put_8 (abfd, (code & 0xf) | 0x20, + contents + irel->r_offset - 2); + break; + case 0xa0: + bfd_put_8 (abfd, (code & 0xf) | 0x30, + contents + irel->r_offset - 2); + break; + case 0x38: + bfd_put_8 (abfd, 0x7f, contents + irel->r_offset - 2); + break; + case 0x30: + bfd_put_8 (abfd, 0x7e, contents + irel->r_offset - 2); + break; + default: + abort(); + } /* Fix the relocation's type. */ irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info), --- binutils-031228/bfd/coff-h8300.c.orig Mon Nov 24 23:36:39 2003 +++ binutils-031228/bfd/coff-h8300.c Tue Dec 30 01:20:36 2003 @@ -666,6 +666,7 @@ h8300_reloc16_extra_cases (bfd *abfd, st bfd_vma value; bfd_vma dot; int gap, tmp; + unsigned char temp_code; //used only in switch-case switch (reloc->howto->type) { @@ -947,17 +948,27 @@ h8300_reloc16_extra_cases (bfd *abfd, st if (data[dst_address - 2] != 0x6a) abort (); + if( (data[src_address - 1] & 0x10) != 0x10) + temp_code = data[src_address - 1] & 0xf0; + else + temp_code = data[src_address - 1]; /* Fix up the opcode. */ - switch (data[src_address - 1] & 0xf0) + switch (temp_code) { - case 0x00: - data[dst_address - 2] = (data[src_address - 1] & 0xf) | 0x20; - break; - case 0x80: - data[dst_address - 2] = (data[src_address - 1] & 0xf) | 0x30; - break; - default: - abort (); + case 0x00: + data[dst_address - 2] = (data[src_address - 1] & 0xf) | 0x20; + break; + case 0x80: + data[dst_address - 2] = (data[src_address - 1] & 0xf) | 0x30; + break; + case 0x18: + data[dst_address - 2] = 0x7f; + break; + case 0x10: + data[dst_address - 2] = 0x7e; + break; + default: + abort (); } bfd_put_8 (abfd, value & 0xff, data + dst_address - 1); @@ -972,17 +983,27 @@ h8300_reloc16_extra_cases (bfd *abfd, st if (data[dst_address - 2] != 0x6a) abort (); + if( (data[src_address - 1] & 0x30) != 0x30) + temp_code = data[src_address - 1] & 0xf0; + else + temp_code = data[src_address - 1]; /* Fix up the opcode. */ - switch (data[src_address - 1] & 0xf0) + switch (temp_code) { - case 0x20: - data[dst_address - 2] = (data[src_address - 1] & 0xf) | 0x20; - break; - case 0xa0: - data[dst_address - 2] = (data[src_address - 1] & 0xf) | 0x30; - break; - default: - abort (); + case 0x20: + data[dst_address - 2] = (data[src_address - 1] & 0xf) | 0x20; + break; + case 0xa0: + data[dst_address - 2] = (data[src_address - 1] & 0xf) | 0x30; + break; + case 0x38: + data[dst_address - 2] = 0x7f; + break; + case 0x30: + data[dst_address - 2] = 0x7e; + break; + default: + abort (); } bfd_put_8 (abfd, value & 0xff, data + dst_address - 1);