2002-03-02 Chris Demetriou <cgd@broadcom.com>
authorChris Demetriou <cgd@google.com>
Sun, 3 Mar 2002 07:36:42 +0000 (07:36 +0000)
committerChris Demetriou <cgd@google.com>
Sun, 3 Mar 2002 07:36:42 +0000 (07:36 +0000)
* mips.igen (loadstore_ea): New function to do effective
address calculations.
(do_load, do_load_left, do_load_right, LL, LDD, PREF, do_store,
do_store_left, do_store_right, SC, SCD, PREFX, SWC1, SWXC1,
CACHE): Use loadstore_ea to do effective address computations.

sim/mips/ChangeLog
sim/mips/mips.igen

index c02a53bbadf4b8a3ac6c6d02b9afd76376a69427..f8127f1b139dbbae78dc197930d5457d1502a7c2 100644 (file)
@@ -1,3 +1,11 @@
+2002-03-02  Chris Demetriou  <cgd@broadcom.com>
+
+       * mips.igen (loadstore_ea): New function to do effective
+       address calculations.
+       (do_load, do_load_left, do_load_right, LL, LDD, PREF, do_store,
+       do_store_left, do_store_right, SC, SCD, PREFX, SWC1, SWXC1,
+       CACHE): Use loadstore_ea to do effective address computations.
+
 2002-03-02  Chris Demetriou  <cgd@broadcom.com>
 
        * interp.c (load_word): Use EXTEND32 rather than SIGNEXTEND.
index be7882064b629690f5a55965d9a5091523ea8d6a..2c75cb88f3f1676241b7e39e62e76e3a9abe6a56 100644 (file)
   return CIA + 8;
 }
 
+
+// Helper:
+//
+// Calculate an effective address given a base and an offset.
+//
+
+:function:::address_word:loadstore_ea:address_word base, address_word offset
+*mipsI:
+*mipsII:
+*mipsIII:
+*mipsIV:
+*mipsV:
+*vr4100:
+*vr5000:
+*r3900:
+{
+  return base + offset;
+}
+
+
 // Helper:
 // 
 // Check that an access to a HI/LO register meets timing requirements
   unsigned64 memval;
   address_word vaddr;
 
-  vaddr = base + offset;
+  vaddr = loadstore_ea (SD_, base, offset);
   if ((vaddr & access) != 0)
     {
       SIM_CORE_SIGNAL (SD, STATE_CPU (SD, 0), cia, read_map, access+1, vaddr, read_transfer, sim_core_unaligned_signal);
   unsigned_word lhs_mask;
   unsigned_word temp;
 
-  vaddr = base + offset;
+  vaddr = loadstore_ea (SD_, base, offset);
   AddressTranslation (vaddr, isDATA, isLOAD, &paddr, &uncached, isTARGET, isREAL);
   paddr = (paddr ^ (reverseendian & mask));
   if (BigEndianMem == 0)
   unsigned64 memval;
   address_word vaddr;
 
-  vaddr = base + offset;
+  vaddr = loadstore_ea (SD_, base, offset);
   AddressTranslation (vaddr, isDATA, isLOAD, &paddr, &uncached, isTARGET, isREAL);
   /* NOTE: SPEC is wrong, has `BigEndianMem == 0' not `BigEndianMem != 0' */
   paddr = (paddr ^ (reverseendian & mask));
   address_word base = GPR[BASE];
   address_word offset = EXTEND16 (OFFSET);
   {
-    address_word vaddr = ((unsigned64)base + offset);
+    address_word vaddr = loadstore_ea (SD_, base, offset);
     address_word paddr;
     int uncached;
     if ((vaddr & 3) != 0)
   address_word offset = EXTEND16 (OFFSET);
   check_u64 (SD_, instruction_0);
   {
-    address_word vaddr = ((unsigned64)base + offset);
+    address_word vaddr = loadstore_ea (SD_, base, offset);
     address_word paddr;
     int uncached;
     if ((vaddr & 7) != 0)
   address_word base = GPR[BASE];
   address_word offset = EXTEND16 (OFFSET);
   {
-    address_word vaddr = ((unsigned64)base + offset);
+    address_word vaddr = loadstore_ea (SD_, base, offset);
     address_word paddr;
     int uncached;
     {
   unsigned64 memval;
   address_word vaddr;
 
-  vaddr = base + offset;
+  vaddr = loadstore_ea (SD_, base, offset);
   if ((vaddr & access) != 0)
     {
       SIM_CORE_SIGNAL (SD, STATE_CPU(SD, 0), cia, read_map, access+1, vaddr, write_transfer, sim_core_unaligned_signal);
   int nr_lhs_bits;
   int nr_rhs_bits;
 
-  vaddr = base + offset;
+  vaddr = loadstore_ea (SD_, base, offset);
   AddressTranslation (vaddr, isDATA, isSTORE, &paddr, &uncached, isTARGET, isREAL);
   paddr = (paddr ^ (reverseendian & mask));
   if (BigEndianMem == 0)
   unsigned64 memval;
   address_word vaddr;
 
-  vaddr = base + offset;
+  vaddr = loadstore_ea (SD_, base, offset);
   AddressTranslation (vaddr, isDATA, isSTORE, &paddr, &uncached, isTARGET, isREAL);
   paddr = (paddr ^ (reverseendian & mask));
   if (BigEndianMem != 0)
   address_word base = GPR[BASE];
   address_word offset = EXTEND16 (OFFSET);
   {
-    address_word vaddr = ((unsigned64)base + offset);
+    address_word vaddr = loadstore_ea (SD_, base, offset);
     address_word paddr;
     int uncached;
     if ((vaddr & 3) != 0)
   address_word offset = EXTEND16 (OFFSET);
   check_u64 (SD_, instruction_0);
   {
-    address_word vaddr = ((unsigned64)base + offset);
+    address_word vaddr = loadstore_ea (SD_, base, offset);
     address_word paddr;
     int uncached;
     if ((vaddr & 7) != 0)
   address_word base = GPR[BASE];
   address_word index = GPR[INDEX];
   {
-    address_word vaddr = ((unsigned64)base + (unsigned64)index);
+    address_word vaddr = loadstore_ea (SD_, base, index);
     address_word paddr;
     int uncached;
     if (AddressTranslation(vaddr,isDATA,isLOAD,&paddr,&uncached,isTARGET,isREAL))
 *vr5000:
 *r3900:
 {
-  signed_word offset = EXTEND16 (OFFSET);
+  address_word base = GPR[BASE];
+  address_word offset = EXTEND16 (OFFSET);
   check_fpu(SD_);
   {
-    address_word vaddr = ((uword64)GPR[BASE] + offset);
+    address_word vaddr = loadstore_ea (SD_, base, offset);
     address_word paddr;
     int uncached;
     if ((vaddr & 3) != 0)
   check_fpu(SD_);
   check_u64 (SD_, instruction_0);
   {
-   address_word vaddr = ((unsigned64)base + index);
+   address_word vaddr = loadstore_ea (SD_, base, index);
    address_word paddr;
    int uncached;
    if ((vaddr & 3) != 0)
   address_word base = GPR[BASE];
   address_word offset = EXTEND16 (OFFSET);
   {
-    address_word vaddr = (base + offset);
+    address_word vaddr = loadstore_ea (SD_, base, offset);
     address_word paddr;
     int uncached;
     if (AddressTranslation(vaddr,isDATA,isLOAD,&paddr,&uncached,isTARGET,isREAL))