@@ -34,15 +34,13 @@ namespace randomx {
34
34
static const char * regE[4 ] = { " xmm4" , " xmm5" , " xmm6" , " xmm7" };
35
35
static const char * regA[4 ] = { " xmm8" , " xmm9" , " xmm10" , " xmm11" };
36
36
37
- static const char * regA4 = " xmm12" ;
38
- static const char * dblMin = " xmm13" ;
39
- static const char * absMask = " xmm14" ;
40
- static const char * signMask = " xmm15" ;
41
- static const char * regMx = " rbp" ;
37
+ static const char * tempRegx = " xmm12" ;
38
+ static const char * mantissaMask = " xmm13" ;
39
+ static const char * exponentMask = " xmm14" ;
40
+ static const char * scaleMask = " xmm15" ;
42
41
static const char * regIc = " rbx" ;
43
42
static const char * regIc32 = " ebx" ;
44
43
static const char * regIc8 = " bl" ;
45
- static const char * regDatasetAddr = " rdi" ;
46
44
static const char * regScratchpadAddr = " rsi" ;
47
45
48
46
void AssemblyGeneratorX86::generateProgram (Program& prog) {
@@ -274,7 +272,6 @@ namespace randomx {
274
272
return (int32_t )instr.getImm32 () & ScratchpadL3Mask;
275
273
}
276
274
277
- // 1 uOP
278
275
void AssemblyGeneratorX86::h_IADD_RS (Instruction& instr, int i) {
279
276
registerUsage[instr.dst ] = i;
280
277
if (instr.dst == RegisterNeedsDisplacement)
@@ -284,27 +281,18 @@ namespace randomx {
284
281
traceint (instr);
285
282
}
286
283
287
- // 2.75 uOP
288
284
void AssemblyGeneratorX86::h_IADD_M (Instruction& instr, int i) {
289
285
registerUsage[instr.dst ] = i;
290
286
if (instr.src != instr.dst ) {
291
287
genAddressReg (instr);
292
- asmCode << " \t add " << regR[instr.dst ] << " , qword ptr [rsi +rax]" << std::endl;
288
+ asmCode << " \t add " << regR[instr.dst ] << " , qword ptr [" << regScratchpadAddr << " +rax]" << std::endl;
293
289
}
294
290
else {
295
- asmCode << " \t add " << regR[instr.dst ] << " , qword ptr [rsi +" << genAddressImm (instr) << " ]" << std::endl;
291
+ asmCode << " \t add " << regR[instr.dst ] << " , qword ptr [" << regScratchpadAddr << " +" << genAddressImm (instr) << " ]" << std::endl;
296
292
}
297
293
traceint (instr);
298
294
}
299
295
300
- // 1 uOP
301
- void AssemblyGeneratorX86::h_IADD_RC (Instruction& instr, int i) {
302
- registerUsage[instr.dst ] = i;
303
- asmCode << " \t lea " << regR[instr.dst ] << " , [" << regR[instr.dst ] << " +" << regR[instr.src ] << std::showpos << (int32_t )instr.getImm32 () << std::noshowpos << " ]" << std::endl;
304
- traceint (instr);
305
- }
306
-
307
- // 1 uOP
308
296
void AssemblyGeneratorX86::h_ISUB_R (Instruction& instr, int i) {
309
297
registerUsage[instr.dst ] = i;
310
298
if (instr.src != instr.dst ) {
@@ -316,27 +304,18 @@ namespace randomx {
316
304
traceint (instr);
317
305
}
318
306
319
- // 2.75 uOP
320
307
void AssemblyGeneratorX86::h_ISUB_M (Instruction& instr, int i) {
321
308
registerUsage[instr.dst ] = i;
322
309
if (instr.src != instr.dst ) {
323
310
genAddressReg (instr);
324
- asmCode << " \t sub " << regR[instr.dst ] << " , qword ptr [rsi +rax]" << std::endl;
311
+ asmCode << " \t sub " << regR[instr.dst ] << " , qword ptr [" << regScratchpadAddr << " +rax]" << std::endl;
325
312
}
326
313
else {
327
- asmCode << " \t sub " << regR[instr.dst ] << " , qword ptr [rsi +" << genAddressImm (instr) << " ]" << std::endl;
314
+ asmCode << " \t sub " << regR[instr.dst ] << " , qword ptr [" << regScratchpadAddr << " +" << genAddressImm (instr) << " ]" << std::endl;
328
315
}
329
316
traceint (instr);
330
317
}
331
318
332
- // 1 uOP
333
- void AssemblyGeneratorX86::h_IMUL_9C (Instruction& instr, int i) {
334
- registerUsage[instr.dst ] = i;
335
- asmCode << " \t lea " << regR[instr.dst ] << " , [" << regR[instr.dst ] << " +" << regR[instr.dst ] << " *8" << std::showpos << (int32_t )instr.getImm32 () << std::noshowpos << " ]" << std::endl;
336
- traceint (instr);
337
- }
338
-
339
- // 1 uOP
340
319
void AssemblyGeneratorX86::h_IMUL_R (Instruction& instr, int i) {
341
320
registerUsage[instr.dst ] = i;
342
321
if (instr.src != instr.dst ) {
@@ -348,15 +327,14 @@ namespace randomx {
348
327
traceint (instr);
349
328
}
350
329
351
- // 2.75 uOP
352
330
void AssemblyGeneratorX86::h_IMUL_M (Instruction& instr, int i) {
353
331
registerUsage[instr.dst ] = i;
354
332
if (instr.src != instr.dst ) {
355
333
genAddressReg (instr);
356
- asmCode << " \t imul " << regR[instr.dst ] << " , qword ptr [rsi +rax]" << std::endl;
334
+ asmCode << " \t imul " << regR[instr.dst ] << " , qword ptr [" << regScratchpadAddr << " +rax]" << std::endl;
357
335
}
358
336
else {
359
- asmCode << " \t imul " << regR[instr.dst ] << " , qword ptr [rsi +" << genAddressImm (instr) << " ]" << std::endl;
337
+ asmCode << " \t imul " << regR[instr.dst ] << " , qword ptr [" << regScratchpadAddr << " +" << genAddressImm (instr) << " ]" << std::endl;
360
338
}
361
339
traceint (instr);
362
340
}
@@ -370,23 +348,21 @@ namespace randomx {
370
348
traceint (instr);
371
349
}
372
350
373
- // 5.75 uOPs
374
351
void AssemblyGeneratorX86::h_IMULH_M (Instruction& instr, int i) {
375
352
registerUsage[instr.dst ] = i;
376
353
if (instr.src != instr.dst ) {
377
354
genAddressReg (instr, " ecx" );
378
355
asmCode << " \t mov rax, " << regR[instr.dst ] << std::endl;
379
- asmCode << " \t mul qword ptr [rsi +rcx]" << std::endl;
356
+ asmCode << " \t mul qword ptr [" << regScratchpadAddr << " +rcx]" << std::endl;
380
357
}
381
358
else {
382
359
asmCode << " \t mov rax, " << regR[instr.dst ] << std::endl;
383
- asmCode << " \t mul qword ptr [rsi +" << genAddressImm (instr) << " ]" << std::endl;
360
+ asmCode << " \t mul qword ptr [" << regScratchpadAddr << " +" << genAddressImm (instr) << " ]" << std::endl;
384
361
}
385
362
asmCode << " \t mov " << regR[instr.dst ] << " , rdx" << std::endl;
386
363
traceint (instr);
387
364
}
388
365
389
- // 4 uOPs
390
366
void AssemblyGeneratorX86::h_ISMULH_R (Instruction& instr, int i) {
391
367
registerUsage[instr.dst ] = i;
392
368
asmCode << " \t mov rax, " << regR[instr.dst ] << std::endl;
@@ -395,30 +371,27 @@ namespace randomx {
395
371
traceint (instr);
396
372
}
397
373
398
- // 5.75 uOPs
399
374
void AssemblyGeneratorX86::h_ISMULH_M (Instruction& instr, int i) {
400
375
registerUsage[instr.dst ] = i;
401
376
if (instr.src != instr.dst ) {
402
377
genAddressReg (instr, " ecx" );
403
378
asmCode << " \t mov rax, " << regR[instr.dst ] << std::endl;
404
- asmCode << " \t imul qword ptr [rsi +rcx]" << std::endl;
379
+ asmCode << " \t imul qword ptr [" << regScratchpadAddr << " +rcx]" << std::endl;
405
380
}
406
381
else {
407
382
asmCode << " \t mov rax, " << regR[instr.dst ] << std::endl;
408
- asmCode << " \t imul qword ptr [rsi +" << genAddressImm (instr) << " ]" << std::endl;
383
+ asmCode << " \t imul qword ptr [" << regScratchpadAddr << " +" << genAddressImm (instr) << " ]" << std::endl;
409
384
}
410
385
asmCode << " \t mov " << regR[instr.dst ] << " , rdx" << std::endl;
411
386
traceint (instr);
412
387
}
413
388
414
- // 1 uOP
415
389
void AssemblyGeneratorX86::h_INEG_R (Instruction& instr, int i) {
416
390
registerUsage[instr.dst ] = i;
417
391
asmCode << " \t neg " << regR[instr.dst ] << std::endl;
418
392
traceint (instr);
419
393
}
420
394
421
- // 1 uOP
422
395
void AssemblyGeneratorX86::h_IXOR_R (Instruction& instr, int i) {
423
396
registerUsage[instr.dst ] = i;
424
397
if (instr.src != instr.dst ) {
@@ -430,20 +403,18 @@ namespace randomx {
430
403
traceint (instr);
431
404
}
432
405
433
- // 2.75 uOP
434
406
void AssemblyGeneratorX86::h_IXOR_M (Instruction& instr, int i) {
435
407
registerUsage[instr.dst ] = i;
436
408
if (instr.src != instr.dst ) {
437
409
genAddressReg (instr);
438
- asmCode << " \t xor " << regR[instr.dst ] << " , qword ptr [rsi +rax]" << std::endl;
410
+ asmCode << " \t xor " << regR[instr.dst ] << " , qword ptr [" << regScratchpadAddr << " +rax]" << std::endl;
439
411
}
440
412
else {
441
- asmCode << " \t xor " << regR[instr.dst ] << " , qword ptr [rsi +" << genAddressImm (instr) << " ]" << std::endl;
413
+ asmCode << " \t xor " << regR[instr.dst ] << " , qword ptr [" << regScratchpadAddr << " +" << genAddressImm (instr) << " ]" << std::endl;
442
414
}
443
415
traceint (instr);
444
416
}
445
417
446
- // 1.75 uOPs
447
418
void AssemblyGeneratorX86::h_IROR_R (Instruction& instr, int i) {
448
419
registerUsage[instr.dst ] = i;
449
420
if (instr.src != instr.dst ) {
@@ -456,7 +427,6 @@ namespace randomx {
456
427
traceint (instr);
457
428
}
458
429
459
- // 1.75 uOPs
460
430
void AssemblyGeneratorX86::h_IROL_R (Instruction& instr, int i) {
461
431
registerUsage[instr.dst ] = i;
462
432
if (instr.src != instr.dst ) {
@@ -469,7 +439,6 @@ namespace randomx {
469
439
traceint (instr);
470
440
}
471
441
472
- // 2 uOPs
473
442
void AssemblyGeneratorX86::h_IMUL_RCP (Instruction& instr, int i) {
474
443
if (instr.getImm32 () != 0 ) {
475
444
registerUsage[instr.dst ] = i;
@@ -483,12 +452,6 @@ namespace randomx {
483
452
}
484
453
}
485
454
486
- // ~8.5 uOPs
487
- void AssemblyGeneratorX86::h_ISDIV_C (Instruction& instr, int i) {
488
- tracenop (instr);
489
- }
490
-
491
- // 2 uOPs
492
455
void AssemblyGeneratorX86::h_ISWAP_R (Instruction& instr, int i) {
493
456
if (instr.src != instr.dst ) {
494
457
registerUsage[instr.dst ] = i;
@@ -501,100 +464,70 @@ namespace randomx {
501
464
}
502
465
}
503
466
504
- // 1 uOPs
505
467
void AssemblyGeneratorX86::h_FSWAP_R (Instruction& instr, int i) {
506
468
asmCode << " \t shufpd " << regFE[instr.dst ] << " , " << regFE[instr.dst ] << " , 1" << std::endl;
507
469
traceflt (instr);
508
470
}
509
471
510
- // 1 uOP
511
472
void AssemblyGeneratorX86::h_FADD_R (Instruction& instr, int i) {
512
473
instr.dst %= 4 ;
513
474
instr.src %= 4 ;
514
475
asmCode << " \t addpd " << regF[instr.dst ] << " , " << regA[instr.src ] << std::endl;
515
476
traceflt (instr);
516
477
}
517
478
518
- // 5 uOPs
519
479
void AssemblyGeneratorX86::h_FADD_M (Instruction& instr, int i) {
520
480
instr.dst %= 4 ;
521
481
genAddressReg (instr);
522
- asmCode << " \t cvtdq2pd xmm12 , qword ptr [rsi +rax]" << std::endl;
523
- asmCode << " \t addpd " << regF[instr.dst ] << " , xmm12 " << std::endl;
482
+ asmCode << " \t cvtdq2pd " << tempRegx << " , qword ptr [" << regScratchpadAddr << " +rax]" << std::endl;
483
+ asmCode << " \t addpd " << regF[instr.dst ] << " , " << tempRegx << std::endl;
524
484
traceflt (instr);
525
485
}
526
486
527
- // 1 uOP
528
487
void AssemblyGeneratorX86::h_FSUB_R (Instruction& instr, int i) {
529
488
instr.dst %= 4 ;
530
489
instr.src %= 4 ;
531
490
asmCode << " \t subpd " << regF[instr.dst ] << " , " << regA[instr.src ] << std::endl;
532
491
traceflt (instr);
533
492
}
534
493
535
- // 5 uOPs
536
494
void AssemblyGeneratorX86::h_FSUB_M (Instruction& instr, int i) {
537
495
instr.dst %= 4 ;
538
496
genAddressReg (instr);
539
- asmCode << " \t cvtdq2pd xmm12 , qword ptr [rsi +rax]" << std::endl;
540
- asmCode << " \t subpd " << regF[instr.dst ] << " , xmm12 " << std::endl;
497
+ asmCode << " \t cvtdq2pd " << tempRegx << " , qword ptr [" << regScratchpadAddr << " +rax]" << std::endl;
498
+ asmCode << " \t subpd " << regF[instr.dst ] << " , " << tempRegx << std::endl;
541
499
traceflt (instr);
542
500
}
543
501
544
- // 1 uOP
545
502
void AssemblyGeneratorX86::h_FSCAL_R (Instruction& instr, int i) {
546
503
instr.dst %= 4 ;
547
- asmCode << " \t xorps " << regF[instr.dst ] << " , " << signMask << std::endl;
504
+ asmCode << " \t xorps " << regF[instr.dst ] << " , " << scaleMask << std::endl;
548
505
traceflt (instr);
549
506
}
550
507
551
- // 1 uOPs
552
508
void AssemblyGeneratorX86::h_FMUL_R (Instruction& instr, int i) {
553
509
instr.dst %= 4 ;
554
510
instr.src %= 4 ;
555
511
asmCode << " \t mulpd " << regE[instr.dst ] << " , " << regA[instr.src ] << std::endl;
556
512
traceflt (instr);
557
513
}
558
514
559
- // 7 uOPs
560
- void AssemblyGeneratorX86::h_FMUL_M (Instruction& instr, int i) {
561
- instr.dst %= 4 ;
562
- genAddressReg (instr);
563
- asmCode << " \t cvtdq2pd xmm12, qword ptr [rsi+rax]" << std::endl;
564
- asmCode << " \t andps xmm12, xmm14" << std::endl;
565
- asmCode << " \t mulpd " << regE[instr.dst ] << " , xmm12" << std::endl;
566
- asmCode << " \t maxpd " << regE[instr.dst ] << " , " << dblMin << std::endl;
567
- traceflt (instr);
568
- }
569
-
570
- // 2 uOPs
571
- void AssemblyGeneratorX86::h_FDIV_R (Instruction& instr, int i) {
572
- instr.dst %= 4 ;
573
- instr.src %= 4 ;
574
- asmCode << " \t divpd " << regE[instr.dst ] << " , " << regA[instr.src ] << std::endl;
575
- asmCode << " \t maxpd " << regE[instr.dst ] << " , " << dblMin << std::endl;
576
- traceflt (instr);
577
- }
578
-
579
- // 7 uOPs
580
515
void AssemblyGeneratorX86::h_FDIV_M (Instruction& instr, int i) {
581
516
instr.dst %= 4 ;
582
517
genAddressReg (instr);
583
- asmCode << " \t cvtdq2pd xmm12 , qword ptr [rsi +rax]" << std::endl;
584
- asmCode << " \t andps xmm12, xmm13 " << std::endl;
585
- asmCode << " \t orps xmm12, xmm14 " << std::endl;
586
- asmCode << " \t divpd " << regE[instr.dst ] << " , xmm12 " << std::endl;
518
+ asmCode << " \t cvtdq2pd " << tempRegx << " , qword ptr [" << regScratchpadAddr << " +rax]" << std::endl;
519
+ asmCode << " \t andps " << tempRegx << " , " << mantissaMask << std::endl;
520
+ asmCode << " \t orps " << tempRegx << " , " << exponentMask << std::endl;
521
+ asmCode << " \t divpd " << regE[instr.dst ] << " , " << tempRegx << std::endl;
587
522
traceflt (instr);
588
523
}
589
524
590
- // 1 uOP
591
525
void AssemblyGeneratorX86::h_FSQRT_R (Instruction& instr, int i) {
592
526
instr.dst %= 4 ;
593
527
asmCode << " \t sqrtpd " << regE[instr.dst ] << " , " << regE[instr.dst ] << std::endl;
594
528
traceflt (instr);
595
529
}
596
530
597
- // 6 uOPs
598
531
void AssemblyGeneratorX86::h_CFROUND (Instruction& instr, int i) {
599
532
asmCode << " \t mov rax, " << regR[instr.src ] << std::endl;
600
533
int rotate = (13 - (instr.getImm32 () & 63 )) & 63 ;
@@ -645,7 +578,6 @@ namespace randomx {
645
578
}
646
579
}
647
580
648
- // 4 uOPs
649
581
void AssemblyGeneratorX86::h_COND_R (Instruction& instr, int i) {
650
582
handleCondition (instr, i);
651
583
asmCode << " \t xor ecx, ecx" << std::endl;
@@ -655,28 +587,9 @@ namespace randomx {
655
587
traceint (instr);
656
588
}
657
589
658
- // 6 uOPs
659
- void AssemblyGeneratorX86::h_COND_M (Instruction& instr, int i) {
660
- handleCondition (instr, i);
661
- asmCode << " \t xor ecx, ecx" << std::endl;
662
- genAddressReg (instr);
663
- asmCode << " \t cmp dword ptr [rsi+rax], " << (int32_t )instr.getImm32 () << std::endl;
664
- asmCode << " \t set" << condition (instr) << " cl" << std::endl;
665
- asmCode << " \t add " << regR[instr.dst ] << " , rcx" << std::endl;
666
- traceint (instr);
667
- }
668
-
669
- // 3 uOPs
670
590
void AssemblyGeneratorX86::h_ISTORE (Instruction& instr, int i) {
671
591
genAddressRegDst (instr);
672
- asmCode << " \t mov qword ptr [rsi+rax], " << regR[instr.src ] << std::endl;
673
- tracenop (instr);
674
- }
675
-
676
- // 3 uOPs
677
- void AssemblyGeneratorX86::h_FSTORE (Instruction& instr, int i) {
678
- genAddressRegDst (instr, 16 );
679
- asmCode << " \t movapd xmmword ptr [rsi+rax], " << regFE[instr.src ] << std::endl;
592
+ asmCode << " \t mov qword ptr [" << regScratchpadAddr << " +rax], " << regR[instr.src ] << std::endl;
680
593
tracenop (instr);
681
594
}
682
595
@@ -692,10 +605,8 @@ namespace randomx {
692
605
// Integer
693
606
INST_HANDLE (IADD_RS)
694
607
INST_HANDLE (IADD_M)
695
- INST_HANDLE (IADD_RC)
696
608
INST_HANDLE (ISUB_R)
697
609
INST_HANDLE (ISUB_M)
698
- INST_HANDLE (IMUL_9C)
699
610
INST_HANDLE (IMUL_R)
700
611
INST_HANDLE (IMUL_M)
701
612
INST_HANDLE (IMULH_R)
@@ -727,7 +638,6 @@ namespace randomx {
727
638
728
639
// Control
729
640
INST_HANDLE (COND_R)
730
- INST_HANDLE (COND_M)
731
641
INST_HANDLE (CFROUND)
732
642
INST_HANDLE (ISTORE)
733
643
0 commit comments