@@ -505,6 +505,44 @@ fn xmm_reg_index(reg: InlineAsmReg) -> Option<u32> {
505
505
}
506
506
}
507
507
508
+ /// If the register is an AArch64 integer register then return its index.
509
+ fn a64_reg_index ( reg : InlineAsmReg ) -> Option < u32 > {
510
+ match reg {
511
+ InlineAsmReg :: AArch64 ( AArch64InlineAsmReg :: x0) => Some ( 0 ) ,
512
+ InlineAsmReg :: AArch64 ( AArch64InlineAsmReg :: x1) => Some ( 1 ) ,
513
+ InlineAsmReg :: AArch64 ( AArch64InlineAsmReg :: x2) => Some ( 2 ) ,
514
+ InlineAsmReg :: AArch64 ( AArch64InlineAsmReg :: x3) => Some ( 3 ) ,
515
+ InlineAsmReg :: AArch64 ( AArch64InlineAsmReg :: x4) => Some ( 4 ) ,
516
+ InlineAsmReg :: AArch64 ( AArch64InlineAsmReg :: x5) => Some ( 5 ) ,
517
+ InlineAsmReg :: AArch64 ( AArch64InlineAsmReg :: x6) => Some ( 6 ) ,
518
+ InlineAsmReg :: AArch64 ( AArch64InlineAsmReg :: x7) => Some ( 7 ) ,
519
+ InlineAsmReg :: AArch64 ( AArch64InlineAsmReg :: x8) => Some ( 8 ) ,
520
+ InlineAsmReg :: AArch64 ( AArch64InlineAsmReg :: x9) => Some ( 9 ) ,
521
+ InlineAsmReg :: AArch64 ( AArch64InlineAsmReg :: x10) => Some ( 10 ) ,
522
+ InlineAsmReg :: AArch64 ( AArch64InlineAsmReg :: x11) => Some ( 11 ) ,
523
+ InlineAsmReg :: AArch64 ( AArch64InlineAsmReg :: x12) => Some ( 12 ) ,
524
+ InlineAsmReg :: AArch64 ( AArch64InlineAsmReg :: x13) => Some ( 13 ) ,
525
+ InlineAsmReg :: AArch64 ( AArch64InlineAsmReg :: x14) => Some ( 14 ) ,
526
+ InlineAsmReg :: AArch64 ( AArch64InlineAsmReg :: x15) => Some ( 15 ) ,
527
+ InlineAsmReg :: AArch64 ( AArch64InlineAsmReg :: x16) => Some ( 16 ) ,
528
+ InlineAsmReg :: AArch64 ( AArch64InlineAsmReg :: x17) => Some ( 17 ) ,
529
+ InlineAsmReg :: AArch64 ( AArch64InlineAsmReg :: x18) => Some ( 18 ) ,
530
+ // x19 is reserved
531
+ InlineAsmReg :: AArch64 ( AArch64InlineAsmReg :: x20) => Some ( 20 ) ,
532
+ InlineAsmReg :: AArch64 ( AArch64InlineAsmReg :: x21) => Some ( 21 ) ,
533
+ InlineAsmReg :: AArch64 ( AArch64InlineAsmReg :: x22) => Some ( 22 ) ,
534
+ InlineAsmReg :: AArch64 ( AArch64InlineAsmReg :: x23) => Some ( 23 ) ,
535
+ InlineAsmReg :: AArch64 ( AArch64InlineAsmReg :: x24) => Some ( 24 ) ,
536
+ InlineAsmReg :: AArch64 ( AArch64InlineAsmReg :: x25) => Some ( 25 ) ,
537
+ InlineAsmReg :: AArch64 ( AArch64InlineAsmReg :: x26) => Some ( 26 ) ,
538
+ InlineAsmReg :: AArch64 ( AArch64InlineAsmReg :: x27) => Some ( 27 ) ,
539
+ InlineAsmReg :: AArch64 ( AArch64InlineAsmReg :: x28) => Some ( 28 ) ,
540
+ // x29 is reserved
541
+ InlineAsmReg :: AArch64 ( AArch64InlineAsmReg :: x30) => Some ( 30 ) ,
542
+ _ => None ,
543
+ }
544
+ }
545
+
508
546
/// If the register is an AArch64 vector register then return its index.
509
547
fn a64_vreg_index ( reg : InlineAsmReg ) -> Option < u32 > {
510
548
match reg {
@@ -535,6 +573,22 @@ fn reg_to_llvm(reg: InlineAsmRegOrRegClass, layout: Option<&TyAndLayout<'_>>) ->
535
573
'x'
536
574
} ;
537
575
format ! ( "{{{}mm{}}}" , class, idx)
576
+ } else if let Some ( idx) = a64_reg_index ( reg) {
577
+ let class = if let Some ( layout) = layout {
578
+ match layout. size . bytes ( ) {
579
+ 8 => 'x' ,
580
+ _ => 'w' ,
581
+ }
582
+ } else {
583
+ // We use i32 as the type for discarded outputs
584
+ 'w'
585
+ } ;
586
+ if class == 'x' && reg == InlineAsmReg :: AArch64 ( AArch64InlineAsmReg :: x30) {
587
+ // LLVM doesn't recognize x30. use lr instead.
588
+ "{lr}" . to_string ( )
589
+ } else {
590
+ format ! ( "{{{}{}}}" , class, idx)
591
+ }
538
592
} else if let Some ( idx) = a64_vreg_index ( reg) {
539
593
let class = if let Some ( layout) = layout {
540
594
match layout. size . bytes ( ) {
@@ -550,9 +604,6 @@ fn reg_to_llvm(reg: InlineAsmRegOrRegClass, layout: Option<&TyAndLayout<'_>>) ->
550
604
'q'
551
605
} ;
552
606
format ! ( "{{{}{}}}" , class, idx)
553
- } else if reg == InlineAsmReg :: AArch64 ( AArch64InlineAsmReg :: x30) {
554
- // LLVM doesn't recognize x30
555
- "{lr}" . to_string ( )
556
607
} else if reg == InlineAsmReg :: Arm ( ArmInlineAsmReg :: r14) {
557
608
// LLVM doesn't recognize r14
558
609
"{lr}" . to_string ( )
0 commit comments