@@ -247,7 +247,7 @@ bool emitter::emitInsIsLoadOrStore(instruction ins)
247
247
* Returns the specific encoding of the given CPU instruction.
248
248
*/
249
249
250
- inline emitter::code_t emitter::emitInsCode (instruction ins /* , insFormat fmt*/ ) const
250
+ inline emitter::code_t emitter::emitInsCode (instruction ins /* , insFormat fmt*/ )
251
251
{
252
252
code_t code = BAD_CODE;
253
253
@@ -688,7 +688,7 @@ void emitter::emitIns_R_R(
688
688
if (INS_fcvt_d_w != ins && INS_fcvt_d_wu != ins) // fcvt.d.w[u] always produces an exact result
689
689
code |= 0x7 << 12 ; // round according to frm status register
690
690
}
691
- else if (INS_fcvt_s_d == ins || INS_fcvt_d_s == ins)
691
+ else if (INS_fcvt_s_d == ins || INS_fcvt_d_s == ins || INS_fsqrt_s == ins || INS_fsqrt_d == ins )
692
692
{
693
693
assert (isFloatReg (reg1));
694
694
assert (isFloatReg (reg2));
@@ -865,7 +865,6 @@ void emitter::emitIns_R_R_R(
865
865
case INS_fsub_s:
866
866
case INS_fmul_s:
867
867
case INS_fdiv_s:
868
- case INS_fsqrt_s:
869
868
case INS_fsgnj_s:
870
869
case INS_fsgnjn_s:
871
870
case INS_fsgnjx_s:
@@ -880,7 +879,6 @@ void emitter::emitIns_R_R_R(
880
879
case INS_fsub_d:
881
880
case INS_fmul_d:
882
881
case INS_fdiv_d:
883
- case INS_fsqrt_d:
884
882
case INS_fsgnj_d:
885
883
case INS_fsgnjn_d:
886
884
case INS_fsgnjx_d:
@@ -925,7 +923,7 @@ void emitter::emitIns_R_R_R(
925
923
code |= ((reg1 & 0x1f ) << 7 );
926
924
code |= ((reg2 & 0x1f ) << 15 );
927
925
code |= ((reg3 & 0x1f ) << 20 );
928
- if ((INS_fadd_s <= ins && INS_fsqrt_s >= ins) || (INS_fadd_d <= ins && INS_fsqrt_d >= ins))
926
+ if ((INS_fadd_s <= ins && INS_fdiv_s >= ins) || (INS_fadd_d <= ins && INS_fdiv_d >= ins))
929
927
{
930
928
code |= 0x7 << 12 ;
931
929
}
@@ -4319,22 +4317,17 @@ void emitter::emitDispInsName(
4319
4317
case 0x2C : // FSQRT.S
4320
4318
printf (" fsqrt.s %s, %s\n " , fd, fs1);
4321
4319
return ;
4322
- case 0x10 : // FSGNJ.S & FSGNJN.S & FSGNJX.S
4323
- if (opcode4 == 0 ) // FSGNJ.S
4320
+ case 0x10 : // FSGNJ.S & FSGNJN.S & FSGNJX.S
4321
+ NYI_IF (opcode4 >= 3 , " RISC-V illegal fsgnj.s variant" );
4322
+ if (fs1 != fs2)
4324
4323
{
4325
- printf (" fsgnj.s %s, %s, %s\n " , fd, fs1, fs2);
4324
+ const char * variants[3 ] = {" .s " , " n.s" , " x.s" };
4325
+ printf (" fsgnj%s %s, %s, %s\n " , variants[opcode4], fd, fs1, fs2);
4326
4326
}
4327
- else if (opcode4 == 1 ) // FSGNJN.S
4327
+ else // pseudos
4328
4328
{
4329
- printf (" fsgnjn.s %s, %s, %s\n " , fd, fs1, fs2);
4330
- }
4331
- else if (opcode4 == 2 ) // FSGNJX.S
4332
- {
4333
- printf (" fsgnjx.s %s, %s, %s\n " , fd, fs1, fs2);
4334
- }
4335
- else
4336
- {
4337
- NYI_RISCV64 (" illegal ins within emitDisInsName!" );
4329
+ const char * names[3 ] = {" fmv.s " , " fneg.s" , " fabs.s" };
4330
+ printf (" %s %s, %s\n " , names[opcode4], fd, fs1);
4338
4331
}
4339
4332
return ;
4340
4333
case 0x14 : // FMIN.S & FMAX.S
@@ -4422,7 +4415,6 @@ void emitter::emitDispInsName(
4422
4415
{
4423
4416
printf (" fcvt.s.lu %s, %s\n " , fd, xs1);
4424
4417
}
4425
-
4426
4418
else
4427
4419
{
4428
4420
NYI_RISCV64 (" illegal ins within emitDisInsName!" );
@@ -4446,22 +4438,17 @@ void emitter::emitDispInsName(
4446
4438
case 0x2d : // FSQRT.D
4447
4439
printf (" fsqrt.d %s, %s\n " , fd, fs1);
4448
4440
return ;
4449
- case 0x11 : // FSGNJ.D & FSGNJN.D & FSGNJX.D
4450
- if (opcode4 == 0 ) // FSGNJ.D
4441
+ case 0x11 : // FSGNJ.D & FSGNJN.D & FSGNJX.D
4442
+ NYI_IF (opcode4 >= 3 , " RISC-V illegal fsgnj.d variant" );
4443
+ if (fs1 != fs2)
4451
4444
{
4452
- printf (" fsgnj.d %s, %s, %s\n " , fd, fs1, fs2);
4445
+ const char * variants[3 ] = {" .d " , " n.d" , " x.d" };
4446
+ printf (" fsgnj%s %s, %s, %s\n " , variants[opcode4], fd, fs1, fs2);
4453
4447
}
4454
- else if (opcode4 == 1 ) // FSGNJN.D
4448
+ else // pseudos
4455
4449
{
4456
- printf (" fsgnjn.d %s, %s, %s\n " , fd, fs1, fs2);
4457
- }
4458
- else if (opcode4 == 2 ) // FSGNJX.D
4459
- {
4460
- printf (" fsgnjx.d %s, %s, %s\n " , fd, fs1, fs2);
4461
- }
4462
- else
4463
- {
4464
- NYI_RISCV64 (" illegal ins within emitDisInsName!" );
4450
+ const char * names[3 ] = {" fmv.d " , " fneg.d" , " fabs.d" };
4451
+ printf (" %s %s, %s\n " , names[opcode4], fd, fs1);
4465
4452
}
4466
4453
return ;
4467
4454
case 0x15 : // FMIN.D & FMAX.D
0 commit comments