diff options
-rw-r--r-- | include/bfd.h | 2 | ||||
-rw-r--r-- | include/opcode/sparc.h | 97 |
2 files changed, 73 insertions, 26 deletions
diff --git a/include/bfd.h b/include/bfd.h index 142ceee..a0e8e50 100644 --- a/include/bfd.h +++ b/include/bfd.h @@ -222,7 +222,7 @@ typedef enum bfd_print_symbol bfd_print_symbol_name, bfd_print_symbol_more, bfd_print_symbol_all, - bfd_print_symbol_nm, /* Pretty format suitable for nm program. */ + bfd_print_symbol_nm /* Pretty format suitable for nm program. */ } bfd_print_symbol_type; diff --git a/include/opcode/sparc.h b/include/opcode/sparc.h index d0bc4cc..17da3ca 100644 --- a/include/opcode/sparc.h +++ b/include/opcode/sparc.h @@ -35,7 +35,7 @@ enum sparc_architecture { v7, cypress, v8, - v9, + v9 }; static const char *architecture_pname[] = { @@ -158,7 +158,7 @@ The following chars are unused: (note: ,[] are used as punctuation) #define ASI_RS2(x) (SIMM13(x)) #define ANNUL (1<<29) -#define BPRED (1<<21) /* v9 */ +#define BPRED (1<<19) /* v9 */ #define IMMED F3I(1) #define RD_G0 RD(~0) #define RS1_G0 RS1(~0) @@ -212,7 +212,7 @@ The following chars are unused: (note: ,[] are used as punctuation) #define ICC (0) /* v9 */ #define XCC (1<<11) /* v9 */ #define FCC(x) (((x)&0x3)<<11) /* v9 */ -#define FBFCC(x) (((x)&0x3)<<19) /* v9 */ +#define FBFCC(x) (((x)&0x3)<<20) /* v9 */ static struct sparc_opcode sparc_opcodes[] = { @@ -953,14 +953,14 @@ static struct sparc_opcode sparc_opcodes[] = { { opcode, (mask)|IMMED, (lose)|RS1_G0, "i", (flags), v6 }, /* %g0 + imm */ \ { opcode, (mask)|IMMED, (lose), "1+i", (flags), v6 }, /* rs1 + imm */ \ { opcode, (mask), IMMED|(lose), "1+2", (flags), v6 }, /* rs1 + rs2 */ \ - { opcode, (mask)|(1<<12)|IMMED, (lose)|RS1_G0, "Z,i", (flags), v9 }, /* %g0 + imm */ \ - { opcode, (mask)|(1<<12)|IMMED, (lose), "Z,1+i", (flags), v9 }, /* rs1 + imm */ \ - { opcode, (mask)|(1<<12), IMMED|(lose), "Z,1+2", (flags), v9 }, /* rs1 + rs2 */ \ - { opcode, (mask)|(1<<12), IMMED|(lose)|RS2_G0, "Z,1", (flags), v9 }, /* rs1 + %g0 */ \ - { opcode, (mask)|IMMED, (1<<12)|(lose)|RS1_G0, "z,i", (flags)|F_ALIAS, v9 }, /* %g0 + imm */ \ - { opcode, (mask)|IMMED, (1<<12)|(lose), "z,1+i", (flags)|F_ALIAS, v9 }, /* rs1 + imm */ \ - { opcode, (mask), IMMED|(1<<12)|(lose), "z,1+2", (flags)|F_ALIAS, v9 }, /* rs1 + rs2 */ \ - { opcode, (mask), IMMED|(1<<12)|(lose)|RS2_G0, "z,1", (flags)|F_ALIAS, v9 }, /* rs1 + %g0 */ \ + { opcode, (mask)|(2<<11)|IMMED, (lose)|RS1_G0, "Z,i", (flags), v9 }, /* %g0 + imm */ \ + { opcode, (mask)|(2<<11)|IMMED, (lose), "Z,1+i", (flags), v9 }, /* rs1 + imm */ \ + { opcode, (mask)|(2<<11), IMMED|(lose), "Z,1+2", (flags), v9 }, /* rs1 + rs2 */ \ + { opcode, (mask)|(2<<11), IMMED|(lose)|RS2_G0, "Z,1", (flags), v9 }, /* rs1 + %g0 */ \ + { opcode, (mask)|IMMED, (lose)|RS1_G0, "z,i", (flags)|F_ALIAS, v9 }, /* %g0 + imm */ \ + { opcode, (mask)|IMMED, (lose), "z,1+i", (flags)|F_ALIAS, v9 }, /* rs1 + imm */ \ + { opcode, (mask), IMMED|(lose), "z,1+2", (flags)|F_ALIAS, v9 }, /* rs1 + rs2 */ \ + { opcode, (mask), IMMED|(lose)|RS2_G0, "z,1", (flags)|F_ALIAS, v9 }, /* rs1 + %g0 */ \ { opcode, (mask), IMMED|(lose)|RS2_G0, "1", (flags), v6 } /* rs1 + %g0 */ /* Define both branches and traps based on condition mask */ @@ -1011,32 +1011,79 @@ cond ("bz", "tz", CONDZ, F_ALIAS), /* for e */ brr(bop, F2(0, 3)|COND(mask), F2(~0, ~3)|COND(~(mask)), (flags)) /* v9 */ \ /* v9 */ condr("bre", 0x1, 0), -/* v9 */ condr("brne", 0x0, 0), +/* v9 */ condr("brne", 0x5, 0), /* v9 */ condr("brneg", 0x3, 0), -/* v9 */ condr("brnz", 0x0, F_ALIAS), -/* v9 */ condr("brpos", 0x2, 0), +/* v9 */ condr("brnegz", 0x2, 0), +/* v9 */ condr("brposnz", 0x6, 0), +/* v9 */ condr("brnz", 0x5, F_ALIAS), +/* v9 */ condr("brpos", 0x7, 0), /* v9 */ condr("brz", 0x1, F_ALIAS), #undef condr /* v9 */ #undef brr /* v9 */ #define mrr(opcode, mask, lose, flags) /* v9 */ \ - { opcode, (mask), (lose)|ASI(~0), "1,2,d", F_DELAYED|(flags), v9 }, \ - { opcode, (mask), (lose), "1,i,d", F_DELAYED|(flags), v9 } - -#define movr(bop, mask, flags) /* v9 */ \ - mrr(bop, F3(2, 0x2f, 0)|COND(mask), F3(~2, ~0x2f, ~0)|COND(~(mask))|ASI(~0), (flags)), /* v9 */ \ - mrr(bop, F3(2, 0x2f, 1)|COND(mask), F3(~2, ~0x2f, ~1)|COND(~(mask)), (flags)) /* v9 */ \ - + { opcode, (mask), (lose), "1,2,d", (flags), v9 }, \ + { opcode, (mask), (lose), "1,i,d", (flags), v9 } + +#define movr(mop, mask, flags) /* v9 */ \ + mrr(mop, F3(2, 0x2f, 0)|COND(mask), F3(~2, ~0x2f, ~0)|COND(~(mask)), (flags)), /* v9 */ \ + mrr(mop, F3(2, 0x2f, 1)|COND(mask), F3(~2, ~0x2f, ~1)|COND(~(mask)), (flags)) /* v9 */ + +#define fmrrs(opcode, mask, lose, flags) /* v9 */ \ + { opcode, (mask), (lose), "1,f,g", (flags), v9 } +#define fmrrd(opcode, mask, lose, flags) /* v9 */ \ + { opcode, (mask), (lose), "1,B,H", (flags), v9 } +#define fmrrq(opcode, mask, lose, flags) /* v9 */ \ + { opcode, (mask), (lose), "1,R,J", (flags), v9 } + +#define fmovrs(mop, mask, flags) /* v9 */ \ + fmrrs(mop, F3(2, 0x25, 0)|COND(mask), F3(~2, ~0x25, ~0)|COND(~(mask)), (flags)) /* v9 */ +#define fmovrd(mop, mask, flags) /* v9 */ \ + fmrrd(mop, F3(2, 0x25, 0)|COND(mask), F3(~2, ~0x25, ~0)|COND(~(mask)), (flags)) /* v9 */ +#define fmovrq(mop, mask, flags) /* v9 */ \ + fmrrq(mop, F3(2, 0x25, 0)|COND(mask), F3(~2, ~0x25, ~0)|COND(~(mask)), (flags)) /* v9 */ + +/* v9 */ movr("movrne", 0x5, 0), /* v9 */ movr("movre", 0x1, 0), -/* v9 */ movr("movrne", 0x0, 0), +/* v9 */ movr("movrpos", 0x7, 0), /* v9 */ movr("movrneg", 0x3, 0), -/* v9 */ movr("movrnz", 0x0, F_ALIAS), -/* v9 */ movr("movrpos", 0x2, 0), +/* v9 */ movr("movrnegz", 0x2, 0), +/* v9 */ movr("movrposnz", 0x6, 0), +/* v9 */ movr("movrnz", 0x5, F_ALIAS), /* v9 */ movr("movrz", 0x1, F_ALIAS), +/* v9 */ fmovrs("fmovrnes", 0x5, 0), +/* v9 */ fmovrs("fmovres", 0x1, 0), +/* v9 */ fmovrs("fmovrposs", 0x7, 0), +/* v9 */ fmovrs("fmovrnegs", 0x3, 0), +/* v9 */ fmovrs("fmovrnegzs", 0x2, 0), +/* v9 */ fmovrs("fmovrposnzs", 0x6, 0), +/* v9 */ fmovrs("fmovrnzs", 0x5, F_ALIAS), +/* v9 */ fmovrs("fmovrzs", 0x1, F_ALIAS), + +/* v9 */ fmovrd("fmovrned", 0x5, 0), +/* v9 */ fmovrd("fmovred", 0x1, 0), +/* v9 */ fmovrd("fmovrposd", 0x7, 0), +/* v9 */ fmovrd("fmovrnegd", 0x3, 0), +/* v9 */ fmovrd("fmovrnegzd", 0x2, 0), +/* v9 */ fmovrd("fmovrposnzd", 0x6, 0), +/* v9 */ fmovrd("fmovrnzd", 0x5, F_ALIAS), +/* v9 */ fmovrd("fmovrzd", 0x1, F_ALIAS), + +/* v9 */ fmovrq("fmovrneq", 0x5, 0), +/* v9 */ fmovrq("fmovreq", 0x1, 0), +/* v9 */ fmovrq("fmovrposq", 0x7, 0), +/* v9 */ fmovrq("fmovrnegq", 0x3, 0), +/* v9 */ fmovrq("fmovrnegzq", 0x2, 0), +/* v9 */ fmovrq("fmovrposnzq", 0x6, 0), +/* v9 */ fmovrq("fmovrnzq", 0x5, F_ALIAS), +/* v9 */ fmovrq("fmovrzq", 0x1, F_ALIAS), + #undef movr /* v9 */ #undef mrr /* v9 */ +#undef fmovr /* v9 */ +#undef fmrr /* v9 */ { "mova", F3(2, 0x2c, 0)|FCC(0)|MCOND(FCONDA,0), MCOND(~FCONDA,~0)|FCC(~0)|F3(~2, ~0x2c, ~0), "6,2,d", 0, v9 }, { "mova", F3(2, 0x2c, 1)|FCC(0)|MCOND(FCONDA,0), MCOND(~FCONDA,~0)|FCC(~0)|F3(~2, ~0x2c,~1), "6,I,d", 0, v9 }, @@ -1617,7 +1664,7 @@ cond ("bz", "tz", CONDZ, F_ALIAS), /* for e */ { opcode, FBFCC(2)|(mask)|BPRED|ANNUL, FBFCC(~2)|(lose), ",a,T 8,G", F_DELAYED, v9 }, \ { opcode, FBFCC(3)|(mask), ANNUL|BPRED|FBFCC(~3)|(lose), "9,G", F_DELAYED, v9 }, \ { opcode, FBFCC(3)|(mask)|ANNUL, BPRED|FBFCC(~3)|(lose), ",a 9,G", F_DELAYED, v9 }, \ - { opcode, FBFCC(3)|(mask), ANNUL|BPRED|FBFCC(~3)|(lose), ",N9,G", F_DELAYED, v9 }, \ + { opcode, FBFCC(3)|(mask), ANNUL|BPRED|FBFCC(~3)|(lose), ",N 9,G", F_DELAYED, v9 }, \ { opcode, FBFCC(3)|(mask)|ANNUL, BPRED|FBFCC(~3)|(lose), ",a,N 9,G", F_DELAYED, v9 }, \ { opcode, FBFCC(3)|(mask)|BPRED, ANNUL|FBFCC(~3)|(lose), ",T 9,G", F_DELAYED, v9 }, \ { opcode, FBFCC(3)|(mask)|BPRED|ANNUL, FBFCC(~3)|(lose), ",a,T 9,G", F_DELAYED, v9 } |