Home | History | Annotate | Download | only in PowerPC
      1 # RUN: llc -run-pass ppc-mi-peepholes -ppc-convert-rr-to-ri %s -o - | FileCheck %s
      2 # RUN: llc -start-after ppc-mi-peepholes -ppc-late-peephole %s -o - | FileCheck %s --check-prefix=CHECK-LATE
      3 
      4 --- |
      5   ; ModuleID = 'convert-rr-to-ri-instrs.ll'
      6   source_filename = "convert-rr-to-ri-instrs.c"
      7   target datalayout = "e-m:e-i64:64-n32:64"
      8   target triple = "powerpc64le-unknown-linux-gnu"
      9   
     10   ; Function Attrs: norecurse nounwind readnone
     11   define zeroext i32 @testRLWNM(i32 zeroext %a) local_unnamed_addr #0 {
     12   entry:
     13     %shl = shl i32 %a, 4
     14     %and = and i32 %shl, 4080
     15     ret i32 %and
     16   }
     17   
     18   ; Function Attrs: norecurse nounwind readnone
     19   define i64 @testRLWNM8(i64 %a) local_unnamed_addr #0 {
     20   entry:
     21     %shl = shl i64 %a, 4
     22     %and = and i64 %shl, 4080
     23     ret i64 %and
     24   }
     25   
     26   ; Function Attrs: norecurse nounwind readnone
     27   define zeroext i32 @testRLWNMo(i32 zeroext %a, i32 zeroext %b) local_unnamed_addr #0 {
     28   entry:
     29     %and = and i32 %a, 255
     30     %tobool = icmp eq i32 %and, 0
     31     %cond = select i1 %tobool, i32 %b, i32 %a
     32     ret i32 %cond
     33   }
     34   
     35   ; Function Attrs: norecurse nounwind readnone
     36   define i64 @testRLWNM8o(i64 %a, i64 %b) local_unnamed_addr #0 {
     37   entry:
     38     %a.tr = trunc i64 %a to i32
     39     %0 = shl i32 %a.tr, 4
     40     %conv = and i32 %0, 4080
     41     %tobool = icmp eq i32 %conv, 0
     42     %conv1 = zext i32 %conv to i64
     43     %cond = select i1 %tobool, i64 %b, i64 %conv1
     44     ret i64 %cond
     45   }
     46   
     47   ; Function Attrs: norecurse nounwind readnone
     48   define zeroext i32 @testSLW(i32 zeroext %a, i32 zeroext %b) local_unnamed_addr #0 {
     49   entry:
     50     %shl = shl i32 %a, %b
     51     ret i32 %shl
     52   }
     53   
     54   ; Function Attrs: norecurse nounwind readnone
     55   define zeroext i32 @testSLWo(i32 zeroext %a, i32 zeroext %b) local_unnamed_addr #0 {
     56   entry:
     57     %shl = shl i32 %a, %b
     58     %tobool = icmp eq i32 %shl, 0
     59     %cond = select i1 %tobool, i32 %b, i32 %a
     60     ret i32 %cond
     61   }
     62   
     63   ; Function Attrs: norecurse nounwind readnone
     64   define zeroext i32 @testSRW(i32 zeroext %a, i32 zeroext %b) local_unnamed_addr #0 {
     65   entry:
     66     %shr = lshr i32 %a, %b
     67     ret i32 %shr
     68   }
     69   
     70   ; Function Attrs: norecurse nounwind readnone
     71   define zeroext i32 @testSRWo(i32 zeroext %a, i32 zeroext %b) local_unnamed_addr #0 {
     72   entry:
     73     %shr = lshr i32 %a, %b
     74     %tobool = icmp eq i32 %shr, 0
     75     %cond = select i1 %tobool, i32 %b, i32 %a
     76     ret i32 %cond
     77   }
     78   
     79   ; Function Attrs: norecurse nounwind readnone
     80   define signext i32 @testSRAW(i32 signext %a, i32 signext %b) local_unnamed_addr #0 {
     81   entry:
     82     %shr = ashr i32 %a, %b
     83     ret i32 %shr
     84   }
     85   
     86   ; Function Attrs: norecurse nounwind readnone
     87   define signext i32 @testSRAWo(i32 signext %a, i32 signext %b) local_unnamed_addr #0 {
     88   entry:
     89     %shr = ashr i32 %a, %b
     90     %tobool = icmp eq i32 %shr, 0
     91     %cond = select i1 %tobool, i32 %b, i32 %shr
     92     ret i32 %cond
     93   }
     94   
     95   ; Function Attrs: norecurse nounwind readnone
     96   define i64 @testRLDCL(i64 %a, i64 %b) local_unnamed_addr #0 {
     97   entry:
     98     %and = and i64 %b, 63
     99     %shl = shl i64 %a, %and
    100     %sub = sub nsw i64 64, %and
    101     %shr = lshr i64 %a, %sub
    102     %or = or i64 %shr, %shl
    103     ret i64 %or
    104   }
    105   
    106   ; Function Attrs: norecurse nounwind readnone
    107   define i64 @testRLDCLo(i64 %a, i64 %b) local_unnamed_addr #0 {
    108   entry:
    109     %and = and i64 %b, 63
    110     %shl = shl i64 %a, %and
    111     %sub = sub nsw i64 64, %and
    112     %shr = lshr i64 %a, %sub
    113     %or = or i64 %shr, %shl
    114     %tobool = icmp eq i64 %or, 0
    115     %cond = select i1 %tobool, i64 %and, i64 %a
    116     ret i64 %cond
    117   }
    118   
    119   ; Function Attrs: norecurse nounwind readnone
    120   define i64 @testRLDCR(i64 %a, i64 %b) local_unnamed_addr #0 {
    121   entry:
    122     %and = and i64 %b, 63
    123     %shl = shl i64 %a, %and
    124     %sub = sub nsw i64 64, %and
    125     %shr = lshr i64 %a, %sub
    126     %or = or i64 %shr, %shl
    127     ret i64 %or
    128   }
    129   
    130   ; Function Attrs: norecurse nounwind readnone
    131   define i64 @testRLDCRo(i64 %a, i64 %b) local_unnamed_addr #0 {
    132   entry:
    133     %and = and i64 %b, 63
    134     %shl = shl i64 %a, %and
    135     %sub = sub nsw i64 64, %and
    136     %shr = lshr i64 %a, %sub
    137     %or = or i64 %shr, %shl
    138     %tobool = icmp eq i64 %or, 0
    139     %cond = select i1 %tobool, i64 %and, i64 %a
    140     ret i64 %cond
    141   }
    142   
    143   define i64 @testSLD(i64 %a, i64 %b) local_unnamed_addr #0 {
    144   entry:
    145     %shl = shl i64 %a, %b
    146     ret i64 %shl
    147   }
    148   
    149   ; Function Attrs: norecurse nounwind readnone
    150   define i64 @testSLDo(i64 %a, i64 %b) local_unnamed_addr #0 {
    151   entry:
    152     %shl = shl i64 %a, %b
    153     %tobool = icmp eq i64 %shl, 0
    154     %cond = select i1 %tobool, i64 %b, i64 %a
    155     ret i64 %cond
    156   }
    157   
    158   ; Function Attrs: norecurse nounwind readnone
    159   define i64 @testSRD(i64 %a, i64 %b) local_unnamed_addr #0 {
    160   entry:
    161     %shr = lshr i64 %a, %b
    162     ret i64 %shr
    163   }
    164   
    165   ; Function Attrs: norecurse nounwind readnone
    166   define i64 @testSRDo(i64 %a, i64 %b) local_unnamed_addr #0 {
    167   entry:
    168     %shr = lshr i64 %a, %b
    169     %tobool = icmp eq i64 %shr, 0
    170     %cond = select i1 %tobool, i64 %b, i64 %a
    171     ret i64 %cond
    172   }
    173   
    174   ; Function Attrs: norecurse nounwind readnone
    175   define i64 @testSRAD(i64 %a, i64 %b) local_unnamed_addr #0 {
    176   entry:
    177     %shr = ashr i64 %a, %b
    178     ret i64 %shr
    179   }
    180   
    181   ; Function Attrs: norecurse nounwind readnone
    182   define i64 @testSRADo(i64 %a, i64 %b) local_unnamed_addr #0 {
    183   entry:
    184     %shr = ashr i64 %a, %b
    185     %tobool = icmp eq i64 %shr, 0
    186     %cond = select i1 %tobool, i64 %b, i64 %shr
    187     ret i64 %cond
    188   }
    189   
    190   attributes #0 = { norecurse nounwind readnone "correctly-rounded-divide-sqrt-fp-math"="false" "disable-tail-calls"="false" "less-precise-fpmad"="false" "no-frame-pointer-elim"="false" "no-infs-fp-math"="false" "no-jump-tables"="false" "no-nans-fp-math"="false" "no-signed-zeros-fp-math"="false" "no-trapping-math"="false" "stack-protector-buffer-size"="8" "target-cpu"="pwr9" "target-features"="+altivec,+bpermd,+crypto,+direct-move,+extdiv,+htm,+power8-vector,+power9-vector,+vsx,-qpx" "unsafe-fp-math"="false" "use-soft-float"="false" }
    191   
    192   !llvm.module.flags = !{!0, !1}
    193   !llvm.ident = !{!2}
    194   
    195   !0 = !{i32 1, !"wchar_size", i32 4}
    196   !1 = !{i32 7, !"PIC Level", i32 2}
    197   !2 = !{!"clang version 6.0.0 (trunk 316067)"}
    198   !3 = !{!4, !4, i64 0}
    199   !4 = !{!"omnipotent char", !5, i64 0}
    200   !5 = !{!"Simple C/C++ TBAA"}
    201   !6 = !{!7, !7, i64 0}
    202   !7 = !{!"short", !4, i64 0}
    203   !8 = !{!9, !9, i64 0}
    204   !9 = !{!"int", !4, i64 0}
    205   !10 = !{!11, !11, i64 0}
    206   !11 = !{!"long long", !4, i64 0}
    207   !12 = !{!13, !13, i64 0}
    208   !13 = !{!"double", !4, i64 0}
    209   !14 = !{!15, !15, i64 0}
    210   !15 = !{!"float", !4, i64 0}
    211 
    212 ...
    213 ---
    214 name:            testRLWNM
    215 # CHECK-ALL: name: testRLWNM
    216 alignment:       4
    217 exposesReturnsTwice: false
    218 legalized:       false
    219 regBankSelected: false
    220 selected:        false
    221 tracksRegLiveness: true
    222 registers:       
    223   - { id: 0, class: g8rc, preferred-register: '' }
    224   - { id: 1, class: gprc, preferred-register: '' }
    225   - { id: 2, class: gprc, preferred-register: '' }
    226   - { id: 3, class: g8rc, preferred-register: '' }
    227   - { id: 4, class: gprc, preferred-register: '' }
    228 liveins:         
    229   - { reg: '$x3', virtual-reg: '%0' }
    230 frameInfo:       
    231   isFrameAddressTaken: false
    232   isReturnAddressTaken: false
    233   hasStackMap:     false
    234   hasPatchPoint:   false
    235   stackSize:       0
    236   offsetAdjustment: 0
    237   maxAlignment:    0
    238   adjustsStack:    false
    239   hasCalls:        false
    240   stackProtector:  ''
    241   maxCallFrameSize: 4294967295
    242   hasOpaqueSPAdjustment: false
    243   hasVAStart:      false
    244   hasMustTailInVarArgFunc: false
    245   savePoint:       ''
    246   restorePoint:    ''
    247 fixedStack:      
    248 stack:           
    249 constants:       
    250 body:             |
    251   bb.0.entry:
    252     liveins: $x3
    253   
    254     %0 = COPY $x3
    255     %1 = COPY %0.sub_32
    256     %3 = IMPLICIT_DEF
    257     %2 = LI 170
    258     %4 = RLWNM killed %1, %2, 20, 27
    259     ; CHECK: RLWINM killed %1, 10, 20, 27
    260     ; CHECK-LATE: rlwinm 3, 3, 10, 20, 27
    261     $x3 = EXTSW_32_64 %4
    262     BLR8 implicit $lr8, implicit $rm, implicit $x3
    263 
    264 ...
    265 ---
    266 name:            testRLWNM8
    267 # CHECK-ALL: name: testRLWNM8
    268 alignment:       4
    269 exposesReturnsTwice: false
    270 legalized:       false
    271 regBankSelected: false
    272 selected:        false
    273 tracksRegLiveness: true
    274 registers:       
    275   - { id: 0, class: g8rc, preferred-register: '' }
    276   - { id: 1, class: g8rc, preferred-register: '' }
    277   - { id: 2, class: g8rc, preferred-register: '' }
    278 liveins:         
    279   - { reg: '$x3', virtual-reg: '%0' }
    280 frameInfo:       
    281   isFrameAddressTaken: false
    282   isReturnAddressTaken: false
    283   hasStackMap:     false
    284   hasPatchPoint:   false
    285   stackSize:       0
    286   offsetAdjustment: 0
    287   maxAlignment:    0
    288   adjustsStack:    false
    289   hasCalls:        false
    290   stackProtector:  ''
    291   maxCallFrameSize: 4294967295
    292   hasOpaqueSPAdjustment: false
    293   hasVAStart:      false
    294   hasMustTailInVarArgFunc: false
    295   savePoint:       ''
    296   restorePoint:    ''
    297 fixedStack:      
    298 stack:           
    299 constants:       
    300 body:             |
    301   bb.0.entry:
    302     liveins: $x3
    303   
    304     %0 = LI8 234
    305     %1 = COPY $x3
    306     %2 = RLWNM8 %1, %0, 20, 27
    307     ; CHECK: RLWINM8 %1, 10, 20, 27
    308     ; CHECK-LATE: rlwinm 3, 3, 10, 20, 27
    309     $x3 = COPY %2
    310     BLR8 implicit $lr8, implicit $rm, implicit $x3
    311 
    312 ...
    313 ---
    314 name:            testRLWNMo
    315 # CHECK-ALL: name: testRLWNMo
    316 alignment:       4
    317 exposesReturnsTwice: false
    318 legalized:       false
    319 regBankSelected: false
    320 selected:        false
    321 tracksRegLiveness: true
    322 registers:       
    323   - { id: 0, class: g8rc, preferred-register: '' }
    324   - { id: 1, class: g8rc, preferred-register: '' }
    325   - { id: 2, class: gprc_and_gprc_nor0, preferred-register: '' }
    326   - { id: 3, class: gprc_and_gprc_nor0, preferred-register: '' }
    327   - { id: 4, class: gprc, preferred-register: '' }
    328   - { id: 5, class: crrc, preferred-register: '' }
    329   - { id: 6, class: gprc, preferred-register: '' }
    330   - { id: 7, class: g8rc, preferred-register: '' }
    331   - { id: 8, class: g8rc, preferred-register: '' }
    332   - { id: 9, class: g8rc, preferred-register: '' }
    333 liveins:         
    334   - { reg: '$x3', virtual-reg: '%0' }
    335   - { reg: '$x4', virtual-reg: '%1' }
    336 frameInfo:       
    337   isFrameAddressTaken: false
    338   isReturnAddressTaken: false
    339   hasStackMap:     false
    340   hasPatchPoint:   false
    341   stackSize:       0
    342   offsetAdjustment: 0
    343   maxAlignment:    0
    344   adjustsStack:    false
    345   hasCalls:        false
    346   stackProtector:  ''
    347   maxCallFrameSize: 4294967295
    348   hasOpaqueSPAdjustment: false
    349   hasVAStart:      false
    350   hasMustTailInVarArgFunc: false
    351   savePoint:       ''
    352   restorePoint:    ''
    353 fixedStack:      
    354 stack:           
    355 constants:       
    356 body:             |
    357   bb.0.entry:
    358     liveins: $x3, $x4
    359   
    360     %1 = COPY $x4
    361     %0 = COPY $x3
    362     %2 = COPY %1.sub_32
    363     %3 = LI -22
    364     %4 = RLWNMo %2, %3, 24, 31, implicit-def $cr0
    365     ; CHECK: RLWINMo %2, 10, 24, 31, implicit-def $cr0
    366     ; CHECK-LATE: li 3, -22
    367     ; CHECK-LATE: rlwinm. 5, 4, 10, 24, 31
    368     %5 = COPY killed $cr0
    369     %6 = ISEL %2, %3, %5.sub_eq
    370     %8 = IMPLICIT_DEF
    371     %7 = INSERT_SUBREG %8, killed %6, 1
    372     %9 = RLDICL killed %7, 0, 32
    373     $x3 = COPY %9
    374     BLR8 implicit $lr8, implicit $rm, implicit $x3
    375 
    376 ...
    377 ---
    378 name:            testRLWNM8o
    379 # CHECK-ALL: name: testRLWNM8o
    380 alignment:       4
    381 exposesReturnsTwice: false
    382 legalized:       false
    383 regBankSelected: false
    384 selected:        false
    385 tracksRegLiveness: true
    386 registers:       
    387   - { id: 0, class: g8rc, preferred-register: '' }
    388   - { id: 1, class: g8rc_and_g8rc_nox0, preferred-register: '' }
    389   - { id: 2, class: g8rc, preferred-register: '' }
    390   - { id: 3, class: g8rc, preferred-register: '' }
    391   - { id: 4, class: g8rc, preferred-register: '' }
    392   - { id: 5, class: g8rc, preferred-register: '' }
    393   - { id: 6, class: g8rc_and_g8rc_nox0, preferred-register: '' }
    394   - { id: 7, class: crrc, preferred-register: '' }
    395   - { id: 8, class: g8rc, preferred-register: '' }
    396 liveins:         
    397   - { reg: '$x3', virtual-reg: '%0' }
    398   - { reg: '$x4', virtual-reg: '%1' }
    399 frameInfo:       
    400   isFrameAddressTaken: false
    401   isReturnAddressTaken: false
    402   hasStackMap:     false
    403   hasPatchPoint:   false
    404   stackSize:       0
    405   offsetAdjustment: 0
    406   maxAlignment:    0
    407   adjustsStack:    false
    408   hasCalls:        false
    409   stackProtector:  ''
    410   maxCallFrameSize: 4294967295
    411   hasOpaqueSPAdjustment: false
    412   hasVAStart:      false
    413   hasMustTailInVarArgFunc: false
    414   savePoint:       ''
    415   restorePoint:    ''
    416 fixedStack:      
    417 stack:           
    418 constants:       
    419 body:             |
    420   bb.0.entry:
    421     liveins: $x3, $x4
    422   
    423     %1 = COPY $x4
    424     %0 = COPY $x3
    425     %2 = LI8 -18
    426     %3 = RLWNM8o %1, %2, 20, 27, implicit-def $cr0
    427     ; CHECK: RLWINM8o %1, 14, 20, 27, implicit-def $cr0
    428     ; CHECK-LATE: rlwinm. 3, 4, 14, 20, 27
    429     %7 = COPY killed $cr0
    430     %6 = RLDICL killed %3, 0, 32
    431     %8 = ISEL8 %1, %6, %7.sub_eq
    432     $x3 = COPY %8
    433     BLR8 implicit $lr8, implicit $rm, implicit $x3
    434 
    435 ...
    436 ---
    437 name:            testSLW
    438 # CHECK-ALL: name: testSLW
    439 alignment:       4
    440 exposesReturnsTwice: false
    441 legalized:       false
    442 regBankSelected: false
    443 selected:        false
    444 tracksRegLiveness: true
    445 registers:       
    446   - { id: 0, class: g8rc, preferred-register: '' }
    447   - { id: 1, class: g8rc, preferred-register: '' }
    448   - { id: 2, class: gprc, preferred-register: '' }
    449   - { id: 3, class: g8rc, preferred-register: '' }
    450   - { id: 4, class: g8rc, preferred-register: '' }
    451   - { id: 5, class: gprc, preferred-register: '' }
    452   - { id: 6, class: g8rc, preferred-register: '' }
    453   - { id: 7, class: g8rc, preferred-register: '' }
    454   - { id: 8, class: gprc, preferred-register: '' }
    455 liveins:         
    456   - { reg: '$x3', virtual-reg: '%0' }
    457   - { reg: '$x4', virtual-reg: '%1' }
    458 frameInfo:       
    459   isFrameAddressTaken: false
    460   isReturnAddressTaken: false
    461   hasStackMap:     false
    462   hasPatchPoint:   false
    463   stackSize:       0
    464   offsetAdjustment: 0
    465   maxAlignment:    0
    466   adjustsStack:    false
    467   hasCalls:        false
    468   stackProtector:  ''
    469   maxCallFrameSize: 4294967295
    470   hasOpaqueSPAdjustment: false
    471   hasVAStart:      false
    472   hasMustTailInVarArgFunc: false
    473   savePoint:       ''
    474   restorePoint:    ''
    475 fixedStack:      
    476 stack:           
    477 constants:       
    478 body:             |
    479   bb.0.entry:
    480     liveins: $x3, $x4
    481   
    482     %1 = COPY $x4
    483     %0 = COPY $x3
    484     %2 = COPY %1.sub_32
    485     %5 = LI 210
    486     %8 = SLW killed %2, killed %5
    487     ; CHECK: RLWINM killed %2, 18, 0, 13
    488     ; CHECK-LATE: slwi 3, 4, 18
    489     $x3 = EXTSW_32_64 %8
    490     BLR8 implicit $lr8, implicit $rm, implicit $x3
    491 
    492 ...
    493 ---
    494 name:            testSLWo
    495 # CHECK-ALL: name: testSLWo
    496 alignment:       4
    497 exposesReturnsTwice: false
    498 legalized:       false
    499 regBankSelected: false
    500 selected:        false
    501 tracksRegLiveness: true
    502 registers:       
    503   - { id: 0, class: g8rc, preferred-register: '' }
    504   - { id: 1, class: g8rc, preferred-register: '' }
    505   - { id: 2, class: gprc_and_gprc_nor0, preferred-register: '' }
    506   - { id: 3, class: gprc_and_gprc_nor0, preferred-register: '' }
    507   - { id: 4, class: gprc, preferred-register: '' }
    508   - { id: 5, class: crrc, preferred-register: '' }
    509   - { id: 6, class: gprc, preferred-register: '' }
    510   - { id: 7, class: g8rc, preferred-register: '' }
    511   - { id: 8, class: g8rc, preferred-register: '' }
    512   - { id: 9, class: g8rc, preferred-register: '' }
    513 liveins:         
    514   - { reg: '$x3', virtual-reg: '%0' }
    515   - { reg: '$x4', virtual-reg: '%1' }
    516 frameInfo:       
    517   isFrameAddressTaken: false
    518   isReturnAddressTaken: false
    519   hasStackMap:     false
    520   hasPatchPoint:   false
    521   stackSize:       0
    522   offsetAdjustment: 0
    523   maxAlignment:    0
    524   adjustsStack:    false
    525   hasCalls:        false
    526   stackProtector:  ''
    527   maxCallFrameSize: 4294967295
    528   hasOpaqueSPAdjustment: false
    529   hasVAStart:      false
    530   hasMustTailInVarArgFunc: false
    531   savePoint:       ''
    532   restorePoint:    ''
    533 fixedStack:      
    534 stack:           
    535 constants:       
    536 body:             |
    537   bb.0.entry:
    538     liveins: $x3, $x4
    539   
    540     %1 = COPY $x4
    541     %0 = COPY $x3
    542     %2 = LI 35
    543     %3 = COPY %0.sub_32
    544     %4 = SLWo %3, %2, implicit-def $cr0
    545     ; CHECK: ANDIo %3, 0, implicit-def $cr0
    546     ; CHECK-LATE: andi. 5, 3, 0
    547     %5 = COPY killed $cr0
    548     %6 = ISEL %2, %3, %5.sub_eq
    549     %8 = IMPLICIT_DEF
    550     %7 = INSERT_SUBREG %8, killed %6, 1
    551     %9 = RLDICL killed %7, 0, 32
    552     $x3 = COPY %9
    553     BLR8 implicit $lr8, implicit $rm, implicit $x3
    554 
    555 ...
    556 ---
    557 name:            testSRW
    558 # CHECK-ALL: name: testSRW
    559 alignment:       4
    560 exposesReturnsTwice: false
    561 legalized:       false
    562 regBankSelected: false
    563 selected:        false
    564 tracksRegLiveness: true
    565 registers:       
    566   - { id: 0, class: g8rc, preferred-register: '' }
    567   - { id: 1, class: g8rc, preferred-register: '' }
    568   - { id: 2, class: gprc, preferred-register: '' }
    569   - { id: 3, class: g8rc, preferred-register: '' }
    570   - { id: 4, class: g8rc, preferred-register: '' }
    571   - { id: 5, class: gprc, preferred-register: '' }
    572   - { id: 6, class: g8rc, preferred-register: '' }
    573   - { id: 7, class: g8rc, preferred-register: '' }
    574   - { id: 8, class: gprc, preferred-register: '' }
    575 liveins:         
    576   - { reg: '$x3', virtual-reg: '%0' }
    577   - { reg: '$x4', virtual-reg: '%1' }
    578 frameInfo:       
    579   isFrameAddressTaken: false
    580   isReturnAddressTaken: false
    581   hasStackMap:     false
    582   hasPatchPoint:   false
    583   stackSize:       0
    584   offsetAdjustment: 0
    585   maxAlignment:    0
    586   adjustsStack:    false
    587   hasCalls:        false
    588   stackProtector:  ''
    589   maxCallFrameSize: 4294967295
    590   hasOpaqueSPAdjustment: false
    591   hasVAStart:      false
    592   hasMustTailInVarArgFunc: false
    593   savePoint:       ''
    594   restorePoint:    ''
    595 fixedStack:      
    596 stack:           
    597 constants:       
    598 body:             |
    599   bb.0.entry:
    600     liveins: $x3, $x4
    601   
    602     %1 = COPY $x4
    603     %0 = COPY $x3
    604     %2 = LI 48
    605     %5 = COPY %0.sub_32
    606     %8 = SRW killed %5, killed %2
    607     ; CHECK: LI 0
    608     ; CHECK-LATE: li 3, 0
    609     $x3 = EXTSW_32_64 %8
    610     BLR8 implicit $lr8, implicit $rm, implicit $x3
    611 
    612 ...
    613 ---
    614 name:            testSRWo
    615 # CHECK-ALL: name: testSRWo
    616 alignment:       4
    617 exposesReturnsTwice: false
    618 legalized:       false
    619 regBankSelected: false
    620 selected:        false
    621 tracksRegLiveness: true
    622 registers:       
    623   - { id: 0, class: g8rc, preferred-register: '' }
    624   - { id: 1, class: g8rc, preferred-register: '' }
    625   - { id: 2, class: gprc_and_gprc_nor0, preferred-register: '' }
    626   - { id: 3, class: gprc_and_gprc_nor0, preferred-register: '' }
    627   - { id: 4, class: gprc, preferred-register: '' }
    628   - { id: 5, class: crrc, preferred-register: '' }
    629   - { id: 6, class: gprc, preferred-register: '' }
    630   - { id: 7, class: g8rc, preferred-register: '' }
    631   - { id: 8, class: g8rc, preferred-register: '' }
    632   - { id: 9, class: g8rc, preferred-register: '' }
    633 liveins:         
    634   - { reg: '$x3', virtual-reg: '%0' }
    635   - { reg: '$x4', virtual-reg: '%1' }
    636 frameInfo:       
    637   isFrameAddressTaken: false
    638   isReturnAddressTaken: false
    639   hasStackMap:     false
    640   hasPatchPoint:   false
    641   stackSize:       0
    642   offsetAdjustment: 0
    643   maxAlignment:    0
    644   adjustsStack:    false
    645   hasCalls:        false
    646   stackProtector:  ''
    647   maxCallFrameSize: 4294967295
    648   hasOpaqueSPAdjustment: false
    649   hasVAStart:      false
    650   hasMustTailInVarArgFunc: false
    651   savePoint:       ''
    652   restorePoint:    ''
    653 fixedStack:      
    654 stack:           
    655 constants:       
    656 body:             |
    657   bb.0.entry:
    658     liveins: $x3, $x4
    659   
    660     %1 = COPY $x4
    661     %0 = COPY $x3
    662     %2 = LI -7
    663     %3 = COPY %0.sub_32
    664     %4 = SRWo %3, %2, implicit-def $cr0
    665     ; CHECK: ANDIo %3, 0, implicit-def $cr0
    666     ; CHECK-LATE: andi. 5, 3, 0
    667     %5 = COPY killed $cr0
    668     %6 = ISEL %2, %3, %5.sub_eq
    669     %8 = IMPLICIT_DEF
    670     %7 = INSERT_SUBREG %8, killed %6, 1
    671     %9 = RLDICL killed %7, 0, 32
    672     $x3 = COPY %9
    673     BLR8 implicit $lr8, implicit $rm, implicit $x3
    674 
    675 ...
    676 ---
    677 name:            testSRAW
    678 # CHECK-ALL: name: testSRAW
    679 alignment:       4
    680 exposesReturnsTwice: false
    681 legalized:       false
    682 regBankSelected: false
    683 selected:        false
    684 tracksRegLiveness: true
    685 registers:       
    686   - { id: 0, class: g8rc, preferred-register: '' }
    687   - { id: 1, class: g8rc, preferred-register: '' }
    688   - { id: 2, class: gprc, preferred-register: '' }
    689   - { id: 3, class: gprc, preferred-register: '' }
    690   - { id: 4, class: gprc, preferred-register: '' }
    691   - { id: 5, class: g8rc, preferred-register: '' }
    692 liveins:         
    693   - { reg: '$x3', virtual-reg: '%0' }
    694   - { reg: '$x4', virtual-reg: '%1' }
    695 frameInfo:       
    696   isFrameAddressTaken: false
    697   isReturnAddressTaken: false
    698   hasStackMap:     false
    699   hasPatchPoint:   false
    700   stackSize:       0
    701   offsetAdjustment: 0
    702   maxAlignment:    0
    703   adjustsStack:    false
    704   hasCalls:        false
    705   stackProtector:  ''
    706   maxCallFrameSize: 4294967295
    707   hasOpaqueSPAdjustment: false
    708   hasVAStart:      false
    709   hasMustTailInVarArgFunc: false
    710   savePoint:       ''
    711   restorePoint:    ''
    712 fixedStack:      
    713 stack:           
    714 constants:       
    715 body:             |
    716   bb.0.entry:
    717     liveins: $x3, $x4
    718   
    719     %1 = COPY $x4
    720     %0 = COPY $x3
    721     %2 = LI 48
    722     %3 = COPY %0.sub_32
    723     %4 = SRAW killed %3, killed %2, implicit-def dead $carry
    724     ; CHECK: LI 48
    725     ; CHECK: SRAW killed %3, killed %2, implicit-def dead $carry
    726     ; CHECK-LATE: sraw 3, 3, 4
    727     %5 = EXTSW_32_64 killed %4
    728     $x3 = COPY %5
    729     BLR8 implicit $lr8, implicit $rm, implicit $x3
    730 
    731 ...
    732 ---
    733 name:            testSRAWo
    734 # CHECK-ALL: name: testSRAWo
    735 alignment:       4
    736 exposesReturnsTwice: false
    737 legalized:       false
    738 regBankSelected: false
    739 selected:        false
    740 tracksRegLiveness: true
    741 registers:       
    742   - { id: 0, class: g8rc, preferred-register: '' }
    743   - { id: 1, class: g8rc, preferred-register: '' }
    744   - { id: 2, class: gprc_and_gprc_nor0, preferred-register: '' }
    745   - { id: 3, class: gprc, preferred-register: '' }
    746   - { id: 4, class: gprc_and_gprc_nor0, preferred-register: '' }
    747   - { id: 5, class: crrc, preferred-register: '' }
    748   - { id: 6, class: gprc, preferred-register: '' }
    749   - { id: 7, class: g8rc, preferred-register: '' }
    750 liveins:         
    751   - { reg: '$x3', virtual-reg: '%0' }
    752   - { reg: '$x4', virtual-reg: '%1' }
    753 frameInfo:       
    754   isFrameAddressTaken: false
    755   isReturnAddressTaken: false
    756   hasStackMap:     false
    757   hasPatchPoint:   false
    758   stackSize:       0
    759   offsetAdjustment: 0
    760   maxAlignment:    0
    761   adjustsStack:    false
    762   hasCalls:        false
    763   stackProtector:  ''
    764   maxCallFrameSize: 4294967295
    765   hasOpaqueSPAdjustment: false
    766   hasVAStart:      false
    767   hasMustTailInVarArgFunc: false
    768   savePoint:       ''
    769   restorePoint:    ''
    770 fixedStack:      
    771 stack:           
    772 constants:       
    773 body:             |
    774   bb.0.entry:
    775     liveins: $x3, $x4
    776   
    777     %1 = COPY $x4
    778     %0 = COPY $x3
    779     %2 = LI 80
    780     %3 = COPY %0.sub_32
    781     %4 = SRAWo killed %3, %2, implicit-def dead $carry, implicit-def $cr0
    782     ; CHECK: SRAWo killed %3, %2, implicit-def dead $carry, implicit-def $cr0
    783     ; CHECK-LATE: sraw. 3, 3, 4
    784     %5 = COPY killed $cr0
    785     %6 = ISEL %2, %4, %5.sub_eq
    786     %7 = EXTSW_32_64 killed %6
    787     $x3 = COPY %7
    788     BLR8 implicit $lr8, implicit $rm, implicit $x3
    789 
    790 ...
    791 ---
    792 name:            testRLDCL
    793 # CHECK-ALL: name: testRLDCL
    794 alignment:       4
    795 exposesReturnsTwice: false
    796 legalized:       false
    797 regBankSelected: false
    798 selected:        false
    799 tracksRegLiveness: true
    800 registers:       
    801   - { id: 0, class: g8rc, preferred-register: '' }
    802   - { id: 1, class: g8rc, preferred-register: '' }
    803   - { id: 2, class: gprc, preferred-register: '' }
    804   - { id: 3, class: gprc, preferred-register: '' }
    805   - { id: 4, class: g8rc, preferred-register: '' }
    806 liveins:         
    807   - { reg: '$x3', virtual-reg: '%0' }
    808   - { reg: '$x4', virtual-reg: '%1' }
    809 frameInfo:       
    810   isFrameAddressTaken: false
    811   isReturnAddressTaken: false
    812   hasStackMap:     false
    813   hasPatchPoint:   false
    814   stackSize:       0
    815   offsetAdjustment: 0
    816   maxAlignment:    0
    817   adjustsStack:    false
    818   hasCalls:        false
    819   stackProtector:  ''
    820   maxCallFrameSize: 4294967295
    821   hasOpaqueSPAdjustment: false
    822   hasVAStart:      false
    823   hasMustTailInVarArgFunc: false
    824   savePoint:       ''
    825   restorePoint:    ''
    826 fixedStack:      
    827 stack:           
    828 constants:       
    829 body:             |
    830   bb.0.entry:
    831     liveins: $x3, $x4
    832   
    833     %1 = COPY $x4
    834     %0 = COPY $x3
    835     %2 = COPY %1.sub_32
    836     %3 = LI 140
    837     %4 = RLDCL %0, killed %3, 0
    838     ; CHECK: RLDICL %0, 12, 0
    839     ; CHECK-LATE: rotldi 3, 3, 12
    840     $x3 = COPY %4
    841     BLR8 implicit $lr8, implicit $rm, implicit $x3
    842 
    843 ...
    844 ---
    845 name:            testRLDCLo
    846 # CHECK-ALL: name: testRLDCLo
    847 alignment:       4
    848 exposesReturnsTwice: false
    849 legalized:       false
    850 regBankSelected: false
    851 selected:        false
    852 tracksRegLiveness: true
    853 registers:       
    854   - { id: 0, class: g8rc_and_g8rc_nox0, preferred-register: '' }
    855   - { id: 1, class: g8rc, preferred-register: '' }
    856   - { id: 2, class: g8rc_and_g8rc_nox0, preferred-register: '' }
    857   - { id: 3, class: gprc, preferred-register: '' }
    858   - { id: 4, class: g8rc, preferred-register: '' }
    859   - { id: 5, class: crrc, preferred-register: '' }
    860   - { id: 6, class: g8rc, preferred-register: '' }
    861 liveins:         
    862   - { reg: '$x3', virtual-reg: '%0' }
    863   - { reg: '$x4', virtual-reg: '%1' }
    864 frameInfo:       
    865   isFrameAddressTaken: false
    866   isReturnAddressTaken: false
    867   hasStackMap:     false
    868   hasPatchPoint:   false
    869   stackSize:       0
    870   offsetAdjustment: 0
    871   maxAlignment:    0
    872   adjustsStack:    false
    873   hasCalls:        false
    874   stackProtector:  ''
    875   maxCallFrameSize: 4294967295
    876   hasOpaqueSPAdjustment: false
    877   hasVAStart:      false
    878   hasMustTailInVarArgFunc: false
    879   savePoint:       ''
    880   restorePoint:    ''
    881 fixedStack:      
    882 stack:           
    883 constants:       
    884 body:             |
    885   bb.0.entry:
    886     liveins: $x3, $x4
    887   
    888     %1 = COPY $x4
    889     %0 = COPY $x3
    890     %2 = RLDICL %1, 0, 58
    891     %3 = LI -37
    892     %4 = RLDCLo %0, killed %3, 0, implicit-def $cr0
    893     ; CHECK: RLDICLo %0, 27, 0, implicit-def $cr0
    894     ; CHECK-LATE: rldicl. 5, 3, 27, 0
    895     %5 = COPY killed $cr0
    896     %6 = ISEL8 %2, %0, %5.sub_eq
    897     $x3 = COPY %6
    898     BLR8 implicit $lr8, implicit $rm, implicit $x3
    899 
    900 ...
    901 ---
    902 name:            testRLDCR
    903 # CHECK-ALL: name: testRLDCR
    904 alignment:       4
    905 exposesReturnsTwice: false
    906 legalized:       false
    907 regBankSelected: false
    908 selected:        false
    909 tracksRegLiveness: true
    910 registers:       
    911   - { id: 0, class: g8rc, preferred-register: '' }
    912   - { id: 1, class: g8rc, preferred-register: '' }
    913   - { id: 2, class: gprc, preferred-register: '' }
    914   - { id: 3, class: gprc, preferred-register: '' }
    915   - { id: 4, class: g8rc, preferred-register: '' }
    916 liveins:         
    917   - { reg: '$x3', virtual-reg: '%0' }
    918   - { reg: '$x4', virtual-reg: '%1' }
    919 frameInfo:       
    920   isFrameAddressTaken: false
    921   isReturnAddressTaken: false
    922   hasStackMap:     false
    923   hasPatchPoint:   false
    924   stackSize:       0
    925   offsetAdjustment: 0
    926   maxAlignment:    0
    927   adjustsStack:    false
    928   hasCalls:        false
    929   stackProtector:  ''
    930   maxCallFrameSize: 4294967295
    931   hasOpaqueSPAdjustment: false
    932   hasVAStart:      false
    933   hasMustTailInVarArgFunc: false
    934   savePoint:       ''
    935   restorePoint:    ''
    936 fixedStack:      
    937 stack:           
    938 constants:       
    939 body:             |
    940   bb.0.entry:
    941     liveins: $x3, $x4
    942   
    943     %1 = COPY $x4
    944     %0 = COPY $x3
    945     %2 = COPY %1.sub_32
    946     %3 = LI 300
    947     %4 = RLDCR %0, killed %3, 0
    948     ; CHECK: RLDICR %0, 44, 0
    949     ; CHECK-LATE: rldicr 3, 3, 44, 0
    950     $x3 = COPY %4
    951     BLR8 implicit $lr8, implicit $rm, implicit $x3
    952 
    953 ...
    954 ---
    955 name:            testRLDCRo
    956 # CHECK-ALL: name: testRLDCRo
    957 alignment:       4
    958 exposesReturnsTwice: false
    959 legalized:       false
    960 regBankSelected: false
    961 selected:        false
    962 tracksRegLiveness: true
    963 registers:       
    964   - { id: 0, class: g8rc_and_g8rc_nox0, preferred-register: '' }
    965   - { id: 1, class: g8rc, preferred-register: '' }
    966   - { id: 2, class: g8rc_and_g8rc_nox0, preferred-register: '' }
    967   - { id: 3, class: gprc, preferred-register: '' }
    968   - { id: 4, class: g8rc, preferred-register: '' }
    969   - { id: 5, class: crrc, preferred-register: '' }
    970   - { id: 6, class: g8rc, preferred-register: '' }
    971 liveins:         
    972   - { reg: '$x3', virtual-reg: '%0' }
    973   - { reg: '$x4', virtual-reg: '%1' }
    974 frameInfo:       
    975   isFrameAddressTaken: false
    976   isReturnAddressTaken: false
    977   hasStackMap:     false
    978   hasPatchPoint:   false
    979   stackSize:       0
    980   offsetAdjustment: 0
    981   maxAlignment:    0
    982   adjustsStack:    false
    983   hasCalls:        false
    984   stackProtector:  ''
    985   maxCallFrameSize: 4294967295
    986   hasOpaqueSPAdjustment: false
    987   hasVAStart:      false
    988   hasMustTailInVarArgFunc: false
    989   savePoint:       ''
    990   restorePoint:    ''
    991 fixedStack:      
    992 stack:           
    993 constants:       
    994 body:             |
    995   bb.0.entry:
    996     liveins: $x3, $x4
    997   
    998     %1 = COPY $x4
    999     %0 = COPY $x3
   1000     %2 = RLDICL %1, 0, 58
   1001     %3 = LI -18
   1002     %4 = RLDCRo %0, killed %3, 0, implicit-def $cr0
   1003     ; CHECK: RLDICRo %0, 46, 0, implicit-def $cr0
   1004     ; CHECK-LATE: rldicr. 5, 3, 46, 0
   1005     %5 = COPY killed $cr0
   1006     %6 = ISEL8 %2, %0, %5.sub_eq
   1007     $x3 = COPY %6
   1008     BLR8 implicit $lr8, implicit $rm, implicit $x3
   1009 
   1010 ...
   1011 ---
   1012 name:            testSLD
   1013 # CHECK-ALL: name: testSLD
   1014 alignment:       4
   1015 exposesReturnsTwice: false
   1016 legalized:       false
   1017 regBankSelected: false
   1018 selected:        false
   1019 tracksRegLiveness: true
   1020 registers:       
   1021   - { id: 0, class: g8rc, preferred-register: '' }
   1022   - { id: 1, class: g8rc, preferred-register: '' }
   1023   - { id: 2, class: gprc, preferred-register: '' }
   1024   - { id: 3, class: g8rc, preferred-register: '' }
   1025 liveins:         
   1026   - { reg: '$x3', virtual-reg: '%0' }
   1027   - { reg: '$x4', virtual-reg: '%1' }
   1028 frameInfo:       
   1029   isFrameAddressTaken: false
   1030   isReturnAddressTaken: false
   1031   hasStackMap:     false
   1032   hasPatchPoint:   false
   1033   stackSize:       0
   1034   offsetAdjustment: 0
   1035   maxAlignment:    0
   1036   adjustsStack:    false
   1037   hasCalls:        false
   1038   stackProtector:  ''
   1039   maxCallFrameSize: 4294967295
   1040   hasOpaqueSPAdjustment: false
   1041   hasVAStart:      false
   1042   hasMustTailInVarArgFunc: false
   1043   savePoint:       ''
   1044   restorePoint:    ''
   1045 fixedStack:      
   1046 stack:           
   1047 constants:       
   1048 body:             |
   1049   bb.0.entry:
   1050     liveins: $x3, $x4
   1051   
   1052     %1 = COPY $x4
   1053     %0 = COPY $x3
   1054     %2 = LI -13
   1055     %3 = SLD %0, killed %2
   1056     ; CHECK: LI8 0
   1057     ; CHECK-LATE: li 3, 0
   1058     $x3 = COPY %3
   1059     BLR8 implicit $lr8, implicit $rm, implicit $x3
   1060 
   1061 ...
   1062 ---
   1063 name:            testSLDo
   1064 # CHECK-ALL: name: testSLDo
   1065 alignment:       4
   1066 exposesReturnsTwice: false
   1067 legalized:       false
   1068 regBankSelected: false
   1069 selected:        false
   1070 tracksRegLiveness: true
   1071 registers:       
   1072   - { id: 0, class: g8rc_and_g8rc_nox0, preferred-register: '' }
   1073   - { id: 1, class: g8rc_and_g8rc_nox0, preferred-register: '' }
   1074   - { id: 2, class: gprc, preferred-register: '' }
   1075   - { id: 3, class: g8rc, preferred-register: '' }
   1076   - { id: 4, class: crrc, preferred-register: '' }
   1077   - { id: 5, class: g8rc, preferred-register: '' }
   1078 liveins:         
   1079   - { reg: '$x3', virtual-reg: '%0' }
   1080   - { reg: '$x4', virtual-reg: '%1' }
   1081 frameInfo:       
   1082   isFrameAddressTaken: false
   1083   isReturnAddressTaken: false
   1084   hasStackMap:     false
   1085   hasPatchPoint:   false
   1086   stackSize:       0
   1087   offsetAdjustment: 0
   1088   maxAlignment:    0
   1089   adjustsStack:    false
   1090   hasCalls:        false
   1091   stackProtector:  ''
   1092   maxCallFrameSize: 4294967295
   1093   hasOpaqueSPAdjustment: false
   1094   hasVAStart:      false
   1095   hasMustTailInVarArgFunc: false
   1096   savePoint:       ''
   1097   restorePoint:    ''
   1098 fixedStack:      
   1099 stack:           
   1100 constants:       
   1101 body:             |
   1102   bb.0.entry:
   1103     liveins: $x3, $x4
   1104   
   1105     %1 = COPY $x4
   1106     %0 = COPY $x3
   1107     %2 = LI 88
   1108     %3 = SLDo %0, killed %2, implicit-def $cr0
   1109     ; CHECK: ANDIo8 %0, 0, implicit-def $cr0
   1110     ; CHECK-LATE: andi. 5, 3, 0
   1111     %4 = COPY killed $cr0
   1112     %5 = ISEL8 %1, %0, %4.sub_eq
   1113     $x3 = COPY %5
   1114     BLR8 implicit $lr8, implicit $rm, implicit $x3
   1115 
   1116 ...
   1117 ---
   1118 name:            testSRD
   1119 # CHECK-ALL: name: testSRD
   1120 alignment:       4
   1121 exposesReturnsTwice: false
   1122 legalized:       false
   1123 regBankSelected: false
   1124 selected:        false
   1125 tracksRegLiveness: true
   1126 registers:       
   1127   - { id: 0, class: g8rc, preferred-register: '' }
   1128   - { id: 1, class: g8rc, preferred-register: '' }
   1129   - { id: 2, class: gprc, preferred-register: '' }
   1130   - { id: 3, class: g8rc, preferred-register: '' }
   1131 liveins:         
   1132   - { reg: '$x3', virtual-reg: '%0' }
   1133   - { reg: '$x4', virtual-reg: '%1' }
   1134 frameInfo:       
   1135   isFrameAddressTaken: false
   1136   isReturnAddressTaken: false
   1137   hasStackMap:     false
   1138   hasPatchPoint:   false
   1139   stackSize:       0
   1140   offsetAdjustment: 0
   1141   maxAlignment:    0
   1142   adjustsStack:    false
   1143   hasCalls:        false
   1144   stackProtector:  ''
   1145   maxCallFrameSize: 4294967295
   1146   hasOpaqueSPAdjustment: false
   1147   hasVAStart:      false
   1148   hasMustTailInVarArgFunc: false
   1149   savePoint:       ''
   1150   restorePoint:    ''
   1151 fixedStack:      
   1152 stack:           
   1153 constants:       
   1154 body:             |
   1155   bb.0.entry:
   1156     liveins: $x3, $x4
   1157   
   1158     %1 = COPY $x4
   1159     %0 = COPY $x3
   1160     %2 = LI 400
   1161     %3 = SRD %0, killed %2
   1162     ; CHECK: RLDICL %0, 48, 16
   1163     ; CHECK-LATE: rldicl 3, 3, 48, 16
   1164     $x3 = COPY %3
   1165     BLR8 implicit $lr8, implicit $rm, implicit $x3
   1166 
   1167 ...
   1168 ---
   1169 name:            testSRDo
   1170 # CHECK-ALL: name: testSRDo
   1171 alignment:       4
   1172 exposesReturnsTwice: false
   1173 legalized:       false
   1174 regBankSelected: false
   1175 selected:        false
   1176 tracksRegLiveness: true
   1177 registers:       
   1178   - { id: 0, class: g8rc_and_g8rc_nox0, preferred-register: '' }
   1179   - { id: 1, class: g8rc_and_g8rc_nox0, preferred-register: '' }
   1180   - { id: 2, class: gprc, preferred-register: '' }
   1181   - { id: 3, class: g8rc, preferred-register: '' }
   1182   - { id: 4, class: crrc, preferred-register: '' }
   1183   - { id: 5, class: g8rc, preferred-register: '' }
   1184 liveins:         
   1185   - { reg: '$x3', virtual-reg: '%0' }
   1186   - { reg: '$x4', virtual-reg: '%1' }
   1187 frameInfo:       
   1188   isFrameAddressTaken: false
   1189   isReturnAddressTaken: false
   1190   hasStackMap:     false
   1191   hasPatchPoint:   false
   1192   stackSize:       0
   1193   offsetAdjustment: 0
   1194   maxAlignment:    0
   1195   adjustsStack:    false
   1196   hasCalls:        false
   1197   stackProtector:  ''
   1198   maxCallFrameSize: 4294967295
   1199   hasOpaqueSPAdjustment: false
   1200   hasVAStart:      false
   1201   hasMustTailInVarArgFunc: false
   1202   savePoint:       ''
   1203   restorePoint:    ''
   1204 fixedStack:      
   1205 stack:           
   1206 constants:       
   1207 body:             |
   1208   bb.0.entry:
   1209     liveins: $x3, $x4
   1210   
   1211     %1 = COPY $x4
   1212     %0 = COPY $x3
   1213     %2 = LI 64
   1214     %3 = SRDo %0, killed %2, implicit-def $cr0
   1215     ; CHECK: ANDIo8 %0, 0, implicit-def $cr0
   1216     ; CHECK-LATE: andi. 5, 3, 0
   1217     %4 = COPY killed $cr0
   1218     %5 = ISEL8 %1, %0, %4.sub_eq
   1219     $x3 = COPY %5
   1220     BLR8 implicit $lr8, implicit $rm, implicit $x3
   1221 
   1222 ...
   1223 ---
   1224 name:            testSRAD
   1225 # CHECK-ALL: name: testSRAD
   1226 alignment:       4
   1227 exposesReturnsTwice: false
   1228 legalized:       false
   1229 regBankSelected: false
   1230 selected:        false
   1231 tracksRegLiveness: true
   1232 registers:       
   1233   - { id: 0, class: g8rc, preferred-register: '' }
   1234   - { id: 1, class: g8rc, preferred-register: '' }
   1235   - { id: 2, class: gprc, preferred-register: '' }
   1236   - { id: 3, class: g8rc, preferred-register: '' }
   1237 liveins:         
   1238   - { reg: '$x3', virtual-reg: '%0' }
   1239   - { reg: '$x4', virtual-reg: '%1' }
   1240 frameInfo:       
   1241   isFrameAddressTaken: false
   1242   isReturnAddressTaken: false
   1243   hasStackMap:     false
   1244   hasPatchPoint:   false
   1245   stackSize:       0
   1246   offsetAdjustment: 0
   1247   maxAlignment:    0
   1248   adjustsStack:    false
   1249   hasCalls:        false
   1250   stackProtector:  ''
   1251   maxCallFrameSize: 4294967295
   1252   hasOpaqueSPAdjustment: false
   1253   hasVAStart:      false
   1254   hasMustTailInVarArgFunc: false
   1255   savePoint:       ''
   1256   restorePoint:    ''
   1257 fixedStack:      
   1258 stack:           
   1259 constants:       
   1260 body:             |
   1261   bb.0.entry:
   1262     liveins: $x3, $x4
   1263   
   1264     %1 = COPY $x4
   1265     %0 = COPY $x3
   1266     %2 = LI -44
   1267     %3 = SRAD %0, killed %2, implicit-def dead $carry
   1268     ; CHECK: SRAD %0, killed %2, implicit-def dead $carry
   1269     ; CHECK-LATE: srad 3, 3, 4
   1270     $x3 = COPY %3
   1271     BLR8 implicit $lr8, implicit $rm, implicit $x3
   1272 
   1273 ...
   1274 ---
   1275 name:            testSRADo
   1276 # CHECK-ALL: name: testSRADo
   1277 alignment:       4
   1278 exposesReturnsTwice: false
   1279 legalized:       false
   1280 regBankSelected: false
   1281 selected:        false
   1282 tracksRegLiveness: true
   1283 registers:       
   1284   - { id: 0, class: g8rc, preferred-register: '' }
   1285   - { id: 1, class: g8rc_and_g8rc_nox0, preferred-register: '' }
   1286   - { id: 2, class: gprc, preferred-register: '' }
   1287   - { id: 3, class: g8rc_and_g8rc_nox0, preferred-register: '' }
   1288   - { id: 4, class: crrc, preferred-register: '' }
   1289   - { id: 5, class: g8rc, preferred-register: '' }
   1290 liveins:         
   1291   - { reg: '$x3', virtual-reg: '%0' }
   1292   - { reg: '$x4', virtual-reg: '%1' }
   1293 frameInfo:       
   1294   isFrameAddressTaken: false
   1295   isReturnAddressTaken: false
   1296   hasStackMap:     false
   1297   hasPatchPoint:   false
   1298   stackSize:       0
   1299   offsetAdjustment: 0
   1300   maxAlignment:    0
   1301   adjustsStack:    false
   1302   hasCalls:        false
   1303   stackProtector:  ''
   1304   maxCallFrameSize: 4294967295
   1305   hasOpaqueSPAdjustment: false
   1306   hasVAStart:      false
   1307   hasMustTailInVarArgFunc: false
   1308   savePoint:       ''
   1309   restorePoint:    ''
   1310 fixedStack:      
   1311 stack:           
   1312 constants:       
   1313 body:             |
   1314   bb.0.entry:
   1315     liveins: $x3, $x4
   1316   
   1317     %1 = COPY $x4
   1318     %0 = COPY $x3
   1319     %2 = LI 68
   1320     %3 = SRADo %0, killed %2, implicit-def dead $carry, implicit-def $cr0
   1321     ; CHECK: SRADo %0, killed %2, implicit-def dead $carry, implicit-def $cr0
   1322     ; CHECK-LATE: srad. 3, 3, 5
   1323     %4 = COPY killed $cr0
   1324     %5 = ISEL8 %1, %3, %4.sub_eq
   1325     $x3 = COPY %5
   1326     BLR8 implicit $lr8, implicit $rm, implicit $x3
   1327 
   1328 ...
   1329 ---
   1330