@@ -3033,8 +3033,11 @@ emit_move_return_value (MonoCompile *cfg, MonoInst *ins, guint8 *code)
3033
3033
{
3034
3034
switch (ins -> opcode ) {
3035
3035
case OP_FCALL :
3036
+ case OP_RCALL :
3036
3037
case OP_FCALL_REG :
3038
+ case OP_RCALL_REG :
3037
3039
case OP_FCALL_MEMBASE :
3040
+ case OP_RCALL_MEMBASE :
3038
3041
if (ins -> dreg != ppc_f1 )
3039
3042
ppc_fmr (code , ins -> dreg , ppc_f1 );
3040
3043
break ;
@@ -3763,6 +3766,7 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb)
3763
3766
ppc_mr (code , ppc_r4 , saved );
3764
3767
break ;
3765
3768
}
3769
+ case OP_RMOVE :
3766
3770
case OP_FMOVE :
3767
3771
if (ins -> dreg != ins -> sreg1 )
3768
3772
ppc_fmr (code , ins -> dreg , ins -> sreg1 );
@@ -3894,6 +3898,7 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb)
3894
3898
ppc_stptr (code , ppc_r0 , 0 , ins -> sreg1 );
3895
3899
break ;
3896
3900
}
3901
+ case OP_RCALL :
3897
3902
case OP_FCALL :
3898
3903
case OP_LCALL :
3899
3904
case OP_VCALL :
@@ -3916,6 +3921,7 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb)
3916
3921
/* FIXME: this should be handled somewhere else in the new jit */
3917
3922
code = emit_move_return_value (cfg , ins , code );
3918
3923
break ;
3924
+ case OP_RCALL_REG :
3919
3925
case OP_FCALL_REG :
3920
3926
case OP_LCALL_REG :
3921
3927
case OP_VCALL_REG :
@@ -3945,6 +3951,7 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb)
3945
3951
/* FIXME: this should be handled somewhere else in the new jit */
3946
3952
code = emit_move_return_value (cfg , ins , code );
3947
3953
break ;
3954
+ case OP_RCALL_MEMBASE :
3948
3955
case OP_FCALL_MEMBASE :
3949
3956
case OP_LCALL_MEMBASE :
3950
3957
case OP_VCALL_MEMBASE :
@@ -4266,21 +4273,27 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb)
4266
4273
case CEE_CONV_R4 : /* FIXME: change precision */
4267
4274
case CEE_CONV_R8 :
4268
4275
g_assert_not_reached ();
4276
+ case OP_RCONV_TO_I1 :
4269
4277
case OP_FCONV_TO_I1 :
4270
4278
code = emit_float_to_int (cfg , code , ins -> dreg , ins -> sreg1 , 1 , TRUE);
4271
4279
break ;
4280
+ case OP_RCONV_TO_U1 :
4272
4281
case OP_FCONV_TO_U1 :
4273
4282
code = emit_float_to_int (cfg , code , ins -> dreg , ins -> sreg1 , 1 , FALSE);
4274
4283
break ;
4284
+ case OP_RCONV_TO_I2 :
4275
4285
case OP_FCONV_TO_I2 :
4276
4286
code = emit_float_to_int (cfg , code , ins -> dreg , ins -> sreg1 , 2 , TRUE);
4277
4287
break ;
4288
+ case OP_RCONV_TO_U2 :
4278
4289
case OP_FCONV_TO_U2 :
4279
4290
code = emit_float_to_int (cfg , code , ins -> dreg , ins -> sreg1 , 2 , FALSE);
4280
4291
break ;
4292
+ case OP_RCONV_TO_I4 :
4281
4293
case OP_FCONV_TO_I4 :
4282
4294
code = emit_float_to_int (cfg , code , ins -> dreg , ins -> sreg1 , 4 , TRUE);
4283
4295
break ;
4296
+ case OP_RCONV_TO_U4 :
4284
4297
case OP_FCONV_TO_U4 :
4285
4298
code = emit_float_to_int (cfg , code , ins -> dreg , ins -> sreg1 , 4 , FALSE);
4286
4299
break ;
@@ -4339,21 +4352,35 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb)
4339
4352
case OP_SQRT :
4340
4353
ppc_fsqrtd (code , ins -> dreg , ins -> sreg1 );
4341
4354
break ;
4355
+ case OP_RADD :
4356
+ ppc_fadds (code , ins -> dreg , ins -> sreg1 , ins -> sreg2 );
4357
+ break ;
4342
4358
case OP_FADD :
4343
4359
ppc_fadd (code , ins -> dreg , ins -> sreg1 , ins -> sreg2 );
4344
4360
break ;
4361
+ case OP_RSUB :
4362
+ ppc_fsubs (code , ins -> dreg , ins -> sreg1 , ins -> sreg2 );
4363
+ break ;
4345
4364
case OP_FSUB :
4346
4365
ppc_fsub (code , ins -> dreg , ins -> sreg1 , ins -> sreg2 );
4347
4366
break ;
4367
+ case OP_RMUL :
4368
+ ppc_fmuls (code , ins -> dreg , ins -> sreg1 , ins -> sreg2 );
4369
+ break ;
4348
4370
case OP_FMUL :
4349
4371
ppc_fmul (code , ins -> dreg , ins -> sreg1 , ins -> sreg2 );
4350
4372
break ;
4373
+ case OP_RDIV :
4374
+ ppc_fdivs (code , ins -> dreg , ins -> sreg1 , ins -> sreg2 );
4375
+ break ;
4351
4376
case OP_FDIV :
4352
4377
ppc_fdiv (code , ins -> dreg , ins -> sreg1 , ins -> sreg2 );
4353
4378
break ;
4379
+ case OP_RNEG :
4354
4380
case OP_FNEG :
4355
4381
ppc_fneg (code , ins -> dreg , ins -> sreg1 );
4356
4382
break ;
4383
+ case OP_RREM :
4357
4384
case OP_FREM :
4358
4385
/* emulated */
4359
4386
g_assert_not_reached ();
@@ -4391,37 +4418,46 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb)
4391
4418
ppc_cmpl (code , 0 , 1 , ins -> sreg1 , ins -> sreg2 );
4392
4419
ppc_iselgt (code , ins -> dreg , ins -> sreg1 , ins -> sreg2 );
4393
4420
break ;
4421
+ case OP_RCOMPARE :
4394
4422
case OP_FCOMPARE :
4395
4423
ppc_fcmpu (code , 0 , ins -> sreg1 , ins -> sreg2 );
4396
4424
break ;
4425
+ case OP_RCEQ :
4426
+ case OP_RCNEQ :
4397
4427
case OP_FCEQ :
4398
4428
case OP_FCNEQ :
4399
4429
ppc_fcmpo (code , 0 , ins -> sreg1 , ins -> sreg2 );
4400
4430
ppc_li (code , ins -> dreg , 1 );
4401
- ppc_bc (code , ins -> opcode == OP_FCEQ ? PPC_BR_TRUE : PPC_BR_FALSE , PPC_BR_EQ , 2 );
4431
+ ppc_bc (code , ins -> opcode == OP_FCEQ || ins -> opcode == OP_RCEQ ? PPC_BR_TRUE : PPC_BR_FALSE , PPC_BR_EQ , 2 );
4402
4432
ppc_li (code , ins -> dreg , 0 );
4403
4433
break ;
4434
+ case OP_RCLT :
4435
+ case OP_RCGE :
4404
4436
case OP_FCLT :
4405
4437
case OP_FCGE :
4406
4438
ppc_fcmpo (code , 0 , ins -> sreg1 , ins -> sreg2 );
4407
4439
ppc_li (code , ins -> dreg , 1 );
4408
- ppc_bc (code , ins -> opcode == OP_FCLT ? PPC_BR_TRUE : PPC_BR_FALSE , PPC_BR_LT , 2 );
4440
+ ppc_bc (code , ins -> opcode == OP_FCLT || ins -> opcode == OP_RCLT ? PPC_BR_TRUE : PPC_BR_FALSE , PPC_BR_LT , 2 );
4409
4441
ppc_li (code , ins -> dreg , 0 );
4410
4442
break ;
4443
+ case OP_RCLT_UN :
4411
4444
case OP_FCLT_UN :
4412
4445
ppc_fcmpu (code , 0 , ins -> sreg1 , ins -> sreg2 );
4413
4446
ppc_li (code , ins -> dreg , 1 );
4414
4447
ppc_bc (code , PPC_BR_TRUE , PPC_BR_SO , 3 );
4415
4448
ppc_bc (code , PPC_BR_TRUE , PPC_BR_LT , 2 );
4416
4449
ppc_li (code , ins -> dreg , 0 );
4417
4450
break ;
4451
+ case OP_RCGT :
4452
+ case OP_RCLE :
4418
4453
case OP_FCGT :
4419
4454
case OP_FCLE :
4420
4455
ppc_fcmpo (code , 0 , ins -> sreg1 , ins -> sreg2 );
4421
4456
ppc_li (code , ins -> dreg , 1 );
4422
- ppc_bc (code , ins -> opcode == OP_FCGT ? PPC_BR_TRUE : PPC_BR_FALSE , PPC_BR_GT , 2 );
4457
+ ppc_bc (code , ins -> opcode == OP_FCGT || ins -> opcode == OP_RCGT ? PPC_BR_TRUE : PPC_BR_FALSE , PPC_BR_GT , 2 );
4423
4458
ppc_li (code , ins -> dreg , 0 );
4424
4459
break ;
4460
+ case OP_RCGT_UN :
4425
4461
case OP_FCGT_UN :
4426
4462
ppc_fcmpu (code , 0 , ins -> sreg1 , ins -> sreg2 );
4427
4463
ppc_li (code , ins -> dreg , 1 );
@@ -4492,6 +4528,10 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb)
4492
4528
case OP_ZEXT_I4 :
4493
4529
ppc_clrldi (code , ins -> dreg , ins -> sreg1 , 32 );
4494
4530
break ;
4531
+ case OP_RCONV_TO_R4 :
4532
+ case OP_RCONV_TO_R8 :
4533
+ ppc_fmr (code , ins -> dreg , ins -> sreg1 );
4534
+ break ;
4495
4535
case OP_ICONV_TO_R4 :
4496
4536
case OP_ICONV_TO_R8 :
4497
4537
case OP_LCONV_TO_R4 :
@@ -4509,9 +4549,11 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb)
4509
4549
ppc_str (code , tmp , -8 , ppc_r1 );
4510
4550
ppc_lfd (code , ins -> dreg , -8 , ppc_r1 );
4511
4551
}
4512
- ppc_fcfid (code , ins -> dreg , ins -> dreg );
4513
- if (ins -> opcode == OP_ICONV_TO_R4 || ins -> opcode == OP_LCONV_TO_R4 )
4514
- ppc_frsp (code , ins -> dreg , ins -> dreg );
4552
+ if (ins -> opcode == OP_ICONV_TO_R4 || ins -> opcode == OP_LCONV_TO_R4 ) {
4553
+ ppc_fcfids (code , ins -> dreg , ins -> dreg );
4554
+ } else {
4555
+ ppc_fcfid (code , ins -> dreg , ins -> dreg );
4556
+ }
4515
4557
break ;
4516
4558
}
4517
4559
case OP_LSHR :
@@ -4544,9 +4586,11 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb)
4544
4586
case OP_LBLE_UN :
4545
4587
EMIT_COND_BRANCH (ins , ins -> opcode - OP_LBEQ );
4546
4588
break ;
4589
+ case OP_RCONV_TO_I8 :
4547
4590
case OP_FCONV_TO_I8 :
4548
4591
code = emit_float_to_int (cfg , code , ins -> dreg , ins -> sreg1 , 8 , TRUE);
4549
4592
break ;
4593
+ case OP_RCONV_TO_U8 :
4550
4594
case OP_FCONV_TO_U8 :
4551
4595
code = emit_float_to_int (cfg , code , ins -> dreg , ins -> sreg1 , 8 , FALSE);
4552
4596
break ;
0 commit comments