Remove int hack to allow unsigned numbers greater than 2^63 - 1...
authorVikram S. Adve <vadve@cs.uiuc.edu>
Sat, 15 Dec 2001 00:33:36 +0000 (00:33 +0000)
committerVikram S. Adve <vadve@cs.uiuc.edu>
Sat, 15 Dec 2001 00:33:36 +0000 (00:33 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@1483 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Target/SparcV9/SparcV9InstrInfo.cpp

index 13e6f5421976150d31dcca365219ad64c2b907a5..99bb14d12ed2529594c85807c15f3301418fee63 100644 (file)
@@ -26,7 +26,7 @@
 
 
 static inline MachineInstr*
-CreateIntSetInstruction(int64_t C, bool isSigned, Value* dest,
+CreateIntSetInstruction(int64_t C, Value* dest,
                         vector<TmpInstruction*>& tempVec)
 {
   MachineInstr* minstr;
@@ -43,12 +43,33 @@ CreateIntSetInstruction(int64_t C, bool isSigned, Value* dest,
                                    /*isdef*/ true);
       minstr->SetMachineOperand(2, MachineOperand::MO_VirtualRegister,dest);
     }
-  if (isSigned)
+  else
     {
       minstr = new MachineInstr(SETSW);
       minstr->SetMachineOperand(0, MachineOperand::MO_SignExtendedImmed, C);
       minstr->SetMachineOperand(1, MachineOperand::MO_VirtualRegister, dest);
     }
+  
+  return minstr;
+}
+
+static inline MachineInstr*
+CreateUIntSetInstruction(uint64_t C, Value* dest,
+                         vector<TmpInstruction*>& tempVec)
+{
+  MachineInstr* minstr;
+  if (C > (unsigned int) ~0)
+    { // C does not fit in 32 bits
+      TmpInstruction* tmpReg =
+        new TmpInstruction(Instruction::UserOp1, Type::IntTy, NULL, NULL);
+      tempVec.push_back(tmpReg);
+      
+      minstr = new MachineInstr(SETX);
+      minstr->SetMachineOperand(0, MachineOperand::MO_SignExtendedImmed, C);
+      minstr->SetMachineOperand(1, MachineOperand::MO_VirtualRegister, tmpReg,
+                                   /*isdef*/ true);
+      minstr->SetMachineOperand(2, MachineOperand::MO_VirtualRegister,dest);
+    }
   else
     {
       minstr = new MachineInstr(SETUW);
@@ -105,10 +126,18 @@ UltraSparcInstrInfo::CreateCodeToLoadConst(Value* val,
   
   if (valType->isIntegral() || valType == Type::BoolTy)
     {
-      bool isValidConstant;
-      int64_t C = GetConstantValueAsSignedInt(val, isValidConstant);
-      assert(isValidConstant && "Unrecognized constant");
-      minstr = CreateIntSetInstruction(C, valType->isSigned(), dest, tempVec);
+      if (ConstantUInt* uval = dyn_cast<ConstantUInt>(val))
+        {
+          uint64_t C = uval->getValue();
+          minstr = CreateUIntSetInstruction(C, dest, tempVec);
+        }
+      else
+        {
+          bool isValidConstant;
+          int64_t C = GetConstantValueAsSignedInt(val, isValidConstant);
+          assert(isValidConstant && "Unrecognized constant");
+          minstr = CreateIntSetInstruction(C, dest, tempVec);
+        }
       minstrVec.push_back(minstr);
     }
   else