Skip to content

Commit 32c49a6

Browse files
committed
CR fixes
1 parent 8b4ae94 commit 32c49a6

File tree

9 files changed

+80
-97
lines changed

9 files changed

+80
-97
lines changed

lib/Backend/IRBuilderAsmJs.cpp

Lines changed: 22 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -2332,7 +2332,6 @@ IRBuilderAsmJs::BuildInt2(Js::OpCodeAsmJs newOpcode, uint32 offset, Js::RegSlot
23322332
dstOpnd->SetValueType(ValueType::GetInt(false));
23332333

23342334
IR::Instr * instr = nullptr;
2335-
IRType signExtendFromType = TyIllegal;
23362335
switch (newOpcode)
23372336
{
23382337
case Js::OpCodeAsmJs::BeginSwitch_Int:
@@ -2396,11 +2395,11 @@ IRBuilderAsmJs::BuildInt2(Js::OpCodeAsmJs newOpcode, uint32 offset, Js::RegSlot
23962395
instr = IR::Instr::New(Js::OpCode::GrowWasmMemory, dstOpnd, BuildSrcOpnd(AsmJsRegSlots::WasmMemoryReg, TyVar), srcOpnd, m_func);
23972396
break;
23982397

2399-
case Js::OpCodeAsmJs::I32Extend8_s: signExtendFromType = TyInt8; goto make_sign_extend;
2400-
case Js::OpCodeAsmJs::I32Extend16_s: signExtendFromType = TyInt16; goto make_sign_extend;
2401-
make_sign_extend:
2402-
// Src2 is a dummy source, used only to carry the type to cast from
2403-
instr = IR::Instr::New(Js::OpCode::Conv_Prim, dstOpnd, srcOpnd, IR::IntConstOpnd::New(signExtendFromType, signExtendFromType, m_func), m_func);
2398+
case Js::OpCodeAsmJs::I32Extend8_s:
2399+
instr = CreateSignExtendInstr(dstOpnd, srcOpnd, TyInt8);
2400+
break;
2401+
case Js::OpCodeAsmJs::I32Extend16_s:
2402+
instr = CreateSignExtendInstr(dstOpnd, srcOpnd, TyInt16);
24042403
break;
24052404
default:
24062405
Assume(UNREACHED);
@@ -2430,6 +2429,15 @@ IR::RegOpnd* IRBuilderAsmJs::BuildTrapIfMinIntOverNegOne(IR::RegOpnd* src1Opnd,
24302429
return newSrc;
24312430
}
24322431

2432+
IR::Instr* IRBuilderAsmJs::CreateSignExtendInstr(IR::Opnd* dst, IR::Opnd* src, IRType fromType)
2433+
{
2434+
// Since CSE ignores the type of the type, the int const value carries that information to prevent
2435+
// cse of sign extension of different types.
2436+
IR::Opnd* fromTypeOpnd = IR::IntConstOpnd::New(fromType, fromType, m_func);
2437+
// Src2 is a dummy source, used only to carry the type to cast from
2438+
return IR::Instr::New(Js::OpCode::Conv_Prim, dst, src, fromTypeOpnd, m_func);
2439+
}
2440+
24332441
void
24342442
IRBuilderAsmJs::BuildInt3(Js::OpCodeAsmJs newOpcode, uint32 offset, Js::RegSlot dstRegSlot, Js::RegSlot src1RegSlot, Js::RegSlot src2RegSlot)
24352443
{
@@ -3028,7 +3036,6 @@ IRBuilderAsmJs::BuildLong2(Js::OpCodeAsmJs newOpcode, uint32 offset, Js::RegSlot
30283036
dstOpnd->SetValueType(ValueType::GetInt(false));
30293037

30303038
IR::Instr * instr = nullptr;
3031-
IRType signExtendFromType = TyIllegal;
30323039
switch (newOpcode)
30333040
{
30343041
case Js::OpCodeAsmJs::Ld_Long:
@@ -3055,12 +3062,14 @@ IRBuilderAsmJs::BuildLong2(Js::OpCodeAsmJs newOpcode, uint32 offset, Js::RegSlot
30553062
AddInstr(slotInstr, offset);
30563063
}
30573064
break;
3058-
case Js::OpCodeAsmJs::I64Extend8_s: signExtendFromType = TyInt8; goto make_sign_extend;
3059-
case Js::OpCodeAsmJs::I64Extend16_s: signExtendFromType = TyInt16; goto make_sign_extend;
3060-
case Js::OpCodeAsmJs::I64Extend32_s: signExtendFromType = TyInt32;
3061-
make_sign_extend:
3062-
// Src2 is a dummy source, used only to carry the type to cast from
3063-
instr = IR::Instr::New(Js::OpCode::Conv_Prim, dstOpnd, srcOpnd, IR::IntConstOpnd::New(signExtendFromType, signExtendFromType, m_func), m_func);
3065+
case Js::OpCodeAsmJs::I64Extend8_s:
3066+
instr = CreateSignExtendInstr(dstOpnd, srcOpnd, TyInt8);
3067+
break;
3068+
case Js::OpCodeAsmJs::I64Extend16_s:
3069+
instr = CreateSignExtendInstr(dstOpnd, srcOpnd, TyInt16);
3070+
break;
3071+
case Js::OpCodeAsmJs::I64Extend32_s:
3072+
instr = CreateSignExtendInstr(dstOpnd, srcOpnd, TyInt32);
30643073
break;
30653074
default:
30663075
Assume(UNREACHED);

lib/Backend/IRBuilderAsmJs.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -155,7 +155,9 @@ class IRBuilderAsmJs
155155
IR::Instr* GenerateStSlotForReturn(IR::RegOpnd* srcOpnd, IRType type);
156156
IR::RegOpnd* BuildTrapIfZero(IR::RegOpnd* srcOpnd, uint32 offset);
157157
IR::RegOpnd* BuildTrapIfMinIntOverNegOne(IR::RegOpnd* src1Opnd, IR::RegOpnd* src2Opnd, uint32 offset);
158-
158+
159+
IR::Instr* CreateSignExtendInstr(IR::Opnd* dst, IR::Opnd* src, IRType fromType);
160+
159161
JitArenaAllocator * m_tempAlloc;
160162
JitArenaAllocator * m_funcAlloc;
161163
Func * m_func;

lib/Backend/LowerMDShared.cpp

Lines changed: 47 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7622,7 +7622,53 @@ LowererMD::EmitLongToInt(IR::Opnd *dst, IR::Opnd *src, IR::Instr *instrInsert)
76227622

76237623
void LowererMD::EmitSignExtend(IR::Instr * instr)
76247624
{
7625-
this->lowererMDArch.EmitSignExtend(instr);
7625+
IR::Opnd* dst = instr->GetDst();
7626+
IR::Opnd* src1 = instr->GetSrc1();
7627+
IR::Opnd* src2 = instr->GetSrc2();
7628+
Assert(dst && src1 && src2);
7629+
7630+
// Src2 is used to determine what's the from type size
7631+
Assert(src2->GetSize() < dst->GetSize());
7632+
IRType fromType = src2->GetType();
7633+
Js::OpCode op = Js::OpCode::MOVSX;
7634+
switch (src2->GetSize())
7635+
{
7636+
case 1: break; // default
7637+
case 2: op = Js::OpCode::MOVSXW; break;
7638+
case 4:
7639+
#if _M_X64
7640+
op = Js::OpCode::MOVSXD;
7641+
#else
7642+
op = LowererMDArch::GetAssignOp(fromType);
7643+
#endif
7644+
break;
7645+
default:
7646+
Assert(UNREACHED);
7647+
}
7648+
7649+
#if _M_IX86
7650+
// Special handling of int64 on x86
7651+
if (dst->IsInt64())
7652+
{
7653+
Int64RegPair dstPair = m_func->FindOrCreateInt64Pair(dst);
7654+
Int64RegPair srcPair = m_func->FindOrCreateInt64Pair(src1);
7655+
7656+
IR::RegOpnd * eaxReg = IR::RegOpnd::New(RegEAX, TyInt32, m_func);
7657+
IR::RegOpnd * edxReg = IR::RegOpnd::New(RegEDX, TyInt32, m_func);
7658+
7659+
instr->InsertBefore(IR::Instr::New(op, eaxReg, srcPair.low->UseWithNewType(fromType, m_func), m_func));
7660+
Legalize(instr->m_prev);
7661+
instr->InsertBefore(IR::Instr::New(Js::OpCode::CDQ, edxReg, m_func));
7662+
Legalize(instr->m_prev);
7663+
m_lowerer->InsertMove(dstPair.low, eaxReg, instr);
7664+
m_lowerer->InsertMove(dstPair.high, edxReg, instr);
7665+
}
7666+
else
7667+
#endif
7668+
{
7669+
instr->InsertBefore(IR::Instr::New(op, dst, src1->UseWithNewType(fromType, m_func), m_func));
7670+
Legalize(instr->m_prev);
7671+
}
76267672
}
76277673

76287674
void

lib/Backend/Opnd.cpp

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1093,25 +1093,23 @@ void RegOpnd::Initialize(StackSym *sym, RegNum reg, IRType type)
10931093
///----------------------------------------------------------------------------
10941094

10951095
RegOpnd *
1096-
RegOpnd::New(IRType type, Func *func)
1096+
RegOpnd::New(IRType type, Func *func)
10971097
{
10981098
return RegOpnd::New(StackSym::New(type, func), RegNOREG, type, func);
10991099
}
11001100

1101+
IR::RegOpnd *
1102+
RegOpnd::New(RegNum reg, IRType type, Func *func)
1103+
{
1104+
return RegOpnd::New(StackSym::New(type, func), reg, type, func);
1105+
}
1106+
11011107
RegOpnd *
11021108
RegOpnd::New(StackSym *sym, IRType type, Func *func)
11031109
{
11041110
return RegOpnd::New(sym, RegNOREG, type, func);
11051111
}
11061112

1107-
///----------------------------------------------------------------------------
1108-
///
1109-
/// RegOpnd::New
1110-
///
1111-
/// Creates a new RegOpnd.
1112-
///
1113-
///----------------------------------------------------------------------------
1114-
11151113
RegOpnd *
11161114
RegOpnd::New(StackSym *sym, RegNum reg, IRType type, Func *func)
11171115
{

lib/Backend/Opnd.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1275,6 +1275,7 @@ class RegOpnd : public Opnd
12751275

12761276
public:
12771277
static RegOpnd * New(IRType type, Func *func);
1278+
static RegOpnd * New(RegNum reg, IRType type, Func *func);
12781279
static RegOpnd * New(StackSym *sym, IRType type, Func *func);
12791280
static RegOpnd * New(StackSym *sym, RegNum reg, IRType type, Func *func);
12801281

lib/Backend/amd64/LowererMDArch.cpp

Lines changed: 0 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -2564,31 +2564,6 @@ LowererMDArch::EmitUIntToFloat(IR::Opnd *dst, IR::Opnd *src, IR::Instr *instrIns
25642564
tempReg->UseWithNewType(TyInt64, this->m_func), this->m_func));
25652565
}
25662566

2567-
void
2568-
LowererMDArch::EmitSignExtend(IR::Instr * instr)
2569-
{
2570-
IR::Opnd* dst = instr->GetDst();
2571-
IR::Opnd* src1 = instr->GetSrc1();
2572-
IR::Opnd* src2 = instr->GetSrc2();
2573-
2574-
// Src2 is used to determine what's the from type size
2575-
Assert(src2->GetSize() < dst->GetSize());
2576-
IRType fromType = src2->GetType();
2577-
Js::OpCode op = Js::OpCode::MOVSX;
2578-
if (src2->GetSize() == 2)
2579-
{
2580-
op = Js::OpCode::MOVSXW;
2581-
}
2582-
else if (src2->GetSize() == 4)
2583-
{
2584-
op = Js::OpCode::MOVSXD;
2585-
}
2586-
2587-
IR::RegOpnd * tempReg = IR::RegOpnd::New(fromType, this->m_func);
2588-
instr->InsertBefore(IR::Instr::New(Js::OpCode::MOV_TRUNC, tempReg, src1, m_func));
2589-
instr->InsertBefore(IR::Instr::New(op, dst, tempReg, m_func));
2590-
}
2591-
25922567
bool
25932568
LowererMDArch::EmitLoadInt32(IR::Instr *instrLoad, bool conversionFromObjectAllowed, bool bailOutOnHelper, IR::LabelInstr * labelBailOut)
25942569
{

lib/Backend/amd64/LowererMDArch.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -117,7 +117,6 @@ class LowererMDArch
117117
void EmitIntToLong(IR::Opnd *dst, IR::Opnd *src, IR::Instr *instrInsert);
118118
void EmitUIntToLong(IR::Opnd *dst, IR::Opnd *src, IR::Instr *instrInsert);
119119
void EmitLongToInt(IR::Opnd *dst, IR::Opnd *src, IR::Instr *instrInsert);
120-
void EmitSignExtend(IR::Instr * instr);
121120
bool EmitLoadInt32(IR::Instr *instrLoad, bool conversionFromObjectAllowed, bool bailOnHelperCall, IR::LabelInstr * labelBailOut);
122121

123122
IR::Instr * LoadCheckedFloat(IR::RegOpnd *opndOrig, IR::RegOpnd *opndFloat, IR::LabelInstr *labelInline, IR::LabelInstr *labelHelper, IR::Instr *instrInsert, const bool checkForNullInLoopBody = false);

lib/Backend/i386/LowererMDArch.cpp

Lines changed: 0 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -2802,52 +2802,6 @@ LowererMDArch::EmitLoadInt32(IR::Instr *instrLoad, bool conversionFromObjectAllo
28022802
return false;
28032803
}
28042804

2805-
void LowererMDArch::EmitSignExtend(IR::Instr * instr)
2806-
{
2807-
IR::Opnd* dst = instr->GetDst();
2808-
IR::Opnd* src1 = instr->GetSrc1();
2809-
IR::Opnd* src2 = instr->GetSrc2();
2810-
2811-
// Src2 is used to determine what's the from type size
2812-
Assert(src2->GetSize() < dst->GetSize());
2813-
IRType fromType = src2->GetType();
2814-
Js::OpCode op = Js::OpCode::MOVSX;
2815-
if (src2->GetSize() == 2)
2816-
{
2817-
op = Js::OpCode::MOVSXW;
2818-
}
2819-
if (!dst->IsInt64())
2820-
{
2821-
IR::RegOpnd * tempReg = IR::RegOpnd::New(fromType, this->m_func);
2822-
2823-
lowererMD->m_lowerer->InsertMove(tempReg, src1, instr);
2824-
instr->InsertBefore(IR::Instr::New(op, dst, tempReg, m_func));
2825-
}
2826-
else
2827-
{
2828-
Int64RegPair dstPair = m_func->FindOrCreateInt64Pair(dst);
2829-
Int64RegPair srcPair = m_func->FindOrCreateInt64Pair(src1);
2830-
2831-
IR::RegOpnd * eaxReg = IR::RegOpnd::New(TyInt32, this->m_func);
2832-
eaxReg->SetReg(RegEAX);
2833-
IR::RegOpnd * edxReg = IR::RegOpnd::New(TyInt32, this->m_func);
2834-
edxReg->SetReg(RegEDX);
2835-
if (fromType == TyInt32)
2836-
{
2837-
lowererMD->m_lowerer->InsertMove(eaxReg, srcPair.low, instr);
2838-
}
2839-
else
2840-
{
2841-
IR::RegOpnd * tempReg = IR::RegOpnd::New(fromType, this->m_func);
2842-
lowererMD->m_lowerer->InsertMove(tempReg, srcPair.low, instr);
2843-
instr->InsertBefore(IR::Instr::New(op, eaxReg, tempReg, m_func));
2844-
}
2845-
instr->InsertBefore(IR::Instr::New(Js::OpCode::CDQ, edxReg, m_func));
2846-
lowererMD->m_lowerer->InsertMove(dstPair.low, eaxReg, instr);
2847-
lowererMD->m_lowerer->InsertMove(dstPair.high, edxReg, instr);
2848-
}
2849-
}
2850-
28512805
IR::Instr *
28522806
LowererMDArch::LoadCheckedFloat(
28532807
IR::RegOpnd *opndOrig,

lib/Backend/i386/LowererMDArch.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,6 @@ class LowererMDArch
8383
static void EmitIntToLong(IR::Opnd *dst, IR::Opnd *src, IR::Instr *instrInsert);
8484
static void EmitUIntToLong(IR::Opnd *dst, IR::Opnd *src, IR::Instr *instrInsert);
8585
static void EmitLongToInt(IR::Opnd *dst, IR::Opnd *src, IR::Instr *instrInsert);
86-
void EmitSignExtend(IR::Instr * instr);
8786
bool EmitLoadInt32(IR::Instr *instrLoad, bool conversionFromObjectAllowed, bool bailOutOnHelper = false, IR::LabelInstr * labelBailOut = nullptr);
8887

8988
IR::Instr * LoadCheckedFloat(IR::RegOpnd *opndOrig, IR::RegOpnd *opndFloat, IR::LabelInstr *labelInline, IR::LabelInstr *labelHelper, IR::Instr *instrInsert, const bool checkForNullInLoopBody = false);

0 commit comments

Comments
 (0)