1faa326deSCraig Topper; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2faa326deSCraig Topper; RUN: llc -mtriple=riscv64 -mattr=+c -verify-machineinstrs < %s \ 3faa326deSCraig Topper; RUN: | FileCheck -check-prefix=NOCMOV %s 4faa326deSCraig Topper; RUN: llc -mtriple=riscv64 -mattr=+conditional-cmv-fusion,+c -verify-machineinstrs < %s \ 5faa326deSCraig Topper; RUN: | FileCheck -check-prefixes=CMOV,CMOV-NOZICOND %s 6d833b9d6SAlex Bradbury; RUN: llc -mtriple=riscv64 -mattr=+conditional-cmv-fusion,+c,+zicond -verify-machineinstrs < %s \ 7faa326deSCraig Topper; RUN: | FileCheck -check-prefixes=CMOV,CMOV-ZICOND %s 8faa326deSCraig Topper; RUN: llc -mtriple=riscv64 -mattr=+short-forward-branch-opt -verify-machineinstrs < %s \ 9faa326deSCraig Topper; RUN: | FileCheck -check-prefixes=SHORT_FORWARD,SFB-NOZICOND %s 10faa326deSCraig Topper; RUN: llc -mtriple=riscv64 -mattr=+short-forward-branch-opt,+c -verify-machineinstrs < %s \ 11faa326deSCraig Topper; RUN: | FileCheck -check-prefixes=SHORT_FORWARD,SFB-NOZICOND %s 12d833b9d6SAlex Bradbury; RUN: llc -mtriple=riscv64 -mattr=+short-forward-branch-opt,+zicond -verify-machineinstrs < %s \ 13faa326deSCraig Topper; RUN: | FileCheck -check-prefixes=SHORT_FORWARD,SFB-ZICOND %s 14faa326deSCraig Topper 15faa326deSCraig Topper; The conditional move optimization in sifive-p450 requires that only a 16faa326deSCraig Topper; single c.mv instruction appears in the branch shadow. 17faa326deSCraig Topper 18faa326deSCraig Topper; The sifive-7-series can predicate an xor. 19faa326deSCraig Topper 20faa326deSCraig Topperdefine signext i32 @test1(i32 signext %x, i32 signext %y, i32 signext %z) { 21faa326deSCraig Topper; NOCMOV-LABEL: test1: 22faa326deSCraig Topper; NOCMOV: # %bb.0: 23faa326deSCraig Topper; NOCMOV-NEXT: snez a2, a2 24faa326deSCraig Topper; NOCMOV-NEXT: addi a2, a2, -1 25faa326deSCraig Topper; NOCMOV-NEXT: and a1, a1, a2 26faa326deSCraig Topper; NOCMOV-NEXT: xor a0, a0, a1 27faa326deSCraig Topper; NOCMOV-NEXT: ret 28faa326deSCraig Topper; 29faa326deSCraig Topper; CMOV-LABEL: test1: 30faa326deSCraig Topper; CMOV: # %bb.0: 31faa326deSCraig Topper; CMOV-NEXT: xor a1, a1, a0 32faa326deSCraig Topper; CMOV-NEXT: bnez a2, .LBB0_2 33faa326deSCraig Topper; CMOV-NEXT: # %bb.1: 34faa326deSCraig Topper; CMOV-NEXT: mv a0, a1 35faa326deSCraig Topper; CMOV-NEXT: .LBB0_2: 36faa326deSCraig Topper; CMOV-NEXT: ret 37faa326deSCraig Topper; 38faa326deSCraig Topper; SHORT_FORWARD-LABEL: test1: 39faa326deSCraig Topper; SHORT_FORWARD: # %bb.0: 40faa326deSCraig Topper; SHORT_FORWARD-NEXT: bnez a2, .LBB0_2 41faa326deSCraig Topper; SHORT_FORWARD-NEXT: # %bb.1: 42faa326deSCraig Topper; SHORT_FORWARD-NEXT: xor a0, a0, a1 43faa326deSCraig Topper; SHORT_FORWARD-NEXT: .LBB0_2: 44faa326deSCraig Topper; SHORT_FORWARD-NEXT: ret 45faa326deSCraig Topper %c = icmp eq i32 %z, 0 46faa326deSCraig Topper %a = xor i32 %x, %y 47faa326deSCraig Topper %b = select i1 %c, i32 %a, i32 %x 48faa326deSCraig Topper ret i32 %b 49faa326deSCraig Topper} 50faa326deSCraig Topper 51faa326deSCraig Topperdefine signext i32 @test2(i32 signext %x, i32 signext %y, i32 signext %z) { 52faa326deSCraig Topper; NOCMOV-LABEL: test2: 53faa326deSCraig Topper; NOCMOV: # %bb.0: 54faa326deSCraig Topper; NOCMOV-NEXT: seqz a2, a2 55faa326deSCraig Topper; NOCMOV-NEXT: addi a2, a2, -1 56faa326deSCraig Topper; NOCMOV-NEXT: and a1, a1, a2 57faa326deSCraig Topper; NOCMOV-NEXT: xor a0, a0, a1 58faa326deSCraig Topper; NOCMOV-NEXT: ret 59faa326deSCraig Topper; 60faa326deSCraig Topper; CMOV-LABEL: test2: 61faa326deSCraig Topper; CMOV: # %bb.0: 62faa326deSCraig Topper; CMOV-NEXT: xor a1, a1, a0 63faa326deSCraig Topper; CMOV-NEXT: beqz a2, .LBB1_2 64faa326deSCraig Topper; CMOV-NEXT: # %bb.1: 65faa326deSCraig Topper; CMOV-NEXT: mv a0, a1 66faa326deSCraig Topper; CMOV-NEXT: .LBB1_2: 67faa326deSCraig Topper; CMOV-NEXT: ret 68faa326deSCraig Topper; 69faa326deSCraig Topper; SHORT_FORWARD-LABEL: test2: 70faa326deSCraig Topper; SHORT_FORWARD: # %bb.0: 71faa326deSCraig Topper; SHORT_FORWARD-NEXT: beqz a2, .LBB1_2 72faa326deSCraig Topper; SHORT_FORWARD-NEXT: # %bb.1: 73faa326deSCraig Topper; SHORT_FORWARD-NEXT: xor a0, a0, a1 74faa326deSCraig Topper; SHORT_FORWARD-NEXT: .LBB1_2: 75faa326deSCraig Topper; SHORT_FORWARD-NEXT: ret 76faa326deSCraig Topper %c = icmp eq i32 %z, 0 77faa326deSCraig Topper %a = xor i32 %x, %y 78faa326deSCraig Topper %b = select i1 %c, i32 %x, i32 %a 79faa326deSCraig Topper ret i32 %b 80faa326deSCraig Topper} 81faa326deSCraig Topper 82faa326deSCraig Topper; Make sure we don't share the same basic block for two selects with the same 83faa326deSCraig Topper; condition. 84faa326deSCraig Topperdefine signext i32 @test3(i32 signext %v, i32 signext %w, i32 signext %x, i32 signext %y, i32 signext %z) { 85faa326deSCraig Topper; NOCMOV-LABEL: test3: 86faa326deSCraig Topper; NOCMOV: # %bb.0: 87faa326deSCraig Topper; NOCMOV-NEXT: seqz a4, a4 88faa326deSCraig Topper; NOCMOV-NEXT: addi a4, a4, -1 89faa326deSCraig Topper; NOCMOV-NEXT: and a1, a1, a4 90faa326deSCraig Topper; NOCMOV-NEXT: and a3, a3, a4 91*9122c523SPengcheng Wang; NOCMOV-NEXT: xor a0, a0, a1 92faa326deSCraig Topper; NOCMOV-NEXT: xor a2, a2, a3 93faa326deSCraig Topper; NOCMOV-NEXT: addw a0, a0, a2 94faa326deSCraig Topper; NOCMOV-NEXT: ret 95faa326deSCraig Topper; 96faa326deSCraig Topper; CMOV-LABEL: test3: 97faa326deSCraig Topper; CMOV: # %bb.0: 98faa326deSCraig Topper; CMOV-NEXT: xor a1, a1, a0 99*9122c523SPengcheng Wang; CMOV-NEXT: xor a3, a3, a2 100faa326deSCraig Topper; CMOV-NEXT: bnez a4, .LBB2_2 101faa326deSCraig Topper; CMOV-NEXT: # %bb.1: 102faa326deSCraig Topper; CMOV-NEXT: mv a1, a0 103faa326deSCraig Topper; CMOV-NEXT: .LBB2_2: 104faa326deSCraig Topper; CMOV-NEXT: bnez a4, .LBB2_4 105faa326deSCraig Topper; CMOV-NEXT: # %bb.3: 106*9122c523SPengcheng Wang; CMOV-NEXT: mv a3, a2 107faa326deSCraig Topper; CMOV-NEXT: .LBB2_4: 108*9122c523SPengcheng Wang; CMOV-NEXT: addw a0, a1, a3 109faa326deSCraig Topper; CMOV-NEXT: ret 110faa326deSCraig Topper; 111faa326deSCraig Topper; SHORT_FORWARD-LABEL: test3: 112faa326deSCraig Topper; SHORT_FORWARD: # %bb.0: 113faa326deSCraig Topper; SHORT_FORWARD-NEXT: beqz a4, .LBB2_2 114faa326deSCraig Topper; SHORT_FORWARD-NEXT: # %bb.1: 115faa326deSCraig Topper; SHORT_FORWARD-NEXT: xor a0, a0, a1 116faa326deSCraig Topper; SHORT_FORWARD-NEXT: .LBB2_2: 117faa326deSCraig Topper; SHORT_FORWARD-NEXT: beqz a4, .LBB2_4 118faa326deSCraig Topper; SHORT_FORWARD-NEXT: # %bb.3: 119faa326deSCraig Topper; SHORT_FORWARD-NEXT: xor a2, a2, a3 120faa326deSCraig Topper; SHORT_FORWARD-NEXT: .LBB2_4: 121faa326deSCraig Topper; SHORT_FORWARD-NEXT: addw a0, a0, a2 122faa326deSCraig Topper; SHORT_FORWARD-NEXT: ret 123faa326deSCraig Topper %c = icmp eq i32 %z, 0 124faa326deSCraig Topper %a = xor i32 %v, %w 125faa326deSCraig Topper %b = select i1 %c, i32 %v, i32 %a 126faa326deSCraig Topper %d = xor i32 %x, %y 127faa326deSCraig Topper %e = select i1 %c, i32 %x, i32 %d 128faa326deSCraig Topper %f = add i32 %b, %e 129faa326deSCraig Topper ret i32 %f 130faa326deSCraig Topper} 131faa326deSCraig Topper 132faa326deSCraig Topperdefine signext i32 @test4(i32 signext %x, i32 signext %y, i32 signext %z) { 133faa326deSCraig Topper; NOCMOV-LABEL: test4: 134faa326deSCraig Topper; NOCMOV: # %bb.0: 135faa326deSCraig Topper; NOCMOV-NEXT: snez a0, a2 136faa326deSCraig Topper; NOCMOV-NEXT: addi a0, a0, -1 137faa326deSCraig Topper; NOCMOV-NEXT: andi a0, a0, 3 138faa326deSCraig Topper; NOCMOV-NEXT: ret 139faa326deSCraig Topper; 140faa326deSCraig Topper; CMOV-NOZICOND-LABEL: test4: 141faa326deSCraig Topper; CMOV-NOZICOND: # %bb.0: 142faa326deSCraig Topper; CMOV-NOZICOND-NEXT: li a1, 0 143faa326deSCraig Topper; CMOV-NOZICOND-NEXT: li a0, 3 144faa326deSCraig Topper; CMOV-NOZICOND-NEXT: beqz a2, .LBB3_2 145faa326deSCraig Topper; CMOV-NOZICOND-NEXT: # %bb.1: 146faa326deSCraig Topper; CMOV-NOZICOND-NEXT: mv a0, a1 147faa326deSCraig Topper; CMOV-NOZICOND-NEXT: .LBB3_2: 148faa326deSCraig Topper; CMOV-NOZICOND-NEXT: ret 149faa326deSCraig Topper; 150faa326deSCraig Topper; CMOV-ZICOND-LABEL: test4: 151faa326deSCraig Topper; CMOV-ZICOND: # %bb.0: 152faa326deSCraig Topper; CMOV-ZICOND-NEXT: li a0, 3 153faa326deSCraig Topper; CMOV-ZICOND-NEXT: czero.nez a0, a0, a2 154faa326deSCraig Topper; CMOV-ZICOND-NEXT: ret 155faa326deSCraig Topper; 156faa326deSCraig Topper; SFB-NOZICOND-LABEL: test4: 157faa326deSCraig Topper; SFB-NOZICOND: # %bb.0: 158faa326deSCraig Topper; SFB-NOZICOND-NEXT: li a0, 3 159faa326deSCraig Topper; SFB-NOZICOND-NEXT: beqz a2, .LBB3_2 160faa326deSCraig Topper; SFB-NOZICOND-NEXT: # %bb.1: 161faa326deSCraig Topper; SFB-NOZICOND-NEXT: li a0, 0 162faa326deSCraig Topper; SFB-NOZICOND-NEXT: .LBB3_2: 163faa326deSCraig Topper; SFB-NOZICOND-NEXT: ret 164faa326deSCraig Topper; 165faa326deSCraig Topper; SFB-ZICOND-LABEL: test4: 166faa326deSCraig Topper; SFB-ZICOND: # %bb.0: 167faa326deSCraig Topper; SFB-ZICOND-NEXT: li a0, 3 168faa326deSCraig Topper; SFB-ZICOND-NEXT: czero.nez a0, a0, a2 169faa326deSCraig Topper; SFB-ZICOND-NEXT: ret 170faa326deSCraig Topper %c = icmp eq i32 %z, 0 171faa326deSCraig Topper %a = select i1 %c, i32 3, i32 0 172faa326deSCraig Topper ret i32 %a 173faa326deSCraig Topper} 174faa326deSCraig Topper 175faa326deSCraig Topperdefine i16 @select_xor_1(i16 %A, i8 %cond) { 176faa326deSCraig Topper; NOCMOV-LABEL: select_xor_1: 177faa326deSCraig Topper; NOCMOV: # %bb.0: # %entry 178faa326deSCraig Topper; NOCMOV-NEXT: slli a1, a1, 63 179faa326deSCraig Topper; NOCMOV-NEXT: srai a1, a1, 63 180faa326deSCraig Topper; NOCMOV-NEXT: andi a1, a1, 43 181faa326deSCraig Topper; NOCMOV-NEXT: xor a0, a0, a1 182faa326deSCraig Topper; NOCMOV-NEXT: ret 183faa326deSCraig Topper; 184faa326deSCraig Topper; CMOV-LABEL: select_xor_1: 185faa326deSCraig Topper; CMOV: # %bb.0: # %entry 186faa326deSCraig Topper; CMOV-NEXT: andi a1, a1, 1 187faa326deSCraig Topper; CMOV-NEXT: xori a2, a0, 43 188faa326deSCraig Topper; CMOV-NEXT: beqz a1, .LBB4_2 189faa326deSCraig Topper; CMOV-NEXT: # %bb.1: # %entry 190faa326deSCraig Topper; CMOV-NEXT: mv a0, a2 191faa326deSCraig Topper; CMOV-NEXT: .LBB4_2: # %entry 192faa326deSCraig Topper; CMOV-NEXT: ret 193faa326deSCraig Topper; 194faa326deSCraig Topper; SHORT_FORWARD-LABEL: select_xor_1: 195faa326deSCraig Topper; SHORT_FORWARD: # %bb.0: # %entry 196faa326deSCraig Topper; SHORT_FORWARD-NEXT: andi a1, a1, 1 197faa326deSCraig Topper; SHORT_FORWARD-NEXT: beqz a1, .LBB4_2 198faa326deSCraig Topper; SHORT_FORWARD-NEXT: # %bb.1: # %entry 199faa326deSCraig Topper; SHORT_FORWARD-NEXT: xori a0, a0, 43 200faa326deSCraig Topper; SHORT_FORWARD-NEXT: .LBB4_2: # %entry 201faa326deSCraig Topper; SHORT_FORWARD-NEXT: ret 202faa326deSCraig Topperentry: 203faa326deSCraig Topper %and = and i8 %cond, 1 204faa326deSCraig Topper %cmp10 = icmp eq i8 %and, 0 205faa326deSCraig Topper %0 = xor i16 %A, 43 206faa326deSCraig Topper %1 = select i1 %cmp10, i16 %A, i16 %0 207faa326deSCraig Topper ret i16 %1 208faa326deSCraig Topper} 209faa326deSCraig Topper 210faa326deSCraig Topper; Equivalent to above, but with icmp ne (and %cond, 1), 1 instead of 211faa326deSCraig Topper; icmp eq (and %cond, 1), 0 212faa326deSCraig Topperdefine i16 @select_xor_1b(i16 %A, i8 %cond) { 213faa326deSCraig Topper; NOCMOV-LABEL: select_xor_1b: 214faa326deSCraig Topper; NOCMOV: # %bb.0: # %entry 215faa326deSCraig Topper; NOCMOV-NEXT: slli a1, a1, 63 216faa326deSCraig Topper; NOCMOV-NEXT: srai a1, a1, 63 217faa326deSCraig Topper; NOCMOV-NEXT: andi a1, a1, 43 218faa326deSCraig Topper; NOCMOV-NEXT: xor a0, a0, a1 219faa326deSCraig Topper; NOCMOV-NEXT: ret 220faa326deSCraig Topper; 221faa326deSCraig Topper; CMOV-LABEL: select_xor_1b: 222faa326deSCraig Topper; CMOV: # %bb.0: # %entry 223faa326deSCraig Topper; CMOV-NEXT: andi a1, a1, 1 224faa326deSCraig Topper; CMOV-NEXT: xori a2, a0, 43 225faa326deSCraig Topper; CMOV-NEXT: beqz a1, .LBB5_2 226faa326deSCraig Topper; CMOV-NEXT: # %bb.1: # %entry 227faa326deSCraig Topper; CMOV-NEXT: mv a0, a2 228faa326deSCraig Topper; CMOV-NEXT: .LBB5_2: # %entry 229faa326deSCraig Topper; CMOV-NEXT: ret 230faa326deSCraig Topper; 231faa326deSCraig Topper; SHORT_FORWARD-LABEL: select_xor_1b: 232faa326deSCraig Topper; SHORT_FORWARD: # %bb.0: # %entry 233faa326deSCraig Topper; SHORT_FORWARD-NEXT: andi a1, a1, 1 234faa326deSCraig Topper; SHORT_FORWARD-NEXT: beqz a1, .LBB5_2 235faa326deSCraig Topper; SHORT_FORWARD-NEXT: # %bb.1: # %entry 236faa326deSCraig Topper; SHORT_FORWARD-NEXT: xori a0, a0, 43 237faa326deSCraig Topper; SHORT_FORWARD-NEXT: .LBB5_2: # %entry 238faa326deSCraig Topper; SHORT_FORWARD-NEXT: ret 239faa326deSCraig Topperentry: 240faa326deSCraig Topper %and = and i8 %cond, 1 241faa326deSCraig Topper %cmp10 = icmp ne i8 %and, 1 242faa326deSCraig Topper %0 = xor i16 %A, 43 243faa326deSCraig Topper %1 = select i1 %cmp10, i16 %A, i16 %0 244faa326deSCraig Topper ret i16 %1 245faa326deSCraig Topper} 246faa326deSCraig Topper 247faa326deSCraig Topperdefine i32 @select_xor_2(i32 %A, i32 %B, i8 %cond) { 248faa326deSCraig Topper; NOCMOV-LABEL: select_xor_2: 249faa326deSCraig Topper; NOCMOV: # %bb.0: # %entry 250faa326deSCraig Topper; NOCMOV-NEXT: slli a2, a2, 63 251faa326deSCraig Topper; NOCMOV-NEXT: srai a2, a2, 63 252faa326deSCraig Topper; NOCMOV-NEXT: and a1, a1, a2 253faa326deSCraig Topper; NOCMOV-NEXT: xor a0, a0, a1 254faa326deSCraig Topper; NOCMOV-NEXT: ret 255faa326deSCraig Topper; 256faa326deSCraig Topper; CMOV-LABEL: select_xor_2: 257faa326deSCraig Topper; CMOV: # %bb.0: # %entry 258faa326deSCraig Topper; CMOV-NEXT: andi a2, a2, 1 259faa326deSCraig Topper; CMOV-NEXT: xor a1, a1, a0 260faa326deSCraig Topper; CMOV-NEXT: beqz a2, .LBB6_2 261faa326deSCraig Topper; CMOV-NEXT: # %bb.1: # %entry 262faa326deSCraig Topper; CMOV-NEXT: mv a0, a1 263faa326deSCraig Topper; CMOV-NEXT: .LBB6_2: # %entry 264faa326deSCraig Topper; CMOV-NEXT: ret 265faa326deSCraig Topper; 266faa326deSCraig Topper; SFB-ZICOND-LABEL: select_xor_2: 267faa326deSCraig Topper; SFB-ZICOND: # %bb.0: # %entry 268faa326deSCraig Topper; SFB-ZICOND-NEXT: andi a2, a2, 1 269faa326deSCraig Topper; SFB-ZICOND-NEXT: beqz a2, .LBB6_2 270faa326deSCraig Topper; SFB-ZICOND-NEXT: # %bb.1: # %entry 271faa326deSCraig Topper; SFB-ZICOND-NEXT: xor a0, a1, a0 272faa326deSCraig Topper; SFB-ZICOND-NEXT: .LBB6_2: # %entry 273faa326deSCraig Topper; SFB-ZICOND-NEXT: ret 274faa326deSCraig Topperentry: 275faa326deSCraig Topper %and = and i8 %cond, 1 276faa326deSCraig Topper %cmp10 = icmp eq i8 %and, 0 277faa326deSCraig Topper %0 = xor i32 %B, %A 278faa326deSCraig Topper %1 = select i1 %cmp10, i32 %A, i32 %0 279faa326deSCraig Topper ret i32 %1 280faa326deSCraig Topper} 281faa326deSCraig Topper 282faa326deSCraig Topper; Equivalent to above, but with icmp ne (and %cond, 1), 1 instead of 283faa326deSCraig Topper; icmp eq (and %cond, 1), 0 284faa326deSCraig Topperdefine i32 @select_xor_2b(i32 %A, i32 %B, i8 %cond) { 285faa326deSCraig Topper; NOCMOV-LABEL: select_xor_2b: 286faa326deSCraig Topper; NOCMOV: # %bb.0: # %entry 287faa326deSCraig Topper; NOCMOV-NEXT: slli a2, a2, 63 288faa326deSCraig Topper; NOCMOV-NEXT: srai a2, a2, 63 289faa326deSCraig Topper; NOCMOV-NEXT: and a1, a1, a2 290faa326deSCraig Topper; NOCMOV-NEXT: xor a0, a0, a1 291faa326deSCraig Topper; NOCMOV-NEXT: ret 292faa326deSCraig Topper; 293faa326deSCraig Topper; CMOV-LABEL: select_xor_2b: 294faa326deSCraig Topper; CMOV: # %bb.0: # %entry 295faa326deSCraig Topper; CMOV-NEXT: andi a2, a2, 1 296faa326deSCraig Topper; CMOV-NEXT: xor a1, a1, a0 297faa326deSCraig Topper; CMOV-NEXT: beqz a2, .LBB7_2 298faa326deSCraig Topper; CMOV-NEXT: # %bb.1: # %entry 299faa326deSCraig Topper; CMOV-NEXT: mv a0, a1 300faa326deSCraig Topper; CMOV-NEXT: .LBB7_2: # %entry 301faa326deSCraig Topper; CMOV-NEXT: ret 302faa326deSCraig Topper; 303faa326deSCraig Topper; SFB-ZICOND-LABEL: select_xor_2b: 304faa326deSCraig Topper; SFB-ZICOND: # %bb.0: # %entry 305faa326deSCraig Topper; SFB-ZICOND-NEXT: andi a2, a2, 1 306faa326deSCraig Topper; SFB-ZICOND-NEXT: beqz a2, .LBB7_2 307faa326deSCraig Topper; SFB-ZICOND-NEXT: # %bb.1: # %entry 308faa326deSCraig Topper; SFB-ZICOND-NEXT: xor a0, a1, a0 309faa326deSCraig Topper; SFB-ZICOND-NEXT: .LBB7_2: # %entry 310faa326deSCraig Topper; SFB-ZICOND-NEXT: ret 311faa326deSCraig Topperentry: 312faa326deSCraig Topper %and = and i8 %cond, 1 313faa326deSCraig Topper %cmp10 = icmp ne i8 %and, 1 314faa326deSCraig Topper %0 = xor i32 %B, %A 315faa326deSCraig Topper %1 = select i1 %cmp10, i32 %A, i32 %0 316faa326deSCraig Topper ret i32 %1 317faa326deSCraig Topper} 318faa326deSCraig Topper 319faa326deSCraig Topperdefine i32 @select_or(i32 %A, i32 %B, i8 %cond) { 320faa326deSCraig Topper; NOCMOV-LABEL: select_or: 321faa326deSCraig Topper; NOCMOV: # %bb.0: # %entry 322faa326deSCraig Topper; NOCMOV-NEXT: slli a2, a2, 63 323faa326deSCraig Topper; NOCMOV-NEXT: srai a2, a2, 63 324faa326deSCraig Topper; NOCMOV-NEXT: and a1, a1, a2 325faa326deSCraig Topper; NOCMOV-NEXT: or a0, a0, a1 326faa326deSCraig Topper; NOCMOV-NEXT: ret 327faa326deSCraig Topper; 328faa326deSCraig Topper; CMOV-LABEL: select_or: 329faa326deSCraig Topper; CMOV: # %bb.0: # %entry 330faa326deSCraig Topper; CMOV-NEXT: andi a2, a2, 1 331faa326deSCraig Topper; CMOV-NEXT: or a1, a1, a0 332faa326deSCraig Topper; CMOV-NEXT: beqz a2, .LBB8_2 333faa326deSCraig Topper; CMOV-NEXT: # %bb.1: # %entry 334faa326deSCraig Topper; CMOV-NEXT: mv a0, a1 335faa326deSCraig Topper; CMOV-NEXT: .LBB8_2: # %entry 336faa326deSCraig Topper; CMOV-NEXT: ret 337faa326deSCraig Topper; 338faa326deSCraig Topper; SFB-ZICOND-LABEL: select_or: 339faa326deSCraig Topper; SFB-ZICOND: # %bb.0: # %entry 340faa326deSCraig Topper; SFB-ZICOND-NEXT: andi a2, a2, 1 341faa326deSCraig Topper; SFB-ZICOND-NEXT: beqz a2, .LBB8_2 342faa326deSCraig Topper; SFB-ZICOND-NEXT: # %bb.1: # %entry 343faa326deSCraig Topper; SFB-ZICOND-NEXT: or a0, a1, a0 344faa326deSCraig Topper; SFB-ZICOND-NEXT: .LBB8_2: # %entry 345faa326deSCraig Topper; SFB-ZICOND-NEXT: ret 346faa326deSCraig Topperentry: 347faa326deSCraig Topper %and = and i8 %cond, 1 348faa326deSCraig Topper %cmp10 = icmp eq i8 %and, 0 349faa326deSCraig Topper %0 = or i32 %B, %A 350faa326deSCraig Topper %1 = select i1 %cmp10, i32 %A, i32 %0 351faa326deSCraig Topper ret i32 %1 352faa326deSCraig Topper} 353faa326deSCraig Topper 354faa326deSCraig Topper; Equivalent to above, but with icmp ne (and %cond, 1), 1 instead of 355faa326deSCraig Topper; icmp eq (and %cond, 1), 0 356faa326deSCraig Topperdefine i32 @select_or_b(i32 %A, i32 %B, i8 %cond) { 357faa326deSCraig Topper; NOCMOV-LABEL: select_or_b: 358faa326deSCraig Topper; NOCMOV: # %bb.0: # %entry 359faa326deSCraig Topper; NOCMOV-NEXT: slli a2, a2, 63 360faa326deSCraig Topper; NOCMOV-NEXT: srai a2, a2, 63 361faa326deSCraig Topper; NOCMOV-NEXT: and a1, a1, a2 362faa326deSCraig Topper; NOCMOV-NEXT: or a0, a0, a1 363faa326deSCraig Topper; NOCMOV-NEXT: ret 364faa326deSCraig Topper; 365faa326deSCraig Topper; CMOV-LABEL: select_or_b: 366faa326deSCraig Topper; CMOV: # %bb.0: # %entry 367faa326deSCraig Topper; CMOV-NEXT: andi a2, a2, 1 368faa326deSCraig Topper; CMOV-NEXT: or a1, a1, a0 369faa326deSCraig Topper; CMOV-NEXT: beqz a2, .LBB9_2 370faa326deSCraig Topper; CMOV-NEXT: # %bb.1: # %entry 371faa326deSCraig Topper; CMOV-NEXT: mv a0, a1 372faa326deSCraig Topper; CMOV-NEXT: .LBB9_2: # %entry 373faa326deSCraig Topper; CMOV-NEXT: ret 374faa326deSCraig Topper; 375faa326deSCraig Topper; SFB-ZICOND-LABEL: select_or_b: 376faa326deSCraig Topper; SFB-ZICOND: # %bb.0: # %entry 377faa326deSCraig Topper; SFB-ZICOND-NEXT: andi a2, a2, 1 378faa326deSCraig Topper; SFB-ZICOND-NEXT: beqz a2, .LBB9_2 379faa326deSCraig Topper; SFB-ZICOND-NEXT: # %bb.1: # %entry 380faa326deSCraig Topper; SFB-ZICOND-NEXT: or a0, a1, a0 381faa326deSCraig Topper; SFB-ZICOND-NEXT: .LBB9_2: # %entry 382faa326deSCraig Topper; SFB-ZICOND-NEXT: ret 383faa326deSCraig Topperentry: 384faa326deSCraig Topper %and = and i8 %cond, 1 385faa326deSCraig Topper %cmp10 = icmp ne i8 %and, 1 386faa326deSCraig Topper %0 = or i32 %B, %A 387faa326deSCraig Topper %1 = select i1 %cmp10, i32 %A, i32 %0 388faa326deSCraig Topper ret i32 %1 389faa326deSCraig Topper} 390faa326deSCraig Topper 391faa326deSCraig Topperdefine i32 @select_or_1(i32 %A, i32 %B, i32 %cond) { 392faa326deSCraig Topper; NOCMOV-LABEL: select_or_1: 393faa326deSCraig Topper; NOCMOV: # %bb.0: # %entry 394faa326deSCraig Topper; NOCMOV-NEXT: slli a2, a2, 63 395faa326deSCraig Topper; NOCMOV-NEXT: srai a2, a2, 63 396faa326deSCraig Topper; NOCMOV-NEXT: and a1, a1, a2 397faa326deSCraig Topper; NOCMOV-NEXT: or a0, a0, a1 398faa326deSCraig Topper; NOCMOV-NEXT: ret 399faa326deSCraig Topper; 400faa326deSCraig Topper; CMOV-LABEL: select_or_1: 401faa326deSCraig Topper; CMOV: # %bb.0: # %entry 402faa326deSCraig Topper; CMOV-NEXT: andi a2, a2, 1 403faa326deSCraig Topper; CMOV-NEXT: or a1, a1, a0 404faa326deSCraig Topper; CMOV-NEXT: beqz a2, .LBB10_2 405faa326deSCraig Topper; CMOV-NEXT: # %bb.1: # %entry 406faa326deSCraig Topper; CMOV-NEXT: mv a0, a1 407faa326deSCraig Topper; CMOV-NEXT: .LBB10_2: # %entry 408faa326deSCraig Topper; CMOV-NEXT: ret 409faa326deSCraig Topper; 410faa326deSCraig Topper; SFB-ZICOND-LABEL: select_or_1: 411faa326deSCraig Topper; SFB-ZICOND: # %bb.0: # %entry 412faa326deSCraig Topper; SFB-ZICOND-NEXT: andi a2, a2, 1 413faa326deSCraig Topper; SFB-ZICOND-NEXT: beqz a2, .LBB10_2 414faa326deSCraig Topper; SFB-ZICOND-NEXT: # %bb.1: # %entry 415faa326deSCraig Topper; SFB-ZICOND-NEXT: or a0, a1, a0 416faa326deSCraig Topper; SFB-ZICOND-NEXT: .LBB10_2: # %entry 417faa326deSCraig Topper; SFB-ZICOND-NEXT: ret 418faa326deSCraig Topperentry: 419faa326deSCraig Topper %and = and i32 %cond, 1 420faa326deSCraig Topper %cmp10 = icmp eq i32 %and, 0 421faa326deSCraig Topper %0 = or i32 %B, %A 422faa326deSCraig Topper %1 = select i1 %cmp10, i32 %A, i32 %0 423faa326deSCraig Topper ret i32 %1 424faa326deSCraig Topper} 425faa326deSCraig Topper 426faa326deSCraig Topper; Equivalent to above, but with icmp ne (and %cond, 1), 1 instead of 427faa326deSCraig Topper; icmp eq (and %cond, 1), 0 428faa326deSCraig Topperdefine i32 @select_or_1b(i32 %A, i32 %B, i32 %cond) { 429faa326deSCraig Topper; NOCMOV-LABEL: select_or_1b: 430faa326deSCraig Topper; NOCMOV: # %bb.0: # %entry 431faa326deSCraig Topper; NOCMOV-NEXT: slli a2, a2, 63 432faa326deSCraig Topper; NOCMOV-NEXT: srai a2, a2, 63 433faa326deSCraig Topper; NOCMOV-NEXT: and a1, a1, a2 434faa326deSCraig Topper; NOCMOV-NEXT: or a0, a0, a1 435faa326deSCraig Topper; NOCMOV-NEXT: ret 436faa326deSCraig Topper; 437faa326deSCraig Topper; CMOV-LABEL: select_or_1b: 438faa326deSCraig Topper; CMOV: # %bb.0: # %entry 439faa326deSCraig Topper; CMOV-NEXT: andi a2, a2, 1 440faa326deSCraig Topper; CMOV-NEXT: or a1, a1, a0 441faa326deSCraig Topper; CMOV-NEXT: beqz a2, .LBB11_2 442faa326deSCraig Topper; CMOV-NEXT: # %bb.1: # %entry 443faa326deSCraig Topper; CMOV-NEXT: mv a0, a1 444faa326deSCraig Topper; CMOV-NEXT: .LBB11_2: # %entry 445faa326deSCraig Topper; CMOV-NEXT: ret 446faa326deSCraig Topper; 447faa326deSCraig Topper; SFB-ZICOND-LABEL: select_or_1b: 448faa326deSCraig Topper; SFB-ZICOND: # %bb.0: # %entry 449faa326deSCraig Topper; SFB-ZICOND-NEXT: andi a2, a2, 1 450faa326deSCraig Topper; SFB-ZICOND-NEXT: beqz a2, .LBB11_2 451faa326deSCraig Topper; SFB-ZICOND-NEXT: # %bb.1: # %entry 452faa326deSCraig Topper; SFB-ZICOND-NEXT: or a0, a1, a0 453faa326deSCraig Topper; SFB-ZICOND-NEXT: .LBB11_2: # %entry 454faa326deSCraig Topper; SFB-ZICOND-NEXT: ret 455faa326deSCraig Topperentry: 456faa326deSCraig Topper %and = and i32 %cond, 1 457faa326deSCraig Topper %cmp10 = icmp ne i32 %and, 1 458faa326deSCraig Topper %0 = or i32 %B, %A 459faa326deSCraig Topper %1 = select i1 %cmp10, i32 %A, i32 %0 460faa326deSCraig Topper ret i32 %1 461faa326deSCraig Topper} 462