@@ -366,142 +366,6 @@ pub(crate) fn emit(
366
366
}
367
367
}
368
368
369
- Inst :: Mul {
370
- signed,
371
- size,
372
- src1,
373
- src2,
374
- dst_lo,
375
- dst_hi,
376
- } => {
377
- let src1 = src1. to_reg ( ) ;
378
- let dst_lo = dst_lo. to_reg ( ) . to_reg ( ) ;
379
- let dst_hi = dst_hi. to_reg ( ) . to_reg ( ) ;
380
- debug_assert_eq ! ( src1, regs:: rax( ) ) ;
381
- debug_assert_eq ! ( dst_lo, regs:: rax( ) ) ;
382
- debug_assert_eq ! ( dst_hi, regs:: rdx( ) ) ;
383
- let src2 = src2. clone ( ) . to_reg_mem ( ) . clone ( ) ;
384
-
385
- let rex_flags = RexFlags :: from ( * size) ;
386
- let prefix = match size {
387
- OperandSize :: Size16 => LegacyPrefixes :: _66,
388
- OperandSize :: Size32 => LegacyPrefixes :: None ,
389
- OperandSize :: Size64 => LegacyPrefixes :: None ,
390
- _ => unreachable ! ( ) ,
391
- } ;
392
-
393
- let subopcode = if * signed { 5 } else { 4 } ;
394
- match src2 {
395
- RegMem :: Reg { reg } => {
396
- let src = int_reg_enc ( reg) ;
397
- emit_std_enc_enc ( sink, prefix, 0xF7 , 1 , subopcode, src, rex_flags)
398
- }
399
- RegMem :: Mem { addr : src } => {
400
- let amode = src. finalize ( state. frame_layout ( ) , sink) ;
401
- emit_std_enc_mem ( sink, prefix, 0xF7 , 1 , subopcode, & amode, rex_flags, 0 ) ;
402
- }
403
- }
404
- }
405
- Inst :: Mul8 {
406
- signed,
407
- src1,
408
- src2,
409
- dst,
410
- } => {
411
- let src1 = src1. to_reg ( ) ;
412
- let dst = dst. to_reg ( ) . to_reg ( ) ;
413
- debug_assert_eq ! ( src1, regs:: rax( ) ) ;
414
- debug_assert_eq ! ( dst, regs:: rax( ) ) ;
415
- let src2 = src2. clone ( ) . to_reg_mem ( ) . clone ( ) ;
416
-
417
- let mut rex_flags = RexFlags :: from ( OperandSize :: Size8 ) ;
418
- let prefix = LegacyPrefixes :: None ;
419
- let subopcode = if * signed { 5 } else { 4 } ;
420
- match src2 {
421
- RegMem :: Reg { reg } => {
422
- // The intel manual states:
423
- //
424
- // > r/m8 can not be encoded to access the following byte
425
- // > registers if a REX prefix is used: AH, BH, CH, DH
426
- //
427
- // And apparently that also means that a REX prefix must be
428
- // used if it's not one of those registers.
429
- if !( reg == regs:: rax ( )
430
- || reg == regs:: rbx ( )
431
- || reg == regs:: rcx ( )
432
- || reg == regs:: rdx ( ) )
433
- {
434
- rex_flags. always_emit ( ) ;
435
- }
436
- let src = int_reg_enc ( reg) ;
437
- emit_std_enc_enc ( sink, prefix, 0xF6 , 1 , subopcode, src, rex_flags)
438
- }
439
- RegMem :: Mem { addr } => {
440
- let amode = addr. finalize ( state. frame_layout ( ) , sink) ;
441
- emit_std_enc_mem ( sink, prefix, 0xF6 , 1 , subopcode, & amode, rex_flags, 0 ) ;
442
- }
443
- }
444
- }
445
- Inst :: IMul {
446
- size,
447
- src1,
448
- src2,
449
- dst,
450
- } => {
451
- let src1 = src1. to_reg ( ) ;
452
- let dst = dst. to_reg ( ) . to_reg ( ) ;
453
- debug_assert_eq ! ( src1, dst) ;
454
- let src2 = src2. clone ( ) . to_reg_mem ( ) . clone ( ) ;
455
-
456
- let rex = RexFlags :: from ( * size) ;
457
- let prefix = LegacyPrefixes :: None ;
458
- match src2 {
459
- RegMem :: Reg { reg } => {
460
- emit_std_reg_reg ( sink, prefix, 0x0FAF , 2 , dst, reg, rex) ;
461
- }
462
-
463
- RegMem :: Mem { addr } => {
464
- let amode = addr. finalize ( state. frame_layout ( ) , sink) ;
465
- emit_std_reg_mem ( sink, prefix, 0x0FAF , 2 , dst, & amode, rex, 0 ) ;
466
- }
467
- }
468
- }
469
-
470
- Inst :: IMulImm {
471
- size,
472
- src1,
473
- src2,
474
- dst,
475
- } => {
476
- let dst = dst. to_reg ( ) . to_reg ( ) ;
477
- let src1 = src1. clone ( ) . to_reg_mem ( ) . clone ( ) ;
478
-
479
- let rex = RexFlags :: from ( * size) ;
480
- let prefix = match size {
481
- // NB: the intel manual doesn't seem to mention this prefix as
482
- // being required
483
- OperandSize :: Size16 => LegacyPrefixes :: _66,
484
- _ => LegacyPrefixes :: None ,
485
- } ;
486
- let imm_size = if i8:: try_from ( * src2) . is_ok ( ) {
487
- 1
488
- } else {
489
- if * size == OperandSize :: Size16 { 2 } else { 4 }
490
- } ;
491
- let opcode = if imm_size == 1 { 0x6B } else { 0x69 } ;
492
- match src1 {
493
- RegMem :: Reg { reg } => {
494
- emit_std_reg_reg ( sink, prefix, opcode, 1 , dst, reg, rex) ;
495
- }
496
-
497
- RegMem :: Mem { addr } => {
498
- let amode = addr. finalize ( state. frame_layout ( ) , sink) ;
499
- emit_std_reg_mem ( sink, prefix, opcode, 1 , dst, & amode, rex, imm_size) ;
500
- }
501
- }
502
- emit_simm ( sink, imm_size, * src2 as u32 ) ;
503
- }
504
-
505
369
Inst :: MulX {
506
370
size,
507
371
src1,
0 commit comments