blob: c986ca4afd3ab12a48cd8928d84cd501ed65bfd7 [file] [log] [blame]
Misha Brukman5dfe3a92004-06-21 16:55:25 +00001//===-- InstSelectSimple.cpp - A simple instruction selector for PowerPC --===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file was developed by the LLVM research group and is distributed under
6// the University of Illinois Open Source License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
Misha Brukman98649d12004-06-24 21:54:47 +000010#define DEBUG_TYPE "isel"
Misha Brukman5dfe3a92004-06-21 16:55:25 +000011#include "PowerPC.h"
12#include "PowerPCInstrBuilder.h"
13#include "PowerPCInstrInfo.h"
14#include "llvm/Constants.h"
15#include "llvm/DerivedTypes.h"
16#include "llvm/Function.h"
17#include "llvm/Instructions.h"
Misha Brukman5dfe3a92004-06-21 16:55:25 +000018#include "llvm/Pass.h"
Misha Brukman8c9f5202004-06-21 18:30:31 +000019#include "llvm/CodeGen/IntrinsicLowering.h"
Misha Brukman5dfe3a92004-06-21 16:55:25 +000020#include "llvm/CodeGen/MachineConstantPool.h"
21#include "llvm/CodeGen/MachineFrameInfo.h"
22#include "llvm/CodeGen/MachineFunction.h"
23#include "llvm/CodeGen/SSARegMap.h"
24#include "llvm/Target/MRegisterInfo.h"
25#include "llvm/Target/TargetMachine.h"
26#include "llvm/Support/GetElementPtrTypeIterator.h"
27#include "llvm/Support/InstVisitor.h"
Misha Brukman98649d12004-06-24 21:54:47 +000028#include "Support/Debug.h"
29#include <vector>
Chris Lattner98599d02004-07-11 02:48:28 +000030#include <iostream>
Misha Brukman5dfe3a92004-06-21 16:55:25 +000031using namespace llvm;
32
33namespace {
Misha Brukman422791f2004-06-21 17:41:12 +000034 /// TypeClass - Used by the PowerPC backend to group LLVM types by their basic
35 /// PPC Representation.
Misha Brukman5dfe3a92004-06-21 16:55:25 +000036 ///
37 enum TypeClass {
38 cByte, cShort, cInt, cFP, cLong
39 };
40}
41
42/// getClass - Turn a primitive type into a "class" number which is based on the
43/// size of the type, and whether or not it is floating point.
44///
45static inline TypeClass getClass(const Type *Ty) {
Misha Brukman358829f2004-06-21 17:25:55 +000046 switch (Ty->getTypeID()) {
Misha Brukman5dfe3a92004-06-21 16:55:25 +000047 case Type::SByteTyID:
48 case Type::UByteTyID: return cByte; // Byte operands are class #0
49 case Type::ShortTyID:
50 case Type::UShortTyID: return cShort; // Short operands are class #1
51 case Type::IntTyID:
52 case Type::UIntTyID:
Misha Brukman2834a4d2004-07-07 20:07:22 +000053 case Type::PointerTyID: return cInt; // Ints and pointers are class #2
Misha Brukman5dfe3a92004-06-21 16:55:25 +000054
55 case Type::FloatTyID:
56 case Type::DoubleTyID: return cFP; // Floating Point is #3
57
58 case Type::LongTyID:
59 case Type::ULongTyID: return cLong; // Longs are class #4
60 default:
61 assert(0 && "Invalid type to getClass!");
62 return cByte; // not reached
63 }
64}
65
66// getClassB - Just like getClass, but treat boolean values as ints.
67static inline TypeClass getClassB(const Type *Ty) {
68 if (Ty == Type::BoolTy) return cInt;
69 return getClass(Ty);
70}
71
72namespace {
73 struct ISel : public FunctionPass, InstVisitor<ISel> {
74 TargetMachine &TM;
75 MachineFunction *F; // The function we are compiling into
76 MachineBasicBlock *BB; // The current MBB we are compiling
77 int VarArgsFrameIndex; // FrameIndex for start of varargs area
78 int ReturnAddressIndex; // FrameIndex for the return address
79
Misha Brukman313efcb2004-07-09 15:45:07 +000080 std::map<Value*, unsigned> RegMap; // Mapping between Values and SSA Regs
Misha Brukman5dfe3a92004-06-21 16:55:25 +000081
Misha Brukman2834a4d2004-07-07 20:07:22 +000082 // External functions used in the Module
Misha Brukmanf3f63822004-07-08 19:41:16 +000083 Function *fmodFn, *__moddi3Fn, *__divdi3Fn, *__umoddi3Fn, *__udivdi3Fn,
Misha Brukman313efcb2004-07-09 15:45:07 +000084 *__fixdfdiFn, *__floatdisfFn, *__floatdidfFn, *mallocFn, *freeFn;
Misha Brukman2834a4d2004-07-07 20:07:22 +000085
Misha Brukman5dfe3a92004-06-21 16:55:25 +000086 // MBBMap - Mapping between LLVM BB -> Machine BB
87 std::map<const BasicBlock*, MachineBasicBlock*> MBBMap;
88
89 // AllocaMap - Mapping from fixed sized alloca instructions to the
90 // FrameIndex for the alloca.
91 std::map<AllocaInst*, unsigned> AllocaMap;
92
93 ISel(TargetMachine &tm) : TM(tm), F(0), BB(0) {}
94
Misha Brukman2834a4d2004-07-07 20:07:22 +000095 bool doInitialization(Module &M) {
Misha Brukmanb0932592004-07-07 15:36:18 +000096 // Add external functions that we may call
Misha Brukman2834a4d2004-07-07 20:07:22 +000097 Type *d = Type::DoubleTy;
Misha Brukmanf3f63822004-07-08 19:41:16 +000098 Type *f = Type::FloatTy;
Misha Brukman2834a4d2004-07-07 20:07:22 +000099 Type *l = Type::LongTy;
100 Type *ul = Type::ULongTy;
Misha Brukman313efcb2004-07-09 15:45:07 +0000101 Type *voidPtr = PointerType::get(Type::SByteTy);
Misha Brukman2834a4d2004-07-07 20:07:22 +0000102 // double fmod(double, double);
Misha Brukman0aa97c62004-07-08 18:27:59 +0000103 fmodFn = M.getOrInsertFunction("fmod", d, d, d, 0);
Misha Brukman2834a4d2004-07-07 20:07:22 +0000104 // long __moddi3(long, long);
Misha Brukman0aa97c62004-07-08 18:27:59 +0000105 __moddi3Fn = M.getOrInsertFunction("__moddi3", l, l, l, 0);
Misha Brukman2834a4d2004-07-07 20:07:22 +0000106 // long __divdi3(long, long);
Misha Brukman0aa97c62004-07-08 18:27:59 +0000107 __divdi3Fn = M.getOrInsertFunction("__divdi3", l, l, l, 0);
Misha Brukman2834a4d2004-07-07 20:07:22 +0000108 // unsigned long __umoddi3(unsigned long, unsigned long);
Misha Brukman0aa97c62004-07-08 18:27:59 +0000109 __umoddi3Fn = M.getOrInsertFunction("__umoddi3", ul, ul, ul, 0);
Misha Brukman2834a4d2004-07-07 20:07:22 +0000110 // unsigned long __udivdi3(unsigned long, unsigned long);
Misha Brukman0aa97c62004-07-08 18:27:59 +0000111 __udivdi3Fn = M.getOrInsertFunction("__udivdi3", ul, ul, ul, 0);
Misha Brukmanf3f63822004-07-08 19:41:16 +0000112 // long __fixdfdi(double)
113 __fixdfdiFn = M.getOrInsertFunction("__fixdfdi", l, d, 0);
114 // float __floatdisf(long)
115 __floatdisfFn = M.getOrInsertFunction("__floatdisf", f, l, 0);
116 // double __floatdidf(long)
117 __floatdidfFn = M.getOrInsertFunction("__floatdidf", d, l, 0);
Misha Brukman313efcb2004-07-09 15:45:07 +0000118 // void* malloc(size_t)
119 mallocFn = M.getOrInsertFunction("malloc", voidPtr, Type::UIntTy, 0);
120 // void free(void*)
121 freeFn = M.getOrInsertFunction("free", Type::VoidTy, voidPtr, 0);
Misha Brukman2834a4d2004-07-07 20:07:22 +0000122 return false;
123 }
Misha Brukmand18a31d2004-07-06 22:51:53 +0000124
Misha Brukman5dfe3a92004-06-21 16:55:25 +0000125 /// runOnFunction - Top level implementation of instruction selection for
126 /// the entire function.
127 ///
128 bool runOnFunction(Function &Fn) {
129 // First pass over the function, lower any unknown intrinsic functions
130 // with the IntrinsicLowering class.
131 LowerUnknownIntrinsicFunctionCalls(Fn);
132
133 F = &MachineFunction::construct(&Fn, TM);
134
135 // Create all of the machine basic blocks for the function...
136 for (Function::iterator I = Fn.begin(), E = Fn.end(); I != E; ++I)
137 F->getBasicBlockList().push_back(MBBMap[I] = new MachineBasicBlock(I));
138
139 BB = &F->front();
140
141 // Set up a frame object for the return address. This is used by the
142 // llvm.returnaddress & llvm.frameaddress intrinisics.
143 ReturnAddressIndex = F->getFrameInfo()->CreateFixedObject(4, -4);
144
145 // Copy incoming arguments off of the stack...
146 LoadArgumentsToVirtualRegs(Fn);
147
148 // Instruction select everything except PHI nodes
149 visit(Fn);
150
151 // Select the PHI nodes
152 SelectPHINodes();
153
154 RegMap.clear();
155 MBBMap.clear();
156 AllocaMap.clear();
157 F = 0;
158 // We always build a machine code representation for the function
159 return true;
160 }
161
162 virtual const char *getPassName() const {
163 return "PowerPC Simple Instruction Selection";
164 }
165
166 /// visitBasicBlock - This method is called when we are visiting a new basic
167 /// block. This simply creates a new MachineBasicBlock to emit code into
168 /// and adds it to the current MachineFunction. Subsequent visit* for
169 /// instructions will be invoked for all instructions in the basic block.
170 ///
171 void visitBasicBlock(BasicBlock &LLVM_BB) {
172 BB = MBBMap[&LLVM_BB];
173 }
174
175 /// LowerUnknownIntrinsicFunctionCalls - This performs a prepass over the
176 /// function, lowering any calls to unknown intrinsic functions into the
177 /// equivalent LLVM code.
178 ///
179 void LowerUnknownIntrinsicFunctionCalls(Function &F);
180
181 /// LoadArgumentsToVirtualRegs - Load all of the arguments to this function
182 /// from the stack into virtual registers.
183 ///
184 void LoadArgumentsToVirtualRegs(Function &F);
185
186 /// SelectPHINodes - Insert machine code to generate phis. This is tricky
187 /// because we have to generate our sources into the source basic blocks,
188 /// not the current one.
189 ///
190 void SelectPHINodes();
191
192 // Visitation methods for various instructions. These methods simply emit
193 // fixed PowerPC code for each instruction.
194
195 // Control flow operators
196 void visitReturnInst(ReturnInst &RI);
197 void visitBranchInst(BranchInst &BI);
198
199 struct ValueRecord {
200 Value *Val;
201 unsigned Reg;
202 const Type *Ty;
203 ValueRecord(unsigned R, const Type *T) : Val(0), Reg(R), Ty(T) {}
204 ValueRecord(Value *V) : Val(V), Reg(0), Ty(V->getType()) {}
205 };
206 void doCall(const ValueRecord &Ret, MachineInstr *CallMI,
Misha Brukmand18a31d2004-07-06 22:51:53 +0000207 const std::vector<ValueRecord> &Args, bool isVarArg);
Misha Brukman5dfe3a92004-06-21 16:55:25 +0000208 void visitCallInst(CallInst &I);
209 void visitIntrinsicCall(Intrinsic::ID ID, CallInst &I);
210
211 // Arithmetic operators
212 void visitSimpleBinary(BinaryOperator &B, unsigned OpcodeClass);
213 void visitAdd(BinaryOperator &B) { visitSimpleBinary(B, 0); }
214 void visitSub(BinaryOperator &B) { visitSimpleBinary(B, 1); }
215 void visitMul(BinaryOperator &B);
216
217 void visitDiv(BinaryOperator &B) { visitDivRem(B); }
218 void visitRem(BinaryOperator &B) { visitDivRem(B); }
219 void visitDivRem(BinaryOperator &B);
220
221 // Bitwise operators
222 void visitAnd(BinaryOperator &B) { visitSimpleBinary(B, 2); }
223 void visitOr (BinaryOperator &B) { visitSimpleBinary(B, 3); }
224 void visitXor(BinaryOperator &B) { visitSimpleBinary(B, 4); }
225
226 // Comparison operators...
227 void visitSetCondInst(SetCondInst &I);
228 unsigned EmitComparison(unsigned OpNum, Value *Op0, Value *Op1,
229 MachineBasicBlock *MBB,
230 MachineBasicBlock::iterator MBBI);
231 void visitSelectInst(SelectInst &SI);
232
233
234 // Memory Instructions
235 void visitLoadInst(LoadInst &I);
236 void visitStoreInst(StoreInst &I);
237 void visitGetElementPtrInst(GetElementPtrInst &I);
238 void visitAllocaInst(AllocaInst &I);
239 void visitMallocInst(MallocInst &I);
240 void visitFreeInst(FreeInst &I);
241
242 // Other operators
243 void visitShiftInst(ShiftInst &I);
244 void visitPHINode(PHINode &I) {} // PHI nodes handled by second pass
245 void visitCastInst(CastInst &I);
246 void visitVANextInst(VANextInst &I);
247 void visitVAArgInst(VAArgInst &I);
248
249 void visitInstruction(Instruction &I) {
250 std::cerr << "Cannot instruction select: " << I;
251 abort();
252 }
253
254 /// promote32 - Make a value 32-bits wide, and put it somewhere.
255 ///
256 void promote32(unsigned targetReg, const ValueRecord &VR);
257
258 /// emitGEPOperation - Common code shared between visitGetElementPtrInst and
259 /// constant expression GEP support.
260 ///
261 void emitGEPOperation(MachineBasicBlock *BB, MachineBasicBlock::iterator IP,
262 Value *Src, User::op_iterator IdxBegin,
263 User::op_iterator IdxEnd, unsigned TargetReg);
264
265 /// emitCastOperation - Common code shared between visitCastInst and
266 /// constant expression cast support.
267 ///
268 void emitCastOperation(MachineBasicBlock *BB,MachineBasicBlock::iterator IP,
269 Value *Src, const Type *DestTy, unsigned TargetReg);
270
271 /// emitSimpleBinaryOperation - Common code shared between visitSimpleBinary
272 /// and constant expression support.
273 ///
274 void emitSimpleBinaryOperation(MachineBasicBlock *BB,
275 MachineBasicBlock::iterator IP,
276 Value *Op0, Value *Op1,
277 unsigned OperatorClass, unsigned TargetReg);
278
279 /// emitBinaryFPOperation - This method handles emission of floating point
280 /// Add (0), Sub (1), Mul (2), and Div (3) operations.
281 void emitBinaryFPOperation(MachineBasicBlock *BB,
282 MachineBasicBlock::iterator IP,
283 Value *Op0, Value *Op1,
284 unsigned OperatorClass, unsigned TargetReg);
285
286 void emitMultiply(MachineBasicBlock *BB, MachineBasicBlock::iterator IP,
287 Value *Op0, Value *Op1, unsigned TargetReg);
288
289 void doMultiply(MachineBasicBlock *MBB, MachineBasicBlock::iterator MBBI,
290 unsigned DestReg, const Type *DestTy,
291 unsigned Op0Reg, unsigned Op1Reg);
292 void doMultiplyConst(MachineBasicBlock *MBB,
293 MachineBasicBlock::iterator MBBI,
294 unsigned DestReg, const Type *DestTy,
295 unsigned Op0Reg, unsigned Op1Val);
296
297 void emitDivRemOperation(MachineBasicBlock *BB,
298 MachineBasicBlock::iterator IP,
299 Value *Op0, Value *Op1, bool isDiv,
300 unsigned TargetReg);
301
302 /// emitSetCCOperation - Common code shared between visitSetCondInst and
303 /// constant expression support.
304 ///
305 void emitSetCCOperation(MachineBasicBlock *BB,
306 MachineBasicBlock::iterator IP,
307 Value *Op0, Value *Op1, unsigned Opcode,
308 unsigned TargetReg);
309
310 /// emitShiftOperation - Common code shared between visitShiftInst and
311 /// constant expression support.
312 ///
313 void emitShiftOperation(MachineBasicBlock *MBB,
314 MachineBasicBlock::iterator IP,
315 Value *Op, Value *ShiftAmount, bool isLeftShift,
316 const Type *ResultTy, unsigned DestReg);
317
318 /// emitSelectOperation - Common code shared between visitSelectInst and the
319 /// constant expression support.
320 void emitSelectOperation(MachineBasicBlock *MBB,
321 MachineBasicBlock::iterator IP,
322 Value *Cond, Value *TrueVal, Value *FalseVal,
323 unsigned DestReg);
324
325 /// copyConstantToRegister - Output the instructions required to put the
326 /// specified constant into the specified register.
327 ///
328 void copyConstantToRegister(MachineBasicBlock *MBB,
329 MachineBasicBlock::iterator MBBI,
330 Constant *C, unsigned Reg);
331
332 void emitUCOM(MachineBasicBlock *MBB, MachineBasicBlock::iterator MBBI,
333 unsigned LHS, unsigned RHS);
334
335 /// makeAnotherReg - This method returns the next register number we haven't
336 /// yet used.
337 ///
338 /// Long values are handled somewhat specially. They are always allocated
339 /// as pairs of 32 bit integer values. The register number returned is the
340 /// lower 32 bits of the long value, and the regNum+1 is the upper 32 bits
341 /// of the long value.
342 ///
343 unsigned makeAnotherReg(const Type *Ty) {
344 assert(dynamic_cast<const PowerPCRegisterInfo*>(TM.getRegisterInfo()) &&
345 "Current target doesn't have PPC reg info??");
346 const PowerPCRegisterInfo *MRI =
347 static_cast<const PowerPCRegisterInfo*>(TM.getRegisterInfo());
348 if (Ty == Type::LongTy || Ty == Type::ULongTy) {
349 const TargetRegisterClass *RC = MRI->getRegClassForType(Type::IntTy);
350 // Create the lower part
351 F->getSSARegMap()->createVirtualRegister(RC);
352 // Create the upper part.
353 return F->getSSARegMap()->createVirtualRegister(RC)-1;
354 }
355
356 // Add the mapping of regnumber => reg class to MachineFunction
357 const TargetRegisterClass *RC = MRI->getRegClassForType(Ty);
358 return F->getSSARegMap()->createVirtualRegister(RC);
359 }
360
361 /// getReg - This method turns an LLVM value into a register number.
362 ///
363 unsigned getReg(Value &V) { return getReg(&V); } // Allow references
364 unsigned getReg(Value *V) {
365 // Just append to the end of the current bb.
366 MachineBasicBlock::iterator It = BB->end();
367 return getReg(V, BB, It);
368 }
369 unsigned getReg(Value *V, MachineBasicBlock *MBB,
370 MachineBasicBlock::iterator IPt);
371
372 /// getFixedSizedAllocaFI - Return the frame index for a fixed sized alloca
373 /// that is to be statically allocated with the initial stack frame
374 /// adjustment.
375 unsigned getFixedSizedAllocaFI(AllocaInst *AI);
376 };
377}
378
379/// dyn_castFixedAlloca - If the specified value is a fixed size alloca
380/// instruction in the entry block, return it. Otherwise, return a null
381/// pointer.
382static AllocaInst *dyn_castFixedAlloca(Value *V) {
383 if (AllocaInst *AI = dyn_cast<AllocaInst>(V)) {
384 BasicBlock *BB = AI->getParent();
385 if (isa<ConstantUInt>(AI->getArraySize()) && BB ==&BB->getParent()->front())
386 return AI;
387 }
388 return 0;
389}
390
391/// getReg - This method turns an LLVM value into a register number.
392///
393unsigned ISel::getReg(Value *V, MachineBasicBlock *MBB,
394 MachineBasicBlock::iterator IPt) {
395 // If this operand is a constant, emit the code to copy the constant into
396 // the register here...
397 //
398 if (Constant *C = dyn_cast<Constant>(V)) {
399 unsigned Reg = makeAnotherReg(V->getType());
400 copyConstantToRegister(MBB, IPt, C, Reg);
401 return Reg;
402 } else if (GlobalValue *GV = dyn_cast<GlobalValue>(V)) {
Misha Brukman7e5812c2004-06-28 18:20:59 +0000403 // GV is located at PC + distance
Misha Brukman7e5812c2004-06-28 18:20:59 +0000404 unsigned CurPC = makeAnotherReg(Type::IntTy);
Misha Brukman5dfe3a92004-06-21 16:55:25 +0000405 unsigned Reg1 = makeAnotherReg(V->getType());
Misha Brukman422791f2004-06-21 17:41:12 +0000406 unsigned Reg2 = makeAnotherReg(V->getType());
Misha Brukman7e5812c2004-06-28 18:20:59 +0000407 // Move PC to destination reg
408 BuildMI(*MBB, IPt, PPC32::MovePCtoLR, 0, CurPC);
Misha Brukman7e5812c2004-06-28 18:20:59 +0000409 // Move value at PC + distance into return reg
410 BuildMI(*MBB, IPt, PPC32::LOADHiAddr, 2, Reg1).addReg(CurPC)
Misha Brukman911afde2004-06-25 14:50:41 +0000411 .addGlobalAddress(GV);
Misha Brukman9ecf3bf2004-06-25 14:57:19 +0000412 BuildMI(*MBB, IPt, PPC32::LOADLoAddr, 2, Reg2).addReg(Reg1)
Misha Brukman911afde2004-06-25 14:50:41 +0000413 .addGlobalAddress(GV);
Misha Brukman5dfe3a92004-06-21 16:55:25 +0000414 return Reg2;
415 } else if (CastInst *CI = dyn_cast<CastInst>(V)) {
416 // Do not emit noop casts at all.
417 if (getClassB(CI->getType()) == getClassB(CI->getOperand(0)->getType()))
418 return getReg(CI->getOperand(0), MBB, IPt);
419 } else if (AllocaInst *AI = dyn_castFixedAlloca(V)) {
420 unsigned Reg = makeAnotherReg(V->getType());
421 unsigned FI = getFixedSizedAllocaFI(AI);
422 addFrameReference(BuildMI(*MBB, IPt, PPC32::ADDI, 2, Reg), FI, 0, false);
423 return Reg;
424 }
425
426 unsigned &Reg = RegMap[V];
427 if (Reg == 0) {
428 Reg = makeAnotherReg(V->getType());
429 RegMap[V] = Reg;
430 }
431
432 return Reg;
433}
434
435/// getFixedSizedAllocaFI - Return the frame index for a fixed sized alloca
436/// that is to be statically allocated with the initial stack frame
437/// adjustment.
438unsigned ISel::getFixedSizedAllocaFI(AllocaInst *AI) {
439 // Already computed this?
440 std::map<AllocaInst*, unsigned>::iterator I = AllocaMap.lower_bound(AI);
441 if (I != AllocaMap.end() && I->first == AI) return I->second;
442
443 const Type *Ty = AI->getAllocatedType();
444 ConstantUInt *CUI = cast<ConstantUInt>(AI->getArraySize());
445 unsigned TySize = TM.getTargetData().getTypeSize(Ty);
446 TySize *= CUI->getValue(); // Get total allocated size...
447 unsigned Alignment = TM.getTargetData().getTypeAlignment(Ty);
448
449 // Create a new stack object using the frame manager...
450 int FrameIdx = F->getFrameInfo()->CreateStackObject(TySize, Alignment);
451 AllocaMap.insert(I, std::make_pair(AI, FrameIdx));
452 return FrameIdx;
453}
454
455
456/// copyConstantToRegister - Output the instructions required to put the
457/// specified constant into the specified register.
458///
459void ISel::copyConstantToRegister(MachineBasicBlock *MBB,
460 MachineBasicBlock::iterator IP,
461 Constant *C, unsigned R) {
Misha Brukman5dfe3a92004-06-21 16:55:25 +0000462 if (C->getType()->isIntegral()) {
463 unsigned Class = getClassB(C->getType());
464
465 if (Class == cLong) {
466 // Copy the value into the register pair.
467 uint64_t Val = cast<ConstantInt>(C)->getRawValue();
Misha Brukman422791f2004-06-21 17:41:12 +0000468 unsigned hiTmp = makeAnotherReg(Type::IntTy);
469 unsigned loTmp = makeAnotherReg(Type::IntTy);
Misha Brukman911afde2004-06-25 14:50:41 +0000470 BuildMI(*MBB, IP, PPC32::ADDIS, 2, loTmp).addReg(PPC32::R0)
471 .addImm(Val >> 48);
472 BuildMI(*MBB, IP, PPC32::ORI, 2, R).addReg(loTmp)
473 .addImm((Val >> 32) & 0xFFFF);
474 BuildMI(*MBB, IP, PPC32::ADDIS, 2, hiTmp).addReg(PPC32::R0)
475 .addImm((Val >> 16) & 0xFFFF);
Misha Brukman5dfe3a92004-06-21 16:55:25 +0000476 BuildMI(*MBB, IP, PPC32::ORI, 2, R+1).addReg(hiTmp).addImm(Val & 0xFFFF);
477 return;
478 }
479
480 assert(Class <= cInt && "Type not handled yet!");
481
482 if (C->getType() == Type::BoolTy) {
Misha Brukman911afde2004-06-25 14:50:41 +0000483 BuildMI(*MBB, IP, PPC32::ADDI, 2, R).addReg(PPC32::R0)
484 .addImm(C == ConstantBool::True);
Misha Brukman5dfe3a92004-06-21 16:55:25 +0000485 } else if (Class == cByte || Class == cShort) {
486 ConstantInt *CI = cast<ConstantInt>(C);
Misha Brukman911afde2004-06-25 14:50:41 +0000487 BuildMI(*MBB, IP, PPC32::ADDI, 2, R).addReg(PPC32::R0)
488 .addImm(CI->getRawValue());
Misha Brukman5dfe3a92004-06-21 16:55:25 +0000489 } else {
490 ConstantInt *CI = cast<ConstantInt>(C);
491 int TheVal = CI->getRawValue() & 0xFFFFFFFF;
492 if (TheVal < 32768 && TheVal >= -32768) {
Misha Brukman911afde2004-06-25 14:50:41 +0000493 BuildMI(*MBB, IP, PPC32::ADDI, 2, R).addReg(PPC32::R0)
494 .addImm(CI->getRawValue());
Misha Brukman422791f2004-06-21 17:41:12 +0000495 } else {
496 unsigned TmpReg = makeAnotherReg(Type::IntTy);
Misha Brukman911afde2004-06-25 14:50:41 +0000497 BuildMI(*MBB, IP, PPC32::ADDIS, 2, TmpReg).addReg(PPC32::R0)
498 .addImm(CI->getRawValue() >> 16);
499 BuildMI(*MBB, IP, PPC32::ORI, 2, R).addReg(TmpReg)
500 .addImm(CI->getRawValue() & 0xFFFF);
Misha Brukman422791f2004-06-21 17:41:12 +0000501 }
Misha Brukman5dfe3a92004-06-21 16:55:25 +0000502 }
503 } else if (ConstantFP *CFP = dyn_cast<ConstantFP>(C)) {
Misha Brukmand18a31d2004-07-06 22:51:53 +0000504 // We need to spill the constant to memory...
505 MachineConstantPool *CP = F->getConstantPool();
506 unsigned CPI = CP->getConstantPoolIndex(CFP);
507 const Type *Ty = CFP->getType();
Misha Brukman5dfe3a92004-06-21 16:55:25 +0000508
Misha Brukmand18a31d2004-07-06 22:51:53 +0000509 assert(Ty == Type::FloatTy || Ty == Type::DoubleTy && "Unknown FP type!");
Misha Brukmanfc879c32004-07-08 18:02:38 +0000510
511 // Load addr of constant to reg; constant is located at PC + distance
512 unsigned CurPC = makeAnotherReg(Type::IntTy);
513 unsigned Reg1 = makeAnotherReg(Type::IntTy);
514 unsigned Reg2 = makeAnotherReg(Type::IntTy);
515 // Move PC to destination reg
516 BuildMI(*MBB, IP, PPC32::MovePCtoLR, 0, CurPC);
517 // Move value at PC + distance into return reg
518 BuildMI(*MBB, IP, PPC32::LOADHiAddr, 2, Reg1).addReg(CurPC)
519 .addConstantPoolIndex(CPI);
520 BuildMI(*MBB, IP, PPC32::LOADLoAddr, 2, Reg2).addReg(Reg1)
521 .addConstantPoolIndex(CPI);
522
Misha Brukmand18a31d2004-07-06 22:51:53 +0000523 unsigned LoadOpcode = (Ty == Type::FloatTy) ? PPC32::LFS : PPC32::LFD;
Misha Brukmanfc879c32004-07-08 18:02:38 +0000524 BuildMI(*MBB, IP, LoadOpcode, 2, R).addImm(0).addReg(Reg2);
Misha Brukman5dfe3a92004-06-21 16:55:25 +0000525 } else if (isa<ConstantPointerNull>(C)) {
526 // Copy zero (null pointer) to the register.
527 BuildMI(*MBB, IP, PPC32::ADDI, 2, R).addReg(PPC32::R0).addImm(0);
528 } else if (ConstantPointerRef *CPR = dyn_cast<ConstantPointerRef>(C)) {
Misha Brukman32caa8d2004-07-14 17:57:04 +0000529 unsigned AddrReg = getReg(CPR->getValue(), MBB, IP);
530 BuildMI(*MBB, IP, PPC32::OR, 2, R).addReg(AddrReg).addReg(AddrReg);
Misha Brukman5dfe3a92004-06-21 16:55:25 +0000531 } else {
532 std::cerr << "Offending constant: " << C << "\n";
533 assert(0 && "Type not handled yet!");
534 }
535}
536
537/// LoadArgumentsToVirtualRegs - Load all of the arguments to this function from
538/// the stack into virtual registers.
539///
540/// FIXME: When we can calculate which args are coming in via registers
541/// source them from there instead.
542void ISel::LoadArgumentsToVirtualRegs(Function &Fn) {
543 unsigned ArgOffset = 0; // Frame mechanisms handle retaddr slot
544 unsigned GPR_remaining = 8;
545 unsigned FPR_remaining = 13;
Misha Brukmand18a31d2004-07-06 22:51:53 +0000546 unsigned GPR_idx = 0, FPR_idx = 0;
547 static const unsigned GPR[] = {
548 PPC32::R3, PPC32::R4, PPC32::R5, PPC32::R6,
549 PPC32::R7, PPC32::R8, PPC32::R9, PPC32::R10,
550 };
551 static const unsigned FPR[] = {
Misha Brukman32caa8d2004-07-14 17:57:04 +0000552 PPC32::F1, PPC32::F2, PPC32::F3, PPC32::F4, PPC32::F5, PPC32::F6, PPC32::F7,
Misha Brukman2834a4d2004-07-07 20:07:22 +0000553 PPC32::F8, PPC32::F9, PPC32::F10, PPC32::F11, PPC32::F12, PPC32::F13
Misha Brukmand18a31d2004-07-06 22:51:53 +0000554 };
Misha Brukman422791f2004-06-21 17:41:12 +0000555
Misha Brukman5dfe3a92004-06-21 16:55:25 +0000556 MachineFrameInfo *MFI = F->getFrameInfo();
Misha Brukmand18a31d2004-07-06 22:51:53 +0000557
Misha Brukman5dfe3a92004-06-21 16:55:25 +0000558 for (Function::aiterator I = Fn.abegin(), E = Fn.aend(); I != E; ++I) {
559 bool ArgLive = !I->use_empty();
560 unsigned Reg = ArgLive ? getReg(*I) : 0;
561 int FI; // Frame object index
562
563 switch (getClassB(I->getType())) {
564 case cByte:
565 if (ArgLive) {
566 FI = MFI->CreateFixedObject(1, ArgOffset);
Misha Brukman422791f2004-06-21 17:41:12 +0000567 if (GPR_remaining > 0) {
Misha Brukmand18a31d2004-07-06 22:51:53 +0000568 BuildMI(BB, PPC32::OR, 2, Reg).addReg(GPR[GPR_idx])
569 .addReg(GPR[GPR_idx]);
Misha Brukman422791f2004-06-21 17:41:12 +0000570 } else {
Misha Brukman2fec9902004-06-21 20:22:03 +0000571 addFrameReference(BuildMI(BB, PPC32::LBZ, 2, Reg), FI);
Misha Brukman422791f2004-06-21 17:41:12 +0000572 }
573 }
Misha Brukman5dfe3a92004-06-21 16:55:25 +0000574 break;
575 case cShort:
576 if (ArgLive) {
577 FI = MFI->CreateFixedObject(2, ArgOffset);
Misha Brukman422791f2004-06-21 17:41:12 +0000578 if (GPR_remaining > 0) {
Misha Brukmand18a31d2004-07-06 22:51:53 +0000579 BuildMI(BB, PPC32::OR, 2, Reg).addReg(GPR[GPR_idx])
580 .addReg(GPR[GPR_idx]);
Misha Brukman422791f2004-06-21 17:41:12 +0000581 } else {
Misha Brukman2fec9902004-06-21 20:22:03 +0000582 addFrameReference(BuildMI(BB, PPC32::LHZ, 2, Reg), FI);
Misha Brukman422791f2004-06-21 17:41:12 +0000583 }
584 }
Misha Brukman5dfe3a92004-06-21 16:55:25 +0000585 break;
586 case cInt:
587 if (ArgLive) {
588 FI = MFI->CreateFixedObject(4, ArgOffset);
Misha Brukman422791f2004-06-21 17:41:12 +0000589 if (GPR_remaining > 0) {
Misha Brukmand18a31d2004-07-06 22:51:53 +0000590 BuildMI(BB, PPC32::OR, 2, Reg).addReg(GPR[GPR_idx])
591 .addReg(GPR[GPR_idx]);
Misha Brukman422791f2004-06-21 17:41:12 +0000592 } else {
Misha Brukman2fec9902004-06-21 20:22:03 +0000593 addFrameReference(BuildMI(BB, PPC32::LWZ, 2, Reg), FI);
Misha Brukman422791f2004-06-21 17:41:12 +0000594 }
595 }
Misha Brukman5dfe3a92004-06-21 16:55:25 +0000596 break;
597 case cLong:
598 if (ArgLive) {
599 FI = MFI->CreateFixedObject(8, ArgOffset);
Misha Brukman422791f2004-06-21 17:41:12 +0000600 if (GPR_remaining > 1) {
Misha Brukman313efcb2004-07-09 15:45:07 +0000601 BuildMI(BB, PPC32::OR, 2, Reg).addReg(GPR[GPR_idx])
602 .addReg(GPR[GPR_idx]);
603 BuildMI(BB, PPC32::OR, 2, Reg+1).addReg(GPR[GPR_idx+1])
604 .addReg(GPR[GPR_idx+1]);
Misha Brukman422791f2004-06-21 17:41:12 +0000605 } else {
Misha Brukman313efcb2004-07-09 15:45:07 +0000606 addFrameReference(BuildMI(BB, PPC32::LWZ, 2, Reg), FI);
607 addFrameReference(BuildMI(BB, PPC32::LWZ, 2, Reg+1), FI, 4);
Misha Brukman422791f2004-06-21 17:41:12 +0000608 }
609 }
Misha Brukman5dfe3a92004-06-21 16:55:25 +0000610 ArgOffset += 4; // longs require 4 additional bytes
Misha Brukman422791f2004-06-21 17:41:12 +0000611 if (GPR_remaining > 1) {
612 GPR_remaining--; // uses up 2 GPRs
613 GPR_idx++;
614 }
Misha Brukman5dfe3a92004-06-21 16:55:25 +0000615 break;
616 case cFP:
617 if (ArgLive) {
618 unsigned Opcode;
619 if (I->getType() == Type::FloatTy) {
620 Opcode = PPC32::LFS;
621 FI = MFI->CreateFixedObject(4, ArgOffset);
622 } else {
623 Opcode = PPC32::LFD;
624 FI = MFI->CreateFixedObject(8, ArgOffset);
625 }
Misha Brukman422791f2004-06-21 17:41:12 +0000626 if (FPR_remaining > 0) {
Misha Brukmand18a31d2004-07-06 22:51:53 +0000627 BuildMI(BB, PPC32::FMR, 1, Reg).addReg(FPR[FPR_idx]);
628 FPR_remaining--;
629 FPR_idx++;
Misha Brukman422791f2004-06-21 17:41:12 +0000630 } else {
Misha Brukmand18a31d2004-07-06 22:51:53 +0000631 addFrameReference(BuildMI(BB, Opcode, 2, Reg), FI);
Misha Brukman422791f2004-06-21 17:41:12 +0000632 }
633 }
Misha Brukman5dfe3a92004-06-21 16:55:25 +0000634 if (I->getType() == Type::DoubleTy) {
635 ArgOffset += 4; // doubles require 4 additional bytes
Misha Brukman422791f2004-06-21 17:41:12 +0000636 if (GPR_remaining > 0) {
Misha Brukmand18a31d2004-07-06 22:51:53 +0000637 GPR_remaining--; // uses up 2 GPRs
638 GPR_idx++;
Misha Brukman422791f2004-06-21 17:41:12 +0000639 }
640 }
Misha Brukman5dfe3a92004-06-21 16:55:25 +0000641 break;
642 default:
643 assert(0 && "Unhandled argument type!");
644 }
645 ArgOffset += 4; // Each argument takes at least 4 bytes on the stack...
Misha Brukman422791f2004-06-21 17:41:12 +0000646 if (GPR_remaining > 0) {
Misha Brukmand18a31d2004-07-06 22:51:53 +0000647 GPR_remaining--; // uses up 2 GPRs
648 GPR_idx++;
Misha Brukman422791f2004-06-21 17:41:12 +0000649 }
Misha Brukman5dfe3a92004-06-21 16:55:25 +0000650 }
651
652 // If the function takes variable number of arguments, add a frame offset for
653 // the start of the first vararg value... this is used to expand
654 // llvm.va_start.
655 if (Fn.getFunctionType()->isVarArg())
656 VarArgsFrameIndex = MFI->CreateFixedObject(1, ArgOffset);
657}
658
659
660/// SelectPHINodes - Insert machine code to generate phis. This is tricky
661/// because we have to generate our sources into the source basic blocks, not
662/// the current one.
663///
664void ISel::SelectPHINodes() {
665 const TargetInstrInfo &TII = *TM.getInstrInfo();
666 const Function &LF = *F->getFunction(); // The LLVM function...
667 for (Function::const_iterator I = LF.begin(), E = LF.end(); I != E; ++I) {
668 const BasicBlock *BB = I;
669 MachineBasicBlock &MBB = *MBBMap[I];
670
671 // Loop over all of the PHI nodes in the LLVM basic block...
672 MachineBasicBlock::iterator PHIInsertPoint = MBB.begin();
673 for (BasicBlock::const_iterator I = BB->begin();
674 PHINode *PN = const_cast<PHINode*>(dyn_cast<PHINode>(I)); ++I) {
675
676 // Create a new machine instr PHI node, and insert it.
677 unsigned PHIReg = getReg(*PN);
678 MachineInstr *PhiMI = BuildMI(MBB, PHIInsertPoint,
679 PPC32::PHI, PN->getNumOperands(), PHIReg);
680
681 MachineInstr *LongPhiMI = 0;
682 if (PN->getType() == Type::LongTy || PN->getType() == Type::ULongTy)
683 LongPhiMI = BuildMI(MBB, PHIInsertPoint,
684 PPC32::PHI, PN->getNumOperands(), PHIReg+1);
685
686 // PHIValues - Map of blocks to incoming virtual registers. We use this
687 // so that we only initialize one incoming value for a particular block,
688 // even if the block has multiple entries in the PHI node.
689 //
690 std::map<MachineBasicBlock*, unsigned> PHIValues;
691
692 for (unsigned i = 0, e = PN->getNumIncomingValues(); i != e; ++i) {
Misha Brukman313efcb2004-07-09 15:45:07 +0000693 MachineBasicBlock *PredMBB = 0;
694 for (MachineBasicBlock::pred_iterator PI = MBB.pred_begin (),
695 PE = MBB.pred_end (); PI != PE; ++PI)
696 if (PN->getIncomingBlock(i) == (*PI)->getBasicBlock()) {
697 PredMBB = *PI;
698 break;
699 }
700 assert (PredMBB && "Couldn't find incoming machine-cfg edge for phi");
701
Misha Brukman5dfe3a92004-06-21 16:55:25 +0000702 unsigned ValReg;
703 std::map<MachineBasicBlock*, unsigned>::iterator EntryIt =
704 PHIValues.lower_bound(PredMBB);
705
706 if (EntryIt != PHIValues.end() && EntryIt->first == PredMBB) {
707 // We already inserted an initialization of the register for this
708 // predecessor. Recycle it.
709 ValReg = EntryIt->second;
710
711 } else {
712 // Get the incoming value into a virtual register.
713 //
714 Value *Val = PN->getIncomingValue(i);
715
716 // If this is a constant or GlobalValue, we may have to insert code
717 // into the basic block to compute it into a virtual register.
718 if ((isa<Constant>(Val) && !isa<ConstantExpr>(Val)) ||
719 isa<GlobalValue>(Val)) {
720 // Simple constants get emitted at the end of the basic block,
721 // before any terminator instructions. We "know" that the code to
722 // move a constant into a register will never clobber any flags.
723 ValReg = getReg(Val, PredMBB, PredMBB->getFirstTerminator());
724 } else {
725 // Because we don't want to clobber any values which might be in
726 // physical registers with the computation of this constant (which
727 // might be arbitrarily complex if it is a constant expression),
728 // just insert the computation at the top of the basic block.
729 MachineBasicBlock::iterator PI = PredMBB->begin();
730
731 // Skip over any PHI nodes though!
732 while (PI != PredMBB->end() && PI->getOpcode() == PPC32::PHI)
733 ++PI;
734
735 ValReg = getReg(Val, PredMBB, PI);
736 }
737
738 // Remember that we inserted a value for this PHI for this predecessor
739 PHIValues.insert(EntryIt, std::make_pair(PredMBB, ValReg));
740 }
741
742 PhiMI->addRegOperand(ValReg);
743 PhiMI->addMachineBasicBlockOperand(PredMBB);
744 if (LongPhiMI) {
745 LongPhiMI->addRegOperand(ValReg+1);
746 LongPhiMI->addMachineBasicBlockOperand(PredMBB);
747 }
748 }
749
750 // Now that we emitted all of the incoming values for the PHI node, make
751 // sure to reposition the InsertPoint after the PHI that we just added.
752 // This is needed because we might have inserted a constant into this
753 // block, right after the PHI's which is before the old insert point!
754 PHIInsertPoint = LongPhiMI ? LongPhiMI : PhiMI;
755 ++PHIInsertPoint;
756 }
757 }
758}
759
760
761// canFoldSetCCIntoBranchOrSelect - Return the setcc instruction if we can fold
762// it into the conditional branch or select instruction which is the only user
763// of the cc instruction. This is the case if the conditional branch is the
764// only user of the setcc, and if the setcc is in the same basic block as the
765// conditional branch. We also don't handle long arguments below, so we reject
766// them here as well.
767//
768static SetCondInst *canFoldSetCCIntoBranchOrSelect(Value *V) {
769 if (SetCondInst *SCI = dyn_cast<SetCondInst>(V))
770 if (SCI->hasOneUse()) {
771 Instruction *User = cast<Instruction>(SCI->use_back());
772 if ((isa<BranchInst>(User) || isa<SelectInst>(User)) &&
773 SCI->getParent() == User->getParent() &&
774 (getClassB(SCI->getOperand(0)->getType()) != cLong ||
775 SCI->getOpcode() == Instruction::SetEQ ||
776 SCI->getOpcode() == Instruction::SetNE))
777 return SCI;
778 }
779 return 0;
780}
781
782// Return a fixed numbering for setcc instructions which does not depend on the
783// order of the opcodes.
784//
785static unsigned getSetCCNumber(unsigned Opcode) {
Misha Brukmane9c65512004-07-06 15:32:44 +0000786 switch (Opcode) {
Misha Brukman5dfe3a92004-06-21 16:55:25 +0000787 default: assert(0 && "Unknown setcc instruction!");
788 case Instruction::SetEQ: return 0;
789 case Instruction::SetNE: return 1;
790 case Instruction::SetLT: return 2;
791 case Instruction::SetGE: return 3;
792 case Instruction::SetGT: return 4;
793 case Instruction::SetLE: return 5;
794 }
795}
796
Misha Brukmane9c65512004-07-06 15:32:44 +0000797static unsigned getPPCOpcodeForSetCCNumber(unsigned Opcode) {
798 switch (Opcode) {
799 default: assert(0 && "Unknown setcc instruction!");
800 case Instruction::SetEQ: return PPC32::BEQ;
801 case Instruction::SetNE: return PPC32::BNE;
802 case Instruction::SetLT: return PPC32::BLT;
803 case Instruction::SetGE: return PPC32::BGE;
804 case Instruction::SetGT: return PPC32::BGT;
805 case Instruction::SetLE: return PPC32::BLE;
806 }
807}
808
809static unsigned invertPPCBranchOpcode(unsigned Opcode) {
810 switch (Opcode) {
811 default: assert(0 && "Unknown PPC32 branch opcode!");
812 case PPC32::BEQ: return PPC32::BNE;
813 case PPC32::BNE: return PPC32::BEQ;
814 case PPC32::BLT: return PPC32::BGE;
815 case PPC32::BGE: return PPC32::BLT;
816 case PPC32::BGT: return PPC32::BLE;
817 case PPC32::BLE: return PPC32::BGT;
818 }
819}
820
Misha Brukman5dfe3a92004-06-21 16:55:25 +0000821/// emitUCOM - emits an unordered FP compare.
822void ISel::emitUCOM(MachineBasicBlock *MBB, MachineBasicBlock::iterator IP,
823 unsigned LHS, unsigned RHS) {
Misha Brukman422791f2004-06-21 17:41:12 +0000824 BuildMI(*MBB, IP, PPC32::FCMPU, 2, PPC32::CR0).addReg(LHS).addReg(RHS);
Misha Brukman5dfe3a92004-06-21 16:55:25 +0000825}
826
827// EmitComparison - This function emits a comparison of the two operands,
828// returning the extended setcc code to use.
829unsigned ISel::EmitComparison(unsigned OpNum, Value *Op0, Value *Op1,
830 MachineBasicBlock *MBB,
831 MachineBasicBlock::iterator IP) {
832 // The arguments are already supposed to be of the same type.
833 const Type *CompTy = Op0->getType();
834 unsigned Class = getClassB(CompTy);
835 unsigned Op0r = getReg(Op0, MBB, IP);
836
837 // Special case handling of: cmp R, i
838 if (isa<ConstantPointerNull>(Op1)) {
Misha Brukmane9c65512004-07-06 15:32:44 +0000839 BuildMI(*MBB, IP, PPC32::CMPI, 2, PPC32::CR0).addReg(Op0r).addImm(0);
Misha Brukman5dfe3a92004-06-21 16:55:25 +0000840 } else if (ConstantInt *CI = dyn_cast<ConstantInt>(Op1)) {
841 if (Class == cByte || Class == cShort || Class == cInt) {
842 unsigned Op1v = CI->getRawValue();
843
844 // Mask off any upper bits of the constant, if there are any...
845 Op1v &= (1ULL << (8 << Class)) - 1;
846
Misha Brukman422791f2004-06-21 17:41:12 +0000847 // Compare immediate or promote to reg?
848 if (Op1v <= 32767) {
Misha Brukman2fec9902004-06-21 20:22:03 +0000849 BuildMI(*MBB, IP, CompTy->isSigned() ? PPC32::CMPI : PPC32::CMPLI, 3,
850 PPC32::CR0).addImm(0).addReg(Op0r).addImm(Op1v);
Misha Brukman422791f2004-06-21 17:41:12 +0000851 } else {
852 unsigned Op1r = getReg(Op1, MBB, IP);
Misha Brukman2fec9902004-06-21 20:22:03 +0000853 BuildMI(*MBB, IP, CompTy->isSigned() ? PPC32::CMP : PPC32::CMPL, 3,
854 PPC32::CR0).addImm(0).addReg(Op0r).addReg(Op1r);
Misha Brukman422791f2004-06-21 17:41:12 +0000855 }
Misha Brukman5dfe3a92004-06-21 16:55:25 +0000856 return OpNum;
857 } else {
858 assert(Class == cLong && "Unknown integer class!");
859 unsigned LowCst = CI->getRawValue();
860 unsigned HiCst = CI->getRawValue() >> 32;
861 if (OpNum < 2) { // seteq, setne
862 unsigned LoTmp = Op0r;
863 if (LowCst != 0) {
Misha Brukman422791f2004-06-21 17:41:12 +0000864 unsigned LoLow = makeAnotherReg(Type::IntTy);
Misha Brukman5dfe3a92004-06-21 16:55:25 +0000865 unsigned LoTmp = makeAnotherReg(Type::IntTy);
866 BuildMI(*MBB, IP, PPC32::XORI, 2, LoLow).addReg(Op0r).addImm(LowCst);
Misha Brukman2fec9902004-06-21 20:22:03 +0000867 BuildMI(*MBB, IP, PPC32::XORIS, 2, LoTmp).addReg(LoLow)
868 .addImm(LowCst >> 16);
Misha Brukman5dfe3a92004-06-21 16:55:25 +0000869 }
870 unsigned HiTmp = Op0r+1;
871 if (HiCst != 0) {
Misha Brukman422791f2004-06-21 17:41:12 +0000872 unsigned HiLow = makeAnotherReg(Type::IntTy);
Misha Brukman5dfe3a92004-06-21 16:55:25 +0000873 unsigned HiTmp = makeAnotherReg(Type::IntTy);
874 BuildMI(*MBB, IP, PPC32::XORI, 2, HiLow).addReg(Op0r+1).addImm(HiCst);
Misha Brukman2fec9902004-06-21 20:22:03 +0000875 BuildMI(*MBB, IP, PPC32::XORIS, 2, HiTmp).addReg(HiLow)
876 .addImm(HiCst >> 16);
Misha Brukman5dfe3a92004-06-21 16:55:25 +0000877 }
878 unsigned FinalTmp = makeAnotherReg(Type::IntTy);
879 BuildMI(*MBB, IP, PPC32::ORo, 2, FinalTmp).addReg(LoTmp).addReg(HiTmp);
880 //BuildMI(*MBB, IP, PPC32::CMPLI, 2, PPC32::CR0).addReg(FinalTmp).addImm(0);
881 return OpNum;
882 } else {
Misha Brukman5dfe3a92004-06-21 16:55:25 +0000883 // FIXME: Not Yet Implemented
Misha Brukman911afde2004-06-25 14:50:41 +0000884 std::cerr << "EmitComparison unimplemented: Opnum >= 2\n";
885 abort();
Misha Brukman422791f2004-06-21 17:41:12 +0000886 return OpNum;
Misha Brukman5dfe3a92004-06-21 16:55:25 +0000887 }
888 }
889 }
890
891 unsigned Op1r = getReg(Op1, MBB, IP);
892 switch (Class) {
893 default: assert(0 && "Unknown type class!");
894 case cByte:
895 case cShort:
896 case cInt:
Misha Brukman2fec9902004-06-21 20:22:03 +0000897 BuildMI(*MBB, IP, CompTy->isSigned() ? PPC32::CMP : PPC32::CMPL, 2,
898 PPC32::CR0).addReg(Op0r).addReg(Op1r);
Misha Brukman5dfe3a92004-06-21 16:55:25 +0000899 break;
Misha Brukmand18a31d2004-07-06 22:51:53 +0000900
Misha Brukman5dfe3a92004-06-21 16:55:25 +0000901 case cFP:
902 emitUCOM(MBB, IP, Op0r, Op1r);
903 break;
904
905 case cLong:
906 if (OpNum < 2) { // seteq, setne
907 unsigned LoTmp = makeAnotherReg(Type::IntTy);
908 unsigned HiTmp = makeAnotherReg(Type::IntTy);
909 unsigned FinalTmp = makeAnotherReg(Type::IntTy);
910 BuildMI(*MBB, IP, PPC32::XOR, 2, LoTmp).addReg(Op0r).addReg(Op1r);
911 BuildMI(*MBB, IP, PPC32::XOR, 2, HiTmp).addReg(Op0r+1).addReg(Op1r+1);
912 BuildMI(*MBB, IP, PPC32::ORo, 2, FinalTmp).addReg(LoTmp).addReg(HiTmp);
913 //BuildMI(*MBB, IP, PPC32::CMPLI, 2, PPC32::CR0).addReg(FinalTmp).addImm(0);
914 break; // Allow the sete or setne to be generated from flags set by OR
915 } else {
Misha Brukman5dfe3a92004-06-21 16:55:25 +0000916 // FIXME: Not Yet Implemented
Misha Brukman911afde2004-06-25 14:50:41 +0000917 std::cerr << "EmitComparison (cLong) unimplemented: Opnum >= 2\n";
918 abort();
Misha Brukman5dfe3a92004-06-21 16:55:25 +0000919 return OpNum;
920 }
921 }
922 return OpNum;
923}
924
Misha Brukmand18a31d2004-07-06 22:51:53 +0000925/// visitSetCondInst - emit code to calculate the condition via
926/// EmitComparison(), and possibly store a 0 or 1 to a register as a result
Misha Brukman5dfe3a92004-06-21 16:55:25 +0000927///
928void ISel::visitSetCondInst(SetCondInst &I) {
Misha Brukmand18a31d2004-07-06 22:51:53 +0000929 if (canFoldSetCCIntoBranchOrSelect(&I))
Misha Brukmane9c65512004-07-06 15:32:44 +0000930 return;
931
Misha Brukman425ff242004-07-01 21:34:10 +0000932 unsigned Op0Reg = getReg(I.getOperand(0));
933 unsigned Op1Reg = getReg(I.getOperand(1));
Misha Brukman5dfe3a92004-06-21 16:55:25 +0000934 unsigned DestReg = getReg(I);
Misha Brukman2834a4d2004-07-07 20:07:22 +0000935 unsigned OpNum = I.getOpcode();
Misha Brukman425ff242004-07-01 21:34:10 +0000936 const Type *Ty = I.getOperand (0)->getType();
937
Misha Brukmand18a31d2004-07-06 22:51:53 +0000938 EmitComparison(OpNum, I.getOperand(0), I.getOperand(1), BB, BB->end());
939
940 unsigned Opcode = getPPCOpcodeForSetCCNumber(OpNum);
Misha Brukman425ff242004-07-01 21:34:10 +0000941 MachineBasicBlock *thisMBB = BB;
942 const BasicBlock *LLVM_BB = BB->getBasicBlock();
943 // thisMBB:
944 // ...
945 // cmpTY cr0, r1, r2
946 // bCC copy1MBB
947 // b copy0MBB
948
949 // FIXME: we wouldn't need copy0MBB (we could fold it into thisMBB)
950 // if we could insert other, non-terminator instructions after the
951 // bCC. But MBB->getFirstTerminator() can't understand this.
952 MachineBasicBlock *copy1MBB = new MachineBasicBlock(LLVM_BB);
953 F->getBasicBlockList().push_back(copy1MBB);
954 BuildMI(BB, Opcode, 2).addReg(PPC32::CR0).addMBB(copy1MBB);
955 MachineBasicBlock *copy0MBB = new MachineBasicBlock(LLVM_BB);
956 F->getBasicBlockList().push_back(copy0MBB);
957 BuildMI(BB, PPC32::B, 1).addMBB(copy0MBB);
958 // Update machine-CFG edges
959 BB->addSuccessor(copy1MBB);
960 BB->addSuccessor(copy0MBB);
961
962 // copy0MBB:
963 // %FalseValue = li 0
Misha Brukmane9c65512004-07-06 15:32:44 +0000964 // b sinkMBB
Misha Brukman425ff242004-07-01 21:34:10 +0000965 BB = copy0MBB;
966 unsigned FalseValue = makeAnotherReg(I.getType());
967 BuildMI(BB, PPC32::LI, 1, FalseValue).addZImm(0);
968 MachineBasicBlock *sinkMBB = new MachineBasicBlock(LLVM_BB);
969 F->getBasicBlockList().push_back(sinkMBB);
970 BuildMI(BB, PPC32::B, 1).addMBB(sinkMBB);
971 // Update machine-CFG edges
972 BB->addSuccessor(sinkMBB);
973
974 DEBUG(std::cerr << "thisMBB is at " << (void*)thisMBB << "\n");
975 DEBUG(std::cerr << "copy1MBB is at " << (void*)copy1MBB << "\n");
976 DEBUG(std::cerr << "copy0MBB is at " << (void*)copy0MBB << "\n");
977 DEBUG(std::cerr << "sinkMBB is at " << (void*)sinkMBB << "\n");
978
979 // copy1MBB:
980 // %TrueValue = li 1
Misha Brukmane9c65512004-07-06 15:32:44 +0000981 // b sinkMBB
Misha Brukman425ff242004-07-01 21:34:10 +0000982 BB = copy1MBB;
983 unsigned TrueValue = makeAnotherReg (I.getType ());
984 BuildMI(BB, PPC32::LI, 1, TrueValue).addZImm(1);
985 BuildMI(BB, PPC32::B, 1).addMBB(sinkMBB);
986 // Update machine-CFG edges
987 BB->addSuccessor(sinkMBB);
988
989 // sinkMBB:
990 // %Result = phi [ %FalseValue, copy0MBB ], [ %TrueValue, copy1MBB ]
991 // ...
992 BB = sinkMBB;
993 BuildMI(BB, PPC32::PHI, 4, DestReg).addReg(FalseValue)
994 .addMBB(copy0MBB).addReg(TrueValue).addMBB(copy1MBB);
Misha Brukman5dfe3a92004-06-21 16:55:25 +0000995}
996
Misha Brukman5dfe3a92004-06-21 16:55:25 +0000997void ISel::visitSelectInst(SelectInst &SI) {
998 unsigned DestReg = getReg(SI);
999 MachineBasicBlock::iterator MII = BB->end();
Misha Brukman2fec9902004-06-21 20:22:03 +00001000 emitSelectOperation(BB, MII, SI.getCondition(), SI.getTrueValue(),
1001 SI.getFalseValue(), DestReg);
Misha Brukman5dfe3a92004-06-21 16:55:25 +00001002}
1003
1004/// emitSelect - Common code shared between visitSelectInst and the constant
1005/// expression support.
1006/// FIXME: this is most likely broken in one or more ways. Namely, PowerPC has
1007/// no select instruction. FSEL only works for comparisons against zero.
1008void ISel::emitSelectOperation(MachineBasicBlock *MBB,
1009 MachineBasicBlock::iterator IP,
1010 Value *Cond, Value *TrueVal, Value *FalseVal,
1011 unsigned DestReg) {
1012 unsigned SelectClass = getClassB(TrueVal->getType());
1013
1014 unsigned TrueReg = getReg(TrueVal, MBB, IP);
1015 unsigned FalseReg = getReg(FalseVal, MBB, IP);
1016
1017 if (TrueReg == FalseReg) {
Misha Brukman422791f2004-06-21 17:41:12 +00001018 if (SelectClass == cFP) {
Misha Brukman2fec9902004-06-21 20:22:03 +00001019 BuildMI(*MBB, IP, PPC32::FMR, 1, DestReg).addReg(TrueReg);
Misha Brukman422791f2004-06-21 17:41:12 +00001020 } else {
Misha Brukman2fec9902004-06-21 20:22:03 +00001021 BuildMI(*MBB, IP, PPC32::OR, 2, DestReg).addReg(TrueReg).addReg(TrueReg);
Misha Brukman422791f2004-06-21 17:41:12 +00001022 }
1023
Misha Brukman5dfe3a92004-06-21 16:55:25 +00001024 if (SelectClass == cLong)
Misha Brukman2fec9902004-06-21 20:22:03 +00001025 BuildMI(*MBB, IP, PPC32::OR, 2, DestReg+1).addReg(TrueReg+1)
1026 .addReg(TrueReg+1);
Misha Brukman5dfe3a92004-06-21 16:55:25 +00001027 return;
1028 }
1029
1030 unsigned CondReg = getReg(Cond, MBB, IP);
1031 unsigned numZeros = makeAnotherReg(Type::IntTy);
1032 unsigned falseHi = makeAnotherReg(Type::IntTy);
1033 unsigned falseAll = makeAnotherReg(Type::IntTy);
1034 unsigned trueAll = makeAnotherReg(Type::IntTy);
1035 unsigned Temp1 = makeAnotherReg(Type::IntTy);
1036 unsigned Temp2 = makeAnotherReg(Type::IntTy);
1037
1038 BuildMI(*MBB, IP, PPC32::CNTLZW, 1, numZeros).addReg(CondReg);
Misha Brukman2fec9902004-06-21 20:22:03 +00001039 BuildMI(*MBB, IP, PPC32::RLWINM, 4, falseHi).addReg(numZeros).addImm(26)
1040 .addImm(0).addImm(0);
Misha Brukman5dfe3a92004-06-21 16:55:25 +00001041 BuildMI(*MBB, IP, PPC32::SRAWI, 2, falseAll).addReg(falseHi).addImm(31);
1042 BuildMI(*MBB, IP, PPC32::NOR, 2, trueAll).addReg(falseAll).addReg(falseAll);
1043 BuildMI(*MBB, IP, PPC32::AND, 2, Temp1).addReg(TrueReg).addReg(trueAll);
1044 BuildMI(*MBB, IP, PPC32::AND, 2, Temp2).addReg(FalseReg).addReg(falseAll);
1045 BuildMI(*MBB, IP, PPC32::OR, 2, DestReg).addReg(Temp1).addReg(Temp2);
1046
1047 if (SelectClass == cLong) {
Misha Brukman422791f2004-06-21 17:41:12 +00001048 unsigned Temp3 = makeAnotherReg(Type::IntTy);
1049 unsigned Temp4 = makeAnotherReg(Type::IntTy);
1050 BuildMI(*MBB, IP, PPC32::AND, 2, Temp3).addReg(TrueReg+1).addReg(trueAll);
1051 BuildMI(*MBB, IP, PPC32::AND, 2, Temp4).addReg(FalseReg+1).addReg(falseAll);
1052 BuildMI(*MBB, IP, PPC32::OR, 2, DestReg+1).addReg(Temp3).addReg(Temp4);
Misha Brukman5dfe3a92004-06-21 16:55:25 +00001053 }
1054
1055 return;
1056}
1057
1058
1059
1060/// promote32 - Emit instructions to turn a narrow operand into a 32-bit-wide
1061/// operand, in the specified target register.
1062///
1063void ISel::promote32(unsigned targetReg, const ValueRecord &VR) {
1064 bool isUnsigned = VR.Ty->isUnsigned() || VR.Ty == Type::BoolTy;
1065
1066 Value *Val = VR.Val;
1067 const Type *Ty = VR.Ty;
1068 if (Val) {
1069 if (Constant *C = dyn_cast<Constant>(Val)) {
1070 Val = ConstantExpr::getCast(C, Type::IntTy);
1071 Ty = Type::IntTy;
1072 }
1073
Misha Brukman2fec9902004-06-21 20:22:03 +00001074 // If this is a simple constant, just emit a load directly to avoid the copy
Misha Brukman5dfe3a92004-06-21 16:55:25 +00001075 if (ConstantInt *CI = dyn_cast<ConstantInt>(Val)) {
1076 int TheVal = CI->getRawValue() & 0xFFFFFFFF;
1077
1078 if (TheVal < 32768 && TheVal >= -32768) {
Misha Brukman422791f2004-06-21 17:41:12 +00001079 BuildMI(BB, PPC32::ADDI, 2, targetReg).addReg(PPC32::R0).addImm(TheVal);
1080 } else {
1081 unsigned TmpReg = makeAnotherReg(Type::IntTy);
Misha Brukman2fec9902004-06-21 20:22:03 +00001082 BuildMI(BB, PPC32::ADDIS, 2, TmpReg).addReg(PPC32::R0)
1083 .addImm(TheVal >> 16);
1084 BuildMI(BB, PPC32::ORI, 2, targetReg).addReg(TmpReg)
1085 .addImm(TheVal & 0xFFFF);
Misha Brukman422791f2004-06-21 17:41:12 +00001086 }
Misha Brukman5dfe3a92004-06-21 16:55:25 +00001087 return;
1088 }
1089 }
1090
1091 // Make sure we have the register number for this value...
1092 unsigned Reg = Val ? getReg(Val) : VR.Reg;
1093
1094 switch (getClassB(Ty)) {
1095 case cByte:
1096 // Extend value into target register (8->32)
1097 if (isUnsigned)
Misha Brukman2fec9902004-06-21 20:22:03 +00001098 BuildMI(BB, PPC32::RLWINM, 4, targetReg).addReg(Reg).addZImm(0)
1099 .addZImm(24).addZImm(31);
Misha Brukman5dfe3a92004-06-21 16:55:25 +00001100 else
1101 BuildMI(BB, PPC32::EXTSB, 1, targetReg).addReg(Reg);
1102 break;
1103 case cShort:
1104 // Extend value into target register (16->32)
1105 if (isUnsigned)
Misha Brukman2fec9902004-06-21 20:22:03 +00001106 BuildMI(BB, PPC32::RLWINM, 4, targetReg).addReg(Reg).addZImm(0)
1107 .addZImm(16).addZImm(31);
Misha Brukman5dfe3a92004-06-21 16:55:25 +00001108 else
1109 BuildMI(BB, PPC32::EXTSH, 1, targetReg).addReg(Reg);
1110 break;
1111 case cInt:
1112 // Move value into target register (32->32)
Misha Brukman972569a2004-06-25 18:36:53 +00001113 BuildMI(BB, PPC32::OR, 2, targetReg).addReg(Reg).addReg(Reg);
Misha Brukman5dfe3a92004-06-21 16:55:25 +00001114 break;
1115 default:
1116 assert(0 && "Unpromotable operand class in promote32");
1117 }
1118}
1119
Misha Brukman2fec9902004-06-21 20:22:03 +00001120/// visitReturnInst - implemented with BLR
1121///
Misha Brukman5dfe3a92004-06-21 16:55:25 +00001122void ISel::visitReturnInst(ReturnInst &I) {
Misha Brukmand47bbf72004-06-25 19:04:27 +00001123 // Only do the processing if this is a non-void return
1124 if (I.getNumOperands() > 0) {
1125 Value *RetVal = I.getOperand(0);
1126 switch (getClassB(RetVal->getType())) {
1127 case cByte: // integral return values: extend or move into r3 and return
1128 case cShort:
1129 case cInt:
1130 promote32(PPC32::R3, ValueRecord(RetVal));
1131 break;
1132 case cFP: { // Floats & Doubles: Return in f1
1133 unsigned RetReg = getReg(RetVal);
1134 BuildMI(BB, PPC32::FMR, 1, PPC32::F1).addReg(RetReg);
1135 break;
1136 }
1137 case cLong: {
1138 unsigned RetReg = getReg(RetVal);
1139 BuildMI(BB, PPC32::OR, 2, PPC32::R3).addReg(RetReg).addReg(RetReg);
1140 BuildMI(BB, PPC32::OR, 2, PPC32::R4).addReg(RetReg+1).addReg(RetReg+1);
1141 break;
1142 }
1143 default:
1144 visitInstruction(I);
1145 }
Misha Brukman5dfe3a92004-06-21 16:55:25 +00001146 }
1147 BuildMI(BB, PPC32::BLR, 1).addImm(0);
1148}
1149
1150// getBlockAfter - Return the basic block which occurs lexically after the
1151// specified one.
1152static inline BasicBlock *getBlockAfter(BasicBlock *BB) {
1153 Function::iterator I = BB; ++I; // Get iterator to next block
1154 return I != BB->getParent()->end() ? &*I : 0;
1155}
1156
1157/// visitBranchInst - Handle conditional and unconditional branches here. Note
1158/// that since code layout is frozen at this point, that if we are trying to
1159/// jump to a block that is the immediate successor of the current block, we can
1160/// just make a fall-through (but we don't currently).
1161///
1162void ISel::visitBranchInst(BranchInst &BI) {
Misha Brukman2fec9902004-06-21 20:22:03 +00001163 // Update machine-CFG edges
1164 BB->addSuccessor (MBBMap[BI.getSuccessor(0)]);
1165 if (BI.isConditional())
Misha Brukmanfadb82f2004-06-24 22:00:15 +00001166 BB->addSuccessor (MBBMap[BI.getSuccessor(1)]);
Misha Brukman2fec9902004-06-21 20:22:03 +00001167
1168 BasicBlock *NextBB = getBlockAfter(BI.getParent()); // BB after current one
Misha Brukmane9c65512004-07-06 15:32:44 +00001169
Misha Brukman2fec9902004-06-21 20:22:03 +00001170 if (!BI.isConditional()) { // Unconditional branch?
Misha Brukmane9c65512004-07-06 15:32:44 +00001171 if (BI.getSuccessor(0) != NextBB)
Misha Brukmanfadb82f2004-06-24 22:00:15 +00001172 BuildMI(BB, PPC32::B, 1).addMBB(MBBMap[BI.getSuccessor(0)]);
1173 return;
Misha Brukman2fec9902004-06-21 20:22:03 +00001174 }
1175
Misha Brukman5dfe3a92004-06-21 16:55:25 +00001176 // See if we can fold the setcc into the branch itself...
1177 SetCondInst *SCI = canFoldSetCCIntoBranchOrSelect(BI.getCondition());
1178 if (SCI == 0) {
1179 // Nope, cannot fold setcc into this branch. Emit a branch on a condition
1180 // computed some other way...
1181 unsigned condReg = getReg(BI.getCondition());
Misha Brukmane9c65512004-07-06 15:32:44 +00001182 BuildMI(BB, PPC32::CMPLI, 3, PPC32::CR1).addImm(0).addReg(condReg)
Misha Brukman2fec9902004-06-21 20:22:03 +00001183 .addImm(0);
Misha Brukman5dfe3a92004-06-21 16:55:25 +00001184 if (BI.getSuccessor(1) == NextBB) {
1185 if (BI.getSuccessor(0) != NextBB)
Misha Brukmane9c65512004-07-06 15:32:44 +00001186 BuildMI(BB, PPC32::BNE, 2).addReg(PPC32::CR1)
Misha Brukman2fec9902004-06-21 20:22:03 +00001187 .addMBB(MBBMap[BI.getSuccessor(0)]);
Misha Brukman5dfe3a92004-06-21 16:55:25 +00001188 } else {
Misha Brukmane9c65512004-07-06 15:32:44 +00001189 BuildMI(BB, PPC32::BNE, 2).addReg(PPC32::CR1)
Misha Brukman2fec9902004-06-21 20:22:03 +00001190 .addMBB(MBBMap[BI.getSuccessor(1)]);
Misha Brukman5dfe3a92004-06-21 16:55:25 +00001191
1192 if (BI.getSuccessor(0) != NextBB)
1193 BuildMI(BB, PPC32::B, 1).addMBB(MBBMap[BI.getSuccessor(0)]);
1194 }
1195 return;
1196 }
1197
Misha Brukman5dfe3a92004-06-21 16:55:25 +00001198 unsigned OpNum = getSetCCNumber(SCI->getOpcode());
Misha Brukmane9c65512004-07-06 15:32:44 +00001199 unsigned Opcode = getPPCOpcodeForSetCCNumber(SCI->getOpcode());
Misha Brukman5dfe3a92004-06-21 16:55:25 +00001200 MachineBasicBlock::iterator MII = BB->end();
1201 OpNum = EmitComparison(OpNum, SCI->getOperand(0), SCI->getOperand(1), BB,MII);
Misha Brukman5dfe3a92004-06-21 16:55:25 +00001202
Misha Brukman5dfe3a92004-06-21 16:55:25 +00001203 if (BI.getSuccessor(0) != NextBB) {
Misha Brukmane9c65512004-07-06 15:32:44 +00001204 BuildMI(BB, Opcode, 2).addReg(PPC32::CR0)
Misha Brukmanfadb82f2004-06-24 22:00:15 +00001205 .addMBB(MBBMap[BI.getSuccessor(0)]);
Misha Brukman5dfe3a92004-06-21 16:55:25 +00001206 if (BI.getSuccessor(1) != NextBB)
Misha Brukmanfadb82f2004-06-24 22:00:15 +00001207 BuildMI(BB, PPC32::B, 1).addMBB(MBBMap[BI.getSuccessor(1)]);
Misha Brukman5dfe3a92004-06-21 16:55:25 +00001208 } else {
1209 // Change to the inverse condition...
1210 if (BI.getSuccessor(1) != NextBB) {
Misha Brukmane9c65512004-07-06 15:32:44 +00001211 Opcode = invertPPCBranchOpcode(Opcode);
1212 BuildMI(BB, Opcode, 2).addReg(PPC32::CR0)
Misha Brukman2fec9902004-06-21 20:22:03 +00001213 .addMBB(MBBMap[BI.getSuccessor(1)]);
Misha Brukman5dfe3a92004-06-21 16:55:25 +00001214 }
1215 }
1216}
1217
Misha Brukmanfc879c32004-07-08 18:02:38 +00001218static Constant* minUConstantForValue(uint64_t val) {
1219 if (val <= 1)
1220 return ConstantBool::get(val);
1221 else if (ConstantUInt::isValueValidForType(Type::UShortTy, val))
1222 return ConstantUInt::get(Type::UShortTy, val);
1223 else if (ConstantUInt::isValueValidForType(Type::UIntTy, val))
1224 return ConstantUInt::get(Type::UIntTy, val);
1225 else if (ConstantUInt::isValueValidForType(Type::ULongTy, val))
1226 return ConstantUInt::get(Type::ULongTy, val);
1227
1228 std::cerr << "Value: " << val << " not accepted for any integral type!\n";
1229 abort();
1230}
Misha Brukman5dfe3a92004-06-21 16:55:25 +00001231
1232/// doCall - This emits an abstract call instruction, setting up the arguments
1233/// and the return value as appropriate. For the actual function call itself,
1234/// it inserts the specified CallMI instruction into the stream.
1235///
1236/// FIXME: See Documentation at the following URL for "correct" behavior
1237/// <http://developer.apple.com/documentation/DeveloperTools/Conceptual/MachORuntime/2rt_powerpc_abi/chapter_9_section_5.html>
1238void ISel::doCall(const ValueRecord &Ret, MachineInstr *CallMI,
Misha Brukmand18a31d2004-07-06 22:51:53 +00001239 const std::vector<ValueRecord> &Args, bool isVarArg) {
Misha Brukman5dfe3a92004-06-21 16:55:25 +00001240 // Count how many bytes are to be pushed on the stack...
1241 unsigned NumBytes = 0;
1242
1243 if (!Args.empty()) {
1244 for (unsigned i = 0, e = Args.size(); i != e; ++i)
1245 switch (getClassB(Args[i].Ty)) {
1246 case cByte: case cShort: case cInt:
1247 NumBytes += 4; break;
1248 case cLong:
1249 NumBytes += 8; break;
1250 case cFP:
1251 NumBytes += Args[i].Ty == Type::FloatTy ? 4 : 8;
1252 break;
1253 default: assert(0 && "Unknown class!");
1254 }
1255
1256 // Adjust the stack pointer for the new arguments...
1257 BuildMI(BB, PPC32::ADJCALLSTACKDOWN, 1).addImm(NumBytes);
1258
1259 // Arguments go on the stack in reverse order, as specified by the ABI.
1260 unsigned ArgOffset = 0;
Misha Brukmand18a31d2004-07-06 22:51:53 +00001261 int GPR_remaining = 8, FPR_remaining = 13;
Misha Brukmanfc879c32004-07-08 18:02:38 +00001262 unsigned GPR_idx = 0, FPR_idx = 0;
Misha Brukmand18a31d2004-07-06 22:51:53 +00001263 static const unsigned GPR[] = {
Misha Brukman14d8c7a2004-06-29 23:45:05 +00001264 PPC32::R3, PPC32::R4, PPC32::R5, PPC32::R6,
1265 PPC32::R7, PPC32::R8, PPC32::R9, PPC32::R10,
1266 };
Misha Brukmand18a31d2004-07-06 22:51:53 +00001267 static const unsigned FPR[] = {
Misha Brukman2834a4d2004-07-07 20:07:22 +00001268 PPC32::F1, PPC32::F2, PPC32::F3, PPC32::F4, PPC32::F5, PPC32::F6,
1269 PPC32::F7, PPC32::F8, PPC32::F9, PPC32::F10, PPC32::F11, PPC32::F12,
1270 PPC32::F13
Misha Brukman14d8c7a2004-06-29 23:45:05 +00001271 };
Misha Brukman422791f2004-06-21 17:41:12 +00001272
Misha Brukman5dfe3a92004-06-21 16:55:25 +00001273 for (unsigned i = 0, e = Args.size(); i != e; ++i) {
1274 unsigned ArgReg;
1275 switch (getClassB(Args[i].Ty)) {
1276 case cByte:
1277 case cShort:
1278 // Promote arg to 32 bits wide into a temporary register...
1279 ArgReg = makeAnotherReg(Type::UIntTy);
1280 promote32(ArgReg, Args[i]);
Misha Brukman422791f2004-06-21 17:41:12 +00001281
1282 // Reg or stack?
1283 if (GPR_remaining > 0) {
Misha Brukman14d8c7a2004-06-29 23:45:05 +00001284 BuildMI(BB, PPC32::OR, 2, GPR[GPR_idx]).addReg(ArgReg)
Misha Brukmanfadb82f2004-06-24 22:00:15 +00001285 .addReg(ArgReg);
Misha Brukman422791f2004-06-21 17:41:12 +00001286 } else {
Misha Brukmanfadb82f2004-06-24 22:00:15 +00001287 BuildMI(BB, PPC32::STW, 3).addReg(ArgReg).addImm(ArgOffset)
1288 .addReg(PPC32::R1);
Misha Brukman422791f2004-06-21 17:41:12 +00001289 }
1290 break;
Misha Brukman5dfe3a92004-06-21 16:55:25 +00001291 case cInt:
1292 ArgReg = Args[i].Val ? getReg(Args[i].Val) : Args[i].Reg;
1293
Misha Brukman422791f2004-06-21 17:41:12 +00001294 // Reg or stack?
1295 if (GPR_remaining > 0) {
Misha Brukman14d8c7a2004-06-29 23:45:05 +00001296 BuildMI(BB, PPC32::OR, 2, GPR[GPR_idx]).addReg(ArgReg)
Misha Brukmanfadb82f2004-06-24 22:00:15 +00001297 .addReg(ArgReg);
Misha Brukman422791f2004-06-21 17:41:12 +00001298 } else {
Misha Brukmanfadb82f2004-06-24 22:00:15 +00001299 BuildMI(BB, PPC32::STW, 3).addReg(ArgReg).addImm(ArgOffset)
1300 .addReg(PPC32::R1);
Misha Brukman422791f2004-06-21 17:41:12 +00001301 }
1302 break;
Misha Brukman5dfe3a92004-06-21 16:55:25 +00001303 case cLong:
Misha Brukman422791f2004-06-21 17:41:12 +00001304 ArgReg = Args[i].Val ? getReg(Args[i].Val) : Args[i].Reg;
Misha Brukman5dfe3a92004-06-21 16:55:25 +00001305
Misha Brukman422791f2004-06-21 17:41:12 +00001306 // Reg or stack?
1307 if (GPR_remaining > 1) {
Misha Brukman14d8c7a2004-06-29 23:45:05 +00001308 BuildMI(BB, PPC32::OR, 2, GPR[GPR_idx]).addReg(ArgReg)
Misha Brukmanfadb82f2004-06-24 22:00:15 +00001309 .addReg(ArgReg);
Misha Brukman14d8c7a2004-06-29 23:45:05 +00001310 BuildMI(BB, PPC32::OR, 2, GPR[GPR_idx + 1]).addReg(ArgReg+1)
Misha Brukmanfadb82f2004-06-24 22:00:15 +00001311 .addReg(ArgReg+1);
Misha Brukman422791f2004-06-21 17:41:12 +00001312 } else {
Misha Brukmanfadb82f2004-06-24 22:00:15 +00001313 BuildMI(BB, PPC32::STW, 3).addReg(ArgReg).addImm(ArgOffset)
1314 .addReg(PPC32::R1);
1315 BuildMI(BB, PPC32::STW, 3).addReg(ArgReg+1).addImm(ArgOffset+4)
1316 .addReg(PPC32::R1);
Misha Brukman422791f2004-06-21 17:41:12 +00001317 }
Misha Brukman5dfe3a92004-06-21 16:55:25 +00001318
1319 ArgOffset += 4; // 8 byte entry, not 4.
Misha Brukman14d8c7a2004-06-29 23:45:05 +00001320 GPR_remaining -= 1; // uses up 2 GPRs
1321 GPR_idx += 1;
Misha Brukman5dfe3a92004-06-21 16:55:25 +00001322 break;
1323 case cFP:
1324 ArgReg = Args[i].Val ? getReg(Args[i].Val) : Args[i].Reg;
1325 if (Args[i].Ty == Type::FloatTy) {
Misha Brukmanfc879c32004-07-08 18:02:38 +00001326 assert(!isVarArg && "Cannot pass floats to vararg functions!");
Misha Brukman1916bf92004-06-24 21:56:15 +00001327 // Reg or stack?
1328 if (FPR_remaining > 0) {
Misha Brukman14d8c7a2004-06-29 23:45:05 +00001329 BuildMI(BB, PPC32::FMR, 1, FPR[FPR_idx]).addReg(ArgReg);
Misha Brukmanfadb82f2004-06-24 22:00:15 +00001330 FPR_remaining--;
1331 FPR_idx++;
Misha Brukman1916bf92004-06-24 21:56:15 +00001332 } else {
Misha Brukmanfadb82f2004-06-24 22:00:15 +00001333 BuildMI(BB, PPC32::STFS, 3).addReg(ArgReg).addImm(ArgOffset)
1334 .addReg(PPC32::R1);
Misha Brukman1916bf92004-06-24 21:56:15 +00001335 }
Misha Brukman5dfe3a92004-06-21 16:55:25 +00001336 } else {
1337 assert(Args[i].Ty == Type::DoubleTy && "Unknown FP type!");
Misha Brukman1916bf92004-06-24 21:56:15 +00001338 // Reg or stack?
1339 if (FPR_remaining > 0) {
Misha Brukman14d8c7a2004-06-29 23:45:05 +00001340 BuildMI(BB, PPC32::FMR, 1, FPR[FPR_idx]).addReg(ArgReg);
Misha Brukmanfadb82f2004-06-24 22:00:15 +00001341 FPR_remaining--;
1342 FPR_idx++;
Misha Brukmand18a31d2004-07-06 22:51:53 +00001343 // For vararg functions, must pass doubles via int regs as well
1344 if (isVarArg) {
Misha Brukman0aa97c62004-07-08 18:27:59 +00001345 Value *Val = Args[i].Val;
1346 if (ConstantFP *CFP = dyn_cast<ConstantFP>(Val)) {
1347 union DU {
1348 double FVal;
1349 struct {
1350 uint32_t hi32;
1351 uint32_t lo32;
1352 } UVal;
1353 } U;
1354 U.FVal = CFP->getValue();
1355 if (GPR_remaining > 0) {
1356 Constant *hi32 = minUConstantForValue(U.UVal.hi32);
1357 copyConstantToRegister(BB, BB->end(), hi32, GPR[GPR_idx]);
1358 }
1359 if (GPR_remaining > 1) {
1360 Constant *lo32 = minUConstantForValue(U.UVal.lo32);
1361 copyConstantToRegister(BB, BB->end(), lo32, GPR[GPR_idx+1]);
1362 }
1363 } else {
1364 // Since this is not a constant, we must load it into int regs
1365 // via memory
1366 BuildMI(BB, PPC32::STFD, 3).addReg(ArgReg).addImm(ArgOffset)
1367 .addReg(PPC32::R1);
1368 if (GPR_remaining > 0)
1369 BuildMI(BB, PPC32::LWZ, 2, GPR[GPR_idx]).addImm(ArgOffset)
1370 .addReg(PPC32::R1);
1371 if (GPR_remaining > 1)
1372 BuildMI(BB, PPC32::LWZ, 2, GPR[GPR_idx+1])
1373 .addImm(ArgOffset+4).addReg(PPC32::R1);
Misha Brukmand18a31d2004-07-06 22:51:53 +00001374 }
1375 }
Misha Brukman1916bf92004-06-24 21:56:15 +00001376 } else {
Misha Brukmanfadb82f2004-06-24 22:00:15 +00001377 BuildMI(BB, PPC32::STFD, 3).addReg(ArgReg).addImm(ArgOffset)
1378 .addReg(PPC32::R1);
Misha Brukman1916bf92004-06-24 21:56:15 +00001379 }
Misha Brukman5dfe3a92004-06-21 16:55:25 +00001380
Misha Brukman1916bf92004-06-24 21:56:15 +00001381 ArgOffset += 4; // 8 byte entry, not 4.
Misha Brukmanfc879c32004-07-08 18:02:38 +00001382 GPR_remaining--; // uses up 2 GPRs
Misha Brukman14d8c7a2004-06-29 23:45:05 +00001383 GPR_idx++;
Misha Brukman5dfe3a92004-06-21 16:55:25 +00001384 }
1385 break;
1386
1387 default: assert(0 && "Unknown class!");
1388 }
1389 ArgOffset += 4;
Misha Brukman14d8c7a2004-06-29 23:45:05 +00001390 GPR_remaining--;
1391 GPR_idx++;
Misha Brukman5dfe3a92004-06-21 16:55:25 +00001392 }
1393 } else {
1394 BuildMI(BB, PPC32::ADJCALLSTACKDOWN, 1).addImm(0);
1395 }
1396
1397 BB->push_back(CallMI);
Misha Brukman5dfe3a92004-06-21 16:55:25 +00001398 BuildMI(BB, PPC32::ADJCALLSTACKUP, 1).addImm(NumBytes);
1399
1400 // If there is a return value, scavenge the result from the location the call
1401 // leaves it in...
1402 //
1403 if (Ret.Ty != Type::VoidTy) {
1404 unsigned DestClass = getClassB(Ret.Ty);
1405 switch (DestClass) {
1406 case cByte:
1407 case cShort:
1408 case cInt:
1409 // Integral results are in r3
Misha Brukman422791f2004-06-21 17:41:12 +00001410 BuildMI(BB, PPC32::OR, 2, Ret.Reg).addReg(PPC32::R3).addReg(PPC32::R3);
Misha Brukmane327e492004-06-24 23:53:24 +00001411 break;
Misha Brukman5dfe3a92004-06-21 16:55:25 +00001412 case cFP: // Floating-point return values live in f1
1413 BuildMI(BB, PPC32::FMR, 1, Ret.Reg).addReg(PPC32::F1);
1414 break;
1415 case cLong: // Long values are in r3:r4
Misha Brukman422791f2004-06-21 17:41:12 +00001416 BuildMI(BB, PPC32::OR, 2, Ret.Reg).addReg(PPC32::R3).addReg(PPC32::R3);
1417 BuildMI(BB, PPC32::OR, 2, Ret.Reg+1).addReg(PPC32::R4).addReg(PPC32::R4);
Misha Brukman5dfe3a92004-06-21 16:55:25 +00001418 break;
1419 default: assert(0 && "Unknown class!");
1420 }
1421 }
1422}
1423
1424
1425/// visitCallInst - Push args on stack and do a procedure call instruction.
1426void ISel::visitCallInst(CallInst &CI) {
1427 MachineInstr *TheCall;
Misha Brukmand18a31d2004-07-06 22:51:53 +00001428 Function *F = CI.getCalledFunction();
1429 if (F) {
Misha Brukman5dfe3a92004-06-21 16:55:25 +00001430 // Is it an intrinsic function call?
1431 if (Intrinsic::ID ID = (Intrinsic::ID)F->getIntrinsicID()) {
1432 visitIntrinsicCall(ID, CI); // Special intrinsics are not handled here
1433 return;
1434 }
1435
1436 // Emit a CALL instruction with PC-relative displacement.
1437 TheCall = BuildMI(PPC32::CALLpcrel, 1).addGlobalAddress(F, true);
1438 } else { // Emit an indirect call through the CTR
1439 unsigned Reg = getReg(CI.getCalledValue());
1440 BuildMI(PPC32::MTSPR, 2).addZImm(9).addReg(Reg);
1441 TheCall = BuildMI(PPC32::CALLindirect, 1).addZImm(20).addZImm(0);
1442 }
1443
1444 std::vector<ValueRecord> Args;
1445 for (unsigned i = 1, e = CI.getNumOperands(); i != e; ++i)
1446 Args.push_back(ValueRecord(CI.getOperand(i)));
1447
1448 unsigned DestReg = CI.getType() != Type::VoidTy ? getReg(CI) : 0;
Misha Brukmand18a31d2004-07-06 22:51:53 +00001449 bool isVarArg = F ? F->getFunctionType()->isVarArg() : true;
1450 doCall(ValueRecord(DestReg, CI.getType()), TheCall, Args, isVarArg);
Misha Brukman5dfe3a92004-06-21 16:55:25 +00001451}
1452
1453
1454/// dyncastIsNan - Return the operand of an isnan operation if this is an isnan.
1455///
1456static Value *dyncastIsNan(Value *V) {
1457 if (CallInst *CI = dyn_cast<CallInst>(V))
1458 if (Function *F = CI->getCalledFunction())
Misha Brukmana2916ce2004-06-21 17:58:36 +00001459 if (F->getIntrinsicID() == Intrinsic::isunordered)
Misha Brukman5dfe3a92004-06-21 16:55:25 +00001460 return CI->getOperand(1);
1461 return 0;
1462}
1463
1464/// isOnlyUsedByUnorderedComparisons - Return true if this value is only used by
1465/// or's whos operands are all calls to the isnan predicate.
1466static bool isOnlyUsedByUnorderedComparisons(Value *V) {
1467 assert(dyncastIsNan(V) && "The value isn't an isnan call!");
1468
1469 // Check all uses, which will be or's of isnans if this predicate is true.
1470 for (Value::use_iterator UI = V->use_begin(), E = V->use_end(); UI != E;++UI){
1471 Instruction *I = cast<Instruction>(*UI);
1472 if (I->getOpcode() != Instruction::Or) return false;
1473 if (I->getOperand(0) != V && !dyncastIsNan(I->getOperand(0))) return false;
1474 if (I->getOperand(1) != V && !dyncastIsNan(I->getOperand(1))) return false;
1475 }
1476
1477 return true;
1478}
1479
1480/// LowerUnknownIntrinsicFunctionCalls - This performs a prepass over the
1481/// function, lowering any calls to unknown intrinsic functions into the
1482/// equivalent LLVM code.
1483///
1484void ISel::LowerUnknownIntrinsicFunctionCalls(Function &F) {
1485 for (Function::iterator BB = F.begin(), E = F.end(); BB != E; ++BB)
1486 for (BasicBlock::iterator I = BB->begin(), E = BB->end(); I != E; )
1487 if (CallInst *CI = dyn_cast<CallInst>(I++))
1488 if (Function *F = CI->getCalledFunction())
1489 switch (F->getIntrinsicID()) {
1490 case Intrinsic::not_intrinsic:
1491 case Intrinsic::vastart:
1492 case Intrinsic::vacopy:
1493 case Intrinsic::vaend:
1494 case Intrinsic::returnaddress:
1495 case Intrinsic::frameaddress:
Misha Brukmana2916ce2004-06-21 17:58:36 +00001496 // FIXME: should lower this ourselves
1497 // case Intrinsic::isunordered:
Misha Brukman5dfe3a92004-06-21 16:55:25 +00001498 // We directly implement these intrinsics
1499 break;
1500 case Intrinsic::readio: {
1501 // On PPC, memory operations are in-order. Lower this intrinsic
1502 // into a volatile load.
1503 Instruction *Before = CI->getPrev();
1504 LoadInst * LI = new LoadInst(CI->getOperand(1), "", true, CI);
1505 CI->replaceAllUsesWith(LI);
1506 BB->getInstList().erase(CI);
1507 break;
1508 }
1509 case Intrinsic::writeio: {
1510 // On PPC, memory operations are in-order. Lower this intrinsic
1511 // into a volatile store.
1512 Instruction *Before = CI->getPrev();
Misha Brukman8d442c22004-07-14 15:29:51 +00001513 StoreInst *SI = new StoreInst(CI->getOperand(1),
Misha Brukman5dfe3a92004-06-21 16:55:25 +00001514 CI->getOperand(2), true, CI);
Misha Brukman8d442c22004-07-14 15:29:51 +00001515 CI->replaceAllUsesWith(SI);
Misha Brukman5dfe3a92004-06-21 16:55:25 +00001516 BB->getInstList().erase(CI);
1517 break;
1518 }
1519 default:
1520 // All other intrinsic calls we must lower.
1521 Instruction *Before = CI->getPrev();
1522 TM.getIntrinsicLowering().LowerIntrinsicCall(CI);
1523 if (Before) { // Move iterator to instruction after call
1524 I = Before; ++I;
1525 } else {
1526 I = BB->begin();
1527 }
1528 }
1529}
1530
1531void ISel::visitIntrinsicCall(Intrinsic::ID ID, CallInst &CI) {
1532 unsigned TmpReg1, TmpReg2, TmpReg3;
1533 switch (ID) {
1534 case Intrinsic::vastart:
1535 // Get the address of the first vararg value...
1536 TmpReg1 = getReg(CI);
1537 addFrameReference(BuildMI(BB, PPC32::ADDI, 2, TmpReg1), VarArgsFrameIndex);
1538 return;
1539
1540 case Intrinsic::vacopy:
1541 TmpReg1 = getReg(CI);
1542 TmpReg2 = getReg(CI.getOperand(1));
1543 BuildMI(BB, PPC32::OR, 2, TmpReg1).addReg(TmpReg2).addReg(TmpReg2);
1544 return;
1545 case Intrinsic::vaend: return;
1546
1547 case Intrinsic::returnaddress:
1548 case Intrinsic::frameaddress:
1549 TmpReg1 = getReg(CI);
1550 if (cast<Constant>(CI.getOperand(1))->isNullValue()) {
1551 if (ID == Intrinsic::returnaddress) {
1552 // Just load the return address
1553 addFrameReference(BuildMI(BB, PPC32::LWZ, 2, TmpReg1),
1554 ReturnAddressIndex);
1555 } else {
1556 addFrameReference(BuildMI(BB, PPC32::ADDI, 2, TmpReg1),
1557 ReturnAddressIndex, -4, false);
1558 }
1559 } else {
1560 // Values other than zero are not implemented yet.
1561 BuildMI(BB, PPC32::ADDI, 2, TmpReg1).addReg(PPC32::R0).addImm(0);
1562 }
1563 return;
1564
Misha Brukmana2916ce2004-06-21 17:58:36 +00001565#if 0
1566 // This may be useful for supporting isunordered
Misha Brukman5dfe3a92004-06-21 16:55:25 +00001567 case Intrinsic::isnan:
1568 // If this is only used by 'isunordered' style comparisons, don't emit it.
1569 if (isOnlyUsedByUnorderedComparisons(&CI)) return;
1570 TmpReg1 = getReg(CI.getOperand(1));
1571 emitUCOM(BB, BB->end(), TmpReg1, TmpReg1);
Misha Brukman422791f2004-06-21 17:41:12 +00001572 TmpReg2 = makeAnotherReg(Type::IntTy);
1573 BuildMI(BB, PPC32::MFCR, TmpReg2);
Misha Brukman5dfe3a92004-06-21 16:55:25 +00001574 TmpReg3 = getReg(CI);
1575 BuildMI(BB, PPC32::RLWINM, 4, TmpReg3).addReg(TmpReg2).addImm(4).addImm(31).addImm(31);
1576 return;
Misha Brukmana2916ce2004-06-21 17:58:36 +00001577#endif
1578
Misha Brukman5dfe3a92004-06-21 16:55:25 +00001579 default: assert(0 && "Error: unknown intrinsics should have been lowered!");
1580 }
1581}
1582
1583/// visitSimpleBinary - Implement simple binary operators for integral types...
1584/// OperatorClass is one of: 0 for Add, 1 for Sub, 2 for And, 3 for Or, 4 for
1585/// Xor.
1586///
1587void ISel::visitSimpleBinary(BinaryOperator &B, unsigned OperatorClass) {
1588 unsigned DestReg = getReg(B);
1589 MachineBasicBlock::iterator MI = BB->end();
1590 Value *Op0 = B.getOperand(0), *Op1 = B.getOperand(1);
1591 unsigned Class = getClassB(B.getType());
1592
1593 emitSimpleBinaryOperation(BB, MI, Op0, Op1, OperatorClass, DestReg);
1594}
1595
1596/// emitBinaryFPOperation - This method handles emission of floating point
1597/// Add (0), Sub (1), Mul (2), and Div (3) operations.
1598void ISel::emitBinaryFPOperation(MachineBasicBlock *BB,
1599 MachineBasicBlock::iterator IP,
1600 Value *Op0, Value *Op1,
1601 unsigned OperatorClass, unsigned DestReg) {
1602
1603 // Special case: op Reg, <const fp>
1604 if (ConstantFP *Op1C = dyn_cast<ConstantFP>(Op1)) {
Misha Brukmanfadb82f2004-06-24 22:00:15 +00001605 // Create a constant pool entry for this constant.
1606 MachineConstantPool *CP = F->getConstantPool();
1607 unsigned CPI = CP->getConstantPoolIndex(Op1C);
1608 const Type *Ty = Op1->getType();
Misha Brukmand9aa7832004-07-12 23:49:47 +00001609 assert(Ty == Type::FloatTy || Ty == Type::DoubleTy && "Unknown FP type!");
Misha Brukman5dfe3a92004-06-21 16:55:25 +00001610
Misha Brukmanfadb82f2004-06-24 22:00:15 +00001611 static const unsigned OpcodeTab[][4] = {
Misha Brukmand18a31d2004-07-06 22:51:53 +00001612 { PPC32::FADDS, PPC32::FSUBS, PPC32::FMULS, PPC32::FDIVS }, // Float
1613 { PPC32::FADD, PPC32::FSUB, PPC32::FMUL, PPC32::FDIV }, // Double
Misha Brukmanfadb82f2004-06-24 22:00:15 +00001614 };
Misha Brukman5dfe3a92004-06-21 16:55:25 +00001615
Misha Brukmanfadb82f2004-06-24 22:00:15 +00001616 unsigned Opcode = OpcodeTab[Ty != Type::FloatTy][OperatorClass];
Misha Brukmana596f8c2004-07-13 15:35:45 +00001617 unsigned Op1Reg = getReg(Op1C, BB, IP);
Misha Brukmanfadb82f2004-06-24 22:00:15 +00001618 unsigned Op0r = getReg(Op0, BB, IP);
Misha Brukmana596f8c2004-07-13 15:35:45 +00001619 BuildMI(*BB, IP, Opcode, 2, DestReg).addReg(Op0r).addReg(Op1Reg);
Misha Brukmanfadb82f2004-06-24 22:00:15 +00001620 return;
1621 }
Misha Brukman5dfe3a92004-06-21 16:55:25 +00001622
1623 // Special case: R1 = op <const fp>, R2
Misha Brukmana596f8c2004-07-13 15:35:45 +00001624 if (ConstantFP *Op0C = dyn_cast<ConstantFP>(Op0))
1625 if (Op0C->isExactlyValue(-0.0) && OperatorClass == 1) {
Misha Brukman5dfe3a92004-06-21 16:55:25 +00001626 // -0.0 - X === -X
1627 unsigned op1Reg = getReg(Op1, BB, IP);
1628 BuildMI(*BB, IP, PPC32::FNEG, 1, DestReg).addReg(op1Reg);
1629 return;
1630 } else {
1631 // R1 = op CST, R2 --> R1 = opr R2, CST
1632
1633 // Create a constant pool entry for this constant.
1634 MachineConstantPool *CP = F->getConstantPool();
Misha Brukmana596f8c2004-07-13 15:35:45 +00001635 unsigned CPI = CP->getConstantPoolIndex(Op0C);
1636 const Type *Ty = Op0C->getType();
1637 assert(Ty == Type::FloatTy || Ty == Type::DoubleTy && "Unknown FP type!");
Misha Brukman5dfe3a92004-06-21 16:55:25 +00001638
1639 static const unsigned OpcodeTab[][4] = {
Misha Brukmand18a31d2004-07-06 22:51:53 +00001640 { PPC32::FADDS, PPC32::FSUBS, PPC32::FMULS, PPC32::FDIVS }, // Float
1641 { PPC32::FADD, PPC32::FSUB, PPC32::FMUL, PPC32::FDIV }, // Double
Misha Brukman5dfe3a92004-06-21 16:55:25 +00001642 };
1643
Misha Brukman5dfe3a92004-06-21 16:55:25 +00001644 unsigned Opcode = OpcodeTab[Ty != Type::FloatTy][OperatorClass];
Misha Brukmana596f8c2004-07-13 15:35:45 +00001645 unsigned Op0Reg = getReg(Op0C, BB, IP);
1646 unsigned Op1Reg = getReg(Op1, BB, IP);
1647 BuildMI(*BB, IP, Opcode, 2, DestReg).addReg(Op0Reg).addReg(Op1Reg);
Misha Brukman5dfe3a92004-06-21 16:55:25 +00001648 return;
1649 }
1650
1651 // General case.
Misha Brukman911afde2004-06-25 14:50:41 +00001652 static const unsigned OpcodeTab[] = {
Misha Brukman5dfe3a92004-06-21 16:55:25 +00001653 PPC32::FADD, PPC32::FSUB, PPC32::FMUL, PPC32::FDIV
1654 };
1655
1656 unsigned Opcode = OpcodeTab[OperatorClass];
1657 unsigned Op0r = getReg(Op0, BB, IP);
1658 unsigned Op1r = getReg(Op1, BB, IP);
1659 BuildMI(*BB, IP, Opcode, 2, DestReg).addReg(Op0r).addReg(Op1r);
1660}
1661
1662/// emitSimpleBinaryOperation - Implement simple binary operators for integral
1663/// types... OperatorClass is one of: 0 for Add, 1 for Sub, 2 for And, 3 for
1664/// Or, 4 for Xor.
1665///
1666/// emitSimpleBinaryOperation - Common code shared between visitSimpleBinary
1667/// and constant expression support.
1668///
1669void ISel::emitSimpleBinaryOperation(MachineBasicBlock *MBB,
1670 MachineBasicBlock::iterator IP,
1671 Value *Op0, Value *Op1,
1672 unsigned OperatorClass, unsigned DestReg) {
1673 unsigned Class = getClassB(Op0->getType());
1674
Misha Brukman422791f2004-06-21 17:41:12 +00001675 // Arithmetic and Bitwise operators
Misha Brukman911afde2004-06-25 14:50:41 +00001676 static const unsigned OpcodeTab[] = {
Misha Brukman422791f2004-06-21 17:41:12 +00001677 PPC32::ADD, PPC32::SUB, PPC32::AND, PPC32::OR, PPC32::XOR
1678 };
1679 // Otherwise, code generate the full operation with a constant.
1680 static const unsigned BottomTab[] = {
1681 PPC32::ADDC, PPC32::SUBC, PPC32::AND, PPC32::OR, PPC32::XOR
1682 };
1683 static const unsigned TopTab[] = {
1684 PPC32::ADDE, PPC32::SUBFE, PPC32::AND, PPC32::OR, PPC32::XOR
1685 };
Misha Brukman5dfe3a92004-06-21 16:55:25 +00001686
1687 if (Class == cFP) {
1688 assert(OperatorClass < 2 && "No logical ops for FP!");
1689 emitBinaryFPOperation(MBB, IP, Op0, Op1, OperatorClass, DestReg);
1690 return;
1691 }
1692
1693 if (Op0->getType() == Type::BoolTy) {
1694 if (OperatorClass == 3)
1695 // If this is an or of two isnan's, emit an FP comparison directly instead
1696 // of or'ing two isnan's together.
1697 if (Value *LHS = dyncastIsNan(Op0))
1698 if (Value *RHS = dyncastIsNan(Op1)) {
1699 unsigned Op0Reg = getReg(RHS, MBB, IP), Op1Reg = getReg(LHS, MBB, IP);
Misha Brukman422791f2004-06-21 17:41:12 +00001700 unsigned TmpReg = makeAnotherReg(Type::IntTy);
Misha Brukman5dfe3a92004-06-21 16:55:25 +00001701 emitUCOM(MBB, IP, Op0Reg, Op1Reg);
Misha Brukman422791f2004-06-21 17:41:12 +00001702 BuildMI(*MBB, IP, PPC32::MFCR, TmpReg);
Misha Brukman2fec9902004-06-21 20:22:03 +00001703 BuildMI(*MBB, IP, PPC32::RLWINM, 4, DestReg).addReg(TmpReg).addImm(4)
1704 .addImm(31).addImm(31);
Misha Brukman5dfe3a92004-06-21 16:55:25 +00001705 return;
1706 }
1707 }
1708
1709 // sub 0, X -> neg X
1710 if (ConstantInt *CI = dyn_cast<ConstantInt>(Op0))
1711 if (OperatorClass == 1 && CI->isNullValue()) {
1712 unsigned op1Reg = getReg(Op1, MBB, IP);
1713 BuildMI(*MBB, IP, PPC32::NEG, 1, DestReg).addReg(op1Reg);
1714
1715 if (Class == cLong) {
Misha Brukman422791f2004-06-21 17:41:12 +00001716 unsigned zeroes = makeAnotherReg(Type::IntTy);
1717 unsigned overflow = makeAnotherReg(Type::IntTy);
Misha Brukman5dfe3a92004-06-21 16:55:25 +00001718 unsigned T = makeAnotherReg(Type::IntTy);
Misha Brukman422791f2004-06-21 17:41:12 +00001719 BuildMI(*MBB, IP, PPC32::CNTLZW, 1, zeroes).addReg(op1Reg);
Misha Brukman2fec9902004-06-21 20:22:03 +00001720 BuildMI(*MBB, IP, PPC32::RLWINM, 4, overflow).addReg(zeroes).addImm(27)
1721 .addImm(5).addImm(31);
Misha Brukman422791f2004-06-21 17:41:12 +00001722 BuildMI(*MBB, IP, PPC32::ADD, 2, T).addReg(op1Reg+1).addReg(overflow);
1723 BuildMI(*MBB, IP, PPC32::NEG, 1, DestReg+1).addReg(T);
Misha Brukman5dfe3a92004-06-21 16:55:25 +00001724 }
1725 return;
1726 }
1727
1728 // Special case: op Reg, <const int>
1729 if (ConstantInt *Op1C = dyn_cast<ConstantInt>(Op1)) {
1730 unsigned Op0r = getReg(Op0, MBB, IP);
1731
1732 // xor X, -1 -> not X
1733 if (OperatorClass == 4 && Op1C->isAllOnesValue()) {
1734 BuildMI(*MBB, IP, PPC32::NOR, 2, DestReg).addReg(Op0r).addReg(Op0r);
1735 if (Class == cLong) // Invert the top part too
Misha Brukman2fec9902004-06-21 20:22:03 +00001736 BuildMI(*MBB, IP, PPC32::NOR, 2, DestReg+1).addReg(Op0r+1)
1737 .addReg(Op0r+1);
Misha Brukman5dfe3a92004-06-21 16:55:25 +00001738 return;
1739 }
1740
1741 unsigned Opcode = OpcodeTab[OperatorClass];
1742 unsigned Op1r = getReg(Op1, MBB, IP);
1743
1744 if (Class != cLong) {
1745 BuildMI(*MBB, IP, Opcode, 2, DestReg).addReg(Op0r).addReg(Op1r);
1746 return;
1747 }
1748
1749 // If the constant is zero in the low 32-bits, just copy the low part
1750 // across and apply the normal 32-bit operation to the high parts. There
1751 // will be no carry or borrow into the top.
1752 if (cast<ConstantInt>(Op1C)->getRawValue() == 0) {
1753 if (OperatorClass != 2) // All but and...
1754 BuildMI(*MBB, IP, PPC32::OR, 2, DestReg).addReg(Op0r).addReg(Op0r);
1755 else
1756 BuildMI(*MBB, IP, PPC32::ADDI, 2, DestReg).addReg(PPC32::R0).addImm(0);
Misha Brukman422791f2004-06-21 17:41:12 +00001757 BuildMI(*MBB, IP, Opcode, 2, DestReg+1).addReg(Op0r+1).addReg(Op1r+1);
Misha Brukman5dfe3a92004-06-21 16:55:25 +00001758 return;
1759 }
1760
1761 // If this is a long value and the high or low bits have a special
1762 // property, emit some special cases.
1763 unsigned Op1h = cast<ConstantInt>(Op1C)->getRawValue() >> 32LL;
1764
1765 // If this is a logical operation and the top 32-bits are zero, just
1766 // operate on the lower 32.
1767 if (Op1h == 0 && OperatorClass > 1) {
1768 BuildMI(*MBB, IP, Opcode, 2, DestReg).addReg(Op0r).addReg(Op1r);
1769 if (OperatorClass != 2) // All but and
Misha Brukman2fec9902004-06-21 20:22:03 +00001770 BuildMI(*MBB, IP, PPC32::OR, 2,DestReg+1).addReg(Op0r+1).addReg(Op0r+1);
Misha Brukman5dfe3a92004-06-21 16:55:25 +00001771 else
Misha Brukman2fec9902004-06-21 20:22:03 +00001772 BuildMI(*MBB, IP, PPC32::ADDI, 2,DestReg+1).addReg(PPC32::R0).addImm(0);
Misha Brukman5dfe3a92004-06-21 16:55:25 +00001773 return;
1774 }
1775
1776 // TODO: We could handle lots of other special cases here, such as AND'ing
1777 // with 0xFFFFFFFF00000000 -> noop, etc.
1778
Misha Brukman2fec9902004-06-21 20:22:03 +00001779 BuildMI(*MBB, IP, BottomTab[OperatorClass], 2, DestReg).addReg(Op0r)
1780 .addImm(Op1r);
1781 BuildMI(*MBB, IP, TopTab[OperatorClass], 2, DestReg+1).addReg(Op0r+1)
1782 .addImm(Op1r+1);
Misha Brukman5dfe3a92004-06-21 16:55:25 +00001783 return;
1784 }
1785
1786 unsigned Op0r = getReg(Op0, MBB, IP);
1787 unsigned Op1r = getReg(Op1, MBB, IP);
1788
1789 if (Class != cLong) {
Misha Brukman422791f2004-06-21 17:41:12 +00001790 unsigned Opcode = OpcodeTab[OperatorClass];
1791 BuildMI(*MBB, IP, Opcode, 2, DestReg).addReg(Op0r).addReg(Op1r);
Misha Brukman5dfe3a92004-06-21 16:55:25 +00001792 } else {
Misha Brukman2fec9902004-06-21 20:22:03 +00001793 BuildMI(*MBB, IP, BottomTab[OperatorClass], 2, DestReg).addReg(Op0r)
1794 .addImm(Op1r);
1795 BuildMI(*MBB, IP, TopTab[OperatorClass], 2, DestReg+1).addReg(Op0r+1)
1796 .addImm(Op1r+1);
Misha Brukman5dfe3a92004-06-21 16:55:25 +00001797 }
1798 return;
1799}
1800
1801/// doMultiply - Emit appropriate instructions to multiply together the
1802/// registers op0Reg and op1Reg, and put the result in DestReg. The type of the
1803/// result should be given as DestTy.
1804///
1805void ISel::doMultiply(MachineBasicBlock *MBB, MachineBasicBlock::iterator MBBI,
1806 unsigned DestReg, const Type *DestTy,
1807 unsigned op0Reg, unsigned op1Reg) {
1808 unsigned Class = getClass(DestTy);
1809 switch (Class) {
1810 case cLong:
Misha Brukman2fec9902004-06-21 20:22:03 +00001811 BuildMI(*MBB, MBBI, PPC32::MULHW, 2, DestReg+1).addReg(op0Reg+1)
1812 .addReg(op1Reg+1);
Misha Brukman5dfe3a92004-06-21 16:55:25 +00001813 case cInt:
1814 case cShort:
1815 case cByte:
1816 BuildMI(*MBB, MBBI, PPC32::MULLW, 2, DestReg).addReg(op0Reg).addReg(op1Reg);
1817 return;
1818 default:
Misha Brukman422791f2004-06-21 17:41:12 +00001819 assert(0 && "doMultiply cannot operate on unknown type!");
Misha Brukman5dfe3a92004-06-21 16:55:25 +00001820 }
1821}
1822
1823// ExactLog2 - This function solves for (Val == 1 << (N-1)) and returns N. It
1824// returns zero when the input is not exactly a power of two.
1825static unsigned ExactLog2(unsigned Val) {
1826 if (Val == 0 || (Val & (Val-1))) return 0;
1827 unsigned Count = 0;
1828 while (Val != 1) {
1829 Val >>= 1;
1830 ++Count;
1831 }
1832 return Count+1;
1833}
1834
1835
1836/// doMultiplyConst - This function is specialized to efficiently codegen an 8,
1837/// 16, or 32-bit integer multiply by a constant.
Misha Brukman2fec9902004-06-21 20:22:03 +00001838///
Misha Brukman5dfe3a92004-06-21 16:55:25 +00001839void ISel::doMultiplyConst(MachineBasicBlock *MBB,
1840 MachineBasicBlock::iterator IP,
1841 unsigned DestReg, const Type *DestTy,
1842 unsigned op0Reg, unsigned ConstRHS) {
1843 unsigned Class = getClass(DestTy);
1844 // Handle special cases here.
1845 switch (ConstRHS) {
1846 case 0:
1847 BuildMI(*MBB, IP, PPC32::ADDI, 2, DestReg).addReg(PPC32::R0).addImm(0);
1848 return;
1849 case 1:
1850 BuildMI(*MBB, IP, PPC32::OR, 2, DestReg).addReg(op0Reg).addReg(op0Reg);
1851 return;
1852 case 2:
1853 BuildMI(*MBB, IP, PPC32::ADD, 2,DestReg).addReg(op0Reg).addReg(op0Reg);
1854 return;
1855 }
1856
1857 // If the element size is exactly a power of 2, use a shift to get it.
1858 if (unsigned Shift = ExactLog2(ConstRHS)) {
1859 switch (Class) {
1860 default: assert(0 && "Unknown class for this function!");
1861 case cByte:
1862 case cShort:
1863 case cInt:
Misha Brukman2fec9902004-06-21 20:22:03 +00001864 BuildMI(*MBB, IP, PPC32::RLWINM, 4, DestReg).addReg(op0Reg)
Misha Brukman8d442c22004-07-14 15:29:51 +00001865 .addImm(Shift-1).addImm(0).addImm(31-Shift+1);
Misha Brukman5dfe3a92004-06-21 16:55:25 +00001866 return;
1867 }
1868 }
1869
1870 // Most general case, emit a normal multiply...
1871 unsigned TmpReg1 = makeAnotherReg(Type::IntTy);
1872 unsigned TmpReg2 = makeAnotherReg(Type::IntTy);
Misha Brukman8d442c22004-07-14 15:29:51 +00001873 unsigned TmpReg3 = makeAnotherReg(Type::IntTy);
Misha Brukman2fec9902004-06-21 20:22:03 +00001874 BuildMI(*MBB, IP, PPC32::ADDIS, 2, TmpReg1).addReg(PPC32::R0)
1875 .addImm(ConstRHS >> 16);
Misha Brukman8d442c22004-07-14 15:29:51 +00001876 BuildMI(*MBB, IP, PPC32::RLWINM, 4, TmpReg2).addReg(TmpReg1)
1877 .addImm(16).addImm(0).addImm(15);
1878 BuildMI(*MBB, IP, PPC32::ORI, 2, TmpReg3).addReg(TmpReg2)
1879 .addImm(ConstRHS & 0xFFFF);
Misha Brukman5dfe3a92004-06-21 16:55:25 +00001880
1881 // Emit a MUL to multiply the register holding the index by
1882 // elementSize, putting the result in OffsetReg.
Misha Brukman8d442c22004-07-14 15:29:51 +00001883 doMultiply(MBB, IP, DestReg, DestTy, op0Reg, TmpReg3);
Misha Brukman5dfe3a92004-06-21 16:55:25 +00001884}
1885
1886void ISel::visitMul(BinaryOperator &I) {
1887 unsigned ResultReg = getReg(I);
1888
1889 Value *Op0 = I.getOperand(0);
1890 Value *Op1 = I.getOperand(1);
1891
1892 MachineBasicBlock::iterator IP = BB->end();
1893 emitMultiply(BB, IP, Op0, Op1, ResultReg);
1894}
1895
1896void ISel::emitMultiply(MachineBasicBlock *MBB, MachineBasicBlock::iterator IP,
1897 Value *Op0, Value *Op1, unsigned DestReg) {
1898 MachineBasicBlock &BB = *MBB;
1899 TypeClass Class = getClass(Op0->getType());
1900
1901 // Simple scalar multiply?
1902 unsigned Op0Reg = getReg(Op0, &BB, IP);
1903 switch (Class) {
1904 case cByte:
1905 case cShort:
1906 case cInt:
1907 if (ConstantInt *CI = dyn_cast<ConstantInt>(Op1)) {
1908 unsigned Val = (unsigned)CI->getRawValue(); // Isn't a 64-bit constant
1909 doMultiplyConst(&BB, IP, DestReg, Op0->getType(), Op0Reg, Val);
1910 } else {
1911 unsigned Op1Reg = getReg(Op1, &BB, IP);
1912 doMultiply(&BB, IP, DestReg, Op1->getType(), Op0Reg, Op1Reg);
1913 }
1914 return;
1915 case cFP:
1916 emitBinaryFPOperation(MBB, IP, Op0, Op1, 2, DestReg);
1917 return;
1918 case cLong:
1919 break;
1920 }
1921
1922 // Long value. We have to do things the hard way...
1923 if (ConstantInt *CI = dyn_cast<ConstantInt>(Op1)) {
1924 unsigned CLow = CI->getRawValue();
1925 unsigned CHi = CI->getRawValue() >> 32;
1926
1927 if (CLow == 0) {
1928 // If the low part of the constant is all zeros, things are simple.
1929 BuildMI(BB, IP, PPC32::ADDI, 2, DestReg).addReg(PPC32::R0).addImm(0);
1930 doMultiplyConst(&BB, IP, DestReg+1, Type::UIntTy, Op0Reg, CHi);
1931 return;
1932 }
1933
1934 // Multiply the two low parts
1935 unsigned OverflowReg = 0;
1936 if (CLow == 1) {
1937 BuildMI(BB, IP, PPC32::OR, 2, DestReg).addReg(Op0Reg).addReg(Op0Reg);
1938 } else {
Misha Brukman422791f2004-06-21 17:41:12 +00001939 unsigned TmpRegL = makeAnotherReg(Type::UIntTy);
Misha Brukman5dfe3a92004-06-21 16:55:25 +00001940 unsigned Op1RegL = makeAnotherReg(Type::UIntTy);
1941 OverflowReg = makeAnotherReg(Type::UIntTy);
Misha Brukman2fec9902004-06-21 20:22:03 +00001942 BuildMI(BB, IP, PPC32::ADDIS, 2, TmpRegL).addReg(PPC32::R0)
1943 .addImm(CLow >> 16);
Misha Brukman422791f2004-06-21 17:41:12 +00001944 BuildMI(BB, IP, PPC32::ORI, 2, Op1RegL).addReg(TmpRegL).addImm(CLow);
1945 BuildMI(BB, IP, PPC32::MULLW, 2, DestReg).addReg(Op0Reg).addReg(Op1RegL);
Misha Brukman2fec9902004-06-21 20:22:03 +00001946 BuildMI(BB, IP, PPC32::MULHW, 2, OverflowReg).addReg(Op0Reg)
1947 .addReg(Op1RegL);
Misha Brukman5dfe3a92004-06-21 16:55:25 +00001948 }
1949
1950 unsigned AHBLReg = makeAnotherReg(Type::UIntTy);
1951 doMultiplyConst(&BB, IP, AHBLReg, Type::UIntTy, Op0Reg+1, CLow);
1952
1953 unsigned AHBLplusOverflowReg;
1954 if (OverflowReg) {
1955 AHBLplusOverflowReg = makeAnotherReg(Type::UIntTy);
Misha Brukman14d8c7a2004-06-29 23:45:05 +00001956 BuildMI(BB, IP, PPC32::ADD, 2,
Misha Brukman5dfe3a92004-06-21 16:55:25 +00001957 AHBLplusOverflowReg).addReg(AHBLReg).addReg(OverflowReg);
1958 } else {
1959 AHBLplusOverflowReg = AHBLReg;
1960 }
1961
1962 if (CHi == 0) {
Misha Brukman2fec9902004-06-21 20:22:03 +00001963 BuildMI(BB, IP, PPC32::OR, 2, DestReg+1).addReg(AHBLplusOverflowReg)
1964 .addReg(AHBLplusOverflowReg);
Misha Brukman5dfe3a92004-06-21 16:55:25 +00001965 } else {
Misha Brukman14d8c7a2004-06-29 23:45:05 +00001966 unsigned ALBHReg = makeAnotherReg(Type::UIntTy);
Misha Brukman5dfe3a92004-06-21 16:55:25 +00001967 doMultiplyConst(&BB, IP, ALBHReg, Type::UIntTy, Op0Reg, CHi);
1968
Misha Brukman14d8c7a2004-06-29 23:45:05 +00001969 BuildMI(BB, IP, PPC32::ADD, 2,
Misha Brukman5dfe3a92004-06-21 16:55:25 +00001970 DestReg+1).addReg(AHBLplusOverflowReg).addReg(ALBHReg);
1971 }
1972 return;
1973 }
1974
1975 // General 64x64 multiply
1976
1977 unsigned Op1Reg = getReg(Op1, &BB, IP);
1978
Misha Brukman14d8c7a2004-06-29 23:45:05 +00001979 // Multiply the two low parts...
1980 BuildMI(BB, IP, PPC32::MULLW, 2, DestReg).addReg(Op0Reg).addReg(Op1Reg);
Misha Brukman5dfe3a92004-06-21 16:55:25 +00001981
1982 unsigned OverflowReg = makeAnotherReg(Type::UIntTy);
Misha Brukman14d8c7a2004-06-29 23:45:05 +00001983 BuildMI(BB, IP, PPC32::MULHW, 2, OverflowReg).addReg(Op0Reg).addReg(Op1Reg);
Misha Brukman5dfe3a92004-06-21 16:55:25 +00001984
Misha Brukman14d8c7a2004-06-29 23:45:05 +00001985 unsigned AHBLReg = makeAnotherReg(Type::UIntTy);
Misha Brukman5dfe3a92004-06-21 16:55:25 +00001986 BuildMI(BB, IP, PPC32::MULLW, 2, AHBLReg).addReg(Op0Reg+1).addReg(Op1Reg);
1987
1988 unsigned AHBLplusOverflowReg = makeAnotherReg(Type::UIntTy);
Misha Brukman14d8c7a2004-06-29 23:45:05 +00001989 BuildMI(BB, IP, PPC32::ADD, 2, AHBLplusOverflowReg).addReg(AHBLReg)
1990 .addReg(OverflowReg);
Misha Brukman5dfe3a92004-06-21 16:55:25 +00001991
1992 unsigned ALBHReg = makeAnotherReg(Type::UIntTy); // AL*BH
1993 BuildMI(BB, IP, PPC32::MULLW, 2, ALBHReg).addReg(Op0Reg).addReg(Op1Reg+1);
1994
Misha Brukman14d8c7a2004-06-29 23:45:05 +00001995 BuildMI(BB, IP, PPC32::ADD, 2,
Misha Brukman5dfe3a92004-06-21 16:55:25 +00001996 DestReg+1).addReg(AHBLplusOverflowReg).addReg(ALBHReg);
1997}
1998
1999
2000/// visitDivRem - Handle division and remainder instructions... these
2001/// instruction both require the same instructions to be generated, they just
2002/// select the result from a different register. Note that both of these
2003/// instructions work differently for signed and unsigned operands.
2004///
2005void ISel::visitDivRem(BinaryOperator &I) {
2006 unsigned ResultReg = getReg(I);
2007 Value *Op0 = I.getOperand(0), *Op1 = I.getOperand(1);
2008
2009 MachineBasicBlock::iterator IP = BB->end();
Misha Brukman2fec9902004-06-21 20:22:03 +00002010 emitDivRemOperation(BB, IP, Op0, Op1, I.getOpcode() == Instruction::Div,
2011 ResultReg);
Misha Brukman5dfe3a92004-06-21 16:55:25 +00002012}
2013
2014void ISel::emitDivRemOperation(MachineBasicBlock *BB,
2015 MachineBasicBlock::iterator IP,
2016 Value *Op0, Value *Op1, bool isDiv,
2017 unsigned ResultReg) {
2018 const Type *Ty = Op0->getType();
2019 unsigned Class = getClass(Ty);
2020 switch (Class) {
2021 case cFP: // Floating point divide
2022 if (isDiv) {
2023 emitBinaryFPOperation(BB, IP, Op0, Op1, 3, ResultReg);
2024 return;
2025 } else { // Floating point remainder...
2026 unsigned Op0Reg = getReg(Op0, BB, IP);
2027 unsigned Op1Reg = getReg(Op1, BB, IP);
2028 MachineInstr *TheCall =
Misha Brukman0aa97c62004-07-08 18:27:59 +00002029 BuildMI(PPC32::CALLpcrel, 1).addGlobalAddress(fmodFn, true);
Misha Brukman5dfe3a92004-06-21 16:55:25 +00002030 std::vector<ValueRecord> Args;
2031 Args.push_back(ValueRecord(Op0Reg, Type::DoubleTy));
2032 Args.push_back(ValueRecord(Op1Reg, Type::DoubleTy));
Misha Brukmand18a31d2004-07-06 22:51:53 +00002033 doCall(ValueRecord(ResultReg, Type::DoubleTy), TheCall, Args, false);
Misha Brukman5dfe3a92004-06-21 16:55:25 +00002034 }
2035 return;
2036 case cLong: {
Misha Brukman0aa97c62004-07-08 18:27:59 +00002037 static Function* const Funcs[] =
2038 { __moddi3Fn, __divdi3Fn, __umoddi3Fn, __udivdi3Fn };
Misha Brukman5dfe3a92004-06-21 16:55:25 +00002039 unsigned Op0Reg = getReg(Op0, BB, IP);
2040 unsigned Op1Reg = getReg(Op1, BB, IP);
2041 unsigned NameIdx = Ty->isUnsigned()*2 + isDiv;
2042 MachineInstr *TheCall =
Misha Brukman0aa97c62004-07-08 18:27:59 +00002043 BuildMI(PPC32::CALLpcrel, 1).addGlobalAddress(Funcs[NameIdx], true);
Misha Brukman5dfe3a92004-06-21 16:55:25 +00002044
2045 std::vector<ValueRecord> Args;
2046 Args.push_back(ValueRecord(Op0Reg, Type::LongTy));
2047 Args.push_back(ValueRecord(Op1Reg, Type::LongTy));
Misha Brukmand18a31d2004-07-06 22:51:53 +00002048 doCall(ValueRecord(ResultReg, Type::LongTy), TheCall, Args, false);
Misha Brukman5dfe3a92004-06-21 16:55:25 +00002049 return;
2050 }
2051 case cByte: case cShort: case cInt:
2052 break; // Small integrals, handled below...
2053 default: assert(0 && "Unknown class!");
2054 }
2055
2056 // Special case signed division by power of 2.
2057 if (isDiv)
2058 if (ConstantSInt *CI = dyn_cast<ConstantSInt>(Op1)) {
2059 assert(Class != cLong && "This doesn't handle 64-bit divides!");
2060 int V = CI->getValue();
2061
2062 if (V == 1) { // X /s 1 => X
2063 unsigned Op0Reg = getReg(Op0, BB, IP);
2064 BuildMI(*BB, IP, PPC32::OR, 2, ResultReg).addReg(Op0Reg).addReg(Op0Reg);
2065 return;
2066 }
2067
2068 if (V == -1) { // X /s -1 => -X
2069 unsigned Op0Reg = getReg(Op0, BB, IP);
2070 BuildMI(*BB, IP, PPC32::NEG, 1, ResultReg).addReg(Op0Reg);
2071 return;
2072 }
2073
2074 bool isNeg = false;
2075 if (V < 0) { // Not a positive power of 2?
2076 V = -V;
2077 isNeg = true; // Maybe it's a negative power of 2.
2078 }
2079 if (unsigned Log = ExactLog2(V)) {
2080 --Log;
2081 unsigned Op0Reg = getReg(Op0, BB, IP);
2082 unsigned TmpReg = makeAnotherReg(Op0->getType());
2083 if (Log != 1)
Misha Brukman2fec9902004-06-21 20:22:03 +00002084 BuildMI(*BB, IP, PPC32::SRAWI,2, TmpReg).addReg(Op0Reg).addImm(Log-1);
Misha Brukman5dfe3a92004-06-21 16:55:25 +00002085 else
2086 BuildMI(*BB, IP, PPC32::OR, 2, TmpReg).addReg(Op0Reg).addReg(Op0Reg);
2087
2088 unsigned TmpReg2 = makeAnotherReg(Op0->getType());
Misha Brukman2fec9902004-06-21 20:22:03 +00002089 BuildMI(*BB, IP, PPC32::RLWINM, 4, TmpReg2).addReg(TmpReg).addImm(Log)
2090 .addImm(32-Log).addImm(31);
Misha Brukman5dfe3a92004-06-21 16:55:25 +00002091
2092 unsigned TmpReg3 = makeAnotherReg(Op0->getType());
2093 BuildMI(*BB, IP, PPC32::ADD, 2, TmpReg3).addReg(Op0Reg).addReg(TmpReg2);
2094
2095 unsigned TmpReg4 = isNeg ? makeAnotherReg(Op0->getType()) : ResultReg;
2096 BuildMI(*BB, IP, PPC32::SRAWI, 2, TmpReg4).addReg(Op0Reg).addImm(Log);
2097
2098 if (isNeg)
2099 BuildMI(*BB, IP, PPC32::NEG, 1, ResultReg).addReg(TmpReg4);
2100 return;
2101 }
2102 }
2103
2104 unsigned Op0Reg = getReg(Op0, BB, IP);
2105 unsigned Op1Reg = getReg(Op1, BB, IP);
2106
2107 if (isDiv) {
Misha Brukman422791f2004-06-21 17:41:12 +00002108 if (Ty->isSigned()) {
Misha Brukman2fec9902004-06-21 20:22:03 +00002109 BuildMI(*BB, IP, PPC32::DIVW, 2, ResultReg).addReg(Op0Reg).addReg(Op1Reg);
Misha Brukman422791f2004-06-21 17:41:12 +00002110 } else {
Misha Brukman2fec9902004-06-21 20:22:03 +00002111 BuildMI(*BB, IP,PPC32::DIVWU, 2, ResultReg).addReg(Op0Reg).addReg(Op1Reg);
Misha Brukman422791f2004-06-21 17:41:12 +00002112 }
Misha Brukman5dfe3a92004-06-21 16:55:25 +00002113 } else { // Remainder
Misha Brukman422791f2004-06-21 17:41:12 +00002114 unsigned TmpReg1 = makeAnotherReg(Op0->getType());
2115 unsigned TmpReg2 = makeAnotherReg(Op0->getType());
2116
2117 if (Ty->isSigned()) {
Misha Brukman2fec9902004-06-21 20:22:03 +00002118 BuildMI(*BB, IP, PPC32::DIVW, 2, TmpReg1).addReg(Op0Reg).addReg(Op1Reg);
Misha Brukman422791f2004-06-21 17:41:12 +00002119 } else {
Misha Brukman2fec9902004-06-21 20:22:03 +00002120 BuildMI(*BB, IP, PPC32::DIVWU, 2, TmpReg1).addReg(Op0Reg).addReg(Op1Reg);
Misha Brukman422791f2004-06-21 17:41:12 +00002121 }
2122 BuildMI(*BB, IP, PPC32::MULLW, 2, TmpReg2).addReg(TmpReg1).addReg(Op1Reg);
2123 BuildMI(*BB, IP, PPC32::SUBF, 2, ResultReg).addReg(TmpReg2).addReg(Op0Reg);
Misha Brukman5dfe3a92004-06-21 16:55:25 +00002124 }
2125}
2126
2127
2128/// Shift instructions: 'shl', 'sar', 'shr' - Some special cases here
2129/// for constant immediate shift values, and for constant immediate
2130/// shift values equal to 1. Even the general case is sort of special,
2131/// because the shift amount has to be in CL, not just any old register.
2132///
2133void ISel::visitShiftInst(ShiftInst &I) {
2134 MachineBasicBlock::iterator IP = BB->end ();
Misha Brukman2fec9902004-06-21 20:22:03 +00002135 emitShiftOperation(BB, IP, I.getOperand (0), I.getOperand (1),
2136 I.getOpcode () == Instruction::Shl, I.getType (),
2137 getReg (I));
Misha Brukman5dfe3a92004-06-21 16:55:25 +00002138}
2139
2140/// emitShiftOperation - Common code shared between visitShiftInst and
2141/// constant expression support.
Misha Brukman2fec9902004-06-21 20:22:03 +00002142///
Misha Brukman5dfe3a92004-06-21 16:55:25 +00002143void ISel::emitShiftOperation(MachineBasicBlock *MBB,
2144 MachineBasicBlock::iterator IP,
2145 Value *Op, Value *ShiftAmount, bool isLeftShift,
2146 const Type *ResultTy, unsigned DestReg) {
2147 unsigned SrcReg = getReg (Op, MBB, IP);
2148 bool isSigned = ResultTy->isSigned ();
2149 unsigned Class = getClass (ResultTy);
2150
2151 // Longs, as usual, are handled specially...
2152 if (Class == cLong) {
2153 // If we have a constant shift, we can generate much more efficient code
2154 // than otherwise...
2155 //
2156 if (ConstantUInt *CUI = dyn_cast<ConstantUInt>(ShiftAmount)) {
2157 unsigned Amount = CUI->getValue();
2158 if (Amount < 32) {
2159 if (isLeftShift) {
Misha Brukman422791f2004-06-21 17:41:12 +00002160 // FIXME: RLWIMI is a use-and-def of DestReg+1, but that violates SSA
Misha Brukman2fec9902004-06-21 20:22:03 +00002161 BuildMI(*MBB, IP, PPC32::RLWINM, 4, DestReg+1).addReg(SrcReg+1)
2162 .addImm(Amount).addImm(0).addImm(31-Amount);
2163 BuildMI(*MBB, IP, PPC32::RLWIMI, 5).addReg(DestReg+1).addReg(SrcReg)
2164 .addImm(Amount).addImm(32-Amount).addImm(31);
2165 BuildMI(*MBB, IP, PPC32::RLWINM, 4, DestReg).addReg(SrcReg)
2166 .addImm(Amount).addImm(0).addImm(31-Amount);
Misha Brukman5dfe3a92004-06-21 16:55:25 +00002167 } else {
Misha Brukman422791f2004-06-21 17:41:12 +00002168 // FIXME: RLWIMI is a use-and-def of DestReg, but that violates SSA
Misha Brukman2fec9902004-06-21 20:22:03 +00002169 BuildMI(*MBB, IP, PPC32::RLWINM, 4, DestReg).addReg(SrcReg)
2170 .addImm(32-Amount).addImm(Amount).addImm(31);
2171 BuildMI(*MBB, IP, PPC32::RLWIMI, 5).addReg(DestReg).addReg(SrcReg+1)
2172 .addImm(32-Amount).addImm(0).addImm(Amount-1);
2173 BuildMI(*MBB, IP, PPC32::RLWINM, 4, DestReg+1).addReg(SrcReg+1)
2174 .addImm(32-Amount).addImm(Amount).addImm(31);
Misha Brukman5dfe3a92004-06-21 16:55:25 +00002175 }
2176 } else { // Shifting more than 32 bits
2177 Amount -= 32;
2178 if (isLeftShift) {
2179 if (Amount != 0) {
Misha Brukman2fec9902004-06-21 20:22:03 +00002180 BuildMI(*MBB, IP, PPC32::RLWINM, 4, DestReg+1).addReg(SrcReg)
2181 .addImm(Amount).addImm(0).addImm(31-Amount);
Misha Brukman5dfe3a92004-06-21 16:55:25 +00002182 } else {
Misha Brukman2fec9902004-06-21 20:22:03 +00002183 BuildMI(*MBB, IP, PPC32::OR, 2, DestReg+1).addReg(SrcReg)
2184 .addReg(SrcReg);
Misha Brukman5dfe3a92004-06-21 16:55:25 +00002185 }
Misha Brukman2fec9902004-06-21 20:22:03 +00002186 BuildMI(*MBB, IP, PPC32::ADDI, 2,DestReg).addReg(PPC32::R0).addImm(0);
Misha Brukman5dfe3a92004-06-21 16:55:25 +00002187 } else {
2188 if (Amount != 0) {
Misha Brukman422791f2004-06-21 17:41:12 +00002189 if (isSigned)
Misha Brukmanfadb82f2004-06-24 22:00:15 +00002190 BuildMI(*MBB, IP, PPC32::SRAWI, 2, DestReg).addReg(SrcReg+1)
2191 .addImm(Amount);
Misha Brukman422791f2004-06-21 17:41:12 +00002192 else
Misha Brukmanfadb82f2004-06-24 22:00:15 +00002193 BuildMI(*MBB, IP, PPC32::RLWINM, 4, DestReg).addReg(SrcReg+1)
2194 .addImm(32-Amount).addImm(Amount).addImm(31);
Misha Brukman5dfe3a92004-06-21 16:55:25 +00002195 } else {
Misha Brukman2fec9902004-06-21 20:22:03 +00002196 BuildMI(*MBB, IP, PPC32::OR, 2, DestReg).addReg(SrcReg+1)
2197 .addReg(SrcReg+1);
Misha Brukman5dfe3a92004-06-21 16:55:25 +00002198 }
Misha Brukman2fec9902004-06-21 20:22:03 +00002199 BuildMI(*MBB, IP,PPC32::ADDI,2,DestReg+1).addReg(PPC32::R0).addImm(0);
Misha Brukman5dfe3a92004-06-21 16:55:25 +00002200 }
2201 }
2202 } else {
2203 unsigned TmpReg1 = makeAnotherReg(Type::IntTy);
2204 unsigned TmpReg2 = makeAnotherReg(Type::IntTy);
Misha Brukman422791f2004-06-21 17:41:12 +00002205 unsigned TmpReg3 = makeAnotherReg(Type::IntTy);
2206 unsigned TmpReg4 = makeAnotherReg(Type::IntTy);
2207 unsigned TmpReg5 = makeAnotherReg(Type::IntTy);
2208 unsigned TmpReg6 = makeAnotherReg(Type::IntTy);
2209 unsigned ShiftAmountReg = getReg (ShiftAmount, MBB, IP);
2210
Misha Brukman5dfe3a92004-06-21 16:55:25 +00002211 if (isLeftShift) {
Misha Brukman2fec9902004-06-21 20:22:03 +00002212 BuildMI(*MBB, IP, PPC32::SUBFIC, 2, TmpReg1).addReg(ShiftAmountReg)
2213 .addImm(32);
2214 BuildMI(*MBB, IP, PPC32::SLW, 2, TmpReg2).addReg(SrcReg+1)
2215 .addReg(ShiftAmountReg);
2216 BuildMI(*MBB, IP, PPC32::SRW, 2,TmpReg3).addReg(SrcReg).addReg(TmpReg1);
2217 BuildMI(*MBB, IP, PPC32::OR, 2,TmpReg4).addReg(TmpReg2).addReg(TmpReg3);
2218 BuildMI(*MBB, IP, PPC32::ADDI, 2, TmpReg5).addReg(ShiftAmountReg)
2219 .addImm(-32);
2220 BuildMI(*MBB, IP, PPC32::SLW, 2,TmpReg6).addReg(SrcReg).addReg(TmpReg5);
2221 BuildMI(*MBB, IP, PPC32::OR, 2, DestReg+1).addReg(TmpReg4)
2222 .addReg(TmpReg6);
2223 BuildMI(*MBB, IP, PPC32::SLW, 2, DestReg).addReg(SrcReg)
2224 .addReg(ShiftAmountReg);
Misha Brukman422791f2004-06-21 17:41:12 +00002225 } else {
2226 if (isSigned) {
Misha Brukman14d8c7a2004-06-29 23:45:05 +00002227 // FIXME: Unimplemented
Misha Brukman2fec9902004-06-21 20:22:03 +00002228 // Page C-3 of the PowerPC 32bit Programming Environments Manual
Misha Brukman14d8c7a2004-06-29 23:45:05 +00002229 std::cerr << "Unimplemented: signed right shift\n";
2230 abort();
Misha Brukman422791f2004-06-21 17:41:12 +00002231 } else {
Misha Brukman2fec9902004-06-21 20:22:03 +00002232 BuildMI(*MBB, IP, PPC32::SUBFIC, 2, TmpReg1).addReg(ShiftAmountReg)
2233 .addImm(32);
2234 BuildMI(*MBB, IP, PPC32::SRW, 2, TmpReg2).addReg(SrcReg)
2235 .addReg(ShiftAmountReg);
2236 BuildMI(*MBB, IP, PPC32::SLW, 2, TmpReg3).addReg(SrcReg+1)
2237 .addReg(TmpReg1);
2238 BuildMI(*MBB, IP, PPC32::OR, 2, TmpReg4).addReg(TmpReg2)
2239 .addReg(TmpReg3);
2240 BuildMI(*MBB, IP, PPC32::ADDI, 2, TmpReg5).addReg(ShiftAmountReg)
2241 .addImm(-32);
2242 BuildMI(*MBB, IP, PPC32::SRW, 2, TmpReg6).addReg(SrcReg+1)
2243 .addReg(TmpReg5);
2244 BuildMI(*MBB, IP, PPC32::OR, 2, DestReg).addReg(TmpReg4)
2245 .addReg(TmpReg6);
2246 BuildMI(*MBB, IP, PPC32::SRW, 2, DestReg+1).addReg(SrcReg+1)
2247 .addReg(ShiftAmountReg);
Misha Brukman422791f2004-06-21 17:41:12 +00002248 }
2249 }
Misha Brukman5dfe3a92004-06-21 16:55:25 +00002250 }
2251 return;
2252 }
2253
2254 if (ConstantUInt *CUI = dyn_cast<ConstantUInt>(ShiftAmount)) {
2255 // The shift amount is constant, guaranteed to be a ubyte. Get its value.
2256 assert(CUI->getType() == Type::UByteTy && "Shift amount not a ubyte?");
2257 unsigned Amount = CUI->getValue();
2258
Misha Brukman422791f2004-06-21 17:41:12 +00002259 if (isLeftShift) {
Misha Brukman2fec9902004-06-21 20:22:03 +00002260 BuildMI(*MBB, IP, PPC32::RLWINM, 4, DestReg).addReg(SrcReg)
2261 .addImm(Amount).addImm(0).addImm(31-Amount);
Misha Brukman422791f2004-06-21 17:41:12 +00002262 } else {
Misha Brukman2fec9902004-06-21 20:22:03 +00002263 if (isSigned) {
2264 BuildMI(*MBB, IP, PPC32::SRAWI,2,DestReg).addReg(SrcReg).addImm(Amount);
2265 } else {
2266 BuildMI(*MBB, IP, PPC32::RLWINM, 4, DestReg).addReg(SrcReg)
2267 .addImm(32-Amount).addImm(Amount).addImm(31);
2268 }
Misha Brukman422791f2004-06-21 17:41:12 +00002269 }
Misha Brukman5dfe3a92004-06-21 16:55:25 +00002270 } else { // The shift amount is non-constant.
2271 unsigned ShiftAmountReg = getReg (ShiftAmount, MBB, IP);
2272
Misha Brukman422791f2004-06-21 17:41:12 +00002273 if (isLeftShift) {
Misha Brukman2fec9902004-06-21 20:22:03 +00002274 BuildMI(*MBB, IP, PPC32::SLW, 2, DestReg).addReg(SrcReg)
2275 .addReg(ShiftAmountReg);
Misha Brukman422791f2004-06-21 17:41:12 +00002276 } else {
Misha Brukman2fec9902004-06-21 20:22:03 +00002277 BuildMI(*MBB, IP, isSigned ? PPC32::SRAW : PPC32::SRW, 2, DestReg)
2278 .addReg(SrcReg).addReg(ShiftAmountReg);
Misha Brukman422791f2004-06-21 17:41:12 +00002279 }
Misha Brukman5dfe3a92004-06-21 16:55:25 +00002280 }
2281}
2282
2283
2284/// visitLoadInst - Implement LLVM load instructions
2285///
2286void ISel::visitLoadInst(LoadInst &I) {
Misha Brukman2fec9902004-06-21 20:22:03 +00002287 static const unsigned Opcodes[] = {
2288 PPC32::LBZ, PPC32::LHZ, PPC32::LWZ, PPC32::LFS
2289 };
Misha Brukman5dfe3a92004-06-21 16:55:25 +00002290 unsigned Class = getClassB(I.getType());
2291 unsigned Opcode = Opcodes[Class];
2292 if (I.getType() == Type::DoubleTy) Opcode = PPC32::LFD;
2293
2294 unsigned DestReg = getReg(I);
2295
2296 if (AllocaInst *AI = dyn_castFixedAlloca(I.getOperand(0))) {
Misha Brukman422791f2004-06-21 17:41:12 +00002297 unsigned FI = getFixedSizedAllocaFI(AI);
Misha Brukman5dfe3a92004-06-21 16:55:25 +00002298 if (Class == cLong) {
Misha Brukman2fec9902004-06-21 20:22:03 +00002299 addFrameReference(BuildMI(BB, PPC32::LWZ, 2, DestReg), FI);
2300 addFrameReference(BuildMI(BB, PPC32::LWZ, 2, DestReg+1), FI, 4);
Misha Brukman5dfe3a92004-06-21 16:55:25 +00002301 } else {
Misha Brukman2fec9902004-06-21 20:22:03 +00002302 addFrameReference(BuildMI(BB, Opcode, 2, DestReg), FI);
Misha Brukman422791f2004-06-21 17:41:12 +00002303 }
Misha Brukman5dfe3a92004-06-21 16:55:25 +00002304 } else {
Misha Brukman422791f2004-06-21 17:41:12 +00002305 unsigned SrcAddrReg = getReg(I.getOperand(0));
Misha Brukman5dfe3a92004-06-21 16:55:25 +00002306
2307 if (Class == cLong) {
2308 BuildMI(BB, PPC32::LWZ, 2, DestReg).addImm(0).addReg(SrcAddrReg);
2309 BuildMI(BB, PPC32::LWZ, 2, DestReg+1).addImm(4).addReg(SrcAddrReg);
2310 } else {
2311 BuildMI(BB, Opcode, 2, DestReg).addImm(0).addReg(SrcAddrReg);
2312 }
2313 }
2314}
2315
2316/// visitStoreInst - Implement LLVM store instructions
2317///
2318void ISel::visitStoreInst(StoreInst &I) {
2319 unsigned ValReg = getReg(I.getOperand(0));
2320 unsigned AddressReg = getReg(I.getOperand(1));
2321
2322 const Type *ValTy = I.getOperand(0)->getType();
2323 unsigned Class = getClassB(ValTy);
2324
2325 if (Class == cLong) {
Misha Brukman422791f2004-06-21 17:41:12 +00002326 BuildMI(BB, PPC32::STW, 3).addReg(ValReg).addImm(0).addReg(AddressReg);
Misha Brukman2fec9902004-06-21 20:22:03 +00002327 BuildMI(BB, PPC32::STW, 3).addReg(ValReg+1).addImm(4).addReg(AddressReg);
Misha Brukman5dfe3a92004-06-21 16:55:25 +00002328 return;
2329 }
2330
2331 static const unsigned Opcodes[] = {
2332 PPC32::STB, PPC32::STH, PPC32::STW, PPC32::STFS
2333 };
2334 unsigned Opcode = Opcodes[Class];
2335 if (ValTy == Type::DoubleTy) Opcode = PPC32::STFD;
2336 BuildMI(BB, Opcode, 3).addReg(ValReg).addImm(0).addReg(AddressReg);
2337}
2338
2339
2340/// visitCastInst - Here we have various kinds of copying with or without sign
2341/// extension going on.
2342///
2343void ISel::visitCastInst(CastInst &CI) {
2344 Value *Op = CI.getOperand(0);
2345
2346 unsigned SrcClass = getClassB(Op->getType());
2347 unsigned DestClass = getClassB(CI.getType());
2348 // Noop casts are not emitted: getReg will return the source operand as the
2349 // register to use for any uses of the noop cast.
2350 if (DestClass == SrcClass)
2351 return;
2352
2353 // If this is a cast from a 32-bit integer to a Long type, and the only uses
2354 // of the case are GEP instructions, then the cast does not need to be
2355 // generated explicitly, it will be folded into the GEP.
2356 if (DestClass == cLong && SrcClass == cInt) {
2357 bool AllUsesAreGEPs = true;
2358 for (Value::use_iterator I = CI.use_begin(), E = CI.use_end(); I != E; ++I)
2359 if (!isa<GetElementPtrInst>(*I)) {
2360 AllUsesAreGEPs = false;
2361 break;
2362 }
2363
2364 // No need to codegen this cast if all users are getelementptr instrs...
2365 if (AllUsesAreGEPs) return;
2366 }
2367
2368 unsigned DestReg = getReg(CI);
2369 MachineBasicBlock::iterator MI = BB->end();
2370 emitCastOperation(BB, MI, Op, CI.getType(), DestReg);
2371}
2372
2373/// emitCastOperation - Common code shared between visitCastInst and constant
2374/// expression cast support.
2375///
2376void ISel::emitCastOperation(MachineBasicBlock *BB,
2377 MachineBasicBlock::iterator IP,
2378 Value *Src, const Type *DestTy,
2379 unsigned DestReg) {
2380 const Type *SrcTy = Src->getType();
2381 unsigned SrcClass = getClassB(SrcTy);
2382 unsigned DestClass = getClassB(DestTy);
2383 unsigned SrcReg = getReg(Src, BB, IP);
2384
2385 // Implement casts to bool by using compare on the operand followed by set if
2386 // not zero on the result.
2387 if (DestTy == Type::BoolTy) {
2388 switch (SrcClass) {
2389 case cByte:
Misha Brukman422791f2004-06-21 17:41:12 +00002390 case cShort:
Misha Brukman5dfe3a92004-06-21 16:55:25 +00002391 case cInt: {
2392 unsigned TmpReg = makeAnotherReg(Type::IntTy);
Misha Brukman422791f2004-06-21 17:41:12 +00002393 BuildMI(*BB, IP, PPC32::ADDIC, 2, TmpReg).addReg(SrcReg).addImm(-1);
2394 BuildMI(*BB, IP, PPC32::SUBFE, 2, DestReg).addReg(TmpReg).addReg(SrcReg);
Misha Brukman5dfe3a92004-06-21 16:55:25 +00002395 break;
2396 }
2397 case cLong: {
2398 unsigned TmpReg = makeAnotherReg(Type::IntTy);
2399 unsigned SrcReg2 = makeAnotherReg(Type::IntTy);
2400 BuildMI(*BB, IP, PPC32::OR, 2, SrcReg2).addReg(SrcReg).addReg(SrcReg+1);
Misha Brukman422791f2004-06-21 17:41:12 +00002401 BuildMI(*BB, IP, PPC32::ADDIC, 2, TmpReg).addReg(SrcReg2).addImm(-1);
2402 BuildMI(*BB, IP, PPC32::SUBFE, 2, DestReg).addReg(TmpReg).addReg(SrcReg2);
Misha Brukman5dfe3a92004-06-21 16:55:25 +00002403 break;
2404 }
2405 case cFP:
2406 // FIXME
Misha Brukman422791f2004-06-21 17:41:12 +00002407 // Load -0.0
2408 // Compare
2409 // move to CR1
2410 // Negate -0.0
2411 // Compare
2412 // CROR
2413 // MFCR
2414 // Left-align
2415 // SRA ?
Misha Brukmand18a31d2004-07-06 22:51:53 +00002416 std::cerr << "Cast fp-to-bool not implemented!";
2417 abort();
Misha Brukman5dfe3a92004-06-21 16:55:25 +00002418 }
2419 return;
2420 }
2421
2422 // Implement casts between values of the same type class (as determined by
2423 // getClass) by using a register-to-register move.
2424 if (SrcClass == DestClass) {
Misha Brukman422791f2004-06-21 17:41:12 +00002425 if (SrcClass <= cInt) {
2426 BuildMI(*BB, IP, PPC32::OR, 2, DestReg).addReg(SrcReg).addReg(SrcReg);
2427 } else if (SrcClass == cFP && SrcTy == DestTy) {
Misha Brukman5dfe3a92004-06-21 16:55:25 +00002428 BuildMI(*BB, IP, PPC32::FMR, 1, DestReg).addReg(SrcReg);
2429 } else if (SrcClass == cFP) {
2430 if (SrcTy == Type::FloatTy) { // float -> double
2431 assert(DestTy == Type::DoubleTy && "Unknown cFP member!");
2432 BuildMI(*BB, IP, PPC32::FMR, 1, DestReg).addReg(SrcReg);
2433 } else { // double -> float
2434 assert(SrcTy == Type::DoubleTy && DestTy == Type::FloatTy &&
2435 "Unknown cFP member!");
Misha Brukman422791f2004-06-21 17:41:12 +00002436 BuildMI(*BB, IP, PPC32::FRSP, 1, DestReg).addReg(SrcReg);
Misha Brukman5dfe3a92004-06-21 16:55:25 +00002437 }
2438 } else if (SrcClass == cLong) {
Misha Brukman422791f2004-06-21 17:41:12 +00002439 BuildMI(*BB, IP, PPC32::OR, 2, DestReg).addReg(SrcReg).addReg(SrcReg);
Misha Brukman2fec9902004-06-21 20:22:03 +00002440 BuildMI(*BB, IP, PPC32::OR, 2, DestReg+1).addReg(SrcReg+1)
2441 .addReg(SrcReg+1);
Misha Brukman5dfe3a92004-06-21 16:55:25 +00002442 } else {
2443 assert(0 && "Cannot handle this type of cast instruction!");
2444 abort();
2445 }
2446 return;
2447 }
2448
2449 // Handle cast of SMALLER int to LARGER int using a move with sign extension
2450 // or zero extension, depending on whether the source type was signed.
2451 if (SrcClass <= cInt && (DestClass <= cInt || DestClass == cLong) &&
2452 SrcClass < DestClass) {
2453 bool isLong = DestClass == cLong;
2454 if (isLong) DestClass = cInt;
2455
2456 bool isUnsigned = SrcTy->isUnsigned() || SrcTy == Type::BoolTy;
2457 if (SrcClass < cInt) {
2458 if (isUnsigned) {
Misha Brukman422791f2004-06-21 17:41:12 +00002459 unsigned shift = (SrcClass == cByte) ? 24 : 16;
Misha Brukman2fec9902004-06-21 20:22:03 +00002460 BuildMI(*BB, IP, PPC32::RLWINM, 4, DestReg).addReg(SrcReg).addZImm(0)
2461 .addImm(shift).addImm(31);
Misha Brukman5dfe3a92004-06-21 16:55:25 +00002462 } else {
Misha Brukman2fec9902004-06-21 20:22:03 +00002463 BuildMI(*BB, IP, (SrcClass == cByte) ? PPC32::EXTSB : PPC32::EXTSH,
2464 1, DestReg).addReg(SrcReg);
Misha Brukman422791f2004-06-21 17:41:12 +00002465 }
2466 } else {
2467 BuildMI(*BB, IP, PPC32::OR, 2, DestReg).addReg(SrcReg).addReg(SrcReg);
2468 }
Misha Brukman5dfe3a92004-06-21 16:55:25 +00002469
2470 if (isLong) { // Handle upper 32 bits as appropriate...
2471 if (isUnsigned) // Zero out top bits...
2472 BuildMI(*BB, IP, PPC32::ADDI, 2, DestReg+1).addReg(PPC32::R0).addImm(0);
2473 else // Sign extend bottom half...
2474 BuildMI(*BB, IP, PPC32::SRAWI, 2, DestReg+1).addReg(DestReg).addImm(31);
2475 }
2476 return;
2477 }
2478
2479 // Special case long -> int ...
2480 if (SrcClass == cLong && DestClass == cInt) {
2481 BuildMI(*BB, IP, PPC32::OR, 2, DestReg).addReg(SrcReg).addReg(SrcReg);
2482 return;
2483 }
2484
2485 // Handle cast of LARGER int to SMALLER int with a clear or sign extend
2486 if ((SrcClass <= cInt || SrcClass == cLong) && DestClass <= cInt
2487 && SrcClass > DestClass) {
2488 bool isUnsigned = SrcTy->isUnsigned() || SrcTy == Type::BoolTy;
Misha Brukman422791f2004-06-21 17:41:12 +00002489 if (isUnsigned) {
2490 unsigned shift = (SrcClass == cByte) ? 24 : 16;
Misha Brukman2fec9902004-06-21 20:22:03 +00002491 BuildMI(*BB, IP, PPC32::RLWINM, 4, DestReg).addReg(SrcReg).addZImm(0)
2492 .addImm(shift).addImm(31);
Misha Brukman422791f2004-06-21 17:41:12 +00002493 } else {
Misha Brukman2fec9902004-06-21 20:22:03 +00002494 BuildMI(*BB, IP, (SrcClass == cByte) ? PPC32::EXTSB : PPC32::EXTSH, 1,
2495 DestReg).addReg(SrcReg);
Misha Brukman422791f2004-06-21 17:41:12 +00002496 }
Misha Brukman5dfe3a92004-06-21 16:55:25 +00002497 return;
2498 }
2499
2500 // Handle casts from integer to floating point now...
2501 if (DestClass == cFP) {
2502
Misha Brukman422791f2004-06-21 17:41:12 +00002503 // Emit a library call for long to float conversion
2504 if (SrcClass == cLong) {
2505 std::vector<ValueRecord> Args;
2506 Args.push_back(ValueRecord(SrcReg, SrcTy));
Misha Brukman313efcb2004-07-09 15:45:07 +00002507 Function *floatFn = (SrcTy==Type::FloatTy) ? __floatdisfFn : __floatdidfFn;
Misha Brukman2fec9902004-06-21 20:22:03 +00002508 MachineInstr *TheCall =
Misha Brukman313efcb2004-07-09 15:45:07 +00002509 BuildMI(PPC32::CALLpcrel, 1).addGlobalAddress(floatFn, true);
Misha Brukmand18a31d2004-07-06 22:51:53 +00002510 doCall(ValueRecord(DestReg, DestTy), TheCall, Args, false);
Misha Brukman422791f2004-06-21 17:41:12 +00002511 return;
2512 }
Misha Brukman5dfe3a92004-06-21 16:55:25 +00002513
2514 unsigned TmpReg = makeAnotherReg(Type::IntTy);
Misha Brukman358829f2004-06-21 17:25:55 +00002515 switch (SrcTy->getTypeID()) {
Misha Brukman5dfe3a92004-06-21 16:55:25 +00002516 case Type::BoolTyID:
2517 case Type::SByteTyID:
2518 BuildMI(*BB, IP, PPC32::EXTSB, 1, TmpReg).addReg(SrcReg);
2519 break;
2520 case Type::UByteTyID:
Misha Brukman2fec9902004-06-21 20:22:03 +00002521 BuildMI(*BB, IP, PPC32::RLWINM, 4, TmpReg).addReg(SrcReg).addZImm(0)
2522 .addImm(24).addImm(31);
Misha Brukman5dfe3a92004-06-21 16:55:25 +00002523 break;
2524 case Type::ShortTyID:
2525 BuildMI(*BB, IP, PPC32::EXTSB, 1, TmpReg).addReg(SrcReg);
2526 break;
2527 case Type::UShortTyID:
Misha Brukman2fec9902004-06-21 20:22:03 +00002528 BuildMI(*BB, IP, PPC32::RLWINM, 4, TmpReg).addReg(SrcReg).addZImm(0)
2529 .addImm(16).addImm(31);
Misha Brukman5dfe3a92004-06-21 16:55:25 +00002530 break;
Misha Brukman422791f2004-06-21 17:41:12 +00002531 case Type::IntTyID:
2532 BuildMI(*BB, IP, PPC32::OR, 2, TmpReg).addReg(SrcReg).addReg(SrcReg);
2533 break;
2534 case Type::UIntTyID:
2535 BuildMI(*BB, IP, PPC32::OR, 2, TmpReg).addReg(SrcReg).addReg(SrcReg);
2536 break;
Misha Brukman5dfe3a92004-06-21 16:55:25 +00002537 default: // No promotion needed...
2538 break;
2539 }
2540
2541 SrcReg = TmpReg;
Misha Brukman422791f2004-06-21 17:41:12 +00002542
Misha Brukman5dfe3a92004-06-21 16:55:25 +00002543 // Spill the integer to memory and reload it from there.
Misha Brukman422791f2004-06-21 17:41:12 +00002544 // Also spill room for a special conversion constant
2545 int ConstantFrameIndex =
Misha Brukman5dfe3a92004-06-21 16:55:25 +00002546 F->getFrameInfo()->CreateStackObject(Type::DoubleTy, TM.getTargetData());
2547 int ValueFrameIdx =
2548 F->getFrameInfo()->CreateStackObject(Type::DoubleTy, TM.getTargetData());
2549
Misha Brukman422791f2004-06-21 17:41:12 +00002550 unsigned constantHi = makeAnotherReg(Type::IntTy);
2551 unsigned constantLo = makeAnotherReg(Type::IntTy);
2552 unsigned ConstF = makeAnotherReg(Type::DoubleTy);
2553 unsigned TempF = makeAnotherReg(Type::DoubleTy);
2554
Misha Brukman5dfe3a92004-06-21 16:55:25 +00002555 if (!SrcTy->isSigned()) {
Misha Brukman2fec9902004-06-21 20:22:03 +00002556 BuildMI(*BB, IP, PPC32::ADDIS, 2, constantHi).addReg(PPC32::R0)
2557 .addImm(0x4330);
Misha Brukman422791f2004-06-21 17:41:12 +00002558 BuildMI(*BB, IP, PPC32::ADDI, 2, constantLo).addReg(PPC32::R0).addImm(0);
Misha Brukman2fec9902004-06-21 20:22:03 +00002559 addFrameReference(BuildMI(*BB, IP, PPC32::STW, 3).addReg(constantHi),
2560 ConstantFrameIndex);
2561 addFrameReference(BuildMI(*BB, IP, PPC32::STW, 3).addReg(constantLo),
2562 ConstantFrameIndex, 4);
2563 addFrameReference(BuildMI(*BB, IP, PPC32::STW, 3).addReg(constantHi),
2564 ValueFrameIdx);
2565 addFrameReference(BuildMI(*BB, IP, PPC32::STW, 3).addReg(SrcReg),
2566 ValueFrameIdx, 4);
2567 addFrameReference(BuildMI(*BB, IP, PPC32::LFD, 2, ConstF),
2568 ConstantFrameIndex);
Misha Brukman422791f2004-06-21 17:41:12 +00002569 addFrameReference(BuildMI(*BB, IP, PPC32::LFD, 2, TempF), ValueFrameIdx);
2570 BuildMI(*BB, IP, PPC32::FSUB, 2, DestReg).addReg(TempF).addReg(ConstF);
2571 } else {
2572 unsigned TempLo = makeAnotherReg(Type::IntTy);
Misha Brukman2fec9902004-06-21 20:22:03 +00002573 BuildMI(*BB, IP, PPC32::ADDIS, 2, constantHi).addReg(PPC32::R0)
2574 .addImm(0x4330);
2575 BuildMI(*BB, IP, PPC32::ADDIS, 2, constantLo).addReg(PPC32::R0)
2576 .addImm(0x8000);
2577 addFrameReference(BuildMI(*BB, IP, PPC32::STW, 3).addReg(constantHi),
2578 ConstantFrameIndex);
2579 addFrameReference(BuildMI(*BB, IP, PPC32::STW, 3).addReg(constantLo),
2580 ConstantFrameIndex, 4);
2581 addFrameReference(BuildMI(*BB, IP, PPC32::STW, 3).addReg(constantHi),
2582 ValueFrameIdx);
Misha Brukman422791f2004-06-21 17:41:12 +00002583 BuildMI(*BB, IP, PPC32::XORIS, 2, TempLo).addReg(SrcReg).addImm(0x8000);
Misha Brukman2fec9902004-06-21 20:22:03 +00002584 addFrameReference(BuildMI(*BB, IP, PPC32::STW, 3).addReg(TempLo),
2585 ValueFrameIdx, 4);
2586 addFrameReference(BuildMI(*BB, IP, PPC32::LFD, 2, ConstF),
2587 ConstantFrameIndex);
Misha Brukman422791f2004-06-21 17:41:12 +00002588 addFrameReference(BuildMI(*BB, IP, PPC32::LFD, 2, TempF), ValueFrameIdx);
Misha Brukman2fec9902004-06-21 20:22:03 +00002589 BuildMI(*BB, IP, PPC32::FSUB, 2, DestReg).addReg(TempF ).addReg(ConstF);
Misha Brukman422791f2004-06-21 17:41:12 +00002590 }
Misha Brukman5dfe3a92004-06-21 16:55:25 +00002591 return;
2592 }
2593
2594 // Handle casts from floating point to integer now...
2595 if (SrcClass == cFP) {
2596
Misha Brukman422791f2004-06-21 17:41:12 +00002597 // emit library call
2598 if (DestClass == cLong) {
2599 std::vector<ValueRecord> Args;
2600 Args.push_back(ValueRecord(SrcReg, SrcTy));
Misha Brukman2fec9902004-06-21 20:22:03 +00002601 MachineInstr *TheCall =
Misha Brukmanf3f63822004-07-08 19:41:16 +00002602 BuildMI(PPC32::CALLpcrel, 1).addGlobalAddress(__fixdfdiFn, true);
Misha Brukmand18a31d2004-07-06 22:51:53 +00002603 doCall(ValueRecord(DestReg, DestTy), TheCall, Args, false);
Misha Brukman422791f2004-06-21 17:41:12 +00002604 return;
2605 }
Misha Brukman5dfe3a92004-06-21 16:55:25 +00002606
2607 int ValueFrameIdx =
2608 F->getFrameInfo()->CreateStackObject(Type::DoubleTy, TM.getTargetData());
2609
Misha Brukman422791f2004-06-21 17:41:12 +00002610 // load into 32 bit value, and then truncate as necessary
2611 // FIXME: This is wrong for unsigned dest types
2612 //if (DestTy->isSigned()) {
2613 unsigned TempReg = makeAnotherReg(Type::DoubleTy);
2614 BuildMI(*BB, IP, PPC32::FCTIWZ, 1, TempReg).addReg(SrcReg);
Misha Brukman2fec9902004-06-21 20:22:03 +00002615 addFrameReference(BuildMI(*BB, IP, PPC32::STFD, 3)
2616 .addReg(TempReg), ValueFrameIdx);
2617 addFrameReference(BuildMI(*BB, IP, PPC32::LWZ, 2, DestReg),
2618 ValueFrameIdx+4);
Misha Brukman422791f2004-06-21 17:41:12 +00002619 //} else {
2620 //}
2621
2622 // FIXME: Truncate return value
Misha Brukman5dfe3a92004-06-21 16:55:25 +00002623 return;
2624 }
2625
2626 // Anything we haven't handled already, we can't (yet) handle at all.
2627 assert(0 && "Unhandled cast instruction!");
2628 abort();
2629}
2630
2631/// visitVANextInst - Implement the va_next instruction...
2632///
2633void ISel::visitVANextInst(VANextInst &I) {
2634 unsigned VAList = getReg(I.getOperand(0));
2635 unsigned DestReg = getReg(I);
2636
2637 unsigned Size;
Misha Brukman358829f2004-06-21 17:25:55 +00002638 switch (I.getArgType()->getTypeID()) {
Misha Brukman5dfe3a92004-06-21 16:55:25 +00002639 default:
2640 std::cerr << I;
2641 assert(0 && "Error: bad type for va_next instruction!");
2642 return;
2643 case Type::PointerTyID:
2644 case Type::UIntTyID:
2645 case Type::IntTyID:
2646 Size = 4;
2647 break;
2648 case Type::ULongTyID:
2649 case Type::LongTyID:
2650 case Type::DoubleTyID:
2651 Size = 8;
2652 break;
2653 }
2654
2655 // Increment the VAList pointer...
2656 BuildMI(BB, PPC32::ADDI, 2, DestReg).addReg(VAList).addImm(Size);
2657}
2658
2659void ISel::visitVAArgInst(VAArgInst &I) {
2660 unsigned VAList = getReg(I.getOperand(0));
2661 unsigned DestReg = getReg(I);
2662
Misha Brukman358829f2004-06-21 17:25:55 +00002663 switch (I.getType()->getTypeID()) {
Misha Brukman5dfe3a92004-06-21 16:55:25 +00002664 default:
2665 std::cerr << I;
2666 assert(0 && "Error: bad type for va_next instruction!");
2667 return;
2668 case Type::PointerTyID:
2669 case Type::UIntTyID:
2670 case Type::IntTyID:
2671 BuildMI(BB, PPC32::LWZ, 2, DestReg).addImm(0).addReg(VAList);
2672 break;
2673 case Type::ULongTyID:
2674 case Type::LongTyID:
2675 BuildMI(BB, PPC32::LWZ, 2, DestReg).addImm(0).addReg(VAList);
2676 BuildMI(BB, PPC32::LWZ, 2, DestReg+1).addImm(4).addReg(VAList);
2677 break;
2678 case Type::DoubleTyID:
2679 BuildMI(BB, PPC32::LFD, 2, DestReg).addImm(0).addReg(VAList);
2680 break;
2681 }
2682}
2683
2684/// visitGetElementPtrInst - instruction-select GEP instructions
2685///
2686void ISel::visitGetElementPtrInst(GetElementPtrInst &I) {
2687 unsigned outputReg = getReg(I);
Misha Brukman2fec9902004-06-21 20:22:03 +00002688 emitGEPOperation(BB, BB->end(), I.getOperand(0), I.op_begin()+1, I.op_end(),
2689 outputReg);
Misha Brukman5dfe3a92004-06-21 16:55:25 +00002690}
2691
2692void ISel::emitGEPOperation(MachineBasicBlock *MBB,
2693 MachineBasicBlock::iterator IP,
2694 Value *Src, User::op_iterator IdxBegin,
2695 User::op_iterator IdxEnd, unsigned TargetReg) {
2696 const TargetData &TD = TM.getTargetData();
2697 if (ConstantPointerRef *CPR = dyn_cast<ConstantPointerRef>(Src))
2698 Src = CPR->getValue();
2699
2700 std::vector<Value*> GEPOps;
2701 GEPOps.resize(IdxEnd-IdxBegin+1);
2702 GEPOps[0] = Src;
2703 std::copy(IdxBegin, IdxEnd, GEPOps.begin()+1);
2704
2705 std::vector<const Type*> GEPTypes;
2706 GEPTypes.assign(gep_type_begin(Src->getType(), IdxBegin, IdxEnd),
2707 gep_type_end(Src->getType(), IdxBegin, IdxEnd));
2708
2709 // Keep emitting instructions until we consume the entire GEP instruction.
Misha Brukman14d8c7a2004-06-29 23:45:05 +00002710 while (!GEPOps.empty()) {
2711 if (GEPTypes.empty()) {
2712 // Load the base pointer into a register.
2713 unsigned Reg = getReg(Src, MBB, IP);
2714 BuildMI(*MBB, IP, PPC32::OR, 2, TargetReg).addReg(Reg).addReg(Reg);
2715 break; // we are now done
2716 }
Misha Brukman313efcb2004-07-09 15:45:07 +00002717 if (const StructType *StTy = dyn_cast<StructType>(GEPTypes.back())) {
2718 // It's a struct access. CUI is the index into the structure,
2719 // which names the field. This index must have unsigned type.
2720 const ConstantUInt *CUI = cast<ConstantUInt>(GEPOps.back());
Misha Brukman5dfe3a92004-06-21 16:55:25 +00002721
Misha Brukman313efcb2004-07-09 15:45:07 +00002722 // Use the TargetData structure to pick out what the layout of the
2723 // structure is in memory. Since the structure index must be constant, we
2724 // can get its value and use it to find the right byte offset from the
2725 // StructLayout class's list of structure member offsets.
2726 unsigned Disp = TD.getStructLayout(StTy)->MemberOffsets[CUI->getValue()];
2727 GEPOps.pop_back(); // Consume a GEP operand
2728 GEPTypes.pop_back();
Misha Brukman2fec9902004-06-21 20:22:03 +00002729 unsigned Reg = makeAnotherReg(Type::UIntTy);
Misha Brukman313efcb2004-07-09 15:45:07 +00002730 unsigned DispReg = makeAnotherReg(Type::UIntTy);
2731 BuildMI(*MBB, IP, PPC32::LI, 2, DispReg).addImm(Disp);
2732 BuildMI(*MBB, IP, PPC32::ADD, 2, TargetReg).addReg(Reg).addReg(DispReg);
Misha Brukman2fec9902004-06-21 20:22:03 +00002733 --IP; // Insert the next instruction before this one.
2734 TargetReg = Reg; // Codegen the rest of the GEP into this
2735 } else {
Misha Brukman313efcb2004-07-09 15:45:07 +00002736 // It's an array or pointer access: [ArraySize x ElementType].
2737 const SequentialType *SqTy = cast<SequentialType>(GEPTypes.back());
2738 Value *idx = GEPOps.back();
2739 GEPOps.pop_back(); // Consume a GEP operand
2740 GEPTypes.pop_back();
2741
2742 // Many GEP instructions use a [cast (int/uint) to LongTy] as their
2743 // operand. Handle this case directly now...
2744 if (CastInst *CI = dyn_cast<CastInst>(idx))
2745 if (CI->getOperand(0)->getType() == Type::IntTy ||
2746 CI->getOperand(0)->getType() == Type::UIntTy)
2747 idx = CI->getOperand(0);
2748
2749 // We want to add BaseReg to(idxReg * sizeof ElementType). First, we
2750 // must find the size of the pointed-to type (Not coincidentally, the next
2751 // type is the type of the elements in the array).
2752 const Type *ElTy = SqTy->getElementType();
2753 unsigned elementSize = TD.getTypeSize(ElTy);
2754
2755 if (idx == Constant::getNullValue(idx->getType())) {
2756 // GEP with idx 0 is a no-op
2757 } else if (elementSize == 1) {
2758 // If the element size is 1, we don't have to multiply, just add
2759 unsigned idxReg = getReg(idx, MBB, IP);
2760 unsigned Reg = makeAnotherReg(Type::UIntTy);
2761 BuildMI(*MBB, IP, PPC32::ADD, 2,TargetReg).addReg(Reg).addReg(idxReg);
2762 --IP; // Insert the next instruction before this one.
2763 TargetReg = Reg; // Codegen the rest of the GEP into this
2764 } else {
2765 unsigned idxReg = getReg(idx, MBB, IP);
2766 unsigned OffsetReg = makeAnotherReg(Type::UIntTy);
2767
2768 // Make sure we can back the iterator up to point to the first
2769 // instruction emitted.
2770 MachineBasicBlock::iterator BeforeIt = IP;
2771 if (IP == MBB->begin())
2772 BeforeIt = MBB->end();
2773 else
2774 --BeforeIt;
2775 doMultiplyConst(MBB, IP, OffsetReg, Type::IntTy, idxReg, elementSize);
2776
2777 // Emit an ADD to add OffsetReg to the basePtr.
2778 unsigned Reg = makeAnotherReg(Type::UIntTy);
2779 BuildMI(*MBB, IP, PPC32::ADD, 2, TargetReg).addReg(Reg).addReg(OffsetReg);
2780
2781 // Step to the first instruction of the multiply.
2782 if (BeforeIt == MBB->end())
2783 IP = MBB->begin();
2784 else
2785 IP = ++BeforeIt;
2786
2787 TargetReg = Reg; // Codegen the rest of the GEP into this
2788 }
Misha Brukman5dfe3a92004-06-21 16:55:25 +00002789 }
Misha Brukman2fec9902004-06-21 20:22:03 +00002790 }
Misha Brukman5dfe3a92004-06-21 16:55:25 +00002791}
2792
2793/// visitAllocaInst - If this is a fixed size alloca, allocate space from the
2794/// frame manager, otherwise do it the hard way.
2795///
2796void ISel::visitAllocaInst(AllocaInst &I) {
2797 // If this is a fixed size alloca in the entry block for the function, we
2798 // statically stack allocate the space, so we don't need to do anything here.
2799 //
2800 if (dyn_castFixedAlloca(&I)) return;
2801
2802 // Find the data size of the alloca inst's getAllocatedType.
2803 const Type *Ty = I.getAllocatedType();
2804 unsigned TySize = TM.getTargetData().getTypeSize(Ty);
2805
2806 // Create a register to hold the temporary result of multiplying the type size
2807 // constant by the variable amount.
2808 unsigned TotalSizeReg = makeAnotherReg(Type::UIntTy);
2809 unsigned SrcReg1 = getReg(I.getArraySize());
2810
2811 // TotalSizeReg = mul <numelements>, <TypeSize>
2812 MachineBasicBlock::iterator MBBI = BB->end();
2813 doMultiplyConst(BB, MBBI, TotalSizeReg, Type::UIntTy, SrcReg1, TySize);
2814
2815 // AddedSize = add <TotalSizeReg>, 15
2816 unsigned AddedSizeReg = makeAnotherReg(Type::UIntTy);
2817 BuildMI(BB, PPC32::ADD, 2, AddedSizeReg).addReg(TotalSizeReg).addImm(15);
2818
2819 // AlignedSize = and <AddedSize>, ~15
2820 unsigned AlignedSize = makeAnotherReg(Type::UIntTy);
Misha Brukman2fec9902004-06-21 20:22:03 +00002821 BuildMI(BB, PPC32::RLWNM, 4, AlignedSize).addReg(AddedSizeReg).addImm(0)
2822 .addImm(0).addImm(27);
Misha Brukman5dfe3a92004-06-21 16:55:25 +00002823
2824 // Subtract size from stack pointer, thereby allocating some space.
2825 BuildMI(BB, PPC32::SUB, 2, PPC32::R1).addReg(PPC32::R1).addReg(AlignedSize);
2826
2827 // Put a pointer to the space into the result register, by copying
2828 // the stack pointer.
2829 BuildMI(BB, PPC32::OR, 2, getReg(I)).addReg(PPC32::R1).addReg(PPC32::R1);
2830
2831 // Inform the Frame Information that we have just allocated a variable-sized
2832 // object.
2833 F->getFrameInfo()->CreateVariableSizedObject();
2834}
2835
2836/// visitMallocInst - Malloc instructions are code generated into direct calls
2837/// to the library malloc.
2838///
2839void ISel::visitMallocInst(MallocInst &I) {
2840 unsigned AllocSize = TM.getTargetData().getTypeSize(I.getAllocatedType());
2841 unsigned Arg;
2842
2843 if (ConstantUInt *C = dyn_cast<ConstantUInt>(I.getOperand(0))) {
2844 Arg = getReg(ConstantUInt::get(Type::UIntTy, C->getValue() * AllocSize));
2845 } else {
2846 Arg = makeAnotherReg(Type::UIntTy);
2847 unsigned Op0Reg = getReg(I.getOperand(0));
2848 MachineBasicBlock::iterator MBBI = BB->end();
2849 doMultiplyConst(BB, MBBI, Arg, Type::UIntTy, Op0Reg, AllocSize);
2850 }
2851
2852 std::vector<ValueRecord> Args;
2853 Args.push_back(ValueRecord(Arg, Type::UIntTy));
Misha Brukman2fec9902004-06-21 20:22:03 +00002854 MachineInstr *TheCall =
Misha Brukman313efcb2004-07-09 15:45:07 +00002855 BuildMI(PPC32::CALLpcrel, 1).addGlobalAddress(mallocFn, true);
Misha Brukmand18a31d2004-07-06 22:51:53 +00002856 doCall(ValueRecord(getReg(I), I.getType()), TheCall, Args, false);
Misha Brukman5dfe3a92004-06-21 16:55:25 +00002857}
2858
2859
2860/// visitFreeInst - Free instructions are code gen'd to call the free libc
2861/// function.
2862///
2863void ISel::visitFreeInst(FreeInst &I) {
2864 std::vector<ValueRecord> Args;
2865 Args.push_back(ValueRecord(I.getOperand(0)));
Misha Brukman2fec9902004-06-21 20:22:03 +00002866 MachineInstr *TheCall =
Misha Brukman313efcb2004-07-09 15:45:07 +00002867 BuildMI(PPC32::CALLpcrel, 1).addGlobalAddress(freeFn, true);
Misha Brukmand18a31d2004-07-06 22:51:53 +00002868 doCall(ValueRecord(0, Type::VoidTy), TheCall, Args, false);
Misha Brukman5dfe3a92004-06-21 16:55:25 +00002869}
2870
2871/// createPPC32SimpleInstructionSelector - This pass converts an LLVM function
2872/// into a machine code representation is a very simple peep-hole fashion. The
2873/// generated code sucks but the implementation is nice and simple.
2874///
2875FunctionPass *llvm::createPPCSimpleInstructionSelector(TargetMachine &TM) {
2876 return new ISel(TM);
2877}