Add implementation for the fcmp instructions. These don't behave -quite- right with...
authorGabe Black <gblack@eecs.umich.edu>
Tue, 30 Jan 2007 03:52:54 +0000 (22:52 -0500)
committerGabe Black <gblack@eecs.umich.edu>
Tue, 30 Jan 2007 03:52:54 +0000 (22:52 -0500)
--HG--
extra : convert_revision : 67b6583a20530b7a393aa04d0b71031d3c72ecdd

src/arch/sparc/isa/decoder.isa

index f8f381b657befad87976667137d8e7be986cb487..d9c8286f89c255e503e7d14605764c4bbcf0ed3a 100644 (file)
@@ -734,7 +734,69 @@ decode OP default Unknown::unknown()
                     default: FailUnimpl::fpop1();
                 }
             }
-            0x35: Trap::fpop2({{fault = new FpDisabled;}});
+            0x35: decode OPF{
+                format BasicOperate{
+                    0x51: fcmps({{
+                          uint8_t fcc;
+                          if(isnan(Frs1s) || isnan(Frs2s))
+                              fcc = 3;
+                          else if(Frs1s < Frs2s)
+                              fcc = 1;
+                          else if(Frs1s > Frs2s)
+                              fcc = 2;
+                          else
+                              fcc = 0;
+                          uint8_t firstbit = 10;
+                          if(FCMPCC)
+                              firstbit = FCMPCC * 2 + 30;
+                          Fsr = insertBits(Fsr, firstbit +1, firstbit, fcc);
+                    }});
+                    0x52: fcmpd({{
+                          uint8_t fcc;
+                          if(isnan(Frs1s) || isnan(Frs2s))
+                              fcc = 3;
+                          else if(Frs1s < Frs2s)
+                              fcc = 1;
+                          else if(Frs1s > Frs2s)
+                              fcc = 2;
+                          else
+                              fcc = 0;
+                          uint8_t firstbit = 10;
+                          if(FCMPCC)
+                              firstbit = FCMPCC * 2 + 30;
+                          Fsr = insertBits(Fsr, firstbit +1, firstbit, fcc);
+                    }});
+                    0x53: Trap::fcmpq({{fault = new FpExceptionOther;}});
+                    0x54: fcmpes({{
+                          uint8_t fcc = 0;
+                          if(isnan(Frs1s) || isnan(Frs2s))
+                              fault = new FpExceptionIEEE754;
+                          if(Frs1s < Frs2s)
+                              fcc = 1;
+                          else if(Frs1s > Frs2s)
+                              fcc = 2;
+                          uint8_t firstbit = 10;
+                          if(FCMPCC)
+                              firstbit = FCMPCC * 2 + 30;
+                          Fsr = insertBits(Fsr, firstbit +1, firstbit, fcc);
+                    }});
+                    0x55: fcmped({{
+                          uint8_t fcc = 0;
+                          if(isnan(Frs1s) || isnan(Frs2s))
+                              fault = new FpExceptionIEEE754;
+                          if(Frs1s < Frs2s)
+                              fcc = 1;
+                          else if(Frs1s > Frs2s)
+                              fcc = 2;
+                          uint8_t firstbit = 10;
+                          if(FCMPCC)
+                              firstbit = FCMPCC * 2 + 30;
+                          Fsr = insertBits(Fsr, firstbit +1, firstbit, fcc);
+                    }});
+                    0x56: Trap::fcmpeq({{fault = new FpExceptionOther;}});
+                    default: FailUnimpl::fpop2();
+                }
+            }
             //This used to be just impdep1, but now it's a whole bunch
             //of instructions
             0x36: decode OPF{