- Στην υλοποίηση του gshare predictor υπάρχει ένα left shift του history register πριν το XOR με το masked PC. Το left shift αυτό χρησιμεύει σε περίπτωση που τα bits του history register είναι λιγότερα από αυτά του table index. Επειδή για να πιάσουμε τα 32Kbits που είναι το επιθυμητό hardware overhead θα χρειαστεί να μειώσουμε τα bits του index, το history πλέον θα είναι μακρύτερο από το index, με αποτέλεσμα το left shift αυτό να έχει πλέον αρνητικό όρισμα (με history length = table index length = 15 όπως είναι αρχικά, το όρισμα προκύπτει μηδέν). Αυτό, όμως, σύμφωνα με το ANSI C πρότυπο (βλ. ελληνικό K&R σ. 282) δίνει UNDEFINED συμπεριφορά* (όπως θα γκρινιάξει και ο g++). Οπότε είτε θα πρέπει να μειωθεί και το history length για να γίνει <= του table index length είτε να αλλάξει ο κώδικας σε αυτό το σημείο και να παίρνει περιπτώσεις αναλόγως του ποιο είναι μακρύτερο. Τι προτείνετε εσείς?
- Η υλοποίηση του BTB που μας δίνεται χρησιμοποιεί πέραν των 2 unsigned integers (PCs) ανά cell και έναν ακόμα integer, που χρησιμοποιείται για να πετύχουμε αντικατάσταση LRU σε κάθε update. Το overhead των LRU registers αυτών θα το αγνοήσουμε?


*Το οποίο σε αυτή την περίπτωση δεν είναι υπερβολή, καθώς ο παρακάτω κώδικας σε εμένα τυπώνει 0 αντί για το αναμενόμενο 1:

#include <stdio.h>
int main ()
{
  unsigned int x = 2;
  printf("%u\n",x << (-1));
  return 0;
}