| OLD | NEW |
| 1 //===- subzero/src/IceTargetLoweringX8632.h - x86-32 lowering ---*- C++ -*-===// | 1 //===- subzero/src/IceTargetLoweringX8632.h - x86-32 lowering ---*- C++ -*-===// |
| 2 // | 2 // |
| 3 // The Subzero Code Generator | 3 // The Subzero Code Generator |
| 4 // | 4 // |
| 5 // This file is distributed under the University of Illinois Open Source | 5 // This file is distributed under the University of Illinois Open Source |
| 6 // License. See LICENSE.TXT for details. | 6 // License. See LICENSE.TXT for details. |
| 7 // | 7 // |
| 8 //===----------------------------------------------------------------------===// | 8 //===----------------------------------------------------------------------===// |
| 9 // | 9 // |
| 10 // This file declares the TargetLoweringX8632 class, which | 10 // This file declares the TargetLoweringX8632 class, which |
| (...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 64 | 64 |
| 65 enum Registers { | 65 enum Registers { |
| 66 #define X(val, init, name, name16, name8, scratch, preserved, stackptr, \ | 66 #define X(val, init, name, name16, name8, scratch, preserved, stackptr, \ |
| 67 frameptr, isI8, isInt, isFP) \ | 67 frameptr, isI8, isInt, isFP) \ |
| 68 val init, | 68 val init, |
| 69 REGX8632_TABLE | 69 REGX8632_TABLE |
| 70 #undef X | 70 #undef X |
| 71 Reg_NUM | 71 Reg_NUM |
| 72 }; | 72 }; |
| 73 | 73 |
| 74 enum X86InstructionSet { |
| 75 // SSE2 is the PNaCl baseline instruction set. |
| 76 SSE2, |
| 77 SSE4_1 |
| 78 }; |
| 79 |
| 80 X86InstructionSet getInstructionSet() const { return InstructionSet; } |
| 81 |
| 74 protected: | 82 protected: |
| 75 TargetX8632(Cfg *Func); | 83 TargetX8632(Cfg *Func); |
| 76 | 84 |
| 77 virtual void postLower(); | 85 virtual void postLower(); |
| 78 | 86 |
| 79 virtual void lowerAlloca(const InstAlloca *Inst); | 87 virtual void lowerAlloca(const InstAlloca *Inst); |
| 80 virtual void lowerArithmetic(const InstArithmetic *Inst); | 88 virtual void lowerArithmetic(const InstArithmetic *Inst); |
| 81 virtual void lowerAssign(const InstAssign *Inst); | 89 virtual void lowerAssign(const InstAssign *Inst); |
| 82 virtual void lowerBr(const InstBr *Inst); | 90 virtual void lowerBr(const InstBr *Inst); |
| 83 virtual void lowerCall(const InstCall *Inst); | 91 virtual void lowerCall(const InstCall *Inst); |
| (...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 179 } | 187 } |
| 180 void _addps(Variable *Dest, Operand *Src0) { | 188 void _addps(Variable *Dest, Operand *Src0) { |
| 181 Context.insert(InstX8632Addps::create(Func, Dest, Src0)); | 189 Context.insert(InstX8632Addps::create(Func, Dest, Src0)); |
| 182 } | 190 } |
| 183 void _addss(Variable *Dest, Operand *Src0) { | 191 void _addss(Variable *Dest, Operand *Src0) { |
| 184 Context.insert(InstX8632Addss::create(Func, Dest, Src0)); | 192 Context.insert(InstX8632Addss::create(Func, Dest, Src0)); |
| 185 } | 193 } |
| 186 void _and(Variable *Dest, Operand *Src0) { | 194 void _and(Variable *Dest, Operand *Src0) { |
| 187 Context.insert(InstX8632And::create(Func, Dest, Src0)); | 195 Context.insert(InstX8632And::create(Func, Dest, Src0)); |
| 188 } | 196 } |
| 197 void _blendvps(Variable *Dest, Operand *Src0, Operand *Src1) { |
| 198 Context.insert(InstX8632Blendvps::create(Func, Dest, Src0, Src1)); |
| 199 } |
| 189 void _br(InstX8632::BrCond Condition, CfgNode *TargetTrue, | 200 void _br(InstX8632::BrCond Condition, CfgNode *TargetTrue, |
| 190 CfgNode *TargetFalse) { | 201 CfgNode *TargetFalse) { |
| 191 Context.insert( | 202 Context.insert( |
| 192 InstX8632Br::create(Func, TargetTrue, TargetFalse, Condition)); | 203 InstX8632Br::create(Func, TargetTrue, TargetFalse, Condition)); |
| 193 } | 204 } |
| 194 void _br(CfgNode *Target) { | 205 void _br(CfgNode *Target) { |
| 195 Context.insert(InstX8632Br::create(Func, Target)); | 206 Context.insert(InstX8632Br::create(Func, Target)); |
| 196 } | 207 } |
| 197 void _br(InstX8632::BrCond Condition, CfgNode *Target) { | 208 void _br(InstX8632::BrCond Condition, CfgNode *Target) { |
| 198 Context.insert(InstX8632Br::create(Func, Target, Condition)); | 209 Context.insert(InstX8632Br::create(Func, Target, Condition)); |
| (...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 253 void _fld(Operand *Src0) { Context.insert(InstX8632Fld::create(Func, Src0)); } | 264 void _fld(Operand *Src0) { Context.insert(InstX8632Fld::create(Func, Src0)); } |
| 254 void _fstp(Variable *Dest) { | 265 void _fstp(Variable *Dest) { |
| 255 Context.insert(InstX8632Fstp::create(Func, Dest)); | 266 Context.insert(InstX8632Fstp::create(Func, Dest)); |
| 256 } | 267 } |
| 257 void _idiv(Variable *Dest, Operand *Src0, Operand *Src1) { | 268 void _idiv(Variable *Dest, Operand *Src0, Operand *Src1) { |
| 258 Context.insert(InstX8632Idiv::create(Func, Dest, Src0, Src1)); | 269 Context.insert(InstX8632Idiv::create(Func, Dest, Src0, Src1)); |
| 259 } | 270 } |
| 260 void _imul(Variable *Dest, Operand *Src0) { | 271 void _imul(Variable *Dest, Operand *Src0) { |
| 261 Context.insert(InstX8632Imul::create(Func, Dest, Src0)); | 272 Context.insert(InstX8632Imul::create(Func, Dest, Src0)); |
| 262 } | 273 } |
| 274 void _insertps(Variable *Dest, Operand *Src0, Operand *Src1) { |
| 275 Context.insert(InstX8632Insertps::create(Func, Dest, Src0, Src1)); |
| 276 } |
| 263 void _lea(Variable *Dest, Operand *Src0) { | 277 void _lea(Variable *Dest, Operand *Src0) { |
| 264 Context.insert(InstX8632Lea::create(Func, Dest, Src0)); | 278 Context.insert(InstX8632Lea::create(Func, Dest, Src0)); |
| 265 } | 279 } |
| 266 void _mfence() { Context.insert(InstX8632Mfence::create(Func)); } | 280 void _mfence() { Context.insert(InstX8632Mfence::create(Func)); } |
| 267 // If Dest=NULL is passed in, then a new variable is created, marked | 281 // If Dest=NULL is passed in, then a new variable is created, marked |
| 268 // as infinite register allocation weight, and returned through the | 282 // as infinite register allocation weight, and returned through the |
| 269 // in/out Dest argument. | 283 // in/out Dest argument. |
| 270 void _mov(Variable *&Dest, Operand *Src0, | 284 void _mov(Variable *&Dest, Operand *Src0, |
| 271 int32_t RegNum = Variable::NoRegister) { | 285 int32_t RegNum = Variable::NoRegister) { |
| 272 if (Dest == NULL) { | 286 if (Dest == NULL) { |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 310 } | 324 } |
| 311 void _padd(Variable *Dest, Operand *Src0) { | 325 void _padd(Variable *Dest, Operand *Src0) { |
| 312 Context.insert(InstX8632Padd::create(Func, Dest, Src0)); | 326 Context.insert(InstX8632Padd::create(Func, Dest, Src0)); |
| 313 } | 327 } |
| 314 void _pand(Variable *Dest, Operand *Src0) { | 328 void _pand(Variable *Dest, Operand *Src0) { |
| 315 Context.insert(InstX8632Pand::create(Func, Dest, Src0)); | 329 Context.insert(InstX8632Pand::create(Func, Dest, Src0)); |
| 316 } | 330 } |
| 317 void _pandn(Variable *Dest, Operand *Src0) { | 331 void _pandn(Variable *Dest, Operand *Src0) { |
| 318 Context.insert(InstX8632Pandn::create(Func, Dest, Src0)); | 332 Context.insert(InstX8632Pandn::create(Func, Dest, Src0)); |
| 319 } | 333 } |
| 334 void _pblendvb(Variable *Dest, Operand *Src0, Operand *Src1) { |
| 335 Context.insert(InstX8632Pblendvb::create(Func, Dest, Src0, Src1)); |
| 336 } |
| 320 void _pcmpeq(Variable *Dest, Operand *Src0) { | 337 void _pcmpeq(Variable *Dest, Operand *Src0) { |
| 321 Context.insert(InstX8632Pcmpeq::create(Func, Dest, Src0)); | 338 Context.insert(InstX8632Pcmpeq::create(Func, Dest, Src0)); |
| 322 } | 339 } |
| 323 void _pcmpgt(Variable *Dest, Operand *Src0) { | 340 void _pcmpgt(Variable *Dest, Operand *Src0) { |
| 324 Context.insert(InstX8632Pcmpgt::create(Func, Dest, Src0)); | 341 Context.insert(InstX8632Pcmpgt::create(Func, Dest, Src0)); |
| 325 } | 342 } |
| 326 void _pextrw(Variable *Dest, Operand *Src0, Operand *Src1) { | 343 void _pextr(Variable *Dest, Operand *Src0, Operand *Src1) { |
| 327 Context.insert(InstX8632Pextrw::create(Func, Dest, Src0, Src1)); | 344 Context.insert(InstX8632Pextr::create(Func, Dest, Src0, Src1)); |
| 328 } | 345 } |
| 329 void _pinsrw(Variable *Dest, Operand *Src0, Operand *Src1) { | 346 void _pinsr(Variable *Dest, Operand *Src0, Operand *Src1) { |
| 330 Context.insert(InstX8632Pinsrw::create(Func, Dest, Src0, Src1)); | 347 Context.insert(InstX8632Pinsr::create(Func, Dest, Src0, Src1)); |
| 331 } | 348 } |
| 332 void _pmullw(Variable *Dest, Operand *Src0) { | 349 void _pmull(Variable *Dest, Operand *Src0) { |
| 333 Context.insert(InstX8632Pmullw::create(Func, Dest, Src0)); | 350 Context.insert(InstX8632Pmull::create(Func, Dest, Src0)); |
| 334 } | 351 } |
| 335 void _pmuludq(Variable *Dest, Operand *Src0) { | 352 void _pmuludq(Variable *Dest, Operand *Src0) { |
| 336 Context.insert(InstX8632Pmuludq::create(Func, Dest, Src0)); | 353 Context.insert(InstX8632Pmuludq::create(Func, Dest, Src0)); |
| 337 } | 354 } |
| 338 void _pop(Variable *Dest) { | 355 void _pop(Variable *Dest) { |
| 339 Context.insert(InstX8632Pop::create(Func, Dest)); | 356 Context.insert(InstX8632Pop::create(Func, Dest)); |
| 340 } | 357 } |
| 341 void _por(Variable *Dest, Operand *Src0) { | 358 void _por(Variable *Dest, Operand *Src0) { |
| 342 Context.insert(InstX8632Por::create(Func, Dest, Src0)); | 359 Context.insert(InstX8632Por::create(Func, Dest, Src0)); |
| 343 } | 360 } |
| (...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 421 void _xchg(Operand *Dest, Variable *Src) { | 438 void _xchg(Operand *Dest, Variable *Src) { |
| 422 Context.insert(InstX8632Xchg::create(Func, Dest, Src)); | 439 Context.insert(InstX8632Xchg::create(Func, Dest, Src)); |
| 423 // The xchg modifies Dest and Src -- model that update with a FakeDef. | 440 // The xchg modifies Dest and Src -- model that update with a FakeDef. |
| 424 Context.insert( | 441 Context.insert( |
| 425 InstFakeDef::create(Func, Src, llvm::dyn_cast<Variable>(Dest))); | 442 InstFakeDef::create(Func, Src, llvm::dyn_cast<Variable>(Dest))); |
| 426 } | 443 } |
| 427 void _xor(Variable *Dest, Operand *Src0) { | 444 void _xor(Variable *Dest, Operand *Src0) { |
| 428 Context.insert(InstX8632Xor::create(Func, Dest, Src0)); | 445 Context.insert(InstX8632Xor::create(Func, Dest, Src0)); |
| 429 } | 446 } |
| 430 | 447 |
| 448 const X86InstructionSet InstructionSet; |
| 431 bool IsEbpBasedFrame; | 449 bool IsEbpBasedFrame; |
| 432 size_t FrameSizeLocals; | 450 size_t FrameSizeLocals; |
| 433 size_t LocalsSizeBytes; | 451 size_t LocalsSizeBytes; |
| 434 llvm::SmallBitVector TypeToRegisterSet[IceType_NUM]; | 452 llvm::SmallBitVector TypeToRegisterSet[IceType_NUM]; |
| 435 llvm::SmallBitVector ScratchRegs; | 453 llvm::SmallBitVector ScratchRegs; |
| 436 llvm::SmallBitVector RegsUsed; | 454 llvm::SmallBitVector RegsUsed; |
| 437 SizeT NextLabelNumber; | 455 SizeT NextLabelNumber; |
| 438 bool ComputedLiveRanges; | 456 bool ComputedLiveRanges; |
| 439 VarList PhysicalRegisters; | 457 VarList PhysicalRegisters; |
| 440 static IceString RegNames[]; | 458 static IceString RegNames[]; |
| (...skipping 24 matching lines...) Expand all Loading... |
| 465 virtual ~TargetGlobalInitX8632() {} | 483 virtual ~TargetGlobalInitX8632() {} |
| 466 }; | 484 }; |
| 467 | 485 |
| 468 template <> void ConstantInteger::emit(GlobalContext *Ctx) const; | 486 template <> void ConstantInteger::emit(GlobalContext *Ctx) const; |
| 469 template <> void ConstantFloat::emit(GlobalContext *Ctx) const; | 487 template <> void ConstantFloat::emit(GlobalContext *Ctx) const; |
| 470 template <> void ConstantDouble::emit(GlobalContext *Ctx) const; | 488 template <> void ConstantDouble::emit(GlobalContext *Ctx) const; |
| 471 | 489 |
| 472 } // end of namespace Ice | 490 } // end of namespace Ice |
| 473 | 491 |
| 474 #endif // SUBZERO_SRC_ICETARGETLOWERINGX8632_H | 492 #endif // SUBZERO_SRC_ICETARGETLOWERINGX8632_H |
| OLD | NEW |