Loading target/hppa/insns.decode +21 −0 Original line number Diff line number Diff line Loading @@ -38,6 +38,7 @@ %sm_imm 16:10 !function=expand_sm_imm %rm64 1:1 16:5 %rt64 6:1 0:5 %im5_0 0:s1 1:4 %im5_16 16:s1 17:4 Loading Loading @@ -195,6 +196,26 @@ lda 000011 ..... ..... .. . 0 -- 0110 ...... @ldstx size=2 sta 000011 ..... ..... .. . 1 -- 1110 ...... @stim5 size=2 stby 000011 b:5 r:5 sp:2 a:1 1 -- 1100 m:1 ..... disp=%im5_0 @fldstwx ...... b:5 x:5 sp:2 scale:1 ....... m:1 ..... \ &ldst t=%rt64 disp=0 size=2 @fldstwi ...... b:5 ..... sp:2 . ....... . ..... \ &ldst t=%rt64 disp=%im5_16 m=%ma_to_m x=0 scale=0 size=2 fldw 001001 ..... ..... .. . 0 -- 000 . . ..... @fldstwx fldw 001001 ..... ..... .. . 1 -- 000 . . ..... @fldstwi fstw 001001 ..... ..... .. . 0 -- 100 . . ..... @fldstwx fstw 001001 ..... ..... .. . 1 -- 100 . . ..... @fldstwi @fldstdx ...... b:5 x:5 sp:2 scale:1 ....... m:1 t:5 \ &ldst disp=0 size=3 @fldstdi ...... b:5 ..... sp:2 . ....... . t:5 \ &ldst disp=%im5_16 m=%ma_to_m x=0 scale=0 size=3 fldd 001011 ..... ..... .. . 0 -- 000 0 . ..... @fldstdx fldd 001011 ..... ..... .. . 1 -- 000 0 . ..... @fldstdi fstd 001011 ..... ..... .. . 0 -- 100 0 . ..... @fldstdx fstd 001011 ..... ..... .. . 1 -- 100 0 . ..... @fldstdi #### # Offset Mem #### Loading target/hppa/translate.c +0 −93 Original line number Diff line number Diff line Loading @@ -855,15 +855,6 @@ static void gen_goto_tb(DisasContext *ctx, int which, } } /* PA has a habit of taking the LSB of a field and using that as the sign, with the rest of the field becoming the least significant bits. */ static target_sreg low_sextract(uint32_t val, int pos, int len) { target_ureg x = -(target_ureg)extract32(val, pos, 1); x = (x << (len - 1)) | extract32(val, pos + 1, len - 1); return x; } static unsigned assemble_rt64(uint32_t insn) { unsigned r1 = extract32(insn, 6, 1); Loading Loading @@ -2981,84 +2972,6 @@ static bool trans_ldo(DisasContext *ctx, arg_ldo *a) return true; } static bool trans_copr_w(DisasContext *ctx, uint32_t insn) { unsigned t0 = extract32(insn, 0, 5); unsigned m = extract32(insn, 5, 1); unsigned t1 = extract32(insn, 6, 1); unsigned ext3 = extract32(insn, 7, 3); /* unsigned cc = extract32(insn, 10, 2); */ unsigned i = extract32(insn, 12, 1); unsigned ua = extract32(insn, 13, 1); unsigned sp = extract32(insn, 14, 2); unsigned rx = extract32(insn, 16, 5); unsigned rb = extract32(insn, 21, 5); unsigned rt = t1 * 32 + t0; int modify = (m ? (ua ? -1 : 1) : 0); int disp, scale; if (i == 0) { scale = (ua ? 2 : 0); disp = 0; modify = m; } else { disp = low_sextract(rx, 0, 5); scale = 0; rx = 0; modify = (m ? (ua ? -1 : 1) : 0); } switch (ext3) { case 0: /* FLDW */ do_floadw(ctx, rt, rb, rx, scale, disp, sp, modify); break; case 4: /* FSTW */ do_fstorew(ctx, rt, rb, rx, scale, disp, sp, modify); break; default: return gen_illegal(ctx); } return true; } static bool trans_copr_dw(DisasContext *ctx, uint32_t insn) { unsigned rt = extract32(insn, 0, 5); unsigned m = extract32(insn, 5, 1); unsigned ext4 = extract32(insn, 6, 4); /* unsigned cc = extract32(insn, 10, 2); */ unsigned i = extract32(insn, 12, 1); unsigned ua = extract32(insn, 13, 1); unsigned sp = extract32(insn, 14, 2); unsigned rx = extract32(insn, 16, 5); unsigned rb = extract32(insn, 21, 5); int modify = (m ? (ua ? -1 : 1) : 0); int disp, scale; if (i == 0) { scale = (ua ? 3 : 0); disp = 0; modify = m; } else { disp = low_sextract(rx, 0, 5); scale = 0; rx = 0; modify = (m ? (ua ? -1 : 1) : 0); } switch (ext4) { case 0: /* FLDD */ do_floadd(ctx, rt, rb, rx, scale, disp, sp, modify); break; case 8: /* FSTD */ do_fstored(ctx, rt, rb, rx, scale, disp, sp, modify); break; default: return gen_illegal(ctx); } return true; } static bool do_cmpb(DisasContext *ctx, unsigned r, TCGv_reg in1, unsigned c, unsigned f, unsigned n, int disp) { Loading Loading @@ -4211,12 +4124,6 @@ static void translate_one(DisasContext *ctx, uint32_t insn) opc = extract32(insn, 26, 6); switch (opc) { case 0x09: trans_copr_w(ctx, insn); return; case 0x0B: trans_copr_dw(ctx, insn); return; case 0x0C: translate_table(ctx, insn, table_float_0c); return; Loading Loading
target/hppa/insns.decode +21 −0 Original line number Diff line number Diff line Loading @@ -38,6 +38,7 @@ %sm_imm 16:10 !function=expand_sm_imm %rm64 1:1 16:5 %rt64 6:1 0:5 %im5_0 0:s1 1:4 %im5_16 16:s1 17:4 Loading Loading @@ -195,6 +196,26 @@ lda 000011 ..... ..... .. . 0 -- 0110 ...... @ldstx size=2 sta 000011 ..... ..... .. . 1 -- 1110 ...... @stim5 size=2 stby 000011 b:5 r:5 sp:2 a:1 1 -- 1100 m:1 ..... disp=%im5_0 @fldstwx ...... b:5 x:5 sp:2 scale:1 ....... m:1 ..... \ &ldst t=%rt64 disp=0 size=2 @fldstwi ...... b:5 ..... sp:2 . ....... . ..... \ &ldst t=%rt64 disp=%im5_16 m=%ma_to_m x=0 scale=0 size=2 fldw 001001 ..... ..... .. . 0 -- 000 . . ..... @fldstwx fldw 001001 ..... ..... .. . 1 -- 000 . . ..... @fldstwi fstw 001001 ..... ..... .. . 0 -- 100 . . ..... @fldstwx fstw 001001 ..... ..... .. . 1 -- 100 . . ..... @fldstwi @fldstdx ...... b:5 x:5 sp:2 scale:1 ....... m:1 t:5 \ &ldst disp=0 size=3 @fldstdi ...... b:5 ..... sp:2 . ....... . t:5 \ &ldst disp=%im5_16 m=%ma_to_m x=0 scale=0 size=3 fldd 001011 ..... ..... .. . 0 -- 000 0 . ..... @fldstdx fldd 001011 ..... ..... .. . 1 -- 000 0 . ..... @fldstdi fstd 001011 ..... ..... .. . 0 -- 100 0 . ..... @fldstdx fstd 001011 ..... ..... .. . 1 -- 100 0 . ..... @fldstdi #### # Offset Mem #### Loading
target/hppa/translate.c +0 −93 Original line number Diff line number Diff line Loading @@ -855,15 +855,6 @@ static void gen_goto_tb(DisasContext *ctx, int which, } } /* PA has a habit of taking the LSB of a field and using that as the sign, with the rest of the field becoming the least significant bits. */ static target_sreg low_sextract(uint32_t val, int pos, int len) { target_ureg x = -(target_ureg)extract32(val, pos, 1); x = (x << (len - 1)) | extract32(val, pos + 1, len - 1); return x; } static unsigned assemble_rt64(uint32_t insn) { unsigned r1 = extract32(insn, 6, 1); Loading Loading @@ -2981,84 +2972,6 @@ static bool trans_ldo(DisasContext *ctx, arg_ldo *a) return true; } static bool trans_copr_w(DisasContext *ctx, uint32_t insn) { unsigned t0 = extract32(insn, 0, 5); unsigned m = extract32(insn, 5, 1); unsigned t1 = extract32(insn, 6, 1); unsigned ext3 = extract32(insn, 7, 3); /* unsigned cc = extract32(insn, 10, 2); */ unsigned i = extract32(insn, 12, 1); unsigned ua = extract32(insn, 13, 1); unsigned sp = extract32(insn, 14, 2); unsigned rx = extract32(insn, 16, 5); unsigned rb = extract32(insn, 21, 5); unsigned rt = t1 * 32 + t0; int modify = (m ? (ua ? -1 : 1) : 0); int disp, scale; if (i == 0) { scale = (ua ? 2 : 0); disp = 0; modify = m; } else { disp = low_sextract(rx, 0, 5); scale = 0; rx = 0; modify = (m ? (ua ? -1 : 1) : 0); } switch (ext3) { case 0: /* FLDW */ do_floadw(ctx, rt, rb, rx, scale, disp, sp, modify); break; case 4: /* FSTW */ do_fstorew(ctx, rt, rb, rx, scale, disp, sp, modify); break; default: return gen_illegal(ctx); } return true; } static bool trans_copr_dw(DisasContext *ctx, uint32_t insn) { unsigned rt = extract32(insn, 0, 5); unsigned m = extract32(insn, 5, 1); unsigned ext4 = extract32(insn, 6, 4); /* unsigned cc = extract32(insn, 10, 2); */ unsigned i = extract32(insn, 12, 1); unsigned ua = extract32(insn, 13, 1); unsigned sp = extract32(insn, 14, 2); unsigned rx = extract32(insn, 16, 5); unsigned rb = extract32(insn, 21, 5); int modify = (m ? (ua ? -1 : 1) : 0); int disp, scale; if (i == 0) { scale = (ua ? 3 : 0); disp = 0; modify = m; } else { disp = low_sextract(rx, 0, 5); scale = 0; rx = 0; modify = (m ? (ua ? -1 : 1) : 0); } switch (ext4) { case 0: /* FLDD */ do_floadd(ctx, rt, rb, rx, scale, disp, sp, modify); break; case 8: /* FSTD */ do_fstored(ctx, rt, rb, rx, scale, disp, sp, modify); break; default: return gen_illegal(ctx); } return true; } static bool do_cmpb(DisasContext *ctx, unsigned r, TCGv_reg in1, unsigned c, unsigned f, unsigned n, int disp) { Loading Loading @@ -4211,12 +4124,6 @@ static void translate_one(DisasContext *ctx, uint32_t insn) opc = extract32(insn, 26, 6); switch (opc) { case 0x09: trans_copr_w(ctx, insn); return; case 0x0B: trans_copr_dw(ctx, insn); return; case 0x0C: translate_table(ctx, insn, table_float_0c); return; Loading