@@ -45,7 +45,8 @@ namespace randomx {
45
45
46
46
void AssemblyGeneratorX86::generateProgram (Program& prog) {
47
47
for (unsigned i = 0 ; i < RegistersCount; ++i) {
48
- registerUsage[i] = -1 ;
48
+ registerUsage[i].lastUsed = -1 ;
49
+ registerUsage[i].count = 0 ;
49
50
}
50
51
asmCode.str (std::string ()); // clear
51
52
for (unsigned i = 0 ; i < prog.getSize (); ++i) {
@@ -215,18 +216,6 @@ namespace randomx {
215
216
asmCode << " }" << std::endl;
216
217
}
217
218
218
- int AssemblyGeneratorX86::getConditionRegister () {
219
- int min = INT_MAX;
220
- int minIndex;
221
- for (unsigned i = 0 ; i < 8 ; ++i) {
222
- if (registerUsage[i] < min) {
223
- min = registerUsage[i];
224
- minIndex = i;
225
- }
226
- }
227
- return minIndex;
228
- }
229
-
230
219
void AssemblyGeneratorX86::traceint (Instruction& instr) {
231
220
if (trace) {
232
221
asmCode << " \t push " << regR[instr.dst ] << std::endl;
@@ -273,7 +262,7 @@ namespace randomx {
273
262
}
274
263
275
264
void AssemblyGeneratorX86::h_IADD_RS (Instruction& instr, int i) {
276
- registerUsage[instr.dst ] = i;
265
+ registerUsage[instr.dst ]. lastUsed = i;
277
266
if (instr.dst == RegisterNeedsDisplacement)
278
267
asmCode << " \t lea " << regR[instr.dst ] << " , [" << regR[instr.dst ] << " +" << regR[instr.src ] << " *" << (1 << (instr.getModShift ())) << std::showpos << (int32_t )instr.getImm32 () << std::noshowpos << " ]" << std::endl;
279
268
else
@@ -282,7 +271,7 @@ namespace randomx {
282
271
}
283
272
284
273
void AssemblyGeneratorX86::h_IADD_M (Instruction& instr, int i) {
285
- registerUsage[instr.dst ] = i;
274
+ registerUsage[instr.dst ]. lastUsed = i;
286
275
if (instr.src != instr.dst ) {
287
276
genAddressReg (instr);
288
277
asmCode << " \t add " << regR[instr.dst ] << " , qword ptr [" << regScratchpadAddr << " +rax]" << std::endl;
@@ -294,7 +283,7 @@ namespace randomx {
294
283
}
295
284
296
285
void AssemblyGeneratorX86::h_ISUB_R (Instruction& instr, int i) {
297
- registerUsage[instr.dst ] = i;
286
+ registerUsage[instr.dst ]. lastUsed = i;
298
287
if (instr.src != instr.dst ) {
299
288
asmCode << " \t sub " << regR[instr.dst ] << " , " << regR[instr.src ] << std::endl;
300
289
}
@@ -305,7 +294,7 @@ namespace randomx {
305
294
}
306
295
307
296
void AssemblyGeneratorX86::h_ISUB_M (Instruction& instr, int i) {
308
- registerUsage[instr.dst ] = i;
297
+ registerUsage[instr.dst ]. lastUsed = i;
309
298
if (instr.src != instr.dst ) {
310
299
genAddressReg (instr);
311
300
asmCode << " \t sub " << regR[instr.dst ] << " , qword ptr [" << regScratchpadAddr << " +rax]" << std::endl;
@@ -317,7 +306,7 @@ namespace randomx {
317
306
}
318
307
319
308
void AssemblyGeneratorX86::h_IMUL_R (Instruction& instr, int i) {
320
- registerUsage[instr.dst ] = i;
309
+ registerUsage[instr.dst ]. lastUsed = i;
321
310
if (instr.src != instr.dst ) {
322
311
asmCode << " \t imul " << regR[instr.dst ] << " , " << regR[instr.src ] << std::endl;
323
312
}
@@ -328,7 +317,7 @@ namespace randomx {
328
317
}
329
318
330
319
void AssemblyGeneratorX86::h_IMUL_M (Instruction& instr, int i) {
331
- registerUsage[instr.dst ] = i;
320
+ registerUsage[instr.dst ]. lastUsed = i;
332
321
if (instr.src != instr.dst ) {
333
322
genAddressReg (instr);
334
323
asmCode << " \t imul " << regR[instr.dst ] << " , qword ptr [" << regScratchpadAddr << " +rax]" << std::endl;
@@ -341,15 +330,15 @@ namespace randomx {
341
330
342
331
// 4 uOPs
343
332
void AssemblyGeneratorX86::h_IMULH_R (Instruction& instr, int i) {
344
- registerUsage[instr.dst ] = i;
333
+ registerUsage[instr.dst ]. lastUsed = i;
345
334
asmCode << " \t mov rax, " << regR[instr.dst ] << std::endl;
346
335
asmCode << " \t mul " << regR[instr.src ] << std::endl;
347
336
asmCode << " \t mov " << regR[instr.dst ] << " , rdx" << std::endl;
348
337
traceint (instr);
349
338
}
350
339
351
340
void AssemblyGeneratorX86::h_IMULH_M (Instruction& instr, int i) {
352
- registerUsage[instr.dst ] = i;
341
+ registerUsage[instr.dst ]. lastUsed = i;
353
342
if (instr.src != instr.dst ) {
354
343
genAddressReg (instr, " ecx" );
355
344
asmCode << " \t mov rax, " << regR[instr.dst ] << std::endl;
@@ -364,15 +353,15 @@ namespace randomx {
364
353
}
365
354
366
355
void AssemblyGeneratorX86::h_ISMULH_R (Instruction& instr, int i) {
367
- registerUsage[instr.dst ] = i;
356
+ registerUsage[instr.dst ]. lastUsed = i;
368
357
asmCode << " \t mov rax, " << regR[instr.dst ] << std::endl;
369
358
asmCode << " \t imul " << regR[instr.src ] << std::endl;
370
359
asmCode << " \t mov " << regR[instr.dst ] << " , rdx" << std::endl;
371
360
traceint (instr);
372
361
}
373
362
374
363
void AssemblyGeneratorX86::h_ISMULH_M (Instruction& instr, int i) {
375
- registerUsage[instr.dst ] = i;
364
+ registerUsage[instr.dst ]. lastUsed = i;
376
365
if (instr.src != instr.dst ) {
377
366
genAddressReg (instr, " ecx" );
378
367
asmCode << " \t mov rax, " << regR[instr.dst ] << std::endl;
@@ -387,13 +376,13 @@ namespace randomx {
387
376
}
388
377
389
378
void AssemblyGeneratorX86::h_INEG_R (Instruction& instr, int i) {
390
- registerUsage[instr.dst ] = i;
379
+ registerUsage[instr.dst ]. lastUsed = i;
391
380
asmCode << " \t neg " << regR[instr.dst ] << std::endl;
392
381
traceint (instr);
393
382
}
394
383
395
384
void AssemblyGeneratorX86::h_IXOR_R (Instruction& instr, int i) {
396
- registerUsage[instr.dst ] = i;
385
+ registerUsage[instr.dst ]. lastUsed = i;
397
386
if (instr.src != instr.dst ) {
398
387
asmCode << " \t xor " << regR[instr.dst ] << " , " << regR[instr.src ] << std::endl;
399
388
}
@@ -404,7 +393,7 @@ namespace randomx {
404
393
}
405
394
406
395
void AssemblyGeneratorX86::h_IXOR_M (Instruction& instr, int i) {
407
- registerUsage[instr.dst ] = i;
396
+ registerUsage[instr.dst ]. lastUsed = i;
408
397
if (instr.src != instr.dst ) {
409
398
genAddressReg (instr);
410
399
asmCode << " \t xor " << regR[instr.dst ] << " , qword ptr [" << regScratchpadAddr << " +rax]" << std::endl;
@@ -416,7 +405,7 @@ namespace randomx {
416
405
}
417
406
418
407
void AssemblyGeneratorX86::h_IROR_R (Instruction& instr, int i) {
419
- registerUsage[instr.dst ] = i;
408
+ registerUsage[instr.dst ]. lastUsed = i;
420
409
if (instr.src != instr.dst ) {
421
410
asmCode << " \t mov ecx, " << regR32[instr.src ] << std::endl;
422
411
asmCode << " \t ror " << regR[instr.dst ] << " , cl" << std::endl;
@@ -428,7 +417,7 @@ namespace randomx {
428
417
}
429
418
430
419
void AssemblyGeneratorX86::h_IROL_R (Instruction& instr, int i) {
431
- registerUsage[instr.dst ] = i;
420
+ registerUsage[instr.dst ]. lastUsed = i;
432
421
if (instr.src != instr.dst ) {
433
422
asmCode << " \t mov ecx, " << regR32[instr.src ] << std::endl;
434
423
asmCode << " \t rol " << regR[instr.dst ] << " , cl" << std::endl;
@@ -441,7 +430,7 @@ namespace randomx {
441
430
442
431
void AssemblyGeneratorX86::h_IMUL_RCP (Instruction& instr, int i) {
443
432
if (instr.getImm32 () != 0 ) {
444
- registerUsage[instr.dst ] = i;
433
+ registerUsage[instr.dst ]. lastUsed = i;
445
434
asmCode << " \t mov rax, " << randomx_reciprocal (instr.getImm32 ()) << std::endl;
446
435
asmCode << " \t imul " << regR[instr.dst ] << " , rax" << std::endl;
447
436
traceint (instr);
@@ -453,8 +442,8 @@ namespace randomx {
453
442
454
443
void AssemblyGeneratorX86::h_ISWAP_R (Instruction& instr, int i) {
455
444
if (instr.src != instr.dst ) {
456
- registerUsage[instr.dst ] = i;
457
- registerUsage[instr.src ] = i;
445
+ registerUsage[instr.dst ]. lastUsed = i;
446
+ registerUsage[instr.src ]. lastUsed = i;
458
447
asmCode << " \t xchg " << regR[instr.dst ] << " , " << regR[instr.src ] << std::endl;
459
448
traceint (instr);
460
449
}
@@ -541,14 +530,16 @@ namespace randomx {
541
530
}
542
531
543
532
void AssemblyGeneratorX86::h_CBRANCH (Instruction& instr, int i) {
544
- int reg = getConditionRegister ();
545
- int target = registerUsage[reg] + 1 ;
533
+ int reg = getConditionRegister (registerUsage);
534
+ int target = registerUsage[reg].lastUsed + 1 ;
535
+ registerUsage[reg].count ++;
546
536
int shift = instr.getModCond ();
547
537
asmCode << " \t add " << regR[reg] << " , " << (int32_t )(instr.getImm32 () | (1 << shift)) << std::endl;
548
538
asmCode << " \t test " << regR[reg] << " , " << (ConditionMask << shift) << std::endl;
549
539
asmCode << " \t jz randomx_isn_" << target << std::endl;
550
- for (unsigned j = 0 ; j < RegistersCount; ++j) { // mark all registers as used
551
- registerUsage[j] = i;
540
+ // mark all registers as used
541
+ for (unsigned j = 0 ; j < RegistersCount; ++j) {
542
+ registerUsage[j].lastUsed = i;
552
543
}
553
544
}
554
545
0 commit comments