Browse Source

sparc64: Fix masking and shifting in VIS fpcmp emulation.

Signed-off-by: David S. Miller <davem@davemloft.net>
David S. Miller 13 years ago
parent
commit
2e8ecdc008
1 changed files with 16 additions and 16 deletions
  1. 16 16
      arch/sparc/kernel/visemul.c

+ 16 - 16
arch/sparc/kernel/visemul.c

@@ -713,17 +713,17 @@ static void pcmp(struct pt_regs *regs, unsigned int insn, unsigned int opf)
 			s16 b = (rs2 >> (i * 16)) & 0xffff;
 			s16 b = (rs2 >> (i * 16)) & 0xffff;
 
 
 			if (a > b)
 			if (a > b)
-				rd_val |= 1 << i;
+				rd_val |= 8 >> i;
 		}
 		}
 		break;
 		break;
 
 
 	case FCMPGT32_OPF:
 	case FCMPGT32_OPF:
 		for (i = 0; i < 2; i++) {
 		for (i = 0; i < 2; i++) {
-			s32 a = (rs1 >> (i * 32)) & 0xffff;
-			s32 b = (rs2 >> (i * 32)) & 0xffff;
+			s32 a = (rs1 >> (i * 32)) & 0xffffffff;
+			s32 b = (rs2 >> (i * 32)) & 0xffffffff;
 
 
 			if (a > b)
 			if (a > b)
-				rd_val |= 1 << i;
+				rd_val |= 2 >> i;
 		}
 		}
 		break;
 		break;
 
 
@@ -733,17 +733,17 @@ static void pcmp(struct pt_regs *regs, unsigned int insn, unsigned int opf)
 			s16 b = (rs2 >> (i * 16)) & 0xffff;
 			s16 b = (rs2 >> (i * 16)) & 0xffff;
 
 
 			if (a <= b)
 			if (a <= b)
-				rd_val |= 1 << i;
+				rd_val |= 8 >> i;
 		}
 		}
 		break;
 		break;
 
 
 	case FCMPLE32_OPF:
 	case FCMPLE32_OPF:
 		for (i = 0; i < 2; i++) {
 		for (i = 0; i < 2; i++) {
-			s32 a = (rs1 >> (i * 32)) & 0xffff;
-			s32 b = (rs2 >> (i * 32)) & 0xffff;
+			s32 a = (rs1 >> (i * 32)) & 0xffffffff;
+			s32 b = (rs2 >> (i * 32)) & 0xffffffff;
 
 
 			if (a <= b)
 			if (a <= b)
-				rd_val |= 1 << i;
+				rd_val |= 2 >> i;
 		}
 		}
 		break;
 		break;
 
 
@@ -753,17 +753,17 @@ static void pcmp(struct pt_regs *regs, unsigned int insn, unsigned int opf)
 			s16 b = (rs2 >> (i * 16)) & 0xffff;
 			s16 b = (rs2 >> (i * 16)) & 0xffff;
 
 
 			if (a != b)
 			if (a != b)
-				rd_val |= 1 << i;
+				rd_val |= 8 >> i;
 		}
 		}
 		break;
 		break;
 
 
 	case FCMPNE32_OPF:
 	case FCMPNE32_OPF:
 		for (i = 0; i < 2; i++) {
 		for (i = 0; i < 2; i++) {
-			s32 a = (rs1 >> (i * 32)) & 0xffff;
-			s32 b = (rs2 >> (i * 32)) & 0xffff;
+			s32 a = (rs1 >> (i * 32)) & 0xffffffff;
+			s32 b = (rs2 >> (i * 32)) & 0xffffffff;
 
 
 			if (a != b)
 			if (a != b)
-				rd_val |= 1 << i;
+				rd_val |= 2 >> i;
 		}
 		}
 		break;
 		break;
 
 
@@ -773,17 +773,17 @@ static void pcmp(struct pt_regs *regs, unsigned int insn, unsigned int opf)
 			s16 b = (rs2 >> (i * 16)) & 0xffff;
 			s16 b = (rs2 >> (i * 16)) & 0xffff;
 
 
 			if (a == b)
 			if (a == b)
-				rd_val |= 1 << i;
+				rd_val |= 8 >> i;
 		}
 		}
 		break;
 		break;
 
 
 	case FCMPEQ32_OPF:
 	case FCMPEQ32_OPF:
 		for (i = 0; i < 2; i++) {
 		for (i = 0; i < 2; i++) {
-			s32 a = (rs1 >> (i * 32)) & 0xffff;
-			s32 b = (rs2 >> (i * 32)) & 0xffff;
+			s32 a = (rs1 >> (i * 32)) & 0xffffffff;
+			s32 b = (rs2 >> (i * 32)) & 0xffffffff;
 
 
 			if (a == b)
 			if (a == b)
-				rd_val |= 1 << i;
+				rd_val |= 2 >> i;
 		}
 		}
 		break;
 		break;
 	}
 	}