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 | 21 | #include "exec.h" |
| 22 | 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 | 24 | /* Load and store */ |
| 173 | 25 | #define MEMSUFFIX _raw |
| 174 | 26 | #include "op_mem.h" | ... | ... |
target-sparc/translate.c
| ... | ... | @@ -114,60 +114,85 @@ static int sign_extend(int x, int len) |
| 114 | 114 | |
| 115 | 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 | 196 | #endif |
| 172 | 197 | |
| 173 | 198 | /* moves */ | ... | ... |