Fix Sparc64 ldfa/stfa and float ops with fpr >= 32
authorblueswir1 <blueswir1@c046a42c-6fe2-441c-8c8c-71466251a162>
Wed, 3 Oct 2007 17:46:29 +0000 (17:46 +0000)
committerblueswir1 <blueswir1@c046a42c-6fe2-441c-8c8c-71466251a162>
Wed, 3 Oct 2007 17:46:29 +0000 (17:46 +0000)
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@3318 c046a42c-6fe2-441c-8c8c-71466251a162

target-sparc/translate.c

index 94503bee8ac883e5467c0c99d0496c37380f8fce..1a6d56ac40ba62b68423da5aa15710100b54a413 100644 (file)
@@ -87,7 +87,7 @@ enum {
 #define GET_FIELD_SPs(x,a,b) sign_extend (GET_FIELD_SP(x,a,b), ((b) - (a) + 1))
 
 #ifdef TARGET_SPARC64
-#define DFPREG(r) (((r & 1) << 6) | (r & 0x1e))
+#define DFPREG(r) (((r & 1) << 5) | (r & 0x1e))
 #else
 #define DFPREG(r) (r & 0x1e)
 #endif
@@ -431,7 +431,7 @@ static inline void gen_ldf_asi(int insn, int size)
 {
     int asi, offset, rd;
 
-    rd = GET_FIELD(insn, 2, 6);
+    rd = DFPREG(GET_FIELD(insn, 2, 6));
     if (IS_IMM) {
         offset = GET_FIELD(insn, 25, 31);
         gen_op_ldf_asi_reg(offset, size, rd);
@@ -445,7 +445,7 @@ static inline void gen_stf_asi(int insn, int size)
 {
     int asi, offset, rd;
 
-    rd = GET_FIELD(insn, 2, 6);
+    rd = DFPREG(GET_FIELD(insn, 2, 6));
     if (IS_IMM) {
         offset = GET_FIELD(insn, 25, 31);
         gen_op_stf_asi_reg(offset, size, rd);