translate.c (f2cfa1229e539ee1bb1822912075cf25538ad6b9) | translate.c (14776ab5a12972ea439c7fb2203a4c15a09094b4) |
---|---|
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 --- 2005 unchanged lines hidden (view full) --- 2014 2015 gen(cpu_env, src); 2016 2017 gen_op_store_QT0_fpr(QFPREG(rd)); 2018 gen_update_fprs_dirty(dc, QFPREG(rd)); 2019} 2020 2021static void gen_swap(DisasContext *dc, TCGv dst, TCGv src, | 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 --- 2005 unchanged lines hidden (view full) --- 2014 2015 gen(cpu_env, src); 2016 2017 gen_op_store_QT0_fpr(QFPREG(rd)); 2018 gen_update_fprs_dirty(dc, QFPREG(rd)); 2019} 2020 2021static void gen_swap(DisasContext *dc, TCGv dst, TCGv src, |
2022 TCGv addr, int mmu_idx, TCGMemOp memop) | 2022 TCGv addr, int mmu_idx, MemOp memop) |
2023{ 2024 gen_address_mask(dc, addr); 2025 tcg_gen_atomic_xchg_tl(dst, addr, src, mmu_idx, memop); 2026} 2027 2028static void gen_ldstub(DisasContext *dc, TCGv dst, TCGv addr, int mmu_idx) 2029{ 2030 TCGv m1 = tcg_const_tl(0xff); --- 14 unchanged lines hidden (view full) --- 2045 GET_ASI_BCOPY, 2046 GET_ASI_BFILL, 2047} ASIType; 2048 2049typedef struct { 2050 ASIType type; 2051 int asi; 2052 int mem_idx; | 2023{ 2024 gen_address_mask(dc, addr); 2025 tcg_gen_atomic_xchg_tl(dst, addr, src, mmu_idx, memop); 2026} 2027 2028static void gen_ldstub(DisasContext *dc, TCGv dst, TCGv addr, int mmu_idx) 2029{ 2030 TCGv m1 = tcg_const_tl(0xff); --- 14 unchanged lines hidden (view full) --- 2045 GET_ASI_BCOPY, 2046 GET_ASI_BFILL, 2047} ASIType; 2048 2049typedef struct { 2050 ASIType type; 2051 int asi; 2052 int mem_idx; |
2053 TCGMemOp memop; | 2053 MemOp memop; |
2054} DisasASI; 2055 | 2054} DisasASI; 2055 |
2056static DisasASI get_asi(DisasContext *dc, int insn, TCGMemOp memop) | 2056static DisasASI get_asi(DisasContext *dc, int insn, MemOp memop) |
2057{ 2058 int asi = GET_FIELD(insn, 19, 26); 2059 ASIType type = GET_ASI_HELPER; 2060 int mem_idx = dc->mem_idx; 2061 2062#ifndef TARGET_SPARC64 2063 /* Before v9, all asis are immediate and privileged. */ 2064 if (IS_IMM) { --- 197 unchanged lines hidden (view full) --- 2262 } 2263 } 2264#endif 2265 2266 return (DisasASI){ type, asi, mem_idx, memop }; 2267} 2268 2269static void gen_ld_asi(DisasContext *dc, TCGv dst, TCGv addr, | 2057{ 2058 int asi = GET_FIELD(insn, 19, 26); 2059 ASIType type = GET_ASI_HELPER; 2060 int mem_idx = dc->mem_idx; 2061 2062#ifndef TARGET_SPARC64 2063 /* Before v9, all asis are immediate and privileged. */ 2064 if (IS_IMM) { --- 197 unchanged lines hidden (view full) --- 2262 } 2263 } 2264#endif 2265 2266 return (DisasASI){ type, asi, mem_idx, memop }; 2267} 2268 2269static void gen_ld_asi(DisasContext *dc, TCGv dst, TCGv addr, |
2270 int insn, TCGMemOp memop) | 2270 int insn, MemOp memop) |
2271{ 2272 DisasASI da = get_asi(dc, insn, memop); 2273 2274 switch (da.type) { 2275 case GET_ASI_EXCP: 2276 break; 2277 case GET_ASI_DTWINX: /* Reserved for ldda. */ 2278 gen_exception(dc, TT_ILL_INSN); --- 21 unchanged lines hidden (view full) --- 2300 tcg_temp_free_i32(r_mop); 2301 tcg_temp_free_i32(r_asi); 2302 } 2303 break; 2304 } 2305} 2306 2307static void gen_st_asi(DisasContext *dc, TCGv src, TCGv addr, | 2271{ 2272 DisasASI da = get_asi(dc, insn, memop); 2273 2274 switch (da.type) { 2275 case GET_ASI_EXCP: 2276 break; 2277 case GET_ASI_DTWINX: /* Reserved for ldda. */ 2278 gen_exception(dc, TT_ILL_INSN); --- 21 unchanged lines hidden (view full) --- 2300 tcg_temp_free_i32(r_mop); 2301 tcg_temp_free_i32(r_asi); 2302 } 2303 break; 2304 } 2305} 2306 2307static void gen_st_asi(DisasContext *dc, TCGv src, TCGv addr, |
2308 int insn, TCGMemOp memop) | 2308 int insn, MemOp memop) |
2309{ 2310 DisasASI da = get_asi(dc, insn, memop); 2311 2312 switch (da.type) { 2313 case GET_ASI_EXCP: 2314 break; 2315 case GET_ASI_DTWINX: /* Reserved for stda. */ 2316#ifndef TARGET_SPARC64 --- 189 unchanged lines hidden (view full) --- 2506 default: 2507 g_assert_not_reached(); 2508 } 2509 break; 2510 2511 case GET_ASI_BLOCK: 2512 /* Valid for lddfa on aligned registers only. */ 2513 if (size == 8 && (rd & 7) == 0) { | 2309{ 2310 DisasASI da = get_asi(dc, insn, memop); 2311 2312 switch (da.type) { 2313 case GET_ASI_EXCP: 2314 break; 2315 case GET_ASI_DTWINX: /* Reserved for stda. */ 2316#ifndef TARGET_SPARC64 --- 189 unchanged lines hidden (view full) --- 2506 default: 2507 g_assert_not_reached(); 2508 } 2509 break; 2510 2511 case GET_ASI_BLOCK: 2512 /* Valid for lddfa on aligned registers only. */ 2513 if (size == 8 && (rd & 7) == 0) { |
2514 TCGMemOp memop; | 2514 MemOp memop; |
2515 TCGv eight; 2516 int i; 2517 2518 gen_address_mask(dc, addr); 2519 2520 /* The first operation checks required alignment. */ 2521 memop = da.memop | MO_ALIGN_64; 2522 eight = tcg_const_tl(8); --- 97 unchanged lines hidden (view full) --- 2620 default: 2621 g_assert_not_reached(); 2622 } 2623 break; 2624 2625 case GET_ASI_BLOCK: 2626 /* Valid for stdfa on aligned registers only. */ 2627 if (size == 8 && (rd & 7) == 0) { | 2515 TCGv eight; 2516 int i; 2517 2518 gen_address_mask(dc, addr); 2519 2520 /* The first operation checks required alignment. */ 2521 memop = da.memop | MO_ALIGN_64; 2522 eight = tcg_const_tl(8); --- 97 unchanged lines hidden (view full) --- 2620 default: 2621 g_assert_not_reached(); 2622 } 2623 break; 2624 2625 case GET_ASI_BLOCK: 2626 /* Valid for stdfa on aligned registers only. */ 2627 if (size == 8 && (rd & 7) == 0) { |
2628 TCGMemOp memop; | 2628 MemOp memop; |
2629 TCGv eight; 2630 int i; 2631 2632 gen_address_mask(dc, addr); 2633 2634 /* The first operation checks required alignment. */ 2635 memop = da.memop | MO_ALIGN_64; 2636 eight = tcg_const_tl(8); --- 3425 unchanged lines hidden --- | 2629 TCGv eight; 2630 int i; 2631 2632 gen_address_mask(dc, addr); 2633 2634 /* The first operation checks required alignment. */ 2635 memop = da.memop | MO_ALIGN_64; 2636 eight = tcg_const_tl(8); --- 3425 unchanged lines hidden --- |