| Index: src/IceTargetLoweringX8632.cpp
|
| diff --git a/src/IceTargetLoweringX8632.cpp b/src/IceTargetLoweringX8632.cpp
|
| index 0576add554dd4fa18a98b822d0352596e5210586..861bc0e54ec75915fa3018320de4d452939dfae2 100644
|
| --- a/src/IceTargetLoweringX8632.cpp
|
| +++ b/src/IceTargetLoweringX8632.cpp
|
| @@ -1342,28 +1342,28 @@ void TargetX8632::lowerArithmetic(const InstArithmetic *Inst) {
|
| } break;
|
| case InstArithmetic::Udiv: {
|
| const SizeT MaxSrcs = 2;
|
| - InstCall *Call = makeHelperCall("__udivdi3", Dest, MaxSrcs);
|
| + InstCall *Call = makeHelperCall(H_udiv_i64, Dest, MaxSrcs);
|
| Call->addArg(Inst->getSrc(0));
|
| Call->addArg(Inst->getSrc(1));
|
| lowerCall(Call);
|
| } break;
|
| case InstArithmetic::Sdiv: {
|
| const SizeT MaxSrcs = 2;
|
| - InstCall *Call = makeHelperCall("__divdi3", Dest, MaxSrcs);
|
| + InstCall *Call = makeHelperCall(H_sdiv_i64, Dest, MaxSrcs);
|
| Call->addArg(Inst->getSrc(0));
|
| Call->addArg(Inst->getSrc(1));
|
| lowerCall(Call);
|
| } break;
|
| case InstArithmetic::Urem: {
|
| const SizeT MaxSrcs = 2;
|
| - InstCall *Call = makeHelperCall("__umoddi3", Dest, MaxSrcs);
|
| + InstCall *Call = makeHelperCall(H_urem_i64, Dest, MaxSrcs);
|
| Call->addArg(Inst->getSrc(0));
|
| Call->addArg(Inst->getSrc(1));
|
| lowerCall(Call);
|
| } break;
|
| case InstArithmetic::Srem: {
|
| const SizeT MaxSrcs = 2;
|
| - InstCall *Call = makeHelperCall("__moddi3", Dest, MaxSrcs);
|
| + InstCall *Call = makeHelperCall(H_srem_i64, Dest, MaxSrcs);
|
| Call->addArg(Inst->getSrc(0));
|
| Call->addArg(Inst->getSrc(1));
|
| lowerCall(Call);
|
| @@ -1664,8 +1664,9 @@ void TargetX8632::lowerArithmetic(const InstArithmetic *Inst) {
|
| case InstArithmetic::Frem: {
|
| const SizeT MaxSrcs = 2;
|
| Type Ty = Dest->getType();
|
| - InstCall *Call = makeHelperCall(
|
| - isFloat32Asserting32Or64(Ty) ? "fmodf" : "fmod", Dest, MaxSrcs);
|
| + InstCall *Call =
|
| + makeHelperCall(isFloat32Asserting32Or64(Ty) ? H_frem_f32 : H_frem_f64,
|
| + Dest, MaxSrcs);
|
| Call->addArg(Src0);
|
| Call->addArg(Src1);
|
| return lowerCall(Call);
|
| @@ -2097,10 +2098,10 @@ void TargetX8632::lowerCast(const InstCast *Inst) {
|
| split64(Dest);
|
| const SizeT MaxSrcs = 1;
|
| Type SrcType = Inst->getSrc(0)->getType();
|
| - InstCall *Call = makeHelperCall(
|
| - isFloat32Asserting32Or64(SrcType) ? "cvtftosi64" : "cvtdtosi64", Dest,
|
| - MaxSrcs);
|
| - // TODO: Call the correct compiler-rt helper function.
|
| + InstCall *Call =
|
| + makeHelperCall(isFloat32Asserting32Or64(SrcType) ? H_fptosi_f32_i64
|
| + : H_fptosi_f64_i64,
|
| + Dest, MaxSrcs);
|
| Call->addArg(Inst->getSrc(0));
|
| lowerCall(Call);
|
| } else {
|
| @@ -2120,7 +2121,7 @@ void TargetX8632::lowerCast(const InstCast *Inst) {
|
| assert(Dest->getType() == IceType_v4i32 &&
|
| Inst->getSrc(0)->getType() == IceType_v4f32);
|
| const SizeT MaxSrcs = 1;
|
| - InstCall *Call = makeHelperCall("Sz_fptoui_v4f32", Dest, MaxSrcs);
|
| + InstCall *Call = makeHelperCall(H_fptoui_4xi32_f32, Dest, MaxSrcs);
|
| Call->addArg(Inst->getSrc(0));
|
| lowerCall(Call);
|
| } else if (Dest->getType() == IceType_i64 ||
|
| @@ -2130,11 +2131,14 @@ void TargetX8632::lowerCast(const InstCast *Inst) {
|
| const SizeT MaxSrcs = 1;
|
| Type DestType = Dest->getType();
|
| Type SrcType = Inst->getSrc(0)->getType();
|
| - IceString DstSubstring = (isInt32Asserting32Or64(DestType) ? "32" : "64");
|
| - IceString SrcSubstring = (isFloat32Asserting32Or64(SrcType) ? "f" : "d");
|
| - // Possibilities are cvtftoui32, cvtdtoui32, cvtftoui64, cvtdtoui64
|
| - IceString TargetString = "cvt" + SrcSubstring + "toui" + DstSubstring;
|
| - // TODO: Call the correct compiler-rt helper function.
|
| + IceString TargetString;
|
| + if (isInt32Asserting32Or64(DestType)) {
|
| + TargetString = isFloat32Asserting32Or64(SrcType) ? H_fptoui_f32_i32
|
| + : H_fptoui_f64_i32;
|
| + } else {
|
| + TargetString = isFloat32Asserting32Or64(SrcType) ? H_fptoui_f32_i64
|
| + : H_fptoui_f64_i64;
|
| + }
|
| InstCall *Call = makeHelperCall(TargetString, Dest, MaxSrcs);
|
| Call->addArg(Inst->getSrc(0));
|
| lowerCall(Call);
|
| @@ -2163,9 +2167,10 @@ void TargetX8632::lowerCast(const InstCast *Inst) {
|
| // Use a helper for x86-32.
|
| const SizeT MaxSrcs = 1;
|
| Type DestType = Dest->getType();
|
| - InstCall *Call = makeHelperCall(
|
| - isFloat32Asserting32Or64(DestType) ? "cvtsi64tof" : "cvtsi64tod",
|
| - Dest, MaxSrcs);
|
| + InstCall *Call =
|
| + makeHelperCall(isFloat32Asserting32Or64(DestType) ? H_sitofp_i64_f32
|
| + : H_sitofp_i64_f64,
|
| + Dest, MaxSrcs);
|
| // TODO: Call the correct compiler-rt helper function.
|
| Call->addArg(Inst->getSrc(0));
|
| lowerCall(Call);
|
| @@ -2190,7 +2195,7 @@ void TargetX8632::lowerCast(const InstCast *Inst) {
|
| assert(Dest->getType() == IceType_v4f32 &&
|
| Src0->getType() == IceType_v4i32);
|
| const SizeT MaxSrcs = 1;
|
| - InstCall *Call = makeHelperCall("Sz_uitofp_v4i32", Dest, MaxSrcs);
|
| + InstCall *Call = makeHelperCall(H_uitofp_4xi32_4xf32, Dest, MaxSrcs);
|
| Call->addArg(Src0);
|
| lowerCall(Call);
|
| } else if (Src0->getType() == IceType_i64 ||
|
| @@ -2199,12 +2204,14 @@ void TargetX8632::lowerCast(const InstCast *Inst) {
|
| // i32 on x86-32.
|
| const SizeT MaxSrcs = 1;
|
| Type DestType = Dest->getType();
|
| - IceString SrcSubstring =
|
| - (isInt32Asserting32Or64(Src0->getType()) ? "32" : "64");
|
| - IceString DstSubstring = (isFloat32Asserting32Or64(DestType) ? "f" : "d");
|
| - // Possibilities are cvtui32tof, cvtui32tod, cvtui64tof, cvtui64tod
|
| - IceString TargetString = "cvtui" + SrcSubstring + "to" + DstSubstring;
|
| - // TODO: Call the correct compiler-rt helper function.
|
| + IceString TargetString;
|
| + if (isInt32Asserting32Or64(Src0->getType())) {
|
| + TargetString = isFloat32Asserting32Or64(DestType) ? H_uitofp_i32_f32
|
| + : H_uitofp_i32_f64;
|
| + } else {
|
| + TargetString = isFloat32Asserting32Or64(DestType) ? H_uitofp_i64_f32
|
| + : H_uitofp_i64_f64;
|
| + }
|
| InstCall *Call = makeHelperCall(TargetString, Dest, MaxSrcs);
|
| Call->addArg(Src0);
|
| lowerCall(Call);
|
| @@ -2236,13 +2243,13 @@ void TargetX8632::lowerCast(const InstCast *Inst) {
|
| llvm_unreachable("Unexpected Bitcast dest type");
|
| case IceType_i8: {
|
| assert(Src0->getType() == IceType_v8i1);
|
| - InstCall *Call = makeHelperCall("Sz_bitcast_v8i1_to_i8", Dest, 1);
|
| + InstCall *Call = makeHelperCall(H_bitcast_8xi1_i8, Dest, 1);
|
| Call->addArg(Src0);
|
| lowerCall(Call);
|
| } break;
|
| case IceType_i16: {
|
| assert(Src0->getType() == IceType_v16i1);
|
| - InstCall *Call = makeHelperCall("Sz_bitcast_v16i1_to_i16", Dest, 1);
|
| + InstCall *Call = makeHelperCall(H_bitcast_16xi1_i16, Dest, 1);
|
| Call->addArg(Src0);
|
| lowerCall(Call);
|
| } break;
|
| @@ -2330,7 +2337,7 @@ void TargetX8632::lowerCast(const InstCast *Inst) {
|
| } break;
|
| case IceType_v8i1: {
|
| assert(Src0->getType() == IceType_i8);
|
| - InstCall *Call = makeHelperCall("Sz_bitcast_i8_to_v8i1", Dest, 1);
|
| + InstCall *Call = makeHelperCall(H_bitcast_i8_8xi1, Dest, 1);
|
| Variable *Src0AsI32 = Func->makeVariable(stackSlotType());
|
| // Arguments to functions are required to be at least 32 bits wide.
|
| lowerCast(InstCast::create(Func, InstCast::Zext, Src0AsI32, Src0));
|
| @@ -2339,7 +2346,7 @@ void TargetX8632::lowerCast(const InstCast *Inst) {
|
| } break;
|
| case IceType_v16i1: {
|
| assert(Src0->getType() == IceType_i16);
|
| - InstCall *Call = makeHelperCall("Sz_bitcast_i16_to_v16i1", Dest, 1);
|
| + InstCall *Call = makeHelperCall(H_bitcast_i16_16xi1, Dest, 1);
|
| Variable *Src0AsI32 = Func->makeVariable(stackSlotType());
|
| // Arguments to functions are required to be at least 32 bits wide.
|
| lowerCast(InstCast::create(Func, InstCast::Zext, Src0AsI32, Src0));
|
| @@ -3013,10 +3020,10 @@ void TargetX8632::lowerIntrinsicCall(const InstIntrinsicCall *Instr) {
|
| case Intrinsics::Ctpop: {
|
| Variable *Dest = Instr->getDest();
|
| Operand *Val = Instr->getArg(0);
|
| - InstCall *Call =
|
| - makeHelperCall(isInt32Asserting32Or64(Val->getType()) ? "__popcountsi2"
|
| - : "__popcountdi2",
|
| - Dest, 1);
|
| + InstCall *Call = makeHelperCall(isInt32Asserting32Or64(Val->getType())
|
| + ? H_call_ctpop_i32
|
| + : H_call_ctpop_i64,
|
| + Dest, 1);
|
| Call->addArg(Val);
|
| lowerCall(Call);
|
| // The popcount helpers always return 32-bit values, while the intrinsic's
|
| @@ -3066,7 +3073,7 @@ void TargetX8632::lowerIntrinsicCall(const InstIntrinsicCall *Instr) {
|
| return;
|
| }
|
| case Intrinsics::Longjmp: {
|
| - InstCall *Call = makeHelperCall("longjmp", nullptr, 2);
|
| + InstCall *Call = makeHelperCall(H_call_longjmp, nullptr, 2);
|
| Call->addArg(Instr->getArg(0));
|
| Call->addArg(Instr->getArg(1));
|
| lowerCall(Call);
|
| @@ -3075,7 +3082,7 @@ void TargetX8632::lowerIntrinsicCall(const InstIntrinsicCall *Instr) {
|
| case Intrinsics::Memcpy: {
|
| // In the future, we could potentially emit an inline memcpy/memset, etc.
|
| // for intrinsic calls w/ a known length.
|
| - InstCall *Call = makeHelperCall("memcpy", nullptr, 3);
|
| + InstCall *Call = makeHelperCall(H_call_memcpy, nullptr, 3);
|
| Call->addArg(Instr->getArg(0));
|
| Call->addArg(Instr->getArg(1));
|
| Call->addArg(Instr->getArg(2));
|
| @@ -3083,7 +3090,7 @@ void TargetX8632::lowerIntrinsicCall(const InstIntrinsicCall *Instr) {
|
| return;
|
| }
|
| case Intrinsics::Memmove: {
|
| - InstCall *Call = makeHelperCall("memmove", nullptr, 3);
|
| + InstCall *Call = makeHelperCall(H_call_memmove, nullptr, 3);
|
| Call->addArg(Instr->getArg(0));
|
| Call->addArg(Instr->getArg(1));
|
| Call->addArg(Instr->getArg(2));
|
| @@ -3098,7 +3105,7 @@ void TargetX8632::lowerIntrinsicCall(const InstIntrinsicCall *Instr) {
|
| assert(ValOp->getType() == IceType_i8);
|
| Variable *ValExt = Func->makeVariable(stackSlotType());
|
| lowerCast(InstCast::create(Func, InstCast::Zext, ValExt, ValOp));
|
| - InstCall *Call = makeHelperCall("memset", nullptr, 3);
|
| + InstCall *Call = makeHelperCall(H_call_memset, nullptr, 3);
|
| Call->addArg(Instr->getArg(0));
|
| Call->addArg(ValExt);
|
| Call->addArg(Instr->getArg(2));
|
| @@ -3116,13 +3123,13 @@ void TargetX8632::lowerIntrinsicCall(const InstIntrinsicCall *Instr) {
|
| _mov(T, Src);
|
| _mov(Dest, T);
|
| } else {
|
| - InstCall *Call = makeHelperCall("__nacl_read_tp", Instr->getDest(), 0);
|
| + InstCall *Call = makeHelperCall(H_call_read_tp, Instr->getDest(), 0);
|
| lowerCall(Call);
|
| }
|
| return;
|
| }
|
| case Intrinsics::Setjmp: {
|
| - InstCall *Call = makeHelperCall("setjmp", Instr->getDest(), 1);
|
| + InstCall *Call = makeHelperCall(H_call_setjmp, Instr->getDest(), 1);
|
| Call->addArg(Instr->getArg(0));
|
| lowerCall(Call);
|
| return;
|
|
|