translate.c (33ec424535e2e8e5fa1fd78f691eb9c3c68fd449) translate.c (daf457d40f92dd5f957b206cc86d95d9c42350c6)
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

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

38#ifdef TARGET_SPARC64
39# define gen_helper_rdpsr(D, E) qemu_build_not_reached()
40# define gen_helper_rett(E) qemu_build_not_reached()
41# define gen_helper_power_down(E) qemu_build_not_reached()
42# define gen_helper_wrpsr(E, S) qemu_build_not_reached()
43#else
44# define gen_helper_clear_softint(E, S) qemu_build_not_reached()
45# define gen_helper_done(E) qemu_build_not_reached()
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

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

38#ifdef TARGET_SPARC64
39# define gen_helper_rdpsr(D, E) qemu_build_not_reached()
40# define gen_helper_rett(E) qemu_build_not_reached()
41# define gen_helper_power_down(E) qemu_build_not_reached()
42# define gen_helper_wrpsr(E, S) qemu_build_not_reached()
43#else
44# define gen_helper_clear_softint(E, S) qemu_build_not_reached()
45# define gen_helper_done(E) qemu_build_not_reached()
46# define gen_helper_fabsd(D, S) qemu_build_not_reached()
47# define gen_helper_flushw(E) qemu_build_not_reached()
46# define gen_helper_flushw(E) qemu_build_not_reached()
48# define gen_helper_fnegd(D, S) qemu_build_not_reached()
49# define gen_helper_rdccr(D, E) qemu_build_not_reached()
50# define gen_helper_rdcwp(D, E) qemu_build_not_reached()
51# define gen_helper_restored(E) qemu_build_not_reached()
52# define gen_helper_retry(E) qemu_build_not_reached()
53# define gen_helper_saved(E) qemu_build_not_reached()
54# define gen_helper_set_softint(E, S) qemu_build_not_reached()
55# define gen_helper_tick_get_count(D, E, T, C) qemu_build_not_reached()
56# define gen_helper_tick_set_count(P, S) qemu_build_not_reached()
57# define gen_helper_tick_set_limit(P, S) qemu_build_not_reached()
58# define gen_helper_wrccr(E, S) qemu_build_not_reached()
59# define gen_helper_wrcwp(E, S) qemu_build_not_reached()
60# define gen_helper_wrgl(E, S) qemu_build_not_reached()
61# define gen_helper_write_softint(E, S) qemu_build_not_reached()
62# define gen_helper_wrpil(E, S) qemu_build_not_reached()
63# define gen_helper_wrpstate(E, S) qemu_build_not_reached()
47# define gen_helper_rdccr(D, E) qemu_build_not_reached()
48# define gen_helper_rdcwp(D, E) qemu_build_not_reached()
49# define gen_helper_restored(E) qemu_build_not_reached()
50# define gen_helper_retry(E) qemu_build_not_reached()
51# define gen_helper_saved(E) qemu_build_not_reached()
52# define gen_helper_set_softint(E, S) qemu_build_not_reached()
53# define gen_helper_tick_get_count(D, E, T, C) qemu_build_not_reached()
54# define gen_helper_tick_set_count(P, S) qemu_build_not_reached()
55# define gen_helper_tick_set_limit(P, S) qemu_build_not_reached()
56# define gen_helper_wrccr(E, S) qemu_build_not_reached()
57# define gen_helper_wrcwp(E, S) qemu_build_not_reached()
58# define gen_helper_wrgl(E, S) qemu_build_not_reached()
59# define gen_helper_write_softint(E, S) qemu_build_not_reached()
60# define gen_helper_wrpil(E, S) qemu_build_not_reached()
61# define gen_helper_wrpstate(E, S) qemu_build_not_reached()
64# define gen_helper_fabsq ({ qemu_build_not_reached(); NULL; })
65# define gen_helper_fcmpeq16 ({ qemu_build_not_reached(); NULL; })
66# define gen_helper_fcmpeq32 ({ qemu_build_not_reached(); NULL; })
67# define gen_helper_fcmpgt16 ({ qemu_build_not_reached(); NULL; })
68# define gen_helper_fcmpgt32 ({ qemu_build_not_reached(); NULL; })
69# define gen_helper_fcmple16 ({ qemu_build_not_reached(); NULL; })
70# define gen_helper_fcmple32 ({ qemu_build_not_reached(); NULL; })
71# define gen_helper_fcmpne16 ({ qemu_build_not_reached(); NULL; })
72# define gen_helper_fcmpne32 ({ qemu_build_not_reached(); NULL; })
73# define gen_helper_fdtox ({ qemu_build_not_reached(); NULL; })
74# define gen_helper_fexpand ({ qemu_build_not_reached(); NULL; })
75# define gen_helper_fmul8sux16 ({ qemu_build_not_reached(); NULL; })
76# define gen_helper_fmul8ulx16 ({ qemu_build_not_reached(); NULL; })
77# define gen_helper_fmul8x16al ({ qemu_build_not_reached(); NULL; })
78# define gen_helper_fmul8x16au ({ qemu_build_not_reached(); NULL; })
79# define gen_helper_fmul8x16 ({ qemu_build_not_reached(); NULL; })
80# define gen_helper_fmuld8sux16 ({ qemu_build_not_reached(); NULL; })
81# define gen_helper_fmuld8ulx16 ({ qemu_build_not_reached(); NULL; })
62# define gen_helper_fcmpeq16 ({ qemu_build_not_reached(); NULL; })
63# define gen_helper_fcmpeq32 ({ qemu_build_not_reached(); NULL; })
64# define gen_helper_fcmpgt16 ({ qemu_build_not_reached(); NULL; })
65# define gen_helper_fcmpgt32 ({ qemu_build_not_reached(); NULL; })
66# define gen_helper_fcmple16 ({ qemu_build_not_reached(); NULL; })
67# define gen_helper_fcmple32 ({ qemu_build_not_reached(); NULL; })
68# define gen_helper_fcmpne16 ({ qemu_build_not_reached(); NULL; })
69# define gen_helper_fcmpne32 ({ qemu_build_not_reached(); NULL; })
70# define gen_helper_fdtox ({ qemu_build_not_reached(); NULL; })
71# define gen_helper_fexpand ({ qemu_build_not_reached(); NULL; })
72# define gen_helper_fmul8sux16 ({ qemu_build_not_reached(); NULL; })
73# define gen_helper_fmul8ulx16 ({ qemu_build_not_reached(); NULL; })
74# define gen_helper_fmul8x16al ({ qemu_build_not_reached(); NULL; })
75# define gen_helper_fmul8x16au ({ qemu_build_not_reached(); NULL; })
76# define gen_helper_fmul8x16 ({ qemu_build_not_reached(); NULL; })
77# define gen_helper_fmuld8sux16 ({ qemu_build_not_reached(); NULL; })
78# define gen_helper_fmuld8ulx16 ({ qemu_build_not_reached(); NULL; })
82# define gen_helper_fnegq ({ qemu_build_not_reached(); NULL; })
83# define gen_helper_fpmerge ({ qemu_build_not_reached(); NULL; })
84# define gen_helper_fqtox ({ qemu_build_not_reached(); NULL; })
85# define gen_helper_fstox ({ qemu_build_not_reached(); NULL; })
86# define gen_helper_fxtod ({ qemu_build_not_reached(); NULL; })
87# define gen_helper_fxtoq ({ qemu_build_not_reached(); NULL; })
88# define gen_helper_fxtos ({ qemu_build_not_reached(); NULL; })
89# define gen_helper_pdist ({ qemu_build_not_reached(); NULL; })
90# define FSR_LDXFSR_MASK 0

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

1234{
1235 gen_op_clear_ieee_excp_and_FTT();
1236 tcg_gen_mov_i32(dst, src);
1237}
1238
1239static void gen_op_fnegs(TCGv_i32 dst, TCGv_i32 src)
1240{
1241 gen_op_clear_ieee_excp_and_FTT();
79# define gen_helper_fpmerge ({ qemu_build_not_reached(); NULL; })
80# define gen_helper_fqtox ({ qemu_build_not_reached(); NULL; })
81# define gen_helper_fstox ({ qemu_build_not_reached(); NULL; })
82# define gen_helper_fxtod ({ qemu_build_not_reached(); NULL; })
83# define gen_helper_fxtoq ({ qemu_build_not_reached(); NULL; })
84# define gen_helper_fxtos ({ qemu_build_not_reached(); NULL; })
85# define gen_helper_pdist ({ qemu_build_not_reached(); NULL; })
86# define FSR_LDXFSR_MASK 0

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

1230{
1231 gen_op_clear_ieee_excp_and_FTT();
1232 tcg_gen_mov_i32(dst, src);
1233}
1234
1235static void gen_op_fnegs(TCGv_i32 dst, TCGv_i32 src)
1236{
1237 gen_op_clear_ieee_excp_and_FTT();
1242 gen_helper_fnegs(dst, src);
1238 tcg_gen_xori_i32(dst, src, 1u << 31);
1243}
1244
1245static void gen_op_fabss(TCGv_i32 dst, TCGv_i32 src)
1246{
1247 gen_op_clear_ieee_excp_and_FTT();
1239}
1240
1241static void gen_op_fabss(TCGv_i32 dst, TCGv_i32 src)
1242{
1243 gen_op_clear_ieee_excp_and_FTT();
1248 gen_helper_fabss(dst, src);
1244 tcg_gen_andi_i32(dst, src, ~(1u << 31));
1249}
1250
1251static void gen_op_fmovd(TCGv_i64 dst, TCGv_i64 src)
1252{
1253 gen_op_clear_ieee_excp_and_FTT();
1254 tcg_gen_mov_i64(dst, src);
1255}
1256
1257static void gen_op_fnegd(TCGv_i64 dst, TCGv_i64 src)
1258{
1259 gen_op_clear_ieee_excp_and_FTT();
1245}
1246
1247static void gen_op_fmovd(TCGv_i64 dst, TCGv_i64 src)
1248{
1249 gen_op_clear_ieee_excp_and_FTT();
1250 tcg_gen_mov_i64(dst, src);
1251}
1252
1253static void gen_op_fnegd(TCGv_i64 dst, TCGv_i64 src)
1254{
1255 gen_op_clear_ieee_excp_and_FTT();
1260 gen_helper_fnegd(dst, src);
1256 tcg_gen_xori_i64(dst, src, 1ull << 63);
1261}
1262
1263static void gen_op_fabsd(TCGv_i64 dst, TCGv_i64 src)
1264{
1265 gen_op_clear_ieee_excp_and_FTT();
1257}
1258
1259static void gen_op_fabsd(TCGv_i64 dst, TCGv_i64 src)
1260{
1261 gen_op_clear_ieee_excp_and_FTT();
1266 gen_helper_fabsd(dst, src);
1262 tcg_gen_andi_i64(dst, src, ~(1ull << 63));
1267}
1268
1263}
1264
1265static void gen_op_fnegq(TCGv_i128 dst, TCGv_i128 src)
1266{
1267 TCGv_i64 l = tcg_temp_new_i64();
1268 TCGv_i64 h = tcg_temp_new_i64();
1269
1270 tcg_gen_extr_i128_i64(l, h, src);
1271 tcg_gen_xori_i64(h, h, 1ull << 63);
1272 tcg_gen_concat_i64_i128(dst, l, h);
1273}
1274
1275static void gen_op_fabsq(TCGv_i128 dst, TCGv_i128 src)
1276{
1277 TCGv_i64 l = tcg_temp_new_i64();
1278 TCGv_i64 h = tcg_temp_new_i64();
1279
1280 tcg_gen_extr_i128_i64(l, h, src);
1281 tcg_gen_andi_i64(h, h, ~(1ull << 63));
1282 tcg_gen_concat_i64_i128(dst, l, h);
1283}
1284
1269#ifdef TARGET_SPARC64
1270static void gen_op_fcmps(int fccno, TCGv_i32 r_rs1, TCGv_i32 r_rs2)
1271{
1272 switch (fccno) {
1273 case 0:
1274 gen_helper_fcmps(cpu_fsr, tcg_env, r_rs1, r_rs2);
1275 break;
1276 case 1:

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

4624 gen_store_fpr_D(dc, a->rd, dst);
4625 return advance_pc(dc);
4626}
4627
4628TRANS(FiTOd, ALL, do_env_df, a, gen_helper_fitod)
4629TRANS(FsTOd, ALL, do_env_df, a, gen_helper_fstod)
4630TRANS(FsTOx, 64, do_env_df, a, gen_helper_fstox)
4631
1285#ifdef TARGET_SPARC64
1286static void gen_op_fcmps(int fccno, TCGv_i32 r_rs1, TCGv_i32 r_rs2)
1287{
1288 switch (fccno) {
1289 case 0:
1290 gen_helper_fcmps(cpu_fsr, tcg_env, r_rs1, r_rs2);
1291 break;
1292 case 1:

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

4640 gen_store_fpr_D(dc, a->rd, dst);
4641 return advance_pc(dc);
4642}
4643
4644TRANS(FiTOd, ALL, do_env_df, a, gen_helper_fitod)
4645TRANS(FsTOd, ALL, do_env_df, a, gen_helper_fstod)
4646TRANS(FsTOx, 64, do_env_df, a, gen_helper_fstox)
4647
4632static bool trans_FMOVq(DisasContext *dc, arg_FMOVq *a)
4648static bool do_qq(DisasContext *dc, arg_r_r *a,
4649 void (*func)(TCGv_i128, TCGv_i128))
4633{
4634 TCGv_i128 t;
4635
4650{
4651 TCGv_i128 t;
4652
4636 if (!avail_64(dc)) {
4637 return false;
4638 }
4639 if (gen_trap_ifnofpu(dc)) {
4640 return true;
4641 }
4642 if (gen_trap_float128(dc)) {
4643 return true;
4644 }
4645
4646 gen_op_clear_ieee_excp_and_FTT();
4647 t = gen_load_fpr_Q(dc, a->rs);
4653 if (gen_trap_ifnofpu(dc)) {
4654 return true;
4655 }
4656 if (gen_trap_float128(dc)) {
4657 return true;
4658 }
4659
4660 gen_op_clear_ieee_excp_and_FTT();
4661 t = gen_load_fpr_Q(dc, a->rs);
4662 func(t, t);
4648 gen_store_fpr_Q(dc, a->rd, t);
4649 return advance_pc(dc);
4650}
4651
4663 gen_store_fpr_Q(dc, a->rd, t);
4664 return advance_pc(dc);
4665}
4666
4652static bool do_qq(DisasContext *dc, arg_r_r *a,
4653 void (*func)(TCGv_env))
4654{
4655 if (gen_trap_ifnofpu(dc)) {
4656 return true;
4657 }
4658 if (gen_trap_float128(dc)) {
4659 return true;
4660 }
4667TRANS(FMOVq, 64, do_qq, a, tcg_gen_mov_i128)
4668TRANS(FNEGq, 64, do_qq, a, gen_op_fnegq)
4669TRANS(FABSq, 64, do_qq, a, gen_op_fabsq)
4661
4670
4662 gen_op_clear_ieee_excp_and_FTT();
4663 gen_op_load_fpr_QT1(QFPREG(a->rs));
4664 func(tcg_env);
4665 gen_op_store_QT0_fpr(QFPREG(a->rd));
4666 gen_update_fprs_dirty(dc, QFPREG(a->rd));
4667 return advance_pc(dc);
4668}
4669
4670TRANS(FNEGq, 64, do_qq, a, gen_helper_fnegq)
4671TRANS(FABSq, 64, do_qq, a, gen_helper_fabsq)
4672
4673static bool do_env_qq(DisasContext *dc, arg_r_r *a,
4674 void (*func)(TCGv_env))
4675{
4676 if (gen_trap_ifnofpu(dc)) {
4677 return true;
4678 }
4679 if (gen_trap_float128(dc)) {
4680 return true;

--- 761 unchanged lines hidden ---
4671static bool do_env_qq(DisasContext *dc, arg_r_r *a,
4672 void (*func)(TCGv_env))
4673{
4674 if (gen_trap_ifnofpu(dc)) {
4675 return true;
4676 }
4677 if (gen_trap_float128(dc)) {
4678 return true;

--- 761 unchanged lines hidden ---