Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 //===- subzero/src/IceTargetLoweringX8632.cpp - x86-32 lowering -----------===// | 1 //===- subzero/src/IceTargetLoweringX8632.cpp - x86-32 lowering -----------===// |
| 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 TargetLoweringX8632 class, which | 10 // This file implements the TargetLoweringX8632 class, which |
| (...skipping 1118 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1129 lowerCall(Call); | 1129 lowerCall(Call); |
| 1130 } break; | 1130 } break; |
| 1131 case InstArithmetic::Fadd: | 1131 case InstArithmetic::Fadd: |
| 1132 case InstArithmetic::Fsub: | 1132 case InstArithmetic::Fsub: |
| 1133 case InstArithmetic::Fmul: | 1133 case InstArithmetic::Fmul: |
| 1134 case InstArithmetic::Fdiv: | 1134 case InstArithmetic::Fdiv: |
| 1135 case InstArithmetic::Frem: | 1135 case InstArithmetic::Frem: |
| 1136 llvm_unreachable("FP instruction with i64 type"); | 1136 llvm_unreachable("FP instruction with i64 type"); |
| 1137 break; | 1137 break; |
| 1138 } | 1138 } |
| 1139 } else { // Dest->getType() != IceType_i64 | 1139 } else if (isVectorType(Dest->getType())) { |
| 1140 switch (Inst->getOp()) { | |
| 1141 case InstArithmetic::_num: | |
| 1142 llvm_unreachable("Unknown arithmetic operator"); | |
| 1143 break; | |
| 1144 case InstArithmetic::Add: | |
| 1145 case InstArithmetic::And: | |
| 1146 case InstArithmetic::Or: | |
| 1147 case InstArithmetic::Xor: | |
| 1148 case InstArithmetic::Sub: | |
| 1149 case InstArithmetic::Mul: | |
| 1150 case InstArithmetic::Shl: | |
| 1151 case InstArithmetic::Lshr: | |
| 1152 case InstArithmetic::Ashr: | |
| 1153 case InstArithmetic::Udiv: | |
| 1154 case InstArithmetic::Sdiv: | |
| 1155 case InstArithmetic::Urem: | |
| 1156 case InstArithmetic::Srem: | |
| 1157 // TODO(wala): Handle these. | |
| 1158 Func->setError("Unhandled instruction"); | |
| 1159 break; | |
| 1160 case InstArithmetic::Fadd: { | |
| 1161 Variable *T = makeReg(Dest->getType()); | |
|
Jim Stichnoth
2014/07/11 19:56:16
Since you're adding 4 new instances of this patter
| |
| 1162 _movp(T, Src0); | |
| 1163 _addps(T, Src1); | |
| 1164 _movp(Dest, T); | |
| 1165 } break; | |
| 1166 case InstArithmetic::Fsub: { | |
| 1167 Variable *T = makeReg(Dest->getType()); | |
| 1168 _movp(T, Src0); | |
| 1169 _subps(T, Src1); | |
| 1170 _movp(Dest, T); | |
| 1171 } break; | |
| 1172 case InstArithmetic::Fmul: { | |
| 1173 Variable *T = makeReg(Dest->getType()); | |
| 1174 _movp(T, Src0); | |
| 1175 _mulps(T, Src1); | |
| 1176 _movp(Dest, T); | |
| 1177 } break; | |
| 1178 case InstArithmetic::Fdiv: { | |
| 1179 Variable *T = makeReg(Dest->getType()); | |
| 1180 _movp(T, Src0); | |
| 1181 _divps(T, Src1); | |
| 1182 _movp(Dest, T); | |
| 1183 } break; | |
| 1184 case InstArithmetic::Frem: { | |
| 1185 const SizeT MaxSrcs = 1; | |
| 1186 InstCall *Call = makeHelperCall("__frem_v4f32", Dest, MaxSrcs); | |
| 1187 Call->addArg(Src0); | |
| 1188 lowerCall(Call); | |
| 1189 } break; | |
| 1190 } | |
| 1191 } else { // Dest->getType() is non-i64 scalar | |
| 1140 Variable *T_edx = NULL; | 1192 Variable *T_edx = NULL; |
| 1141 Variable *T = NULL; | 1193 Variable *T = NULL; |
| 1142 switch (Inst->getOp()) { | 1194 switch (Inst->getOp()) { |
| 1143 case InstArithmetic::_num: | 1195 case InstArithmetic::_num: |
| 1144 llvm_unreachable("Unknown arithmetic operator"); | 1196 llvm_unreachable("Unknown arithmetic operator"); |
| 1145 break; | 1197 break; |
| 1146 case InstArithmetic::Add: | 1198 case InstArithmetic::Add: |
| 1147 _mov(T, Src0); | 1199 _mov(T, Src0); |
| 1148 _add(T, Src1); | 1200 _add(T, Src1); |
| 1149 _mov(Dest, T); | 1201 _mov(Dest, T); |
| (...skipping 297 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1447 if (ScratchRegs[i]) | 1499 if (ScratchRegs[i]) |
| 1448 KilledRegs.push_back(Func->getTarget()->getPhysicalRegister(i)); | 1500 KilledRegs.push_back(Func->getTarget()->getPhysicalRegister(i)); |
| 1449 } | 1501 } |
| 1450 Context.insert(InstFakeKill::create(Func, KilledRegs, NewCall)); | 1502 Context.insert(InstFakeKill::create(Func, KilledRegs, NewCall)); |
| 1451 | 1503 |
| 1452 // Generate a FakeUse to keep the call live if necessary. | 1504 // Generate a FakeUse to keep the call live if necessary. |
| 1453 if (Instr->hasSideEffects() && ReturnReg) { | 1505 if (Instr->hasSideEffects() && ReturnReg) { |
| 1454 Inst *FakeUse = InstFakeUse::create(Func, ReturnReg); | 1506 Inst *FakeUse = InstFakeUse::create(Func, ReturnReg); |
| 1455 Context.insert(FakeUse); | 1507 Context.insert(FakeUse); |
| 1456 } | 1508 } |
| 1457 | 1509 |
| 1458 if (!Dest) | 1510 if (!Dest) |
| 1459 return; | 1511 return; |
| 1460 | 1512 |
| 1461 // Assign the result of the call to Dest. | 1513 // Assign the result of the call to Dest. |
| 1462 if (ReturnReg) { | 1514 if (ReturnReg) { |
| 1463 if (ReturnRegHi) { | 1515 if (ReturnRegHi) { |
| 1464 assert(Dest->getType() == IceType_i64); | 1516 assert(Dest->getType() == IceType_i64); |
| 1465 split64(Dest); | 1517 split64(Dest); |
| 1466 Variable *DestLo = Dest->getLo(); | 1518 Variable *DestLo = Dest->getLo(); |
| 1467 Variable *DestHi = Dest->getHi(); | 1519 Variable *DestHi = Dest->getHi(); |
| (...skipping 1370 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2838 for (SizeT i = 0; i < Size; ++i) { | 2890 for (SizeT i = 0; i < Size; ++i) { |
| 2839 Str << "\t.byte\t" << (((unsigned)Data[i]) & 0xff) << "\n"; | 2891 Str << "\t.byte\t" << (((unsigned)Data[i]) & 0xff) << "\n"; |
| 2840 } | 2892 } |
| 2841 Str << "\t.size\t" << MangledName << ", " << Size << "\n"; | 2893 Str << "\t.size\t" << MangledName << ", " << Size << "\n"; |
| 2842 } | 2894 } |
| 2843 Str << "\t" << (IsInternal ? ".local" : ".global") << "\t" << MangledName | 2895 Str << "\t" << (IsInternal ? ".local" : ".global") << "\t" << MangledName |
| 2844 << "\n"; | 2896 << "\n"; |
| 2845 } | 2897 } |
| 2846 | 2898 |
| 2847 } // end of namespace Ice | 2899 } // end of namespace Ice |
| OLD | NEW |