From 0e2fa9cab9c124788077de728f1e6744d1dd8bb2 Mon Sep 17 00:00:00 2001 From: "Igor V. Kovalenko" Date: Wed, 2 Jun 2010 00:12:48 +0400 Subject: [PATCH] sparc64: improve ldf and stf insns - implemented block load/store primary/secondary with user privilege Signed-off-by: Igor V. Kovalenko Signed-off-by: Blue Swirl --- target-sparc/op_helper.c | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/target-sparc/op_helper.c b/target-sparc/op_helper.c index 842dbd3d19..470c710755 100644 --- a/target-sparc/op_helper.c +++ b/target-sparc/op_helper.c @@ -3164,6 +3164,20 @@ void helper_ldf_asi(target_ulong addr, int asi, int size, int rd) } return; + case 0x70: // Block load primary, user privilege + case 0x71: // Block load secondary, user privilege + if (rd & 7) { + raise_exception(TT_ILL_INSN); + return; + } + helper_check_align(addr, 0x3f); + for (i = 0; i < 16; i++) { + *(uint32_t *)&env->fpr[rd++] = helper_ld_asi(addr, asi & 0x1f, 4, + 0); + addr += 4; + } + + return; default: break; } @@ -3210,6 +3224,20 @@ void helper_stf_asi(target_ulong addr, int asi, int size, int rd) } return; + case 0x70: // Block store primary, user privilege + case 0x71: // Block store secondary, user privilege + if (rd & 7) { + raise_exception(TT_ILL_INSN); + return; + } + helper_check_align(addr, 0x3f); + for (i = 0; i < 16; i++) { + val = *(uint32_t *)&env->fpr[rd++]; + helper_st_asi(addr, val, asi & 0x1f, 4); + addr += 4; + } + + return; default: break; } -- 2.11.4.GIT