OLD | NEW |
1 //===- subzero/src/IceInstX8632.cpp - X86-32 instruction implementation ---===// | 1 //===- subzero/src/IceInstX8632.cpp - X86-32 instruction implementation ---===// |
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 implements the InstX8632 and OperandX8632 classes, | 10 // This file implements the InstX8632 and OperandX8632 classes, |
(...skipping 327 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
338 intptr_t StartPosition) { | 338 intptr_t StartPosition) { |
339 intptr_t EndPosition = Asm->GetPosition(); | 339 intptr_t EndPosition = Asm->GetPosition(); |
340 intptr_t LastFixupLoc = -1; | 340 intptr_t LastFixupLoc = -1; |
341 AssemblerFixup *LastFixup = NULL; | 341 AssemblerFixup *LastFixup = NULL; |
342 if (Asm->GetLatestFixup()) { | 342 if (Asm->GetLatestFixup()) { |
343 LastFixup = Asm->GetLatestFixup(); | 343 LastFixup = Asm->GetLatestFixup(); |
344 LastFixupLoc = LastFixup->position(); | 344 LastFixupLoc = LastFixup->position(); |
345 } | 345 } |
346 if (LastFixupLoc < StartPosition) { | 346 if (LastFixupLoc < StartPosition) { |
347 // The fixup doesn't apply to this current block. | 347 // The fixup doesn't apply to this current block. |
348 for (intptr_t i = 0; i < EndPosition - StartPosition; ++i) { | 348 for (intptr_t i = StartPosition; i < EndPosition; ++i) { |
349 Str << "\t.byte " | 349 Str << "\t.byte 0x"; |
350 << static_cast<uint32_t>(Asm->LoadBuffer<uint8_t>(StartPosition + i)) | 350 Str.write_hex(Asm->LoadBuffer<uint8_t>(i)); |
351 << "\n"; | 351 Str << "\n"; |
352 } | 352 } |
353 return; | 353 return; |
354 } | 354 } |
355 const intptr_t FixupSize = 4; | 355 const intptr_t FixupSize = 4; |
356 assert(LastFixupLoc + FixupSize <= EndPosition); | 356 assert(LastFixupLoc + FixupSize <= EndPosition); |
357 // The fixup does apply to this current block. | 357 // The fixup does apply to this current block. |
358 for (intptr_t i = 0; i < LastFixupLoc - StartPosition; ++i) { | 358 for (intptr_t i = StartPosition; i < LastFixupLoc; ++i) { |
359 Str << "\t.byte " | 359 Str << "\t.byte 0x"; |
360 << static_cast<uint32_t>(Asm->LoadBuffer<uint8_t>(StartPosition + i)) | 360 Str.write_hex(Asm->LoadBuffer<uint8_t>(i)); |
361 << "\n"; | 361 Str << "\n"; |
362 } | 362 } |
363 Str << "\t.long " << LastFixup->value()->getName(); | 363 Str << "\t.long " << LastFixup->value()->getName(); |
364 if (LastFixup->value()->getOffset()) { | 364 if (LastFixup->value()->getOffset()) { |
365 Str << " + " << LastFixup->value()->getOffset(); | 365 Str << " + " << LastFixup->value()->getOffset(); |
366 } | 366 } |
367 Str << "\n"; | 367 Str << "\n"; |
368 for (intptr_t i = LastFixupLoc + FixupSize; i < EndPosition; ++i) { | 368 for (intptr_t i = LastFixupLoc + FixupSize; i < EndPosition; ++i) { |
369 Str << "\t.byte " << static_cast<uint32_t>(Asm->LoadBuffer<uint8_t>(i)) | 369 Str << "\t.byte 0x"; |
370 << "\n"; | 370 Str.write_hex(Asm->LoadBuffer<uint8_t>(i)); |
| 371 Str << "\n"; |
371 } | 372 } |
372 } | 373 } |
373 | 374 |
374 } // end of anonymous namespace | 375 } // end of anonymous namespace |
375 | 376 |
376 void InstX8632::dump(const Cfg *Func) const { | 377 void InstX8632::dump(const Cfg *Func) const { |
377 Ostream &Str = Func->getContext()->getStrDump(); | 378 Ostream &Str = Func->getContext()->getStrDump(); |
378 Str << "[X8632] "; | 379 Str << "[X8632] "; |
379 Inst::dump(Func); | 380 Inst::dump(Func); |
380 } | 381 } |
(...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
471 if (ShiftReg && ShiftReg->getRegNum() == RegX8632::Reg_ecx) { | 472 if (ShiftReg && ShiftReg->getRegNum() == RegX8632::Reg_ecx) { |
472 Str << "cl"; | 473 Str << "cl"; |
473 EmittedSrc1 = true; | 474 EmittedSrc1 = true; |
474 } | 475 } |
475 } | 476 } |
476 if (!EmittedSrc1) | 477 if (!EmittedSrc1) |
477 Inst->getSrc(1)->emit(Func); | 478 Inst->getSrc(1)->emit(Func); |
478 Str << "\n"; | 479 Str << "\n"; |
479 } | 480 } |
480 | 481 |
481 void emitIASVarTyGPR(const Cfg *Func, Type Ty, const Variable *Var, | 482 void emitIASOpTyGPR(const Cfg *Func, Type Ty, const Operand *Op, |
482 const x86::AssemblerX86::GPREmitterOneOp &Emitter) { | 483 const x86::AssemblerX86::GPREmitterOneOp &Emitter) { |
483 x86::AssemblerX86 *Asm = Func->getAssembler<x86::AssemblerX86>(); | 484 x86::AssemblerX86 *Asm = Func->getAssembler<x86::AssemblerX86>(); |
484 intptr_t StartPosition = Asm->GetPosition(); | 485 intptr_t StartPosition = Asm->GetPosition(); |
485 if (Var->hasReg()) { | 486 if (const Variable *Var = llvm::dyn_cast<Variable>(Op)) { |
486 // We cheat a little and use GPRRegister even for byte operations. | 487 if (Var->hasReg()) { |
487 RegX8632::GPRRegister VarReg = | 488 // We cheat a little and use GPRRegister even for byte operations. |
488 RegX8632::getEncodedByteRegOrGPR(Ty, Var->getRegNum()); | 489 RegX8632::GPRRegister VarReg = |
489 (Asm->*(Emitter.Reg))(Ty, VarReg); | 490 RegX8632::getEncodedByteRegOrGPR(Ty, Var->getRegNum()); |
| 491 (Asm->*(Emitter.Reg))(Ty, VarReg); |
| 492 } else { |
| 493 x86::Address StackAddr(static_cast<TargetX8632 *>(Func->getTarget()) |
| 494 ->stackVarToAsmOperand(Var)); |
| 495 (Asm->*(Emitter.Addr))(Ty, StackAddr); |
| 496 } |
| 497 } else if (const OperandX8632Mem *Mem = llvm::dyn_cast<OperandX8632Mem>(Op)) { |
| 498 (Asm->*(Emitter.Addr))(Ty, Mem->toAsmAddress(Asm)); |
490 } else { | 499 } else { |
491 x86::Address StackAddr(static_cast<TargetX8632 *>(Func->getTarget()) | 500 llvm_unreachable("Unexpected operand type"); |
492 ->stackVarToAsmOperand(Var)); | |
493 (Asm->*(Emitter.Addr))(Ty, StackAddr); | |
494 } | 501 } |
495 Ostream &Str = Func->getContext()->getStrEmit(); | 502 Ostream &Str = Func->getContext()->getStrEmit(); |
496 emitIASBytes(Str, Asm, StartPosition); | 503 emitIASBytes(Str, Asm, StartPosition); |
497 } | 504 } |
498 | 505 |
499 void emitIASRegOpTyGPR(const Cfg *Func, Type Ty, const Variable *Var, | 506 void emitIASRegOpTyGPR(const Cfg *Func, Type Ty, const Variable *Var, |
500 const Operand *Src, | 507 const Operand *Src, |
501 const x86::AssemblerX86::GPREmitterRegOp &Emitter) { | 508 const x86::AssemblerX86::GPREmitterRegOp &Emitter) { |
502 x86::AssemblerX86 *Asm = Func->getAssembler<x86::AssemblerX86>(); | 509 x86::AssemblerX86 *Asm = Func->getAssembler<x86::AssemblerX86>(); |
503 intptr_t StartPosition = Asm->GetPosition(); | 510 intptr_t StartPosition = Asm->GetPosition(); |
(...skipping 155 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
659 &x86::AssemblerX86::bsr, &x86::AssemblerX86::bsr, NULL}; | 666 &x86::AssemblerX86::bsr, &x86::AssemblerX86::bsr, NULL}; |
660 template <> | 667 template <> |
661 const x86::AssemblerX86::GPREmitterRegOp InstX8632Lea::Emitter = { | 668 const x86::AssemblerX86::GPREmitterRegOp InstX8632Lea::Emitter = { |
662 /* reg/reg and reg/imm are illegal */ NULL, &x86::AssemblerX86::lea, NULL}; | 669 /* reg/reg and reg/imm are illegal */ NULL, &x86::AssemblerX86::lea, NULL}; |
663 | 670 |
664 // Unary XMM ops | 671 // Unary XMM ops |
665 template <> | 672 template <> |
666 const x86::AssemblerX86::XmmEmitterTwoOps InstX8632Sqrtss::Emitter = { | 673 const x86::AssemblerX86::XmmEmitterTwoOps InstX8632Sqrtss::Emitter = { |
667 &x86::AssemblerX86::sqrtss, &x86::AssemblerX86::sqrtss, NULL}; | 674 &x86::AssemblerX86::sqrtss, &x86::AssemblerX86::sqrtss, NULL}; |
668 | 675 |
| 676 // Binary GPR ops |
| 677 template <> |
| 678 const x86::AssemblerX86::GPREmitterRegOp InstX8632Add::Emitter = { |
| 679 &x86::AssemblerX86::add, &x86::AssemblerX86::add, &x86::AssemblerX86::add}; |
| 680 template <> |
| 681 const x86::AssemblerX86::GPREmitterRegOp InstX8632Adc::Emitter = { |
| 682 &x86::AssemblerX86::adc, &x86::AssemblerX86::adc, &x86::AssemblerX86::adc}; |
| 683 template <> |
| 684 const x86::AssemblerX86::GPREmitterRegOp InstX8632And::Emitter = { |
| 685 &x86::AssemblerX86::And, &x86::AssemblerX86::And, &x86::AssemblerX86::And}; |
| 686 template <> |
| 687 const x86::AssemblerX86::GPREmitterRegOp InstX8632Or::Emitter = { |
| 688 &x86::AssemblerX86::Or, &x86::AssemblerX86::Or, &x86::AssemblerX86::Or}; |
| 689 template <> |
| 690 const x86::AssemblerX86::GPREmitterRegOp InstX8632Sbb::Emitter = { |
| 691 &x86::AssemblerX86::sbb, &x86::AssemblerX86::sbb, &x86::AssemblerX86::sbb}; |
| 692 template <> |
| 693 const x86::AssemblerX86::GPREmitterRegOp InstX8632Sub::Emitter = { |
| 694 &x86::AssemblerX86::sub, &x86::AssemblerX86::sub, &x86::AssemblerX86::sub}; |
| 695 template <> |
| 696 const x86::AssemblerX86::GPREmitterRegOp InstX8632Xor::Emitter = { |
| 697 &x86::AssemblerX86::Xor, &x86::AssemblerX86::Xor, &x86::AssemblerX86::Xor}; |
| 698 |
669 // Binary XMM ops | 699 // Binary XMM ops |
670 template <> | 700 template <> |
671 const x86::AssemblerX86::XmmEmitterTwoOps InstX8632Addss::Emitter = { | 701 const x86::AssemblerX86::XmmEmitterTwoOps InstX8632Addss::Emitter = { |
672 &x86::AssemblerX86::addss, &x86::AssemblerX86::addss, NULL}; | 702 &x86::AssemblerX86::addss, &x86::AssemblerX86::addss, NULL}; |
673 template <> | 703 template <> |
674 const x86::AssemblerX86::XmmEmitterTwoOps InstX8632Addps::Emitter = { | 704 const x86::AssemblerX86::XmmEmitterTwoOps InstX8632Addps::Emitter = { |
675 &x86::AssemblerX86::addps, &x86::AssemblerX86::addps, NULL}; | 705 &x86::AssemblerX86::addps, &x86::AssemblerX86::addps, NULL}; |
676 template <> | 706 template <> |
677 const x86::AssemblerX86::XmmEmitterTwoOps InstX8632Divss::Emitter = { | 707 const x86::AssemblerX86::XmmEmitterTwoOps InstX8632Divss::Emitter = { |
678 &x86::AssemblerX86::divss, &x86::AssemblerX86::divss, NULL}; | 708 &x86::AssemblerX86::divss, &x86::AssemblerX86::divss, NULL}; |
(...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
791 } | 821 } |
792 | 822 |
793 template <> void InstX8632Div::emit(const Cfg *Func) const { | 823 template <> void InstX8632Div::emit(const Cfg *Func) const { |
794 Ostream &Str = Func->getContext()->getStrEmit(); | 824 Ostream &Str = Func->getContext()->getStrEmit(); |
795 assert(getSrcSize() == 3); | 825 assert(getSrcSize() == 3); |
796 Str << "\t" << Opcode << "\t"; | 826 Str << "\t" << Opcode << "\t"; |
797 getSrc(1)->emit(Func); | 827 getSrc(1)->emit(Func); |
798 Str << "\n"; | 828 Str << "\n"; |
799 } | 829 } |
800 | 830 |
| 831 template <> void InstX8632Div::emitIAS(const Cfg *Func) const { |
| 832 assert(getSrcSize() == 3); |
| 833 const Operand *Src = getSrc(1); |
| 834 Type Ty = Src->getType(); |
| 835 const static x86::AssemblerX86::GPREmitterOneOp Emitter = { |
| 836 &x86::AssemblerX86::div, &x86::AssemblerX86::div}; |
| 837 emitIASOpTyGPR(Func, Ty, Src, Emitter); |
| 838 } |
| 839 |
801 template <> void InstX8632Idiv::emit(const Cfg *Func) const { | 840 template <> void InstX8632Idiv::emit(const Cfg *Func) const { |
802 Ostream &Str = Func->getContext()->getStrEmit(); | 841 Ostream &Str = Func->getContext()->getStrEmit(); |
803 assert(getSrcSize() == 3); | 842 assert(getSrcSize() == 3); |
804 Str << "\t" << Opcode << "\t"; | 843 Str << "\t" << Opcode << "\t"; |
805 getSrc(1)->emit(Func); | 844 getSrc(1)->emit(Func); |
806 Str << "\n"; | 845 Str << "\n"; |
807 } | 846 } |
808 | 847 |
| 848 template <> void InstX8632Idiv::emitIAS(const Cfg *Func) const { |
| 849 assert(getSrcSize() == 3); |
| 850 const Operand *Src = getSrc(1); |
| 851 Type Ty = Src->getType(); |
| 852 const static x86::AssemblerX86::GPREmitterOneOp Emitter = { |
| 853 &x86::AssemblerX86::idiv, &x86::AssemblerX86::idiv}; |
| 854 emitIASOpTyGPR(Func, Ty, Src, Emitter); |
| 855 } |
809 | 856 |
810 namespace { | 857 namespace { |
811 | 858 |
812 // pblendvb and blendvps take xmm0 as a final implicit argument. | 859 // pblendvb and blendvps take xmm0 as a final implicit argument. |
813 void emitVariableBlendInst(const char *Opcode, const Inst *Inst, | 860 void emitVariableBlendInst(const char *Opcode, const Inst *Inst, |
814 const Cfg *Func) { | 861 const Cfg *Func) { |
815 Ostream &Str = Func->getContext()->getStrEmit(); | 862 Ostream &Str = Func->getContext()->getStrEmit(); |
816 assert(Inst->getSrcSize() == 3); | 863 assert(Inst->getSrcSize() == 3); |
817 assert(llvm::isa<Variable>(Inst->getSrc(2))); | 864 assert(llvm::isa<Variable>(Inst->getSrc(2))); |
818 assert(llvm::cast<Variable>(Inst->getSrc(2))->getRegNum() == | 865 assert(llvm::cast<Variable>(Inst->getSrc(2))->getRegNum() == |
(...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
919 Ostream &Str = Func->getContext()->getStrEmit(); | 966 Ostream &Str = Func->getContext()->getStrEmit(); |
920 assert(getSrcSize() == 2); | 967 assert(getSrcSize() == 2); |
921 assert(llvm::isa<Variable>(getSrc(0))); | 968 assert(llvm::isa<Variable>(getSrc(0))); |
922 assert(llvm::dyn_cast<Variable>(getSrc(0))->getRegNum() == RegX8632::Reg_eax); | 969 assert(llvm::dyn_cast<Variable>(getSrc(0))->getRegNum() == RegX8632::Reg_eax); |
923 assert(getDest()->getRegNum() == RegX8632::Reg_eax); // TODO: allow edx? | 970 assert(getDest()->getRegNum() == RegX8632::Reg_eax); // TODO: allow edx? |
924 Str << "\tmul\t"; | 971 Str << "\tmul\t"; |
925 getSrc(1)->emit(Func); | 972 getSrc(1)->emit(Func); |
926 Str << "\n"; | 973 Str << "\n"; |
927 } | 974 } |
928 | 975 |
| 976 void InstX8632Mul::emitIAS(const Cfg *Func) const { |
| 977 assert(getSrcSize() == 2); |
| 978 assert(llvm::isa<Variable>(getSrc(0))); |
| 979 assert(llvm::dyn_cast<Variable>(getSrc(0))->getRegNum() == RegX8632::Reg_eax); |
| 980 assert(getDest()->getRegNum() == RegX8632::Reg_eax); // TODO: allow edx? |
| 981 const Operand *Src = getSrc(1); |
| 982 Type Ty = Src->getType(); |
| 983 const static x86::AssemblerX86::GPREmitterOneOp Emitter = { |
| 984 &x86::AssemblerX86::mul, &x86::AssemblerX86::mul}; |
| 985 emitIASOpTyGPR(Func, Ty, Src, Emitter); |
| 986 } |
| 987 |
929 void InstX8632Mul::dump(const Cfg *Func) const { | 988 void InstX8632Mul::dump(const Cfg *Func) const { |
930 Ostream &Str = Func->getContext()->getStrDump(); | 989 Ostream &Str = Func->getContext()->getStrDump(); |
931 dumpDest(Func); | 990 dumpDest(Func); |
932 Str << " = mul." << getDest()->getType() << " "; | 991 Str << " = mul." << getDest()->getType() << " "; |
933 dumpSources(Func); | 992 dumpSources(Func); |
934 } | 993 } |
935 | 994 |
936 void InstX8632Shld::emit(const Cfg *Func) const { | 995 void InstX8632Shld::emit(const Cfg *Func) const { |
937 Ostream &Str = Func->getContext()->getStrEmit(); | 996 Ostream &Str = Func->getContext()->getStrEmit(); |
938 assert(getSrcSize() == 3); | 997 assert(getSrcSize() == 3); |
(...skipping 300 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1239 Str << "test." << getSrc(0)->getType() << " "; | 1298 Str << "test." << getSrc(0)->getType() << " "; |
1240 dumpSources(Func); | 1299 dumpSources(Func); |
1241 } | 1300 } |
1242 | 1301 |
1243 void InstX8632Mfence::emit(const Cfg *Func) const { | 1302 void InstX8632Mfence::emit(const Cfg *Func) const { |
1244 Ostream &Str = Func->getContext()->getStrEmit(); | 1303 Ostream &Str = Func->getContext()->getStrEmit(); |
1245 assert(getSrcSize() == 0); | 1304 assert(getSrcSize() == 0); |
1246 Str << "\tmfence\n"; | 1305 Str << "\tmfence\n"; |
1247 } | 1306 } |
1248 | 1307 |
| 1308 void InstX8632Mfence::emitIAS(const Cfg *Func) const { |
| 1309 Ostream &Str = Func->getContext()->getStrEmit(); |
| 1310 x86::AssemblerX86 *Asm = Func->getAssembler<x86::AssemblerX86>(); |
| 1311 intptr_t StartPosition = Asm->GetPosition(); |
| 1312 Asm->mfence(); |
| 1313 emitIASBytes(Str, Asm, StartPosition); |
| 1314 } |
| 1315 |
1249 void InstX8632Mfence::dump(const Cfg *Func) const { | 1316 void InstX8632Mfence::dump(const Cfg *Func) const { |
1250 Ostream &Str = Func->getContext()->getStrDump(); | 1317 Ostream &Str = Func->getContext()->getStrDump(); |
1251 Str << "mfence\n"; | 1318 Str << "mfence\n"; |
1252 } | 1319 } |
1253 | 1320 |
1254 void InstX8632Store::emit(const Cfg *Func) const { | 1321 void InstX8632Store::emit(const Cfg *Func) const { |
1255 Ostream &Str = Func->getContext()->getStrEmit(); | 1322 Ostream &Str = Func->getContext()->getStrEmit(); |
1256 assert(getSrcSize() == 2); | 1323 assert(getSrcSize() == 2); |
1257 Str << "\tmov" << TypeX8632Attributes[getSrc(0)->getType()].SdSsString | 1324 Str << "\tmov" << TypeX8632Attributes[getSrc(0)->getType()].SdSsString |
1258 << "\t"; | 1325 << "\t"; |
(...skipping 395 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1654 void InstX8632AdjustStack::emit(const Cfg *Func) const { | 1721 void InstX8632AdjustStack::emit(const Cfg *Func) const { |
1655 Ostream &Str = Func->getContext()->getStrEmit(); | 1722 Ostream &Str = Func->getContext()->getStrEmit(); |
1656 Str << "\tsub\tesp, " << Amount << "\n"; | 1723 Str << "\tsub\tesp, " << Amount << "\n"; |
1657 Func->getTarget()->updateStackAdjustment(Amount); | 1724 Func->getTarget()->updateStackAdjustment(Amount); |
1658 } | 1725 } |
1659 | 1726 |
1660 void InstX8632AdjustStack::emitIAS(const Cfg *Func) const { | 1727 void InstX8632AdjustStack::emitIAS(const Cfg *Func) const { |
1661 Ostream &Str = Func->getContext()->getStrEmit(); | 1728 Ostream &Str = Func->getContext()->getStrEmit(); |
1662 x86::AssemblerX86 *Asm = Func->getAssembler<x86::AssemblerX86>(); | 1729 x86::AssemblerX86 *Asm = Func->getAssembler<x86::AssemblerX86>(); |
1663 intptr_t StartPosition = Asm->GetPosition(); | 1730 intptr_t StartPosition = Asm->GetPosition(); |
1664 Asm->subl(RegX8632::Encoded_Reg_esp, x86::Immediate(Amount)); | 1731 Asm->sub(IceType_i32, RegX8632::Encoded_Reg_esp, x86::Immediate(Amount)); |
1665 emitIASBytes(Str, Asm, StartPosition); | 1732 emitIASBytes(Str, Asm, StartPosition); |
1666 Func->getTarget()->updateStackAdjustment(Amount); | 1733 Func->getTarget()->updateStackAdjustment(Amount); |
1667 } | 1734 } |
1668 | 1735 |
1669 void InstX8632AdjustStack::dump(const Cfg *Func) const { | 1736 void InstX8632AdjustStack::dump(const Cfg *Func) const { |
1670 Ostream &Str = Func->getContext()->getStrDump(); | 1737 Ostream &Str = Func->getContext()->getStrDump(); |
1671 Str << "esp = sub.i32 esp, " << Amount; | 1738 Str << "esp = sub.i32 esp, " << Amount; |
1672 } | 1739 } |
1673 | 1740 |
1674 void InstX8632Push::emit(const Cfg *Func) const { | 1741 void InstX8632Push::emit(const Cfg *Func) const { |
(...skipping 316 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1991 } | 2058 } |
1992 Str << "("; | 2059 Str << "("; |
1993 if (Func) | 2060 if (Func) |
1994 Var->dump(Func); | 2061 Var->dump(Func); |
1995 else | 2062 else |
1996 Var->dump(Str); | 2063 Var->dump(Str); |
1997 Str << ")"; | 2064 Str << ")"; |
1998 } | 2065 } |
1999 | 2066 |
2000 } // end of namespace Ice | 2067 } // end of namespace Ice |
OLD | NEW |