Commit ff07ec8309a2e6d74b5f7585e51c5693cc9520f2
1 parent
75b680e5
Convert float move ops to TCG
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@4090 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
3 changed files
with
74 additions
and
325 deletions
target-sparc/fop_template.h deleted
100644 → 0
| 1 | -/* | ||
| 2 | - * SPARC micro operations (templates for various register related | ||
| 3 | - * operations) | ||
| 4 | - * | ||
| 5 | - * Copyright (c) 2003 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 | ||
| 9 | - * License as published by the Free Software Foundation; either | ||
| 10 | - * version 2 of the License, or (at your option) any later version. | ||
| 11 | - * | ||
| 12 | - * This library is distributed in the hope that it will be useful, | ||
| 13 | - * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 14 | - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | ||
| 15 | - * Lesser General Public License for more details. | ||
| 16 | - * | ||
| 17 | - * You should have received a copy of the GNU Lesser General Public | ||
| 18 | - * License along with this library; if not, write to the Free Software | ||
| 19 | - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | ||
| 20 | - */ | ||
| 21 | - | ||
| 22 | -/* floating point registers moves */ | ||
| 23 | -void OPPROTO glue(op_load_fpr_FT0_fpr, REGNAME)(void) | ||
| 24 | -{ | ||
| 25 | - FT0 = REG; | ||
| 26 | -} | ||
| 27 | - | ||
| 28 | -void OPPROTO glue(op_store_FT0_fpr_fpr, REGNAME)(void) | ||
| 29 | -{ | ||
| 30 | - REG = FT0; | ||
| 31 | -} | ||
| 32 | - | ||
| 33 | -void OPPROTO glue(op_load_fpr_FT1_fpr, REGNAME)(void) | ||
| 34 | -{ | ||
| 35 | - FT1 = REG; | ||
| 36 | -} | ||
| 37 | - | ||
| 38 | -void OPPROTO glue(op_store_FT1_fpr_fpr, REGNAME)(void) | ||
| 39 | -{ | ||
| 40 | - REG = FT1; | ||
| 41 | -} | ||
| 42 | - | ||
| 43 | -/* double floating point registers moves */ | ||
| 44 | -void OPPROTO glue(op_load_fpr_DT0_fpr, REGNAME)(void) | ||
| 45 | -{ | ||
| 46 | - CPU_DoubleU u; | ||
| 47 | - uint32_t *p = (uint32_t *)® | ||
| 48 | - u.l.lower = *(p +1); | ||
| 49 | - u.l.upper = *p; | ||
| 50 | - DT0 = u.d; | ||
| 51 | -} | ||
| 52 | - | ||
| 53 | -void OPPROTO glue(op_store_DT0_fpr_fpr, REGNAME)(void) | ||
| 54 | -{ | ||
| 55 | - CPU_DoubleU u; | ||
| 56 | - uint32_t *p = (uint32_t *)® | ||
| 57 | - u.d = DT0; | ||
| 58 | - *(p +1) = u.l.lower; | ||
| 59 | - *p = u.l.upper; | ||
| 60 | -} | ||
| 61 | - | ||
| 62 | -void OPPROTO glue(op_load_fpr_DT1_fpr, REGNAME)(void) | ||
| 63 | -{ | ||
| 64 | - CPU_DoubleU u; | ||
| 65 | - uint32_t *p = (uint32_t *)® | ||
| 66 | - u.l.lower = *(p +1); | ||
| 67 | - u.l.upper = *p; | ||
| 68 | - DT1 = u.d; | ||
| 69 | -} | ||
| 70 | - | ||
| 71 | -void OPPROTO glue(op_store_DT1_fpr_fpr, REGNAME)(void) | ||
| 72 | -{ | ||
| 73 | - CPU_DoubleU u; | ||
| 74 | - uint32_t *p = (uint32_t *)® | ||
| 75 | - u.d = DT1; | ||
| 76 | - *(p +1) = u.l.lower; | ||
| 77 | - *p = u.l.upper; | ||
| 78 | -} | ||
| 79 | - | ||
| 80 | -#if defined(CONFIG_USER_ONLY) | ||
| 81 | -/* quad floating point registers moves */ | ||
| 82 | -void OPPROTO glue(op_load_fpr_QT0_fpr, REGNAME)(void) | ||
| 83 | -{ | ||
| 84 | - CPU_QuadU u; | ||
| 85 | - uint32_t *p = (uint32_t *)® | ||
| 86 | - u.l.lowest = *(p + 3); | ||
| 87 | - u.l.lower = *(p + 2); | ||
| 88 | - u.l.upper = *(p + 1); | ||
| 89 | - u.l.upmost = *p; | ||
| 90 | - QT0 = u.q; | ||
| 91 | -} | ||
| 92 | - | ||
| 93 | -void OPPROTO glue(op_store_QT0_fpr_fpr, REGNAME)(void) | ||
| 94 | -{ | ||
| 95 | - CPU_QuadU u; | ||
| 96 | - uint32_t *p = (uint32_t *)® | ||
| 97 | - u.q = QT0; | ||
| 98 | - *(p + 3) = u.l.lowest; | ||
| 99 | - *(p + 2) = u.l.lower; | ||
| 100 | - *(p + 1) = u.l.upper; | ||
| 101 | - *p = u.l.upmost; | ||
| 102 | -} | ||
| 103 | - | ||
| 104 | -void OPPROTO glue(op_load_fpr_QT1_fpr, REGNAME)(void) | ||
| 105 | -{ | ||
| 106 | - CPU_QuadU u; | ||
| 107 | - uint32_t *p = (uint32_t *)® | ||
| 108 | - u.l.lowest = *(p + 3); | ||
| 109 | - u.l.lower = *(p + 2); | ||
| 110 | - u.l.upper = *(p + 1); | ||
| 111 | - u.l.upmost = *p; | ||
| 112 | - QT1 = u.q; | ||
| 113 | -} | ||
| 114 | - | ||
| 115 | -void OPPROTO glue(op_store_QT1_fpr_fpr, REGNAME)(void) | ||
| 116 | -{ | ||
| 117 | - CPU_QuadU u; | ||
| 118 | - uint32_t *p = (uint32_t *)® | ||
| 119 | - u.q = QT1; | ||
| 120 | - *(p + 3) = u.l.lowest; | ||
| 121 | - *(p + 2) = u.l.lower; | ||
| 122 | - *(p + 1) = u.l.upper; | ||
| 123 | - *p = u.l.upmost; | ||
| 124 | -} | ||
| 125 | -#endif | ||
| 126 | - | ||
| 127 | -#undef REG | ||
| 128 | -#undef REGNAME |
target-sparc/op.c
| @@ -21,154 +21,6 @@ | @@ -21,154 +21,6 @@ | ||
| 21 | #include "exec.h" | 21 | #include "exec.h" |
| 22 | #include "helper.h" | 22 | #include "helper.h" |
| 23 | 23 | ||
| 24 | -#define REGNAME f0 | ||
| 25 | -#define REG (env->fpr[0]) | ||
| 26 | -#include "fop_template.h" | ||
| 27 | -#define REGNAME f1 | ||
| 28 | -#define REG (env->fpr[1]) | ||
| 29 | -#include "fop_template.h" | ||
| 30 | -#define REGNAME f2 | ||
| 31 | -#define REG (env->fpr[2]) | ||
| 32 | -#include "fop_template.h" | ||
| 33 | -#define REGNAME f3 | ||
| 34 | -#define REG (env->fpr[3]) | ||
| 35 | -#include "fop_template.h" | ||
| 36 | -#define REGNAME f4 | ||
| 37 | -#define REG (env->fpr[4]) | ||
| 38 | -#include "fop_template.h" | ||
| 39 | -#define REGNAME f5 | ||
| 40 | -#define REG (env->fpr[5]) | ||
| 41 | -#include "fop_template.h" | ||
| 42 | -#define REGNAME f6 | ||
| 43 | -#define REG (env->fpr[6]) | ||
| 44 | -#include "fop_template.h" | ||
| 45 | -#define REGNAME f7 | ||
| 46 | -#define REG (env->fpr[7]) | ||
| 47 | -#include "fop_template.h" | ||
| 48 | -#define REGNAME f8 | ||
| 49 | -#define REG (env->fpr[8]) | ||
| 50 | -#include "fop_template.h" | ||
| 51 | -#define REGNAME f9 | ||
| 52 | -#define REG (env->fpr[9]) | ||
| 53 | -#include "fop_template.h" | ||
| 54 | -#define REGNAME f10 | ||
| 55 | -#define REG (env->fpr[10]) | ||
| 56 | -#include "fop_template.h" | ||
| 57 | -#define REGNAME f11 | ||
| 58 | -#define REG (env->fpr[11]) | ||
| 59 | -#include "fop_template.h" | ||
| 60 | -#define REGNAME f12 | ||
| 61 | -#define REG (env->fpr[12]) | ||
| 62 | -#include "fop_template.h" | ||
| 63 | -#define REGNAME f13 | ||
| 64 | -#define REG (env->fpr[13]) | ||
| 65 | -#include "fop_template.h" | ||
| 66 | -#define REGNAME f14 | ||
| 67 | -#define REG (env->fpr[14]) | ||
| 68 | -#include "fop_template.h" | ||
| 69 | -#define REGNAME f15 | ||
| 70 | -#define REG (env->fpr[15]) | ||
| 71 | -#include "fop_template.h" | ||
| 72 | -#define REGNAME f16 | ||
| 73 | -#define REG (env->fpr[16]) | ||
| 74 | -#include "fop_template.h" | ||
| 75 | -#define REGNAME f17 | ||
| 76 | -#define REG (env->fpr[17]) | ||
| 77 | -#include "fop_template.h" | ||
| 78 | -#define REGNAME f18 | ||
| 79 | -#define REG (env->fpr[18]) | ||
| 80 | -#include "fop_template.h" | ||
| 81 | -#define REGNAME f19 | ||
| 82 | -#define REG (env->fpr[19]) | ||
| 83 | -#include "fop_template.h" | ||
| 84 | -#define REGNAME f20 | ||
| 85 | -#define REG (env->fpr[20]) | ||
| 86 | -#include "fop_template.h" | ||
| 87 | -#define REGNAME f21 | ||
| 88 | -#define REG (env->fpr[21]) | ||
| 89 | -#include "fop_template.h" | ||
| 90 | -#define REGNAME f22 | ||
| 91 | -#define REG (env->fpr[22]) | ||
| 92 | -#include "fop_template.h" | ||
| 93 | -#define REGNAME f23 | ||
| 94 | -#define REG (env->fpr[23]) | ||
| 95 | -#include "fop_template.h" | ||
| 96 | -#define REGNAME f24 | ||
| 97 | -#define REG (env->fpr[24]) | ||
| 98 | -#include "fop_template.h" | ||
| 99 | -#define REGNAME f25 | ||
| 100 | -#define REG (env->fpr[25]) | ||
| 101 | -#include "fop_template.h" | ||
| 102 | -#define REGNAME f26 | ||
| 103 | -#define REG (env->fpr[26]) | ||
| 104 | -#include "fop_template.h" | ||
| 105 | -#define REGNAME f27 | ||
| 106 | -#define REG (env->fpr[27]) | ||
| 107 | -#include "fop_template.h" | ||
| 108 | -#define REGNAME f28 | ||
| 109 | -#define REG (env->fpr[28]) | ||
| 110 | -#include "fop_template.h" | ||
| 111 | -#define REGNAME f29 | ||
| 112 | -#define REG (env->fpr[29]) | ||
| 113 | -#include "fop_template.h" | ||
| 114 | -#define REGNAME f30 | ||
| 115 | -#define REG (env->fpr[30]) | ||
| 116 | -#include "fop_template.h" | ||
| 117 | -#define REGNAME f31 | ||
| 118 | -#define REG (env->fpr[31]) | ||
| 119 | -#include "fop_template.h" | ||
| 120 | - | ||
| 121 | -#ifdef TARGET_SPARC64 | ||
| 122 | -#define REGNAME f32 | ||
| 123 | -#define REG (env->fpr[32]) | ||
| 124 | -#include "fop_template.h" | ||
| 125 | -#define REGNAME f34 | ||
| 126 | -#define REG (env->fpr[34]) | ||
| 127 | -#include "fop_template.h" | ||
| 128 | -#define REGNAME f36 | ||
| 129 | -#define REG (env->fpr[36]) | ||
| 130 | -#include "fop_template.h" | ||
| 131 | -#define REGNAME f38 | ||
| 132 | -#define REG (env->fpr[38]) | ||
| 133 | -#include "fop_template.h" | ||
| 134 | -#define REGNAME f40 | ||
| 135 | -#define REG (env->fpr[40]) | ||
| 136 | -#include "fop_template.h" | ||
| 137 | -#define REGNAME f42 | ||
| 138 | -#define REG (env->fpr[42]) | ||
| 139 | -#include "fop_template.h" | ||
| 140 | -#define REGNAME f44 | ||
| 141 | -#define REG (env->fpr[44]) | ||
| 142 | -#include "fop_template.h" | ||
| 143 | -#define REGNAME f46 | ||
| 144 | -#define REG (env->fpr[46]) | ||
| 145 | -#include "fop_template.h" | ||
| 146 | -#define REGNAME f48 | ||
| 147 | -#define REG (env->fpr[47]) | ||
| 148 | -#include "fop_template.h" | ||
| 149 | -#define REGNAME f50 | ||
| 150 | -#define REG (env->fpr[50]) | ||
| 151 | -#include "fop_template.h" | ||
| 152 | -#define REGNAME f52 | ||
| 153 | -#define REG (env->fpr[52]) | ||
| 154 | -#include "fop_template.h" | ||
| 155 | -#define REGNAME f54 | ||
| 156 | -#define REG (env->fpr[54]) | ||
| 157 | -#include "fop_template.h" | ||
| 158 | -#define REGNAME f56 | ||
| 159 | -#define REG (env->fpr[56]) | ||
| 160 | -#include "fop_template.h" | ||
| 161 | -#define REGNAME f58 | ||
| 162 | -#define REG (env->fpr[58]) | ||
| 163 | -#include "fop_template.h" | ||
| 164 | -#define REGNAME f60 | ||
| 165 | -#define REG (env->fpr[60]) | ||
| 166 | -#include "fop_template.h" | ||
| 167 | -#define REGNAME f62 | ||
| 168 | -#define REG (env->fpr[62]) | ||
| 169 | -#include "fop_template.h" | ||
| 170 | -#endif | ||
| 171 | - | ||
| 172 | /* Load and store */ | 24 | /* Load and store */ |
| 173 | #define MEMSUFFIX _raw | 25 | #define MEMSUFFIX _raw |
| 174 | #include "op_mem.h" | 26 | #include "op_mem.h" |
target-sparc/translate.c
| @@ -114,60 +114,85 @@ static int sign_extend(int x, int len) | @@ -114,60 +114,85 @@ static int sign_extend(int x, int len) | ||
| 114 | 114 | ||
| 115 | static void disas_sparc_insn(DisasContext * dc); | 115 | static void disas_sparc_insn(DisasContext * dc); |
| 116 | 116 | ||
| 117 | -#ifdef TARGET_SPARC64 | ||
| 118 | -#define GEN32(func, NAME) \ | ||
| 119 | -static GenOpFunc * const NAME ## _table [64] = { \ | ||
| 120 | -NAME ## 0, NAME ## 1, NAME ## 2, NAME ## 3, \ | ||
| 121 | -NAME ## 4, NAME ## 5, NAME ## 6, NAME ## 7, \ | ||
| 122 | -NAME ## 8, NAME ## 9, NAME ## 10, NAME ## 11, \ | ||
| 123 | -NAME ## 12, NAME ## 13, NAME ## 14, NAME ## 15, \ | ||
| 124 | -NAME ## 16, NAME ## 17, NAME ## 18, NAME ## 19, \ | ||
| 125 | -NAME ## 20, NAME ## 21, NAME ## 22, NAME ## 23, \ | ||
| 126 | -NAME ## 24, NAME ## 25, NAME ## 26, NAME ## 27, \ | ||
| 127 | -NAME ## 28, NAME ## 29, NAME ## 30, NAME ## 31, \ | ||
| 128 | -NAME ## 32, 0, NAME ## 34, 0, NAME ## 36, 0, NAME ## 38, 0, \ | ||
| 129 | -NAME ## 40, 0, NAME ## 42, 0, NAME ## 44, 0, NAME ## 46, 0, \ | ||
| 130 | -NAME ## 48, 0, NAME ## 50, 0, NAME ## 52, 0, NAME ## 54, 0, \ | ||
| 131 | -NAME ## 56, 0, NAME ## 58, 0, NAME ## 60, 0, NAME ## 62, 0, \ | ||
| 132 | -}; \ | ||
| 133 | -static inline void func(int n) \ | ||
| 134 | -{ \ | ||
| 135 | - NAME ## _table[n](); \ | 117 | +/* floating point registers moves */ |
| 118 | +static void gen_op_load_fpr_FT0(unsigned int src) | ||
| 119 | +{ | ||
| 120 | + tcg_gen_ld_i32(cpu_tmp0, cpu_env, offsetof(CPUSPARCState, fpr[src])); | ||
| 121 | + tcg_gen_st_i32(cpu_tmp0, cpu_env, offsetof(CPUSPARCState, ft0)); | ||
| 136 | } | 122 | } |
| 137 | -#else | ||
| 138 | -#define GEN32(func, NAME) \ | ||
| 139 | -static GenOpFunc *const NAME ## _table [32] = { \ | ||
| 140 | -NAME ## 0, NAME ## 1, NAME ## 2, NAME ## 3, \ | ||
| 141 | -NAME ## 4, NAME ## 5, NAME ## 6, NAME ## 7, \ | ||
| 142 | -NAME ## 8, NAME ## 9, NAME ## 10, NAME ## 11, \ | ||
| 143 | -NAME ## 12, NAME ## 13, NAME ## 14, NAME ## 15, \ | ||
| 144 | -NAME ## 16, NAME ## 17, NAME ## 18, NAME ## 19, \ | ||
| 145 | -NAME ## 20, NAME ## 21, NAME ## 22, NAME ## 23, \ | ||
| 146 | -NAME ## 24, NAME ## 25, NAME ## 26, NAME ## 27, \ | ||
| 147 | -NAME ## 28, NAME ## 29, NAME ## 30, NAME ## 31, \ | ||
| 148 | -}; \ | ||
| 149 | -static inline void func(int n) \ | ||
| 150 | -{ \ | ||
| 151 | - NAME ## _table[n](); \ | 123 | + |
| 124 | +static void gen_op_load_fpr_FT1(unsigned int src) | ||
| 125 | +{ | ||
| 126 | + tcg_gen_ld_i32(cpu_tmp0, cpu_env, offsetof(CPUSPARCState, fpr[src])); | ||
| 127 | + tcg_gen_st_i32(cpu_tmp0, cpu_env, offsetof(CPUSPARCState, ft1)); | ||
| 152 | } | 128 | } |
| 153 | -#endif | ||
| 154 | 129 | ||
| 155 | -/* floating point registers moves */ | ||
| 156 | -GEN32(gen_op_load_fpr_FT0, gen_op_load_fpr_FT0_fprf); | ||
| 157 | -GEN32(gen_op_load_fpr_FT1, gen_op_load_fpr_FT1_fprf); | ||
| 158 | -GEN32(gen_op_store_FT0_fpr, gen_op_store_FT0_fpr_fprf); | ||
| 159 | -GEN32(gen_op_store_FT1_fpr, gen_op_store_FT1_fpr_fprf); | 130 | +static void gen_op_store_FT0_fpr(unsigned int dst) |
| 131 | +{ | ||
| 132 | + tcg_gen_ld_i32(cpu_tmp0, cpu_env, offsetof(CPUSPARCState, ft0)); | ||
| 133 | + tcg_gen_st_i32(cpu_tmp0, cpu_env, offsetof(CPUSPARCState, fpr[dst])); | ||
| 134 | +} | ||
| 160 | 135 | ||
| 161 | -GEN32(gen_op_load_fpr_DT0, gen_op_load_fpr_DT0_fprf); | ||
| 162 | -GEN32(gen_op_load_fpr_DT1, gen_op_load_fpr_DT1_fprf); | ||
| 163 | -GEN32(gen_op_store_DT0_fpr, gen_op_store_DT0_fpr_fprf); | ||
| 164 | -GEN32(gen_op_store_DT1_fpr, gen_op_store_DT1_fpr_fprf); | 136 | +static void gen_op_load_fpr_DT0(unsigned int src) |
| 137 | +{ | ||
| 138 | + tcg_gen_ld_i32(cpu_tmp0, cpu_env, offsetof(CPUSPARCState, fpr[src])); | ||
| 139 | + tcg_gen_st_i32(cpu_tmp0, cpu_env, offsetof(CPUSPARCState, dt0) + offsetof(CPU_DoubleU, l.upper)); | ||
| 140 | + tcg_gen_ld_i32(cpu_tmp0, cpu_env, offsetof(CPUSPARCState, fpr[src + 1])); | ||
| 141 | + tcg_gen_st_i32(cpu_tmp0, cpu_env, offsetof(CPUSPARCState, dt0) + offsetof(CPU_DoubleU, l.lower)); | ||
| 142 | +} | ||
| 165 | 143 | ||
| 166 | -#if defined(CONFIG_USER_ONLY) | ||
| 167 | -GEN32(gen_op_load_fpr_QT0, gen_op_load_fpr_QT0_fprf); | ||
| 168 | -GEN32(gen_op_load_fpr_QT1, gen_op_load_fpr_QT1_fprf); | ||
| 169 | -GEN32(gen_op_store_QT0_fpr, gen_op_store_QT0_fpr_fprf); | ||
| 170 | -GEN32(gen_op_store_QT1_fpr, gen_op_store_QT1_fpr_fprf); | 144 | +static void gen_op_load_fpr_DT1(unsigned int src) |
| 145 | +{ | ||
| 146 | + tcg_gen_ld_i32(cpu_tmp0, cpu_env, offsetof(CPUSPARCState, fpr[src])); | ||
| 147 | + tcg_gen_st_i32(cpu_tmp0, cpu_env, offsetof(CPUSPARCState, dt1) + offsetof(CPU_DoubleU, l.upper)); | ||
| 148 | + tcg_gen_ld_i32(cpu_tmp0, cpu_env, offsetof(CPUSPARCState, fpr[src + 1])); | ||
| 149 | + tcg_gen_st_i32(cpu_tmp0, cpu_env, offsetof(CPUSPARCState, dt1) + offsetof(CPU_DoubleU, l.lower)); | ||
| 150 | +} | ||
| 151 | + | ||
| 152 | +static void gen_op_store_DT0_fpr(unsigned int dst) | ||
| 153 | +{ | ||
| 154 | + tcg_gen_ld_i32(cpu_tmp0, cpu_env, offsetof(CPUSPARCState, dt0) + offsetof(CPU_DoubleU, l.upper)); | ||
| 155 | + tcg_gen_st_i32(cpu_tmp0, cpu_env, offsetof(CPUSPARCState, fpr[dst])); | ||
| 156 | + tcg_gen_ld_i32(cpu_tmp0, cpu_env, offsetof(CPUSPARCState, dt0) + offsetof(CPU_DoubleU, l.lower)); | ||
| 157 | + tcg_gen_st_i32(cpu_tmp0, cpu_env, offsetof(CPUSPARCState, fpr[dst + 1])); | ||
| 158 | +} | ||
| 159 | + | ||
| 160 | +#ifdef CONFIG_USER_ONLY | ||
| 161 | +static void gen_op_load_fpr_QT0(unsigned int src) | ||
| 162 | +{ | ||
| 163 | + tcg_gen_ld_i32(cpu_tmp0, cpu_env, offsetof(CPUSPARCState, fpr[src])); | ||
| 164 | + tcg_gen_st_i32(cpu_tmp0, cpu_env, offsetof(CPUSPARCState, qt0) + offsetof(CPU_QuadU, l.upmost)); | ||
| 165 | + tcg_gen_ld_i32(cpu_tmp0, cpu_env, offsetof(CPUSPARCState, fpr[src + 1])); | ||
| 166 | + tcg_gen_st_i32(cpu_tmp0, cpu_env, offsetof(CPUSPARCState, qt0) + offsetof(CPU_QuadU, l.upper)); | ||
| 167 | + tcg_gen_ld_i32(cpu_tmp0, cpu_env, offsetof(CPUSPARCState, fpr[src + 2])); | ||
| 168 | + tcg_gen_st_i32(cpu_tmp0, cpu_env, offsetof(CPUSPARCState, qt0) + offsetof(CPU_QuadU, l.lower)); | ||
| 169 | + tcg_gen_ld_i32(cpu_tmp0, cpu_env, offsetof(CPUSPARCState, fpr[src + 3])); | ||
| 170 | + tcg_gen_st_i32(cpu_tmp0, cpu_env, offsetof(CPUSPARCState, qt0) + offsetof(CPU_QuadU, l.lowest)); | ||
| 171 | +} | ||
| 172 | + | ||
| 173 | +static void gen_op_load_fpr_QT1(unsigned int src) | ||
| 174 | +{ | ||
| 175 | + tcg_gen_ld_i32(cpu_tmp0, cpu_env, offsetof(CPUSPARCState, fpr[src])); | ||
| 176 | + tcg_gen_st_i32(cpu_tmp0, cpu_env, offsetof(CPUSPARCState, qt1) + offsetof(CPU_QuadU, l.upmost)); | ||
| 177 | + tcg_gen_ld_i32(cpu_tmp0, cpu_env, offsetof(CPUSPARCState, fpr[src + 1])); | ||
| 178 | + tcg_gen_st_i32(cpu_tmp0, cpu_env, offsetof(CPUSPARCState, qt1) + offsetof(CPU_QuadU, l.upper)); | ||
| 179 | + tcg_gen_ld_i32(cpu_tmp0, cpu_env, offsetof(CPUSPARCState, fpr[src + 2])); | ||
| 180 | + tcg_gen_st_i32(cpu_tmp0, cpu_env, offsetof(CPUSPARCState, qt1) + offsetof(CPU_QuadU, l.lower)); | ||
| 181 | + tcg_gen_ld_i32(cpu_tmp0, cpu_env, offsetof(CPUSPARCState, fpr[src + 3])); | ||
| 182 | + tcg_gen_st_i32(cpu_tmp0, cpu_env, offsetof(CPUSPARCState, qt1) + offsetof(CPU_QuadU, l.lowest)); | ||
| 183 | +} | ||
| 184 | + | ||
| 185 | +static void gen_op_store_QT0_fpr(unsigned int dst) | ||
| 186 | +{ | ||
| 187 | + tcg_gen_ld_i32(cpu_tmp0, cpu_env, offsetof(CPUSPARCState, qt0) + offsetof(CPU_QuadU, l.upmost)); | ||
| 188 | + tcg_gen_st_i32(cpu_tmp0, cpu_env, offsetof(CPUSPARCState, fpr[dst])); | ||
| 189 | + tcg_gen_ld_i32(cpu_tmp0, cpu_env, offsetof(CPUSPARCState, qt0) + offsetof(CPU_QuadU, l.upper)); | ||
| 190 | + tcg_gen_st_i32(cpu_tmp0, cpu_env, offsetof(CPUSPARCState, fpr[dst + 1])); | ||
| 191 | + tcg_gen_ld_i32(cpu_tmp0, cpu_env, offsetof(CPUSPARCState, qt0) + offsetof(CPU_QuadU, l.lower)); | ||
| 192 | + tcg_gen_st_i32(cpu_tmp0, cpu_env, offsetof(CPUSPARCState, fpr[dst + 2])); | ||
| 193 | + tcg_gen_ld_i32(cpu_tmp0, cpu_env, offsetof(CPUSPARCState, qt0) + offsetof(CPU_QuadU, l.lowest)); | ||
| 194 | + tcg_gen_st_i32(cpu_tmp0, cpu_env, offsetof(CPUSPARCState, fpr[dst + 3])); | ||
| 195 | +} | ||
| 171 | #endif | 196 | #endif |
| 172 | 197 | ||
| 173 | /* moves */ | 198 | /* moves */ |