translate.c (f7ec8155f5714df29af2596b2468dd597c137256) translate.c (40f9ad219bb991b50318836612b7331f35c7bb3b)
1/*
2 SPARC translation
3
4 Copyright (C) 2003 Thomas M. Ogrisegg <tom@fnord.at>
5 Copyright (C) 2003-2005 Fabrice Bellard
6
7 This library is free software; you can redistribute it and/or
8 modify it under the terms of the GNU Lesser General Public

--- 5111 unchanged lines hidden (view full) ---

5120 func(dc, &cmp, a->rd, a->rs2);
5121 return advance_pc(dc);
5122}
5123
5124TRANS(FMOVsfcc, 64, do_fmovfcc, a, false, gen_fmovs)
5125TRANS(FMOVdfcc, 64, do_fmovfcc, a, false, gen_fmovd)
5126TRANS(FMOVqfcc, 64, do_fmovfcc, a, true, gen_fmovq)
5127
1/*
2 SPARC translation
3
4 Copyright (C) 2003 Thomas M. Ogrisegg <tom@fnord.at>
5 Copyright (C) 2003-2005 Fabrice Bellard
6
7 This library is free software; you can redistribute it and/or
8 modify it under the terms of the GNU Lesser General Public

--- 5111 unchanged lines hidden (view full) ---

5120 func(dc, &cmp, a->rd, a->rs2);
5121 return advance_pc(dc);
5122}
5123
5124TRANS(FMOVsfcc, 64, do_fmovfcc, a, false, gen_fmovs)
5125TRANS(FMOVdfcc, 64, do_fmovfcc, a, false, gen_fmovd)
5126TRANS(FMOVqfcc, 64, do_fmovfcc, a, true, gen_fmovq)
5127
5128static bool do_fcmps(DisasContext *dc, arg_FCMPs *a, bool e)
5129{
5130 TCGv_i32 src1, src2;
5131
5132 if (avail_32(dc) && a->cc != 0) {
5133 return false;
5134 }
5135 if (gen_trap_ifnofpu(dc)) {
5136 return true;
5137 }
5138
5139 gen_op_clear_ieee_excp_and_FTT();
5140 src1 = gen_load_fpr_F(dc, a->rs1);
5141 src2 = gen_load_fpr_F(dc, a->rs2);
5142 if (e) {
5143 gen_op_fcmpes(a->cc, src1, src2);
5144 } else {
5145 gen_op_fcmps(a->cc, src1, src2);
5146 }
5147 return advance_pc(dc);
5148}
5149
5150TRANS(FCMPs, ALL, do_fcmps, a, false)
5151TRANS(FCMPEs, ALL, do_fcmps, a, true)
5152
5153static bool do_fcmpd(DisasContext *dc, arg_FCMPd *a, bool e)
5154{
5155 TCGv_i64 src1, src2;
5156
5157 if (avail_32(dc) && a->cc != 0) {
5158 return false;
5159 }
5160 if (gen_trap_ifnofpu(dc)) {
5161 return true;
5162 }
5163
5164 gen_op_clear_ieee_excp_and_FTT();
5165 src1 = gen_load_fpr_D(dc, a->rs1);
5166 src2 = gen_load_fpr_D(dc, a->rs2);
5167 if (e) {
5168 gen_op_fcmped(a->cc, src1, src2);
5169 } else {
5170 gen_op_fcmpd(a->cc, src1, src2);
5171 }
5172 return advance_pc(dc);
5173}
5174
5175TRANS(FCMPd, ALL, do_fcmpd, a, false)
5176TRANS(FCMPEd, ALL, do_fcmpd, a, true)
5177
5178static bool do_fcmpq(DisasContext *dc, arg_FCMPq *a, bool e)
5179{
5180 if (avail_32(dc) && a->cc != 0) {
5181 return false;
5182 }
5183 if (gen_trap_ifnofpu(dc)) {
5184 return true;
5185 }
5186 if (gen_trap_float128(dc)) {
5187 return true;
5188 }
5189
5190 gen_op_clear_ieee_excp_and_FTT();
5191 gen_op_load_fpr_QT0(QFPREG(a->rs1));
5192 gen_op_load_fpr_QT1(QFPREG(a->rs2));
5193 if (e) {
5194 gen_op_fcmpeq(a->cc);
5195 } else {
5196 gen_op_fcmpq(a->cc);
5197 }
5198 return advance_pc(dc);
5199}
5200
5201TRANS(FCMPq, ALL, do_fcmpq, a, false)
5202TRANS(FCMPEq, ALL, do_fcmpq, a, true)
5203
5128#define CHECK_IU_FEATURE(dc, FEATURE) \
5129 if (!((dc)->def->features & CPU_FEATURE_ ## FEATURE)) \
5130 goto illegal_insn;
5131#define CHECK_FPU_FEATURE(dc, FEATURE) \
5132 if (!((dc)->def->features & CPU_FEATURE_ ## FEATURE)) \
5133 goto nfpu_insn;
5134
5135/* before an instruction, dc->pc must be static */
5136static void disas_sparc_legacy(DisasContext *dc, unsigned int insn)
5137{
5204#define CHECK_IU_FEATURE(dc, FEATURE) \
5205 if (!((dc)->def->features & CPU_FEATURE_ ## FEATURE)) \
5206 goto illegal_insn;
5207#define CHECK_FPU_FEATURE(dc, FEATURE) \
5208 if (!((dc)->def->features & CPU_FEATURE_ ## FEATURE)) \
5209 goto nfpu_insn;
5210
5211/* before an instruction, dc->pc must be static */
5212static void disas_sparc_legacy(DisasContext *dc, unsigned int insn)
5213{
5138 unsigned int opc, rs1, rs2, rd;
5139 TCGv cpu_src1 __attribute__((unused));
5140 TCGv_i32 cpu_src1_32, cpu_src2_32;
5141 TCGv_i64 cpu_src1_64, cpu_src2_64;
5142 TCGv_i32 cpu_dst_32 __attribute__((unused));
5143 TCGv_i64 cpu_dst_64 __attribute__((unused));
5214 unsigned int opc = GET_FIELD(insn, 0, 1);
5144
5215
5145 opc = GET_FIELD(insn, 0, 1);
5146 rd = GET_FIELD(insn, 2, 6);
5147
5148 switch (opc) {
5149 case 0:
5150 goto illegal_insn; /* in decodetree */
5151 case 1:
5152 g_assert_not_reached(); /* in decodetree */
5153 case 2: /* FPU & Logical Operations */
5154 {
5155 unsigned int xop = GET_FIELD(insn, 7, 12);
5216 switch (opc) {
5217 case 0:
5218 goto illegal_insn; /* in decodetree */
5219 case 1:
5220 g_assert_not_reached(); /* in decodetree */
5221 case 2: /* FPU & Logical Operations */
5222 {
5223 unsigned int xop = GET_FIELD(insn, 7, 12);
5156 TCGv cpu_dst __attribute__((unused)) = tcg_temp_new();
5157
5158 if (xop == 0x34) { /* FPU Operations */
5159 goto illegal_insn; /* in decodetree */
5160 } else if (xop == 0x35) { /* FPU Operations */
5224
5225 if (xop == 0x34) { /* FPU Operations */
5226 goto illegal_insn; /* in decodetree */
5227 } else if (xop == 0x35) { /* FPU Operations */
5161 if (gen_trap_ifnofpu(dc)) {
5162 goto jmp_insn;
5163 }
5164 gen_op_clear_ieee_excp_and_FTT();
5165 rs1 = GET_FIELD(insn, 13, 17);
5166 rs2 = GET_FIELD(insn, 27, 31);
5167 xop = GET_FIELD(insn, 18, 26);
5168
5169 switch (xop) {
5170 case 0x51: /* fcmps, V9 %fcc */
5171 cpu_src1_32 = gen_load_fpr_F(dc, rs1);
5172 cpu_src2_32 = gen_load_fpr_F(dc, rs2);
5173 gen_op_fcmps(rd & 3, cpu_src1_32, cpu_src2_32);
5174 break;
5175 case 0x52: /* fcmpd, V9 %fcc */
5176 cpu_src1_64 = gen_load_fpr_D(dc, rs1);
5177 cpu_src2_64 = gen_load_fpr_D(dc, rs2);
5178 gen_op_fcmpd(rd & 3, cpu_src1_64, cpu_src2_64);
5179 break;
5180 case 0x53: /* fcmpq, V9 %fcc */
5181 CHECK_FPU_FEATURE(dc, FLOAT128);
5182 gen_op_load_fpr_QT0(QFPREG(rs1));
5183 gen_op_load_fpr_QT1(QFPREG(rs2));
5184 gen_op_fcmpq(rd & 3);
5185 break;
5186 case 0x55: /* fcmpes, V9 %fcc */
5187 cpu_src1_32 = gen_load_fpr_F(dc, rs1);
5188 cpu_src2_32 = gen_load_fpr_F(dc, rs2);
5189 gen_op_fcmpes(rd & 3, cpu_src1_32, cpu_src2_32);
5190 break;
5191 case 0x56: /* fcmped, V9 %fcc */
5192 cpu_src1_64 = gen_load_fpr_D(dc, rs1);
5193 cpu_src2_64 = gen_load_fpr_D(dc, rs2);
5194 gen_op_fcmped(rd & 3, cpu_src1_64, cpu_src2_64);
5195 break;
5196 case 0x57: /* fcmpeq, V9 %fcc */
5197 CHECK_FPU_FEATURE(dc, FLOAT128);
5198 gen_op_load_fpr_QT0(QFPREG(rs1));
5199 gen_op_load_fpr_QT1(QFPREG(rs2));
5200 gen_op_fcmpeq(rd & 3);
5201 break;
5202 default:
5203 goto illegal_insn;
5204 }
5228 goto illegal_insn; /* in decodetree */
5205 } else if (xop == 0x36) {
5206#ifdef TARGET_SPARC64
5207 /* VIS */
5229 } else if (xop == 0x36) {
5230#ifdef TARGET_SPARC64
5231 /* VIS */
5232 TCGv_i64 cpu_src1_64, cpu_src2_64, cpu_dst_64;
5233 TCGv_i32 cpu_dst_32;
5234 TCGv cpu_dst = tcg_temp_new();
5208 int opf = GET_FIELD_SP(insn, 5, 13);
5235 int opf = GET_FIELD_SP(insn, 5, 13);
5209 rs1 = GET_FIELD(insn, 13, 17);
5210 rs2 = GET_FIELD(insn, 27, 31);
5236 int rs1 = GET_FIELD(insn, 13, 17);
5237 int rs2 = GET_FIELD(insn, 27, 31);
5238 int rd = GET_FIELD(insn, 2, 6);
5239
5211 if (gen_trap_ifnofpu(dc)) {
5212 goto jmp_insn;
5213 }
5214
5215 switch (opf) {
5216 case 0x000: /* VIS I edge8cc */
5217 case 0x001: /* VIS II edge8n */
5218 case 0x002: /* VIS I edge8lcc */

--- 168 unchanged lines hidden (view full) ---

5387 goto illegal_insn; /* in decodetree */
5388 }
5389 }
5390 break;
5391 case 3: /* load/store instructions */
5392 goto illegal_insn; /* in decodetree */
5393 }
5394 advance_pc(dc);
5240 if (gen_trap_ifnofpu(dc)) {
5241 goto jmp_insn;
5242 }
5243
5244 switch (opf) {
5245 case 0x000: /* VIS I edge8cc */
5246 case 0x001: /* VIS II edge8n */
5247 case 0x002: /* VIS I edge8lcc */

--- 168 unchanged lines hidden (view full) ---

5416 goto illegal_insn; /* in decodetree */
5417 }
5418 }
5419 break;
5420 case 3: /* load/store instructions */
5421 goto illegal_insn; /* in decodetree */
5422 }
5423 advance_pc(dc);
5424#ifdef TARGET_SPARC64
5395 jmp_insn:
5425 jmp_insn:
5426#endif
5396 return;
5397 illegal_insn:
5398 gen_exception(dc, TT_ILL_INSN);
5399 return;
5427 return;
5428 illegal_insn:
5429 gen_exception(dc, TT_ILL_INSN);
5430 return;
5431#ifdef TARGET_SPARC64
5400 nfpu_insn:
5401 gen_op_fpexception_im(dc, FSR_FTT_UNIMPFPOP);
5402 return;
5432 nfpu_insn:
5433 gen_op_fpexception_im(dc, FSR_FTT_UNIMPFPOP);
5434 return;
5435#endif
5403}
5404
5405static void sparc_tr_init_disas_context(DisasContextBase *dcbase, CPUState *cs)
5406{
5407 DisasContext *dc = container_of(dcbase, DisasContext, base);
5408 CPUSPARCState *env = cpu_env(cs);
5409 int bound;
5410

--- 272 unchanged lines hidden ---
5436}
5437
5438static void sparc_tr_init_disas_context(DisasContextBase *dcbase, CPUState *cs)
5439{
5440 DisasContext *dc = container_of(dcbase, DisasContext, base);
5441 CPUSPARCState *env = cpu_env(cs);
5442 int bound;
5443

--- 272 unchanged lines hidden ---