LegalizeFloatTypes.cpp revision 05c397d52a145c8844790d6491c4c51d4bbfed7c
1//===-------- LegalizeFloatTypes.cpp - Legalization of float types --------===// 2// 3// The LLVM Compiler Infrastructure 4// 5// This file is distributed under the University of Illinois Open Source 6// License. See LICENSE.TXT for details. 7// 8//===----------------------------------------------------------------------===// 9// 10// This file implements float type expansion and softening for LegalizeTypes. 11// Softening is the act of turning a computation in an illegal floating point 12// type into a computation in an integer type of the same size; also known as 13// "soft float". For example, turning f32 arithmetic into operations using i32. 14// The resulting integer value is the same as what you would get by performing 15// the floating point operation and bitcasting the result to the integer type. 16// Expansion is the act of changing a computation in an illegal type to be a 17// computation in two identical registers of a smaller type. For example, 18// implementing ppcf128 arithmetic in two f64 registers. 19// 20//===----------------------------------------------------------------------===// 21 22#include "LegalizeTypes.h" 23using namespace llvm; 24 25/// GetFPLibCall - Return the right libcall for the given floating point type. 26static RTLIB::Libcall GetFPLibCall(MVT VT, 27 RTLIB::Libcall Call_F32, 28 RTLIB::Libcall Call_F64, 29 RTLIB::Libcall Call_F80, 30 RTLIB::Libcall Call_PPCF128) { 31 return 32 VT == MVT::f32 ? Call_F32 : 33 VT == MVT::f64 ? Call_F64 : 34 VT == MVT::f80 ? Call_F80 : 35 VT == MVT::ppcf128 ? Call_PPCF128 : 36 RTLIB::UNKNOWN_LIBCALL; 37} 38 39//===----------------------------------------------------------------------===// 40// Result Float to Integer Conversion. 41//===----------------------------------------------------------------------===// 42 43void DAGTypeLegalizer::SoftenFloatResult(SDNode *N, unsigned ResNo) { 44 DEBUG(cerr << "Soften float result " << ResNo << ": "; N->dump(&DAG); 45 cerr << "\n"); 46 SDOperand R = SDOperand(); 47 48 switch (N->getOpcode()) { 49 default: 50#ifndef NDEBUG 51 cerr << "SoftenFloatResult #" << ResNo << ": "; 52 N->dump(&DAG); cerr << "\n"; 53#endif 54 assert(0 && "Do not know how to soften the result of this operator!"); 55 abort(); 56 57 case ISD::BIT_CONVERT: R = SoftenFloatRes_BIT_CONVERT(N); break; 58 case ISD::BUILD_PAIR: R = SoftenFloatRes_BUILD_PAIR(N); break; 59 case ISD::ConstantFP: 60 R = SoftenFloatRes_ConstantFP(cast<ConstantFPSDNode>(N)); 61 break; 62 case ISD::FADD: R = SoftenFloatRes_FADD(N); break; 63 case ISD::FCOPYSIGN: R = SoftenFloatRes_FCOPYSIGN(N); break; 64 case ISD::FMUL: R = SoftenFloatRes_FMUL(N); break; 65 case ISD::FP_EXTEND: R = SoftenFloatRes_FP_EXTEND(N); break; 66 case ISD::FP_ROUND: R = SoftenFloatRes_FP_ROUND(N); break; 67 case ISD::FPOWI: R = SoftenFloatRes_FPOWI(N); break; 68 case ISD::FSUB: R = SoftenFloatRes_FSUB(N); break; 69 case ISD::LOAD: R = SoftenFloatRes_LOAD(N); break; 70 case ISD::SELECT: R = SoftenFloatRes_SELECT(N); break; 71 case ISD::SELECT_CC: R = SoftenFloatRes_SELECT_CC(N); break; 72 case ISD::SINT_TO_FP: R = SoftenFloatRes_SINT_TO_FP(N); break; 73 case ISD::UINT_TO_FP: R = SoftenFloatRes_UINT_TO_FP(N); break; 74 } 75 76 // If R is null, the sub-method took care of registering the result. 77 if (R.Val) 78 SetSoftenedFloat(SDOperand(N, ResNo), R); 79} 80 81SDOperand DAGTypeLegalizer::SoftenFloatRes_BIT_CONVERT(SDNode *N) { 82 return BitConvertToInteger(N->getOperand(0)); 83} 84 85SDOperand DAGTypeLegalizer::SoftenFloatRes_BUILD_PAIR(SDNode *N) { 86 // Convert the inputs to integers, and build a new pair out of them. 87 return DAG.getNode(ISD::BUILD_PAIR, 88 TLI.getTypeToTransformTo(N->getValueType(0)), 89 BitConvertToInteger(N->getOperand(0)), 90 BitConvertToInteger(N->getOperand(1))); 91} 92 93SDOperand DAGTypeLegalizer::SoftenFloatRes_ConstantFP(ConstantFPSDNode *N) { 94 return DAG.getConstant(N->getValueAPF().convertToAPInt(), 95 TLI.getTypeToTransformTo(N->getValueType(0))); 96} 97 98SDOperand DAGTypeLegalizer::SoftenFloatRes_FADD(SDNode *N) { 99 MVT NVT = TLI.getTypeToTransformTo(N->getValueType(0)); 100 SDOperand Ops[2] = { GetSoftenedFloat(N->getOperand(0)), 101 GetSoftenedFloat(N->getOperand(1)) }; 102 return MakeLibCall(GetFPLibCall(N->getValueType(0), 103 RTLIB::ADD_F32, 104 RTLIB::ADD_F64, 105 RTLIB::ADD_F80, 106 RTLIB::ADD_PPCF128), 107 NVT, Ops, 2, false); 108} 109 110SDOperand DAGTypeLegalizer::SoftenFloatRes_FCOPYSIGN(SDNode *N) { 111 SDOperand LHS = GetSoftenedFloat(N->getOperand(0)); 112 SDOperand RHS = BitConvertToInteger(N->getOperand(1)); 113 114 MVT LVT = LHS.getValueType(); 115 MVT RVT = RHS.getValueType(); 116 117 unsigned LSize = LVT.getSizeInBits(); 118 unsigned RSize = RVT.getSizeInBits(); 119 120 // First get the sign bit of second operand. 121 SDOperand SignBit = DAG.getNode(ISD::SHL, RVT, DAG.getConstant(1, RVT), 122 DAG.getConstant(RSize - 1, 123 TLI.getShiftAmountTy())); 124 SignBit = DAG.getNode(ISD::AND, RVT, RHS, SignBit); 125 126 // Shift right or sign-extend it if the two operands have different types. 127 int SizeDiff = RVT.getSizeInBits() - LVT.getSizeInBits(); 128 if (SizeDiff > 0) { 129 SignBit = DAG.getNode(ISD::SRL, RVT, SignBit, 130 DAG.getConstant(SizeDiff, TLI.getShiftAmountTy())); 131 SignBit = DAG.getNode(ISD::TRUNCATE, LVT, SignBit); 132 } else if (SizeDiff < 0) { 133 SignBit = DAG.getNode(ISD::ANY_EXTEND, LVT, SignBit); 134 SignBit = DAG.getNode(ISD::SHL, LVT, SignBit, 135 DAG.getConstant(-SizeDiff, TLI.getShiftAmountTy())); 136 } 137 138 // Clear the sign bit of the first operand. 139 SDOperand Mask = DAG.getNode(ISD::SHL, LVT, DAG.getConstant(1, LVT), 140 DAG.getConstant(LSize - 1, 141 TLI.getShiftAmountTy())); 142 Mask = DAG.getNode(ISD::SUB, LVT, Mask, DAG.getConstant(1, LVT)); 143 LHS = DAG.getNode(ISD::AND, LVT, LHS, Mask); 144 145 // Or the value with the sign bit. 146 return DAG.getNode(ISD::OR, LVT, LHS, SignBit); 147} 148 149SDOperand DAGTypeLegalizer::SoftenFloatRes_FMUL(SDNode *N) { 150 MVT NVT = TLI.getTypeToTransformTo(N->getValueType(0)); 151 SDOperand Ops[2] = { GetSoftenedFloat(N->getOperand(0)), 152 GetSoftenedFloat(N->getOperand(1)) }; 153 return MakeLibCall(GetFPLibCall(N->getValueType(0), 154 RTLIB::MUL_F32, 155 RTLIB::MUL_F64, 156 RTLIB::MUL_F80, 157 RTLIB::MUL_PPCF128), 158 NVT, Ops, 2, false); 159} 160 161SDOperand DAGTypeLegalizer::SoftenFloatRes_FP_EXTEND(SDNode *N) { 162 MVT NVT = TLI.getTypeToTransformTo(N->getValueType(0)); 163 SDOperand Op = N->getOperand(0); 164 165 RTLIB::Libcall LC = RTLIB::UNKNOWN_LIBCALL; 166 switch (Op.getValueType().getSimpleVT()) { 167 default: 168 assert(false && "Unsupported FP_EXTEND!"); 169 case MVT::f32: 170 switch (N->getValueType(0).getSimpleVT()) { 171 default: 172 assert(false && "Unsupported FP_EXTEND!"); 173 case MVT::f64: 174 LC = RTLIB::FPEXT_F32_F64; 175 } 176 } 177 178 return MakeLibCall(LC, NVT, &Op, 1, false); 179} 180 181SDOperand DAGTypeLegalizer::SoftenFloatRes_FP_ROUND(SDNode *N) { 182 MVT NVT = TLI.getTypeToTransformTo(N->getValueType(0)); 183 SDOperand Op = N->getOperand(0); 184 185 RTLIB::Libcall LC = RTLIB::UNKNOWN_LIBCALL; 186 switch (Op.getValueType().getSimpleVT()) { 187 default: 188 assert(false && "Unsupported FP_ROUND!"); 189 case MVT::f64: 190 switch (N->getValueType(0).getSimpleVT()) { 191 default: 192 assert(false && "Unsupported FP_ROUND!"); 193 case MVT::f32: 194 LC = RTLIB::FPROUND_F64_F32; 195 } 196 } 197 198 return MakeLibCall(LC, NVT, &Op, 1, false); 199} 200 201SDOperand DAGTypeLegalizer::SoftenFloatRes_FPOWI(SDNode *N) { 202 MVT NVT = TLI.getTypeToTransformTo(N->getValueType(0)); 203 SDOperand Ops[2] = { GetSoftenedFloat(N->getOperand(0)), N->getOperand(1) }; 204 return MakeLibCall(GetFPLibCall(N->getValueType(0), 205 RTLIB::POWI_F32, 206 RTLIB::POWI_F64, 207 RTLIB::POWI_F80, 208 RTLIB::POWI_PPCF128), 209 NVT, Ops, 2, false); 210} 211 212SDOperand DAGTypeLegalizer::SoftenFloatRes_FSUB(SDNode *N) { 213 MVT NVT = TLI.getTypeToTransformTo(N->getValueType(0)); 214 SDOperand Ops[2] = { GetSoftenedFloat(N->getOperand(0)), 215 GetSoftenedFloat(N->getOperand(1)) }; 216 return MakeLibCall(GetFPLibCall(N->getValueType(0), 217 RTLIB::SUB_F32, 218 RTLIB::SUB_F64, 219 RTLIB::SUB_F80, 220 RTLIB::SUB_PPCF128), 221 NVT, Ops, 2, false); 222} 223 224SDOperand DAGTypeLegalizer::SoftenFloatRes_LOAD(SDNode *N) { 225 LoadSDNode *L = cast<LoadSDNode>(N); 226 MVT VT = N->getValueType(0); 227 MVT NVT = TLI.getTypeToTransformTo(VT); 228 229 SDOperand NewL; 230 if (L->getExtensionType() == ISD::NON_EXTLOAD) { 231 NewL = DAG.getLoad(L->getAddressingMode(), L->getExtensionType(), 232 NVT, L->getChain(), L->getBasePtr(), L->getOffset(), 233 L->getSrcValue(), L->getSrcValueOffset(), NVT, 234 L->isVolatile(), L->getAlignment()); 235 // Legalized the chain result - switch anything that used the old chain to 236 // use the new one. 237 ReplaceValueWith(SDOperand(N, 1), NewL.getValue(1)); 238 return NewL; 239 } 240 241 // Do a non-extending load followed by FP_EXTEND. 242 NewL = DAG.getLoad(L->getAddressingMode(), ISD::NON_EXTLOAD, 243 L->getMemoryVT(), L->getChain(), 244 L->getBasePtr(), L->getOffset(), 245 L->getSrcValue(), L->getSrcValueOffset(), 246 L->getMemoryVT(), 247 L->isVolatile(), L->getAlignment()); 248 // Legalized the chain result - switch anything that used the old chain to 249 // use the new one. 250 ReplaceValueWith(SDOperand(N, 1), NewL.getValue(1)); 251 return BitConvertToInteger(DAG.getNode(ISD::FP_EXTEND, VT, NewL)); 252} 253 254SDOperand DAGTypeLegalizer::SoftenFloatRes_SELECT(SDNode *N) { 255 SDOperand LHS = GetSoftenedFloat(N->getOperand(1)); 256 SDOperand RHS = GetSoftenedFloat(N->getOperand(2)); 257 return DAG.getNode(ISD::SELECT, LHS.getValueType(), N->getOperand(0),LHS,RHS); 258} 259 260SDOperand DAGTypeLegalizer::SoftenFloatRes_SELECT_CC(SDNode *N) { 261 SDOperand LHS = GetSoftenedFloat(N->getOperand(2)); 262 SDOperand RHS = GetSoftenedFloat(N->getOperand(3)); 263 return DAG.getNode(ISD::SELECT_CC, LHS.getValueType(), N->getOperand(0), 264 N->getOperand(1), LHS, RHS, N->getOperand(4)); 265} 266 267SDOperand DAGTypeLegalizer::SoftenFloatRes_SINT_TO_FP(SDNode *N) { 268 SDOperand Op = N->getOperand(0); 269 MVT RVT = N->getValueType(0); 270 271 RTLIB::Libcall LC = RTLIB::UNKNOWN_LIBCALL; 272 switch (Op.getValueType().getSimpleVT()) { 273 case MVT::i32: 274 switch (RVT.getSimpleVT()) { 275 case MVT::f32: 276 LC = RTLIB::SINTTOFP_I32_F32; 277 break; 278 case MVT::f64: 279 LC = RTLIB::SINTTOFP_I32_F64; 280 break; 281 default: 282 break; 283 } 284 break; 285 case MVT::i64: 286 switch (RVT.getSimpleVT()) { 287 case MVT::f32: 288 LC = RTLIB::SINTTOFP_I64_F32; 289 break; 290 case MVT::f64: 291 LC = RTLIB::SINTTOFP_I64_F64; 292 break; 293 case MVT::f80: 294 LC = RTLIB::SINTTOFP_I64_F80; 295 break; 296 case MVT::ppcf128: 297 LC = RTLIB::SINTTOFP_I64_PPCF128; 298 break; 299 default: 300 break; 301 } 302 break; 303 case MVT::i128: 304 switch (RVT.getSimpleVT()) { 305 case MVT::f32: 306 LC = RTLIB::SINTTOFP_I128_F32; 307 break; 308 case MVT::f64: 309 LC = RTLIB::SINTTOFP_I128_F64; 310 break; 311 case MVT::f80: 312 LC = RTLIB::SINTTOFP_I128_F80; 313 break; 314 case MVT::ppcf128: 315 LC = RTLIB::SINTTOFP_I128_PPCF128; 316 break; 317 default: 318 break; 319 } 320 break; 321 default: 322 break; 323 } 324 assert(LC != RTLIB::UNKNOWN_LIBCALL && "Unsupported SINT_TO_FP!"); 325 326 return MakeLibCall(LC, TLI.getTypeToTransformTo(RVT), &Op, 1, false); 327} 328 329SDOperand DAGTypeLegalizer::SoftenFloatRes_UINT_TO_FP(SDNode *N) { 330 SDOperand Op = N->getOperand(0); 331 MVT RVT = N->getValueType(0); 332 333 RTLIB::Libcall LC = RTLIB::UNKNOWN_LIBCALL; 334 switch (Op.getValueType().getSimpleVT()) { 335 case MVT::i32: 336 switch (RVT.getSimpleVT()) { 337 case MVT::f32: 338 LC = RTLIB::UINTTOFP_I32_F32; 339 break; 340 case MVT::f64: 341 LC = RTLIB::UINTTOFP_I32_F64; 342 break; 343 default: 344 break; 345 } 346 break; 347 case MVT::i64: 348 switch (RVT.getSimpleVT()) { 349 case MVT::f32: 350 LC = RTLIB::UINTTOFP_I64_F32; 351 break; 352 case MVT::f64: 353 LC = RTLIB::UINTTOFP_I64_F64; 354 break; 355 default: 356 break; 357 } 358 break; 359 default: 360 break; 361 } 362 assert(LC != RTLIB::UNKNOWN_LIBCALL && "Unsupported UINT_TO_FP!"); 363 364 return MakeLibCall(LC, TLI.getTypeToTransformTo(RVT), &Op, 1, false); 365} 366 367 368//===----------------------------------------------------------------------===// 369// Operand Float to Integer Conversion.. 370//===----------------------------------------------------------------------===// 371 372bool DAGTypeLegalizer::SoftenFloatOperand(SDNode *N, unsigned OpNo) { 373 DEBUG(cerr << "Soften float operand " << OpNo << ": "; N->dump(&DAG); 374 cerr << "\n"); 375 SDOperand Res = SDOperand(); 376 377 switch (N->getOpcode()) { 378 default: 379#ifndef NDEBUG 380 cerr << "SoftenFloatOperand Op #" << OpNo << ": "; 381 N->dump(&DAG); cerr << "\n"; 382#endif 383 assert(0 && "Do not know how to soften this operator's operand!"); 384 abort(); 385 386 case ISD::BIT_CONVERT: Res = SoftenFloatOp_BIT_CONVERT(N); break; 387 case ISD::BR_CC: Res = SoftenFloatOp_BR_CC(N); break; 388 case ISD::FP_TO_SINT: Res = SoftenFloatOp_FP_TO_SINT(N); break; 389 case ISD::FP_TO_UINT: Res = SoftenFloatOp_FP_TO_UINT(N); break; 390 case ISD::SELECT_CC: Res = SoftenFloatOp_SELECT_CC(N); break; 391 case ISD::SETCC: Res = SoftenFloatOp_SETCC(N); break; 392 case ISD::STORE: Res = SoftenFloatOp_STORE(N, OpNo); break; 393 } 394 395 // If the result is null, the sub-method took care of registering results etc. 396 if (!Res.Val) return false; 397 398 // If the result is N, the sub-method updated N in place. Check to see if any 399 // operands are new, and if so, mark them. 400 if (Res.Val == N) { 401 // Mark N as new and remark N and its operands. This allows us to correctly 402 // revisit N if it needs another step of promotion and allows us to visit 403 // any new operands to N. 404 ReanalyzeNode(N); 405 return true; 406 } 407 408 assert(Res.getValueType() == N->getValueType(0) && N->getNumValues() == 1 && 409 "Invalid operand expansion"); 410 411 ReplaceValueWith(SDOperand(N, 0), Res); 412 return false; 413} 414 415/// SoftenSetCCOperands - Soften the operands of a comparison. This code is 416/// shared among BR_CC, SELECT_CC, and SETCC handlers. 417void DAGTypeLegalizer::SoftenSetCCOperands(SDOperand &NewLHS, SDOperand &NewRHS, 418 ISD::CondCode &CCCode) { 419 SDOperand LHSInt = GetSoftenedFloat(NewLHS); 420 SDOperand RHSInt = GetSoftenedFloat(NewRHS); 421 MVT VT = NewLHS.getValueType(); 422 423 assert((VT == MVT::f32 || VT == MVT::f64) && "Unsupported setcc type!"); 424 425 // Expand into one or more soft-fp libcall(s). 426 RTLIB::Libcall LC1 = RTLIB::UNKNOWN_LIBCALL, LC2 = RTLIB::UNKNOWN_LIBCALL; 427 switch (CCCode) { 428 case ISD::SETEQ: 429 case ISD::SETOEQ: 430 LC1 = (VT == MVT::f32) ? RTLIB::OEQ_F32 : RTLIB::OEQ_F64; 431 break; 432 case ISD::SETNE: 433 case ISD::SETUNE: 434 LC1 = (VT == MVT::f32) ? RTLIB::UNE_F32 : RTLIB::UNE_F64; 435 break; 436 case ISD::SETGE: 437 case ISD::SETOGE: 438 LC1 = (VT == MVT::f32) ? RTLIB::OGE_F32 : RTLIB::OGE_F64; 439 break; 440 case ISD::SETLT: 441 case ISD::SETOLT: 442 LC1 = (VT == MVT::f32) ? RTLIB::OLT_F32 : RTLIB::OLT_F64; 443 break; 444 case ISD::SETLE: 445 case ISD::SETOLE: 446 LC1 = (VT == MVT::f32) ? RTLIB::OLE_F32 : RTLIB::OLE_F64; 447 break; 448 case ISD::SETGT: 449 case ISD::SETOGT: 450 LC1 = (VT == MVT::f32) ? RTLIB::OGT_F32 : RTLIB::OGT_F64; 451 break; 452 case ISD::SETUO: 453 LC1 = (VT == MVT::f32) ? RTLIB::UO_F32 : RTLIB::UO_F64; 454 break; 455 case ISD::SETO: 456 LC1 = (VT == MVT::f32) ? RTLIB::O_F32 : RTLIB::O_F64; 457 break; 458 default: 459 LC1 = (VT == MVT::f32) ? RTLIB::UO_F32 : RTLIB::UO_F64; 460 switch (CCCode) { 461 case ISD::SETONE: 462 // SETONE = SETOLT | SETOGT 463 LC1 = (VT == MVT::f32) ? RTLIB::OLT_F32 : RTLIB::OLT_F64; 464 // Fallthrough 465 case ISD::SETUGT: 466 LC2 = (VT == MVT::f32) ? RTLIB::OGT_F32 : RTLIB::OGT_F64; 467 break; 468 case ISD::SETUGE: 469 LC2 = (VT == MVT::f32) ? RTLIB::OGE_F32 : RTLIB::OGE_F64; 470 break; 471 case ISD::SETULT: 472 LC2 = (VT == MVT::f32) ? RTLIB::OLT_F32 : RTLIB::OLT_F64; 473 break; 474 case ISD::SETULE: 475 LC2 = (VT == MVT::f32) ? RTLIB::OLE_F32 : RTLIB::OLE_F64; 476 break; 477 case ISD::SETUEQ: 478 LC2 = (VT == MVT::f32) ? RTLIB::OEQ_F32 : RTLIB::OEQ_F64; 479 break; 480 default: assert(false && "Do not know how to soften this setcc!"); 481 } 482 } 483 484 MVT RetVT = MVT::i32; // FIXME: is this the correct return type? 485 SDOperand Ops[2] = { LHSInt, RHSInt }; 486 NewLHS = MakeLibCall(LC1, RetVT, Ops, 2, false/*sign irrelevant*/); 487 NewRHS = DAG.getConstant(0, RetVT); 488 CCCode = TLI.getCmpLibcallCC(LC1); 489 if (LC2 != RTLIB::UNKNOWN_LIBCALL) { 490 SDOperand Tmp = DAG.getNode(ISD::SETCC, TLI.getSetCCResultType(NewLHS), 491 NewLHS, NewRHS, DAG.getCondCode(CCCode)); 492 NewLHS = MakeLibCall(LC2, RetVT, Ops, 2, false/*sign irrelevant*/); 493 NewLHS = DAG.getNode(ISD::SETCC, TLI.getSetCCResultType(NewLHS), NewLHS, 494 NewRHS, DAG.getCondCode(TLI.getCmpLibcallCC(LC2))); 495 NewLHS = DAG.getNode(ISD::OR, Tmp.getValueType(), Tmp, NewLHS); 496 NewRHS = SDOperand(); 497 } 498} 499 500SDOperand DAGTypeLegalizer::SoftenFloatOp_BIT_CONVERT(SDNode *N) { 501 return DAG.getNode(ISD::BIT_CONVERT, N->getValueType(0), 502 GetSoftenedFloat(N->getOperand(0))); 503} 504 505SDOperand DAGTypeLegalizer::SoftenFloatOp_BR_CC(SDNode *N) { 506 SDOperand NewLHS = N->getOperand(2), NewRHS = N->getOperand(3); 507 ISD::CondCode CCCode = cast<CondCodeSDNode>(N->getOperand(1))->get(); 508 SoftenSetCCOperands(NewLHS, NewRHS, CCCode); 509 510 // If SoftenSetCCOperands returned a scalar, we need to compare the result 511 // against zero to select between true and false values. 512 if (NewRHS.Val == 0) { 513 NewRHS = DAG.getConstant(0, NewLHS.getValueType()); 514 CCCode = ISD::SETNE; 515 } 516 517 // Update N to have the operands specified. 518 return DAG.UpdateNodeOperands(SDOperand(N, 0), N->getOperand(0), 519 DAG.getCondCode(CCCode), NewLHS, NewRHS, 520 N->getOperand(4)); 521} 522 523SDOperand DAGTypeLegalizer::SoftenFloatOp_FP_TO_SINT(SDNode *N) { 524 MVT SVT = N->getOperand(0).getValueType(); 525 MVT RVT = N->getValueType(0); 526 527 RTLIB::Libcall LC = RTLIB::UNKNOWN_LIBCALL; 528 switch (RVT.getSimpleVT()) { 529 case MVT::i32: 530 switch (SVT.getSimpleVT()) { 531 case MVT::f32: 532 LC = RTLIB::FPTOSINT_F32_I32; 533 break; 534 case MVT::f64: 535 LC = RTLIB::FPTOSINT_F64_I32; 536 break; 537 case MVT::f80: 538 LC = RTLIB::FPTOSINT_F80_I32; 539 break; 540 case MVT::ppcf128: 541 LC = RTLIB::FPTOSINT_PPCF128_I32; 542 break; 543 default: 544 break; 545 } 546 break; 547 case MVT::i64: 548 switch (SVT.getSimpleVT()) { 549 case MVT::f32: 550 LC = RTLIB::FPTOSINT_F32_I64; 551 break; 552 case MVT::f64: 553 LC = RTLIB::FPTOSINT_F64_I64; 554 break; 555 case MVT::f80: 556 LC = RTLIB::FPTOSINT_F80_I64; 557 break; 558 case MVT::ppcf128: 559 LC = RTLIB::FPTOSINT_PPCF128_I64; 560 break; 561 default: 562 break; 563 } 564 break; 565 case MVT::i128: 566 switch (SVT.getSimpleVT()) { 567 case MVT::f32: 568 LC = RTLIB::FPTOSINT_F32_I128; 569 break; 570 case MVT::f64: 571 LC = RTLIB::FPTOSINT_F64_I128; 572 break; 573 case MVT::f80: 574 LC = RTLIB::FPTOSINT_F80_I128; 575 break; 576 case MVT::ppcf128: 577 LC = RTLIB::FPTOSINT_PPCF128_I128; 578 break; 579 default: 580 break; 581 } 582 break; 583 default: 584 break; 585 } 586 assert(LC != RTLIB::UNKNOWN_LIBCALL && "Unsupported FP_TO_SINT!"); 587 588 SDOperand Op = GetSoftenedFloat(N->getOperand(0)); 589 return MakeLibCall(LC, RVT, &Op, 1, false); 590} 591 592SDOperand DAGTypeLegalizer::SoftenFloatOp_FP_TO_UINT(SDNode *N) { 593 MVT SVT = N->getOperand(0).getValueType(); 594 MVT RVT = N->getValueType(0); 595 596 RTLIB::Libcall LC = RTLIB::UNKNOWN_LIBCALL; 597 switch (RVT.getSimpleVT()) { 598 case MVT::i32: 599 switch (SVT.getSimpleVT()) { 600 case MVT::f32: 601 LC = RTLIB::FPTOUINT_F32_I32; 602 break; 603 case MVT::f64: 604 LC = RTLIB::FPTOUINT_F64_I32; 605 break; 606 case MVT::f80: 607 LC = RTLIB::FPTOUINT_F80_I32; 608 break; 609 case MVT::ppcf128: 610 LC = RTLIB::FPTOUINT_PPCF128_I32; 611 break; 612 default: 613 break; 614 } 615 break; 616 case MVT::i64: 617 switch (SVT.getSimpleVT()) { 618 case MVT::f32: 619 LC = RTLIB::FPTOUINT_F32_I64; 620 break; 621 case MVT::f64: 622 LC = RTLIB::FPTOUINT_F64_I64; 623 break; 624 case MVT::f80: 625 LC = RTLIB::FPTOUINT_F80_I64; 626 break; 627 case MVT::ppcf128: 628 LC = RTLIB::FPTOUINT_PPCF128_I64; 629 break; 630 default: 631 break; 632 } 633 break; 634 case MVT::i128: 635 switch (SVT.getSimpleVT()) { 636 case MVT::f32: 637 LC = RTLIB::FPTOUINT_F32_I128; 638 break; 639 case MVT::f64: 640 LC = RTLIB::FPTOUINT_F64_I128; 641 break; 642 case MVT::f80: 643 LC = RTLIB::FPTOUINT_F80_I128; 644 break; 645 case MVT::ppcf128: 646 LC = RTLIB::FPTOUINT_PPCF128_I128; 647 break; 648 default: 649 break; 650 } 651 break; 652 default: 653 break; 654 } 655 assert(LC != RTLIB::UNKNOWN_LIBCALL && "Unsupported FP_TO_UINT!"); 656 657 SDOperand Op = GetSoftenedFloat(N->getOperand(0)); 658 return MakeLibCall(LC, RVT, &Op, 1, false); 659} 660 661SDOperand DAGTypeLegalizer::SoftenFloatOp_SELECT_CC(SDNode *N) { 662 SDOperand NewLHS = N->getOperand(0), NewRHS = N->getOperand(1); 663 ISD::CondCode CCCode = cast<CondCodeSDNode>(N->getOperand(4))->get(); 664 SoftenSetCCOperands(NewLHS, NewRHS, CCCode); 665 666 // If SoftenSetCCOperands returned a scalar, we need to compare the result 667 // against zero to select between true and false values. 668 if (NewRHS.Val == 0) { 669 NewRHS = DAG.getConstant(0, NewLHS.getValueType()); 670 CCCode = ISD::SETNE; 671 } 672 673 // Update N to have the operands specified. 674 return DAG.UpdateNodeOperands(SDOperand(N, 0), NewLHS, NewRHS, 675 N->getOperand(2), N->getOperand(3), 676 DAG.getCondCode(CCCode)); 677} 678 679SDOperand DAGTypeLegalizer::SoftenFloatOp_SETCC(SDNode *N) { 680 SDOperand NewLHS = N->getOperand(0), NewRHS = N->getOperand(1); 681 ISD::CondCode CCCode = cast<CondCodeSDNode>(N->getOperand(2))->get(); 682 SoftenSetCCOperands(NewLHS, NewRHS, CCCode); 683 684 // If SoftenSetCCOperands returned a scalar, use it. 685 if (NewRHS.Val == 0) { 686 assert(NewLHS.getValueType() == N->getValueType(0) && 687 "Unexpected setcc expansion!"); 688 return NewLHS; 689 } 690 691 // Otherwise, update N to have the operands specified. 692 return DAG.UpdateNodeOperands(SDOperand(N, 0), NewLHS, NewRHS, 693 DAG.getCondCode(CCCode)); 694} 695 696SDOperand DAGTypeLegalizer::SoftenFloatOp_STORE(SDNode *N, unsigned OpNo) { 697 assert(ISD::isUNINDEXEDStore(N) && "Indexed store during type legalization!"); 698 assert(OpNo == 1 && "Can only soften the stored value!"); 699 StoreSDNode *ST = cast<StoreSDNode>(N); 700 SDOperand Val = ST->getValue(); 701 702 if (ST->isTruncatingStore()) 703 // Do an FP_ROUND followed by a non-truncating store. 704 Val = BitConvertToInteger(DAG.getNode(ISD::FP_ROUND, ST->getMemoryVT(), 705 Val, DAG.getIntPtrConstant(0))); 706 else 707 Val = GetSoftenedFloat(Val); 708 709 return DAG.getStore(ST->getChain(), Val, ST->getBasePtr(), 710 ST->getSrcValue(), ST->getSrcValueOffset(), 711 ST->isVolatile(), ST->getAlignment()); 712} 713 714 715//===----------------------------------------------------------------------===// 716// Float Result Expansion 717//===----------------------------------------------------------------------===// 718 719/// ExpandFloatResult - This method is called when the specified result of the 720/// specified node is found to need expansion. At this point, the node may also 721/// have invalid operands or may have other results that need promotion, we just 722/// know that (at least) one result needs expansion. 723void DAGTypeLegalizer::ExpandFloatResult(SDNode *N, unsigned ResNo) { 724 DEBUG(cerr << "Expand float result: "; N->dump(&DAG); cerr << "\n"); 725 SDOperand Lo, Hi; 726 Lo = Hi = SDOperand(); 727 728 // See if the target wants to custom expand this node. 729 if (TLI.getOperationAction(N->getOpcode(), N->getValueType(ResNo)) == 730 TargetLowering::Custom) { 731 // If the target wants to, allow it to lower this itself. 732 if (SDNode *P = TLI.ReplaceNodeResults(N, DAG)) { 733 // Everything that once used N now uses P. We are guaranteed that the 734 // result value types of N and the result value types of P match. 735 ReplaceNodeWith(N, P); 736 return; 737 } 738 } 739 740 switch (N->getOpcode()) { 741 default: 742#ifndef NDEBUG 743 cerr << "ExpandFloatResult #" << ResNo << ": "; 744 N->dump(&DAG); cerr << "\n"; 745#endif 746 assert(0 && "Do not know how to expand the result of this operator!"); 747 abort(); 748 749 case ISD::MERGE_VALUES: SplitRes_MERGE_VALUES(N, Lo, Hi); break; 750 case ISD::UNDEF: SplitRes_UNDEF(N, Lo, Hi); break; 751 case ISD::SELECT: SplitRes_SELECT(N, Lo, Hi); break; 752 case ISD::SELECT_CC: SplitRes_SELECT_CC(N, Lo, Hi); break; 753 754 case ISD::BIT_CONVERT: ExpandRes_BIT_CONVERT(N, Lo, Hi); break; 755 case ISD::BUILD_PAIR: ExpandRes_BUILD_PAIR(N, Lo, Hi); break; 756 case ISD::EXTRACT_ELEMENT: ExpandRes_EXTRACT_ELEMENT(N, Lo, Hi); break; 757 case ISD::EXTRACT_VECTOR_ELT: ExpandRes_EXTRACT_VECTOR_ELT(N, Lo, Hi); break; 758 759 case ISD::ConstantFP: ExpandFloatRes_ConstantFP(N, Lo, Hi); break; 760 case ISD::FABS: ExpandFloatRes_FABS(N, Lo, Hi); break; 761 case ISD::FADD: ExpandFloatRes_FADD(N, Lo, Hi); break; 762 case ISD::FDIV: ExpandFloatRes_FDIV(N, Lo, Hi); break; 763 case ISD::FMUL: ExpandFloatRes_FMUL(N, Lo, Hi); break; 764 case ISD::FSUB: ExpandFloatRes_FSUB(N, Lo, Hi); break; 765 case ISD::LOAD: ExpandFloatRes_LOAD(N, Lo, Hi); break; 766 case ISD::SINT_TO_FP: 767 case ISD::UINT_TO_FP: ExpandFloatRes_XINT_TO_FP(N, Lo, Hi); break; 768 } 769 770 // If Lo/Hi is null, the sub-method took care of registering results etc. 771 if (Lo.Val) 772 SetExpandedFloat(SDOperand(N, ResNo), Lo, Hi); 773} 774 775void DAGTypeLegalizer::ExpandFloatRes_ConstantFP(SDNode *N, SDOperand &Lo, 776 SDOperand &Hi) { 777 MVT NVT = TLI.getTypeToTransformTo(N->getValueType(0)); 778 assert(NVT.getSizeInBits() == integerPartWidth && 779 "Do not know how to expand this float constant!"); 780 APInt C = cast<ConstantFPSDNode>(N)->getValueAPF().convertToAPInt(); 781 Lo = DAG.getConstantFP(APFloat(APInt(integerPartWidth, 1, 782 &C.getRawData()[1])), NVT); 783 Hi = DAG.getConstantFP(APFloat(APInt(integerPartWidth, 1, 784 &C.getRawData()[0])), NVT); 785} 786 787void DAGTypeLegalizer::ExpandFloatRes_FADD(SDNode *N, SDOperand &Lo, 788 SDOperand &Hi) { 789 SDOperand Ops[2] = { N->getOperand(0), N->getOperand(1) }; 790 SDOperand Call = MakeLibCall(GetFPLibCall(N->getValueType(0), 791 RTLIB::ADD_F32, 792 RTLIB::ADD_F64, 793 RTLIB::ADD_F80, 794 RTLIB::ADD_PPCF128), 795 N->getValueType(0), Ops, 2, 796 false); 797 assert(Call.Val->getOpcode() == ISD::BUILD_PAIR && "Call lowered wrongly!"); 798 Lo = Call.getOperand(0); Hi = Call.getOperand(1); 799} 800 801void DAGTypeLegalizer::ExpandFloatRes_FABS(SDNode *N, SDOperand &Lo, 802 SDOperand &Hi) { 803 assert(N->getValueType(0) == MVT::ppcf128 && 804 "Logic only correct for ppcf128!"); 805 SDOperand Tmp; 806 GetExpandedFloat(N->getOperand(0), Lo, Tmp); 807 Hi = DAG.getNode(ISD::FABS, Tmp.getValueType(), Tmp); 808 // Lo = Hi==fabs(Hi) ? Lo : -Lo; 809 Lo = DAG.getNode(ISD::SELECT_CC, Lo.getValueType(), Tmp, Hi, Lo, 810 DAG.getNode(ISD::FNEG, Lo.getValueType(), Lo), 811 DAG.getCondCode(ISD::SETEQ)); 812} 813 814void DAGTypeLegalizer::ExpandFloatRes_FDIV(SDNode *N, SDOperand &Lo, 815 SDOperand &Hi) { 816 SDOperand Ops[2] = { N->getOperand(0), N->getOperand(1) }; 817 SDOperand Call = MakeLibCall(GetFPLibCall(N->getValueType(0), 818 RTLIB::DIV_F32, 819 RTLIB::DIV_F64, 820 RTLIB::DIV_F80, 821 RTLIB::DIV_PPCF128), 822 N->getValueType(0), Ops, 2, 823 false); 824 assert(Call.Val->getOpcode() == ISD::BUILD_PAIR && "Call lowered wrongly!"); 825 Lo = Call.getOperand(0); Hi = Call.getOperand(1); 826} 827 828void DAGTypeLegalizer::ExpandFloatRes_FMUL(SDNode *N, SDOperand &Lo, 829 SDOperand &Hi) { 830 SDOperand Ops[2] = { N->getOperand(0), N->getOperand(1) }; 831 SDOperand Call = MakeLibCall(GetFPLibCall(N->getValueType(0), 832 RTLIB::MUL_F32, 833 RTLIB::MUL_F64, 834 RTLIB::MUL_F80, 835 RTLIB::MUL_PPCF128), 836 N->getValueType(0), Ops, 2, 837 false); 838 assert(Call.Val->getOpcode() == ISD::BUILD_PAIR && "Call lowered wrongly!"); 839 Lo = Call.getOperand(0); Hi = Call.getOperand(1); 840} 841 842void DAGTypeLegalizer::ExpandFloatRes_FSUB(SDNode *N, SDOperand &Lo, 843 SDOperand &Hi) { 844 SDOperand Ops[2] = { N->getOperand(0), N->getOperand(1) }; 845 SDOperand Call = MakeLibCall(GetFPLibCall(N->getValueType(0), 846 RTLIB::SUB_F32, 847 RTLIB::SUB_F64, 848 RTLIB::SUB_F80, 849 RTLIB::SUB_PPCF128), 850 N->getValueType(0), Ops, 2, 851 false); 852 assert(Call.Val->getOpcode() == ISD::BUILD_PAIR && "Call lowered wrongly!"); 853 Lo = Call.getOperand(0); Hi = Call.getOperand(1); 854} 855 856void DAGTypeLegalizer::ExpandFloatRes_LOAD(SDNode *N, SDOperand &Lo, 857 SDOperand &Hi) { 858 if (ISD::isNormalLoad(N)) { 859 ExpandRes_NormalLoad(N, Lo, Hi); 860 return; 861 } 862 863 assert(ISD::isUNINDEXEDLoad(N) && "Indexed load during type legalization!"); 864 LoadSDNode *LD = cast<LoadSDNode>(N); 865 SDOperand Chain = LD->getChain(); 866 SDOperand Ptr = LD->getBasePtr(); 867 868 MVT NVT = TLI.getTypeToTransformTo(LD->getValueType(0)); 869 assert(NVT.isByteSized() && "Expanded type not byte sized!"); 870 assert(LD->getMemoryVT().bitsLE(NVT) && "Float type not round?"); 871 872 Lo = DAG.getExtLoad(LD->getExtensionType(), NVT, Chain, Ptr, 873 LD->getSrcValue(), LD->getSrcValueOffset(), 874 LD->getMemoryVT(), 875 LD->isVolatile(), LD->getAlignment()); 876 877 // Remember the chain. 878 Chain = Lo.getValue(1); 879 880 // The high part is undefined. 881 Hi = DAG.getNode(ISD::UNDEF, NVT); 882 883 // Modified the chain - switch anything that used the old chain to use the 884 // new one. 885 ReplaceValueWith(SDOperand(LD, 1), Chain); 886} 887 888void DAGTypeLegalizer::ExpandFloatRes_XINT_TO_FP(SDNode *N, SDOperand &Lo, 889 SDOperand &Hi) { 890 assert(N->getValueType(0) == MVT::ppcf128 && "Unsupported XINT_TO_FP!"); 891 MVT VT = N->getValueType(0); 892 MVT NVT = TLI.getTypeToTransformTo(VT); 893 SDOperand Src = N->getOperand(0); 894 MVT SrcVT = Src.getValueType(); 895 896 // First do an SINT_TO_FP, whether the original was signed or unsigned. 897 if (SrcVT.bitsLE(MVT::i32)) { 898 // The integer can be represented exactly in an f64. 899 Src = DAG.getNode(ISD::SIGN_EXTEND, MVT::i32, Src); 900 Lo = DAG.getConstantFP(APFloat(APInt(NVT.getSizeInBits(), 0)), NVT); 901 Hi = DAG.getNode(ISD::SINT_TO_FP, NVT, Src); 902 } else { 903 RTLIB::Libcall LC = RTLIB::UNKNOWN_LIBCALL; 904 if (SrcVT.bitsLE(MVT::i64)) { 905 Src = DAG.getNode(ISD::SIGN_EXTEND, MVT::i64, Src); 906 LC = RTLIB::SINTTOFP_I64_PPCF128; 907 } else if (SrcVT.bitsLE(MVT::i128)) { 908 Src = DAG.getNode(ISD::SIGN_EXTEND, MVT::i128, Src); 909 LC = RTLIB::SINTTOFP_I128_PPCF128; 910 } 911 assert(LC != RTLIB::UNKNOWN_LIBCALL && "Unsupported XINT_TO_FP!"); 912 913 Hi = MakeLibCall(LC, VT, &Src, 1, true); 914 assert(Hi.Val->getOpcode() == ISD::BUILD_PAIR && "Call lowered wrongly!"); 915 Lo = Hi.getOperand(0); Hi = Hi.getOperand(1); 916 } 917 918 if (N->getOpcode() == ISD::SINT_TO_FP) 919 return; 920 921 // Unsigned - fix up the SINT_TO_FP value just calculated. 922 Hi = DAG.getNode(ISD::BUILD_PAIR, VT, Lo, Hi); 923 SrcVT = Src.getValueType(); 924 925 // x>=0 ? (ppcf128)(iN)x : (ppcf128)(iN)x + 2^N; N=32,64,128. 926 static const uint64_t TwoE32[] = { 0x41f0000000000000LL, 0 }; 927 static const uint64_t TwoE64[] = { 0x43f0000000000000LL, 0 }; 928 static const uint64_t TwoE128[] = { 0x47f0000000000000LL, 0 }; 929 const uint64_t *Parts = 0; 930 931 switch (SrcVT.getSimpleVT()) { 932 default: 933 assert(false && "Unsupported UINT_TO_FP!"); 934 case MVT::i32: 935 Parts = TwoE32; 936 case MVT::i64: 937 Parts = TwoE64; 938 case MVT::i128: 939 Parts = TwoE128; 940 } 941 942 Lo = DAG.getNode(ISD::FADD, VT, Hi, 943 DAG.getConstantFP(APFloat(APInt(128, 2, Parts)), 944 MVT::ppcf128)); 945 Lo = DAG.getNode(ISD::SELECT_CC, VT, Src, DAG.getConstant(0, SrcVT), Lo, Hi, 946 DAG.getCondCode(ISD::SETLT)); 947 Hi = DAG.getNode(ISD::EXTRACT_ELEMENT, NVT, Lo, 948 DAG.getConstant(1, TLI.getPointerTy())); 949 Lo = DAG.getNode(ISD::EXTRACT_ELEMENT, NVT, Lo, 950 DAG.getConstant(0, TLI.getPointerTy())); 951} 952 953 954//===----------------------------------------------------------------------===// 955// Float Operand Expansion 956//===----------------------------------------------------------------------===// 957 958/// ExpandFloatOperand - This method is called when the specified operand of the 959/// specified node is found to need expansion. At this point, all of the result 960/// types of the node are known to be legal, but other operands of the node may 961/// need promotion or expansion as well as the specified one. 962bool DAGTypeLegalizer::ExpandFloatOperand(SDNode *N, unsigned OpNo) { 963 DEBUG(cerr << "Expand float operand: "; N->dump(&DAG); cerr << "\n"); 964 SDOperand Res = SDOperand(); 965 966 if (TLI.getOperationAction(N->getOpcode(), N->getOperand(OpNo).getValueType()) 967 == TargetLowering::Custom) 968 Res = TLI.LowerOperation(SDOperand(N, OpNo), DAG); 969 970 if (Res.Val == 0) { 971 switch (N->getOpcode()) { 972 default: 973 #ifndef NDEBUG 974 cerr << "ExpandFloatOperand Op #" << OpNo << ": "; 975 N->dump(&DAG); cerr << "\n"; 976 #endif 977 assert(0 && "Do not know how to expand this operator's operand!"); 978 abort(); 979 980 case ISD::BIT_CONVERT: Res = ExpandOp_BIT_CONVERT(N); break; 981 case ISD::BUILD_VECTOR: Res = ExpandOp_BUILD_VECTOR(N); break; 982 case ISD::EXTRACT_ELEMENT: Res = ExpandOp_EXTRACT_ELEMENT(N); break; 983 984 case ISD::BR_CC: Res = ExpandFloatOp_BR_CC(N); break; 985 case ISD::FP_ROUND: Res = ExpandFloatOp_FP_ROUND(N); break; 986 case ISD::FP_TO_SINT: Res = ExpandFloatOp_FP_TO_SINT(N); break; 987 case ISD::FP_TO_UINT: Res = ExpandFloatOp_FP_TO_UINT(N); break; 988 case ISD::SELECT_CC: Res = ExpandFloatOp_SELECT_CC(N); break; 989 case ISD::SETCC: Res = ExpandFloatOp_SETCC(N); break; 990 case ISD::STORE: Res = ExpandFloatOp_STORE(cast<StoreSDNode>(N), 991 OpNo); break; 992 } 993 } 994 995 // If the result is null, the sub-method took care of registering results etc. 996 if (!Res.Val) return false; 997 // If the result is N, the sub-method updated N in place. Check to see if any 998 // operands are new, and if so, mark them. 999 if (Res.Val == N) { 1000 // Mark N as new and remark N and its operands. This allows us to correctly 1001 // revisit N if it needs another step of expansion and allows us to visit 1002 // any new operands to N. 1003 ReanalyzeNode(N); 1004 return true; 1005 } 1006 1007 assert(Res.getValueType() == N->getValueType(0) && N->getNumValues() == 1 && 1008 "Invalid operand expansion"); 1009 1010 ReplaceValueWith(SDOperand(N, 0), Res); 1011 return false; 1012} 1013 1014/// FloatExpandSetCCOperands - Expand the operands of a comparison. This code 1015/// is shared among BR_CC, SELECT_CC, and SETCC handlers. 1016void DAGTypeLegalizer::FloatExpandSetCCOperands(SDOperand &NewLHS, 1017 SDOperand &NewRHS, 1018 ISD::CondCode &CCCode) { 1019 SDOperand LHSLo, LHSHi, RHSLo, RHSHi; 1020 GetExpandedFloat(NewLHS, LHSLo, LHSHi); 1021 GetExpandedFloat(NewRHS, RHSLo, RHSHi); 1022 1023 MVT VT = NewLHS.getValueType(); 1024 assert(VT == MVT::ppcf128 && "Unsupported setcc type!"); 1025 1026 // FIXME: This generated code sucks. We want to generate 1027 // FCMP crN, hi1, hi2 1028 // BNE crN, L: 1029 // FCMP crN, lo1, lo2 1030 // The following can be improved, but not that much. 1031 SDOperand Tmp1, Tmp2, Tmp3; 1032 Tmp1 = DAG.getSetCC(TLI.getSetCCResultType(LHSHi), LHSHi, RHSHi, ISD::SETEQ); 1033 Tmp2 = DAG.getSetCC(TLI.getSetCCResultType(LHSLo), LHSLo, RHSLo, CCCode); 1034 Tmp3 = DAG.getNode(ISD::AND, Tmp1.getValueType(), Tmp1, Tmp2); 1035 Tmp1 = DAG.getSetCC(TLI.getSetCCResultType(LHSHi), LHSHi, RHSHi, ISD::SETNE); 1036 Tmp2 = DAG.getSetCC(TLI.getSetCCResultType(LHSHi), LHSHi, RHSHi, CCCode); 1037 Tmp1 = DAG.getNode(ISD::AND, Tmp1.getValueType(), Tmp1, Tmp2); 1038 NewLHS = DAG.getNode(ISD::OR, Tmp1.getValueType(), Tmp1, Tmp3); 1039 NewRHS = SDOperand(); // LHS is the result, not a compare. 1040} 1041 1042SDOperand DAGTypeLegalizer::ExpandFloatOp_BR_CC(SDNode *N) { 1043 SDOperand NewLHS = N->getOperand(2), NewRHS = N->getOperand(3); 1044 ISD::CondCode CCCode = cast<CondCodeSDNode>(N->getOperand(1))->get(); 1045 FloatExpandSetCCOperands(NewLHS, NewRHS, CCCode); 1046 1047 // If ExpandSetCCOperands returned a scalar, we need to compare the result 1048 // against zero to select between true and false values. 1049 if (NewRHS.Val == 0) { 1050 NewRHS = DAG.getConstant(0, NewLHS.getValueType()); 1051 CCCode = ISD::SETNE; 1052 } 1053 1054 // Update N to have the operands specified. 1055 return DAG.UpdateNodeOperands(SDOperand(N, 0), N->getOperand(0), 1056 DAG.getCondCode(CCCode), NewLHS, NewRHS, 1057 N->getOperand(4)); 1058} 1059 1060SDOperand DAGTypeLegalizer::ExpandFloatOp_FP_ROUND(SDNode *N) { 1061 assert(N->getOperand(0).getValueType() == MVT::ppcf128 && 1062 "Logic only correct for ppcf128!"); 1063 SDOperand Lo, Hi; 1064 GetExpandedFloat(N->getOperand(0), Lo, Hi); 1065 // Round it the rest of the way (e.g. to f32) if needed. 1066 return DAG.getNode(ISD::FP_ROUND, N->getValueType(0), Hi, N->getOperand(1)); 1067} 1068 1069SDOperand DAGTypeLegalizer::ExpandFloatOp_FP_TO_SINT(SDNode *N) { 1070 assert(N->getOperand(0).getValueType() == MVT::ppcf128 && 1071 "Unsupported FP_TO_SINT!"); 1072 1073 RTLIB::Libcall LC = RTLIB::UNKNOWN_LIBCALL; 1074 switch (N->getValueType(0).getSimpleVT()) { 1075 default: 1076 assert(false && "Unsupported FP_TO_SINT!"); 1077 case MVT::i32: 1078 LC = RTLIB::FPTOSINT_PPCF128_I32; 1079 case MVT::i64: 1080 LC = RTLIB::FPTOSINT_PPCF128_I64; 1081 break; 1082 case MVT::i128: 1083 LC = RTLIB::FPTOSINT_PPCF128_I64; 1084 break; 1085 } 1086 1087 return MakeLibCall(LC, N->getValueType(0), &N->getOperand(0), 1, false); 1088} 1089 1090SDOperand DAGTypeLegalizer::ExpandFloatOp_FP_TO_UINT(SDNode *N) { 1091 assert(N->getOperand(0).getValueType() == MVT::ppcf128 && 1092 "Unsupported FP_TO_UINT!"); 1093 1094 RTLIB::Libcall LC = RTLIB::UNKNOWN_LIBCALL; 1095 switch (N->getValueType(0).getSimpleVT()) { 1096 default: 1097 assert(false && "Unsupported FP_TO_UINT!"); 1098 case MVT::i32: 1099 LC = RTLIB::FPTOUINT_PPCF128_I32; 1100 break; 1101 case MVT::i64: 1102 LC = RTLIB::FPTOUINT_PPCF128_I64; 1103 break; 1104 case MVT::i128: 1105 LC = RTLIB::FPTOUINT_PPCF128_I128; 1106 break; 1107 } 1108 1109 return MakeLibCall(LC, N->getValueType(0), &N->getOperand(0), 1, false); 1110} 1111 1112SDOperand DAGTypeLegalizer::ExpandFloatOp_SELECT_CC(SDNode *N) { 1113 SDOperand NewLHS = N->getOperand(0), NewRHS = N->getOperand(1); 1114 ISD::CondCode CCCode = cast<CondCodeSDNode>(N->getOperand(4))->get(); 1115 FloatExpandSetCCOperands(NewLHS, NewRHS, CCCode); 1116 1117 // If ExpandSetCCOperands returned a scalar, we need to compare the result 1118 // against zero to select between true and false values. 1119 if (NewRHS.Val == 0) { 1120 NewRHS = DAG.getConstant(0, NewLHS.getValueType()); 1121 CCCode = ISD::SETNE; 1122 } 1123 1124 // Update N to have the operands specified. 1125 return DAG.UpdateNodeOperands(SDOperand(N, 0), NewLHS, NewRHS, 1126 N->getOperand(2), N->getOperand(3), 1127 DAG.getCondCode(CCCode)); 1128} 1129 1130SDOperand DAGTypeLegalizer::ExpandFloatOp_SETCC(SDNode *N) { 1131 SDOperand NewLHS = N->getOperand(0), NewRHS = N->getOperand(1); 1132 ISD::CondCode CCCode = cast<CondCodeSDNode>(N->getOperand(2))->get(); 1133 FloatExpandSetCCOperands(NewLHS, NewRHS, CCCode); 1134 1135 // If ExpandSetCCOperands returned a scalar, use it. 1136 if (NewRHS.Val == 0) { 1137 assert(NewLHS.getValueType() == N->getValueType(0) && 1138 "Unexpected setcc expansion!"); 1139 return NewLHS; 1140 } 1141 1142 // Otherwise, update N to have the operands specified. 1143 return DAG.UpdateNodeOperands(SDOperand(N, 0), NewLHS, NewRHS, 1144 DAG.getCondCode(CCCode)); 1145} 1146 1147SDOperand DAGTypeLegalizer::ExpandFloatOp_STORE(SDNode *N, unsigned OpNo) { 1148 if (ISD::isNormalStore(N)) 1149 return ExpandOp_NormalStore(N, OpNo); 1150 1151 assert(ISD::isUNINDEXEDStore(N) && "Indexed store during type legalization!"); 1152 assert(OpNo == 1 && "Can only expand the stored value so far"); 1153 StoreSDNode *ST = cast<StoreSDNode>(N); 1154 1155 SDOperand Chain = ST->getChain(); 1156 SDOperand Ptr = ST->getBasePtr(); 1157 1158 MVT NVT = TLI.getTypeToTransformTo(ST->getValue().getValueType()); 1159 assert(NVT.isByteSized() && "Expanded type not byte sized!"); 1160 assert(ST->getMemoryVT().bitsLE(NVT) && "Float type not round?"); 1161 1162 SDOperand Lo, Hi; 1163 GetExpandedOp(ST->getValue(), Lo, Hi); 1164 1165 return DAG.getTruncStore(Chain, Lo, Ptr, 1166 ST->getSrcValue(), ST->getSrcValueOffset(), 1167 ST->getMemoryVT(), 1168 ST->isVolatile(), ST->getAlignment()); 1169} 1170