@@ -1499,46 +1499,64 @@ impl<'hir> LoweringContext<'_, 'hir> {
1499
1499
// previous iteration.
1500
1500
required_features. clear ( ) ;
1501
1501
1502
- // Validate register classes against currently enabled target
1503
- // features. We check that at least one type is available for
1504
- // the current target.
1505
1502
let reg_class = reg. reg_class ( ) ;
1506
1503
if reg_class == asm:: InlineAsmRegClass :: Err {
1507
1504
continue ;
1508
1505
}
1509
- for & ( _, feature) in reg_class. supported_types ( asm_arch. unwrap ( ) ) {
1510
- if let Some ( feature) = feature {
1511
- if self . sess . target_features . contains ( & Symbol :: intern ( feature) ) {
1506
+
1507
+ // We ignore target feature requirements for clobbers: if the
1508
+ // feature is disabled then the compiler doesn't care what we
1509
+ // do with the registers.
1510
+ //
1511
+ // Note that this is only possible for explicit register
1512
+ // operands, which cannot be used in the asm string.
1513
+ let is_clobber = matches ! (
1514
+ op,
1515
+ hir:: InlineAsmOperand :: Out {
1516
+ reg: asm:: InlineAsmRegOrRegClass :: Reg ( _) ,
1517
+ late: _,
1518
+ expr: None
1519
+ }
1520
+ ) ;
1521
+
1522
+ if !is_clobber {
1523
+ // Validate register classes against currently enabled target
1524
+ // features. We check that at least one type is available for
1525
+ // the current target.
1526
+ for & ( _, feature) in reg_class. supported_types ( asm_arch. unwrap ( ) ) {
1527
+ if let Some ( feature) = feature {
1528
+ if self . sess . target_features . contains ( & Symbol :: intern ( feature) ) {
1529
+ required_features. clear ( ) ;
1530
+ break ;
1531
+ } else {
1532
+ required_features. push ( feature) ;
1533
+ }
1534
+ } else {
1512
1535
required_features. clear ( ) ;
1513
1536
break ;
1514
- } else {
1515
- required_features. push ( feature) ;
1516
1537
}
1517
- } else {
1518
- required_features. clear ( ) ;
1519
- break ;
1520
1538
}
1521
- }
1522
- // We are sorting primitive strs here and can use unstable sort here
1523
- required_features. sort_unstable ( ) ;
1524
- required_features. dedup ( ) ;
1525
- match & required_features [ .. ] {
1526
- [ ] => { }
1527
- [ feature ] => {
1528
- let msg = format ! (
1529
- "register class `{}` requires the `{}` target feature" ,
1530
- reg_class . name ( ) ,
1531
- feature
1532
- ) ;
1533
- sess . struct_span_err ( op_sp , & msg ) . emit ( ) ;
1534
- }
1535
- features => {
1536
- let msg = format ! (
1537
- "register class `{}` requires at least one target feature: {}" ,
1538
- reg_class . name ( ) ,
1539
- features . join ( ", " )
1540
- ) ;
1541
- sess . struct_span_err ( op_sp , & msg ) . emit ( ) ;
1539
+ // We are sorting primitive strs here and can use unstable sort here
1540
+ required_features . sort_unstable ( ) ;
1541
+ required_features. dedup ( ) ;
1542
+ match & required_features[ .. ] {
1543
+ [ ] => { }
1544
+ [ feature ] => {
1545
+ let msg = format ! (
1546
+ "register class `{}` requires the `{}` target feature" ,
1547
+ reg_class . name ( ) ,
1548
+ feature
1549
+ ) ;
1550
+ sess . struct_span_err ( op_sp , & msg ) . emit ( ) ;
1551
+ }
1552
+ features => {
1553
+ let msg = format ! (
1554
+ "register class `{}` requires at least one target feature: {}" ,
1555
+ reg_class . name ( ) ,
1556
+ features . join ( ", " )
1557
+ ) ;
1558
+ sess . struct_span_err ( op_sp , & msg ) . emit ( ) ;
1559
+ }
1542
1560
}
1543
1561
}
1544
1562
0 commit comments