Skip to content

Commit 1bfa6c7

Browse files
committed
Add unsigned conv ovf test
Checkpoint Checkpoint Implement most of the unsigned source conversions Generalize ConvOvfHelper to support growing conversions as well Add some missing conv ovf opcodes Fix up ovf conversion mappings in compiler Fix copy paste error Fix copy-paste error Add missing check Remove no-op movs Remove no-op mov convs
1 parent aa37dff commit 1bfa6c7

File tree

4 files changed

+377
-10
lines changed

4 files changed

+377
-10
lines changed

src/coreclr/interpreter/compiler.cpp

Lines changed: 208 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4131,6 +4131,7 @@ void InterpCompiler::GenerateCode(CORINFO_METHOD_INFO* methodInfo)
41314131
EmitConv(m_pStackPointer - 1, StackTypeI4, INTOP_CONV_OVF_U4_R8);
41324132
break;
41334133
case StackTypeI4:
4134+
EmitConv(m_pStackPointer - 1, StackTypeI4, INTOP_CONV_OVF_U4_I4);
41344135
break;
41354136
case StackTypeI8:
41364137
EmitConv(m_pStackPointer - 1, StackTypeI4, INTOP_CONV_OVF_U4_I8);
@@ -4171,9 +4172,10 @@ void InterpCompiler::GenerateCode(CORINFO_METHOD_INFO* methodInfo)
41714172
EmitConv(m_pStackPointer - 1, StackTypeI8, INTOP_CONV_OVF_U8_R8);
41724173
break;
41734174
case StackTypeI4:
4174-
EmitConv(m_pStackPointer - 1, StackTypeI8, INTOP_CONV_I8_U4);
4175+
EmitConv(m_pStackPointer - 1, StackTypeI8, INTOP_CONV_OVF_U8_I4);
41754176
break;
41764177
case StackTypeI8:
4178+
EmitConv(m_pStackPointer - 1, StackTypeI8, INTOP_CONV_OVF_U8_I8);
41774179
break;
41784180
default:
41794181
assert(0);
@@ -4237,17 +4239,218 @@ void InterpCompiler::GenerateCode(CORINFO_METHOD_INFO* methodInfo)
42374239
break;
42384240
case StackTypeI4:
42394241
#ifdef TARGET_64BIT
4240-
// FIXME: Is this the right conv opcode?
4241-
EmitConv(m_pStackPointer - 1, StackTypeI, INTOP_CONV_I8_I4);
4242+
EmitConv(m_pStackPointer - 1, StackTypeI, INTOP_CONV_OVF_U8_I4);
42424243
#else
4243-
EmitConv(m_pStackPointer - 1, StackTypeI, INTOP_MOV_4);
4244+
EmitConv(m_pStackPointer - 1, StackTypeI, INTOP_CONV_OVF_U4_I4);
42444245
#endif
42454246
break;
42464247
case StackTypeI8:
42474248
#ifdef TARGET_64BIT
4248-
EmitConv(m_pStackPointer - 1, StackTypeI, INTOP_MOV_8);
4249+
EmitConv(m_pStackPointer - 1, StackTypeI, INTOP_CONV_OVF_U8_I8);
42494250
#else
42504251
EmitConv(m_pStackPointer - 1, StackTypeI, INTOP_CONV_OVF_U4_I8);
4252+
#endif
4253+
break;
4254+
default:
4255+
assert(0);
4256+
}
4257+
m_ip++;
4258+
break;
4259+
case CEE_CONV_OVF_I1_UN:
4260+
CHECK_STACK(1);
4261+
switch (m_pStackPointer[-1].type)
4262+
{
4263+
case StackTypeR4:
4264+
case StackTypeR8:
4265+
assert(!"Floating point unsigned conversions");
4266+
break;
4267+
case StackTypeI4:
4268+
EmitConv(m_pStackPointer - 1, StackTypeI4, INTOP_CONV_OVF_I1_U4);
4269+
break;
4270+
case StackTypeI8:
4271+
EmitConv(m_pStackPointer - 1, StackTypeI4, INTOP_CONV_OVF_I1_U8);
4272+
break;
4273+
default:
4274+
assert(0);
4275+
}
4276+
m_ip++;
4277+
break;
4278+
case CEE_CONV_OVF_U1_UN:
4279+
CHECK_STACK(1);
4280+
switch (m_pStackPointer[-1].type)
4281+
{
4282+
case StackTypeR4:
4283+
case StackTypeR8:
4284+
assert(!"Floating point unsigned conversions");
4285+
break;
4286+
case StackTypeI4:
4287+
EmitConv(m_pStackPointer - 1, StackTypeI4, INTOP_CONV_OVF_U1_U4);
4288+
break;
4289+
case StackTypeI8:
4290+
EmitConv(m_pStackPointer - 1, StackTypeI4, INTOP_CONV_OVF_U1_U8);
4291+
break;
4292+
default:
4293+
assert(0);
4294+
}
4295+
m_ip++;
4296+
break;
4297+
case CEE_CONV_OVF_I2_UN:
4298+
CHECK_STACK(1);
4299+
switch (m_pStackPointer[-1].type)
4300+
{
4301+
case StackTypeR4:
4302+
case StackTypeR8:
4303+
assert(!"Floating point unsigned conversions");
4304+
break;
4305+
case StackTypeI4:
4306+
EmitConv(m_pStackPointer - 1, StackTypeI4, INTOP_CONV_OVF_I2_U4);
4307+
break;
4308+
case StackTypeI8:
4309+
EmitConv(m_pStackPointer - 1, StackTypeI4, INTOP_CONV_OVF_I2_U8);
4310+
break;
4311+
default:
4312+
assert(0);
4313+
}
4314+
m_ip++;
4315+
break;
4316+
case CEE_CONV_OVF_U2_UN:
4317+
CHECK_STACK(1);
4318+
switch (m_pStackPointer[-1].type)
4319+
{
4320+
case StackTypeR4:
4321+
case StackTypeR8:
4322+
assert(!"Floating point unsigned conversions");
4323+
break;
4324+
case StackTypeI4:
4325+
EmitConv(m_pStackPointer - 1, StackTypeI4, INTOP_CONV_OVF_U2_U4);
4326+
break;
4327+
case StackTypeI8:
4328+
EmitConv(m_pStackPointer - 1, StackTypeI4, INTOP_CONV_OVF_U2_U8);
4329+
break;
4330+
default:
4331+
assert(0);
4332+
}
4333+
m_ip++;
4334+
break;
4335+
case CEE_CONV_OVF_I4_UN:
4336+
CHECK_STACK(1);
4337+
switch (m_pStackPointer[-1].type)
4338+
{
4339+
case StackTypeR4:
4340+
case StackTypeR8:
4341+
assert(!"Floating point unsigned conversions");
4342+
break;
4343+
case StackTypeI4:
4344+
EmitConv(m_pStackPointer - 1, StackTypeI4, INTOP_CONV_OVF_I4_U4);
4345+
break;
4346+
case StackTypeI8:
4347+
EmitConv(m_pStackPointer - 1, StackTypeI4, INTOP_CONV_OVF_I4_U8);
4348+
break;
4349+
default:
4350+
assert(0);
4351+
}
4352+
m_ip++;
4353+
break;
4354+
case CEE_CONV_OVF_U4_UN:
4355+
CHECK_STACK(1);
4356+
switch (m_pStackPointer[-1].type)
4357+
{
4358+
case StackTypeR4:
4359+
case StackTypeR8:
4360+
assert(!"Floating point unsigned conversions");
4361+
break;
4362+
case StackTypeI4:
4363+
break;
4364+
case StackTypeI8:
4365+
EmitConv(m_pStackPointer - 1, StackTypeI4, INTOP_CONV_OVF_U4_U8);
4366+
break;
4367+
default:
4368+
assert(0);
4369+
}
4370+
m_ip++;
4371+
break;
4372+
case CEE_CONV_OVF_I8_UN:
4373+
CHECK_STACK(1);
4374+
switch (m_pStackPointer[-1].type)
4375+
{
4376+
case StackTypeR4:
4377+
case StackTypeR8:
4378+
assert(!"Floating point unsigned conversions");
4379+
break;
4380+
case StackTypeI4:
4381+
EmitConv(m_pStackPointer - 1, StackTypeI8, INTOP_CONV_I8_U4);
4382+
break;
4383+
case StackTypeI8:
4384+
EmitConv(m_pStackPointer - 1, StackTypeI8, INTOP_CONV_OVF_I8_U8);
4385+
break;
4386+
default:
4387+
assert(0);
4388+
}
4389+
m_ip++;
4390+
break;
4391+
case CEE_CONV_OVF_U8_UN:
4392+
CHECK_STACK(1);
4393+
switch (m_pStackPointer[-1].type)
4394+
{
4395+
case StackTypeR4:
4396+
case StackTypeR8:
4397+
assert(!"Floating point unsigned conversions");
4398+
break;
4399+
case StackTypeI4:
4400+
EmitConv(m_pStackPointer - 1, StackTypeI8, INTOP_CONV_U8_U4);
4401+
break;
4402+
case StackTypeI8:
4403+
break;
4404+
default:
4405+
assert(0);
4406+
}
4407+
m_ip++;
4408+
break;
4409+
case CEE_CONV_OVF_I_UN:
4410+
CHECK_STACK(1);
4411+
switch (m_pStackPointer[-1].type)
4412+
{
4413+
case StackTypeR4:
4414+
case StackTypeR8:
4415+
assert(!"Floating point unsigned conversions");
4416+
break;
4417+
case StackTypeI4:
4418+
#ifdef TARGET_64BIT
4419+
EmitConv(m_pStackPointer - 1, StackTypeI, INTOP_CONV_I8_U4);
4420+
#else
4421+
EmitConv(m_pStackPointer - 1, StackTypeI, INTOP_CONV_OVF_I4_U4);
4422+
#endif
4423+
break;
4424+
case StackTypeI8:
4425+
#ifdef TARGET_64BIT
4426+
EmitConv(m_pStackPointer - 1, StackTypeI, INTOP_CONV_OVF_I8_U8);
4427+
#else
4428+
EmitConv(m_pStackPointer - 1, StackTypeI, INTOP_CONV_OVF_I4_U8);
4429+
#endif
4430+
break;
4431+
default:
4432+
assert(0);
4433+
}
4434+
m_ip++;
4435+
break;
4436+
case CEE_CONV_OVF_U_UN:
4437+
CHECK_STACK(1);
4438+
switch (m_pStackPointer[-1].type)
4439+
{
4440+
case StackTypeR4:
4441+
case StackTypeR8:
4442+
assert(!"Floating point unsigned conversions");
4443+
break;
4444+
case StackTypeI4:
4445+
#ifdef TARGET_64BIT
4446+
EmitConv(m_pStackPointer - 1, StackTypeI, INTOP_CONV_U8_U4);
4447+
#else
4448+
#endif
4449+
break;
4450+
case StackTypeI8:
4451+
#ifdef TARGET_64BIT
4452+
#else
4453+
EmitConv(m_pStackPointer - 1, StackTypeI, INTOP_CONV_OVF_U4_U8);
42514454
#endif
42524455
break;
42534456
default:

src/coreclr/interpreter/intops.def

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -168,6 +168,7 @@ OPDEF(INTOP_CONV_R8_I4, "conv.r8.i4", 3, 1, 1, InterpOpNoArgs)
168168
OPDEF(INTOP_CONV_R8_I8, "conv.r8.i8", 3, 1, 1, InterpOpNoArgs)
169169
OPDEF(INTOP_CONV_R8_R4, "conv.r8.r4", 3, 1, 1, InterpOpNoArgs)
170170

171+
OPDEF(INTOP_CONV_U8_U4, "conv.u8.u4", 3, 1, 1, InterpOpNoArgs)
171172
OPDEF(INTOP_CONV_U8_R4, "conv.u8.r4", 3, 1, 1, InterpOpNoArgs)
172173
OPDEF(INTOP_CONV_U8_R8, "conv.u8.r8", 3, 1, 1, InterpOpNoArgs)
173174

@@ -191,20 +192,41 @@ OPDEF(INTOP_CONV_OVF_U2_I8, "conv.ovf.u2.i8", 3, 1, 1, InterpOpNoArgs)
191192
OPDEF(INTOP_CONV_OVF_U2_R4, "conv.ovf.u2.r4", 3, 1, 1, InterpOpNoArgs)
192193
OPDEF(INTOP_CONV_OVF_U2_R8, "conv.ovf.u2.r8", 3, 1, 1, InterpOpNoArgs)
193194

195+
OPDEF(INTOP_CONV_OVF_I4_U4, "conv.ovf.i4.u4", 3, 1, 1, InterpOpNoArgs)
194196
OPDEF(INTOP_CONV_OVF_I4_I8, "conv.ovf.i4.i8", 3, 1, 1, InterpOpNoArgs)
195197
OPDEF(INTOP_CONV_OVF_I4_R4, "conv.ovf.i4.r4", 3, 1, 1, InterpOpNoArgs)
196198
OPDEF(INTOP_CONV_OVF_I4_R8, "conv.ovf.i4.r8", 3, 1, 1, InterpOpNoArgs)
197199

200+
OPDEF(INTOP_CONV_OVF_U4_I4, "conv.ovf.u4.i4", 3, 1, 1, InterpOpNoArgs)
198201
OPDEF(INTOP_CONV_OVF_U4_I8, "conv.ovf.u4.i8", 3, 1, 1, InterpOpNoArgs)
199202
OPDEF(INTOP_CONV_OVF_U4_R4, "conv.ovf.u4.r4", 3, 1, 1, InterpOpNoArgs)
200203
OPDEF(INTOP_CONV_OVF_U4_R8, "conv.ovf.u4.r8", 3, 1, 1, InterpOpNoArgs)
201204

205+
OPDEF(INTOP_CONV_OVF_I8_U8, "conv.ovf.i8.u8", 3, 1, 1, InterpOpNoArgs)
202206
OPDEF(INTOP_CONV_OVF_I8_R4, "conv.ovf.i8.r4", 3, 1, 1, InterpOpNoArgs)
203207
OPDEF(INTOP_CONV_OVF_I8_R8, "conv.ovf.i8.r8", 3, 1, 1, InterpOpNoArgs)
204208

209+
OPDEF(INTOP_CONV_OVF_U8_I4, "conv.ovf.u8.i4", 3, 1, 1, InterpOpNoArgs)
210+
OPDEF(INTOP_CONV_OVF_U8_I8, "conv.ovf.u8.i8", 3, 1, 1, InterpOpNoArgs)
205211
OPDEF(INTOP_CONV_OVF_U8_R4, "conv.ovf.u8.r4", 3, 1, 1, InterpOpNoArgs)
206212
OPDEF(INTOP_CONV_OVF_U8_R8, "conv.ovf.u8.r8", 3, 1, 1, InterpOpNoArgs)
207213

214+
OPDEF(INTOP_CONV_OVF_I1_U4, "conv.ovf.i1.u4", 3, 1, 1, InterpOpNoArgs)
215+
OPDEF(INTOP_CONV_OVF_I1_U8, "conv.ovf.i1.u8", 3, 1, 1, InterpOpNoArgs)
216+
217+
OPDEF(INTOP_CONV_OVF_U1_U4, "conv.ovf.u1.u4", 3, 1, 1, InterpOpNoArgs)
218+
OPDEF(INTOP_CONV_OVF_U1_U8, "conv.ovf.u1.u8", 3, 1, 1, InterpOpNoArgs)
219+
220+
OPDEF(INTOP_CONV_OVF_I2_U4, "conv.ovf.i2.u4", 3, 1, 1, InterpOpNoArgs)
221+
OPDEF(INTOP_CONV_OVF_I2_U8, "conv.ovf.i2.u8", 3, 1, 1, InterpOpNoArgs)
222+
223+
OPDEF(INTOP_CONV_OVF_U2_U4, "conv.ovf.u2.u4", 3, 1, 1, InterpOpNoArgs)
224+
OPDEF(INTOP_CONV_OVF_U2_U8, "conv.ovf.u2.u8", 3, 1, 1, InterpOpNoArgs)
225+
226+
OPDEF(INTOP_CONV_OVF_I4_U8, "conv.ovf.i4.u8", 3, 1, 1, InterpOpNoArgs)
227+
228+
OPDEF(INTOP_CONV_OVF_U4_U8, "conv.ovf.u4.u8", 3, 1, 1, InterpOpNoArgs)
229+
208230
OPDEF(INTOP_UNBOX_ANY, "unbox.any", 5, 1, 1, InterpOpHelperFtn) // [class handle data item] [helper data item]
209231
OPDEF(INTOP_UNBOX_ANY_GENERIC, "unbox.any.generic", 6, 1, 2, InterpOpGenericHelperFtn) // [class handle data item] [helper data item]
210232
// Unary operations end

0 commit comments

Comments
 (0)