| ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py |
| ; RUN: llc -mtriple=powerpc64le-unknown-linux -mcpu=pwr8 -O0 < %s | \ |
| ; RUN: FileCheck %s -check-prefix=P8 |
| ; RUN: llc -mtriple=powerpc64le-unknown-linux -mcpu=pwr9 -O0 < %s | \ |
| ; RUN: FileCheck %s -check-prefix=P9 |
| |
| define i32 @test_choice1(fp128 %a, fp128 %b) #0 { |
| ; P8-LABEL: test_choice1: |
| ; P8: # %bb.0: # %entry |
| ; P8-NEXT: mflr 0 |
| ; P8-NEXT: std 0, 16(1) |
| ; P8-NEXT: stdu 1, -112(1) |
| ; P8-NEXT: bl __nekf2 |
| ; P8-NEXT: nop |
| ; P8-NEXT: # kill: def $r3 killed $r3 killed $x3 |
| ; P8-NEXT: cmplwi 3, 0 |
| ; P8-NEXT: bne 0, .LBB0_2 |
| ; P8-NEXT: b .LBB0_1 |
| ; P8-NEXT: .LBB0_1: # %if.true |
| ; P8-NEXT: bl foo |
| ; P8-NEXT: nop |
| ; P8-NEXT: stw 3, 108(1) # 4-byte Folded Spill |
| ; P8-NEXT: b .LBB0_3 |
| ; P8-NEXT: .LBB0_2: # %if.false |
| ; P8-NEXT: bl bar |
| ; P8-NEXT: nop |
| ; P8-NEXT: stw 3, 108(1) # 4-byte Folded Spill |
| ; P8-NEXT: .LBB0_3: # %final |
| ; P8-NEXT: lwz 3, 108(1) # 4-byte Folded Reload |
| ; P8-NEXT: clrldi 3, 3, 32 |
| ; P8-NEXT: addi 1, 1, 112 |
| ; P8-NEXT: ld 0, 16(1) |
| ; P8-NEXT: mtlr 0 |
| ; P8-NEXT: blr |
| ; |
| ; P9-LABEL: test_choice1: |
| ; P9: # %bb.0: # %entry |
| ; P9-NEXT: mflr 0 |
| ; P9-NEXT: std 0, 16(1) |
| ; P9-NEXT: stdu 1, -112(1) |
| ; P9-NEXT: xscmpuqp 0, 2, 3 |
| ; P9-NEXT: bne 0, .LBB0_2 |
| ; P9-NEXT: b .LBB0_1 |
| ; P9-NEXT: .LBB0_1: # %if.true |
| ; P9-NEXT: bl foo |
| ; P9-NEXT: nop |
| ; P9-NEXT: stw 3, 108(1) # 4-byte Folded Spill |
| ; P9-NEXT: b .LBB0_3 |
| ; P9-NEXT: .LBB0_2: # %if.false |
| ; P9-NEXT: bl bar |
| ; P9-NEXT: nop |
| ; P9-NEXT: stw 3, 108(1) # 4-byte Folded Spill |
| ; P9-NEXT: .LBB0_3: # %final |
| ; P9-NEXT: lwz 3, 108(1) # 4-byte Folded Reload |
| ; P9-NEXT: clrldi 3, 3, 32 |
| ; P9-NEXT: addi 1, 1, 112 |
| ; P9-NEXT: ld 0, 16(1) |
| ; P9-NEXT: mtlr 0 |
| ; P9-NEXT: blr |
| entry: |
| %cmp = fcmp oeq fp128 %a, %b |
| br i1 %cmp, label %if.true, label %if.false |
| |
| if.true: |
| %res1 = call i32 @foo() |
| br label %final |
| |
| if.false: |
| %res2 = call i32 @bar() |
| br label %final |
| |
| final: |
| %result = phi i32 [%res1, %if.true], [%res2, %if.false] |
| ret i32 %result |
| } |
| |
| define i32 @test_choice2(fp128 %a, fp128 %b) #0 { |
| ; P8-LABEL: test_choice2: |
| ; P8: # %bb.0: # %entry |
| ; P8-NEXT: mflr 0 |
| ; P8-NEXT: std 0, 16(1) |
| ; P8-NEXT: stdu 1, -112(1) |
| ; P8-NEXT: bl __lekf2 |
| ; P8-NEXT: nop |
| ; P8-NEXT: # kill: def $r3 killed $r3 killed $x3 |
| ; P8-NEXT: cmpwi 3, 1 |
| ; P8-NEXT: blt 0, .LBB1_2 |
| ; P8-NEXT: b .LBB1_1 |
| ; P8-NEXT: .LBB1_1: # %if.true |
| ; P8-NEXT: bl foo |
| ; P8-NEXT: nop |
| ; P8-NEXT: stw 3, 108(1) # 4-byte Folded Spill |
| ; P8-NEXT: b .LBB1_3 |
| ; P8-NEXT: .LBB1_2: # %if.false |
| ; P8-NEXT: bl bar |
| ; P8-NEXT: nop |
| ; P8-NEXT: stw 3, 108(1) # 4-byte Folded Spill |
| ; P8-NEXT: .LBB1_3: # %final |
| ; P8-NEXT: lwz 3, 108(1) # 4-byte Folded Reload |
| ; P8-NEXT: clrldi 3, 3, 32 |
| ; P8-NEXT: addi 1, 1, 112 |
| ; P8-NEXT: ld 0, 16(1) |
| ; P8-NEXT: mtlr 0 |
| ; P8-NEXT: blr |
| ; |
| ; P9-LABEL: test_choice2: |
| ; P9: # %bb.0: # %entry |
| ; P9-NEXT: mflr 0 |
| ; P9-NEXT: std 0, 16(1) |
| ; P9-NEXT: stdu 1, -112(1) |
| ; P9-NEXT: xscmpuqp 0, 2, 3 |
| ; P9-NEXT: crmove 20, 3 |
| ; P9-NEXT: crnot 21, 20 |
| ; P9-NEXT: crmove 20, 1 |
| ; P9-NEXT: crnot 20, 20 |
| ; P9-NEXT: crand 20, 20, 21 |
| ; P9-NEXT: crxor 21, 21, 21 |
| ; P9-NEXT: crxor 20, 20, 21 |
| ; P9-NEXT: bc 12, 20, .LBB1_2 |
| ; P9-NEXT: b .LBB1_1 |
| ; P9-NEXT: .LBB1_1: # %if.true |
| ; P9-NEXT: bl foo |
| ; P9-NEXT: nop |
| ; P9-NEXT: stw 3, 108(1) # 4-byte Folded Spill |
| ; P9-NEXT: b .LBB1_3 |
| ; P9-NEXT: .LBB1_2: # %if.false |
| ; P9-NEXT: bl bar |
| ; P9-NEXT: nop |
| ; P9-NEXT: stw 3, 108(1) # 4-byte Folded Spill |
| ; P9-NEXT: .LBB1_3: # %final |
| ; P9-NEXT: lwz 3, 108(1) # 4-byte Folded Reload |
| ; P9-NEXT: clrldi 3, 3, 32 |
| ; P9-NEXT: addi 1, 1, 112 |
| ; P9-NEXT: ld 0, 16(1) |
| ; P9-NEXT: mtlr 0 |
| ; P9-NEXT: blr |
| entry: |
| %cmp = fcmp ugt fp128 %a, %b |
| br i1 %cmp, label %if.true, label %if.false |
| |
| if.true: |
| %res1 = call i32 @foo() |
| br label %final |
| |
| if.false: |
| %res2 = call i32 @bar() |
| br label %final |
| |
| final: |
| %result = phi i32 [%res1, %if.true], [%res2, %if.false] |
| ret i32 %result |
| } |
| |
| define i32 @test_choice3(fp128 %a, fp128 %b) #0 { |
| ; P8-LABEL: test_choice3: |
| ; P8: # %bb.0: # %entry |
| ; P8-NEXT: mflr 0 |
| ; P8-NEXT: std 0, 16(1) |
| ; P8-NEXT: stdu 1, -112(1) |
| ; P8-NEXT: bl __ltkf2 |
| ; P8-NEXT: nop |
| ; P8-NEXT: # kill: def $r3 killed $r3 killed $x3 |
| ; P8-NEXT: cmpwi 3, -1 |
| ; P8-NEXT: bgt 0, .LBB2_2 |
| ; P8-NEXT: b .LBB2_1 |
| ; P8-NEXT: .LBB2_1: # %if.true |
| ; P8-NEXT: bl foo |
| ; P8-NEXT: nop |
| ; P8-NEXT: stw 3, 108(1) # 4-byte Folded Spill |
| ; P8-NEXT: b .LBB2_3 |
| ; P8-NEXT: .LBB2_2: # %if.false |
| ; P8-NEXT: bl bar |
| ; P8-NEXT: nop |
| ; P8-NEXT: stw 3, 108(1) # 4-byte Folded Spill |
| ; P8-NEXT: .LBB2_3: # %final |
| ; P8-NEXT: lwz 3, 108(1) # 4-byte Folded Reload |
| ; P8-NEXT: clrldi 3, 3, 32 |
| ; P8-NEXT: addi 1, 1, 112 |
| ; P8-NEXT: ld 0, 16(1) |
| ; P8-NEXT: mtlr 0 |
| ; P8-NEXT: blr |
| ; |
| ; P9-LABEL: test_choice3: |
| ; P9: # %bb.0: # %entry |
| ; P9-NEXT: mflr 0 |
| ; P9-NEXT: std 0, 16(1) |
| ; P9-NEXT: stdu 1, -112(1) |
| ; P9-NEXT: xscmpuqp 0, 2, 3 |
| ; P9-NEXT: bge 0, .LBB2_2 |
| ; P9-NEXT: b .LBB2_1 |
| ; P9-NEXT: .LBB2_1: # %if.true |
| ; P9-NEXT: bl foo |
| ; P9-NEXT: nop |
| ; P9-NEXT: stw 3, 108(1) # 4-byte Folded Spill |
| ; P9-NEXT: b .LBB2_3 |
| ; P9-NEXT: .LBB2_2: # %if.false |
| ; P9-NEXT: bl bar |
| ; P9-NEXT: nop |
| ; P9-NEXT: stw 3, 108(1) # 4-byte Folded Spill |
| ; P9-NEXT: .LBB2_3: # %final |
| ; P9-NEXT: lwz 3, 108(1) # 4-byte Folded Reload |
| ; P9-NEXT: clrldi 3, 3, 32 |
| ; P9-NEXT: addi 1, 1, 112 |
| ; P9-NEXT: ld 0, 16(1) |
| ; P9-NEXT: mtlr 0 |
| ; P9-NEXT: blr |
| entry: |
| %cmp = fcmp olt fp128 %a, %b |
| br i1 %cmp, label %if.true, label %if.false |
| |
| if.true: |
| %res1 = call i32 @foo() |
| br label %final |
| |
| if.false: |
| %res2 = call i32 @bar() |
| br label %final |
| |
| final: |
| %result = phi i32 [%res1, %if.true], [%res2, %if.false] |
| ret i32 %result |
| } |
| |
| define i32 @test_choice4(fp128 %a, fp128 %b) #0 { |
| ; P8-LABEL: test_choice4: |
| ; P8: # %bb.0: # %entry |
| ; P8-NEXT: mflr 0 |
| ; P8-NEXT: std 0, 16(1) |
| ; P8-NEXT: stdu 1, -112(1) |
| ; P8-NEXT: bl __eqkf2 |
| ; P8-NEXT: nop |
| ; P8-NEXT: # kill: def $r3 killed $r3 killed $x3 |
| ; P8-NEXT: cmplwi 3, 0 |
| ; P8-NEXT: beq 0, .LBB3_2 |
| ; P8-NEXT: b .LBB3_1 |
| ; P8-NEXT: .LBB3_1: # %if.true |
| ; P8-NEXT: bl foo |
| ; P8-NEXT: nop |
| ; P8-NEXT: stw 3, 108(1) # 4-byte Folded Spill |
| ; P8-NEXT: b .LBB3_3 |
| ; P8-NEXT: .LBB3_2: # %if.false |
| ; P8-NEXT: bl bar |
| ; P8-NEXT: nop |
| ; P8-NEXT: stw 3, 108(1) # 4-byte Folded Spill |
| ; P8-NEXT: .LBB3_3: # %final |
| ; P8-NEXT: lwz 3, 108(1) # 4-byte Folded Reload |
| ; P8-NEXT: clrldi 3, 3, 32 |
| ; P8-NEXT: addi 1, 1, 112 |
| ; P8-NEXT: ld 0, 16(1) |
| ; P8-NEXT: mtlr 0 |
| ; P8-NEXT: blr |
| ; |
| ; P9-LABEL: test_choice4: |
| ; P9: # %bb.0: # %entry |
| ; P9-NEXT: mflr 0 |
| ; P9-NEXT: std 0, 16(1) |
| ; P9-NEXT: stdu 1, -112(1) |
| ; P9-NEXT: xscmpuqp 0, 2, 3 |
| ; P9-NEXT: beq 0, .LBB3_2 |
| ; P9-NEXT: b .LBB3_1 |
| ; P9-NEXT: .LBB3_1: # %if.true |
| ; P9-NEXT: bl foo |
| ; P9-NEXT: nop |
| ; P9-NEXT: stw 3, 108(1) # 4-byte Folded Spill |
| ; P9-NEXT: b .LBB3_3 |
| ; P9-NEXT: .LBB3_2: # %if.false |
| ; P9-NEXT: bl bar |
| ; P9-NEXT: nop |
| ; P9-NEXT: stw 3, 108(1) # 4-byte Folded Spill |
| ; P9-NEXT: .LBB3_3: # %final |
| ; P9-NEXT: lwz 3, 108(1) # 4-byte Folded Reload |
| ; P9-NEXT: clrldi 3, 3, 32 |
| ; P9-NEXT: addi 1, 1, 112 |
| ; P9-NEXT: ld 0, 16(1) |
| ; P9-NEXT: mtlr 0 |
| ; P9-NEXT: blr |
| entry: |
| %cmp = fcmp une fp128 %a, %b |
| br i1 %cmp, label %if.true, label %if.false |
| |
| if.true: |
| %res1 = call i32 @foo() |
| br label %final |
| |
| if.false: |
| %res2 = call i32 @bar() |
| br label %final |
| |
| final: |
| %result = phi i32 [%res1, %if.true], [%res2, %if.false] |
| ret i32 %result |
| } |
| |
| attributes #0 = { nounwind } |
| |
| declare i32 @foo() |
| declare i32 @bar() |