brintos

brintos / llvm-project-archived public Read only

0
0
Text · 5.5 KiB · 936ce1e Raw
138 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -mtriple=x86_64-apple-darwin -mcpu=corei7 --show-mc-encoding | FileCheck %s --check-prefix=CHECK3; RUN: llc < %s -mtriple=x86_64-apple-darwin -mcpu=broadwell --show-mc-encoding | FileCheck %s --check-prefix=CHECK4 5define i8 @test_addcarry_32_load(i8 %c, ptr %aptr, i32 %b, ptr %ptr) {6; CHECK-LABEL: test_addcarry_32_load:7; CHECK:       ## %bb.0:8; CHECK-NEXT:    addb $-1, %dil ## encoding: [0x40,0x80,0xc7,0xff]9; CHECK-NEXT:    adcl (%rsi), %edx ## encoding: [0x13,0x16]10; CHECK-NEXT:    setb %al ## encoding: [0x0f,0x92,0xc0]11; CHECK-NEXT:    movl %edx, (%rcx) ## encoding: [0x89,0x11]12; CHECK-NEXT:    retq ## encoding: [0xc3]13  %a = load i32, ptr %aptr14  %ret = call { i8, i32 } @llvm.x86.addcarry.32(i8 %c, i32 %a, i32 %b)15  %1 = extractvalue { i8, i32 } %ret, 116  store i32 %1, ptr %ptr, align 117  %2 = extractvalue { i8, i32 } %ret, 018  ret i8 %219}20 21define i8 @test_addcarry_32_load2(i8 %c, i32 %a, ptr %bptr, ptr %ptr) {22; CHECK-LABEL: test_addcarry_32_load2:23; CHECK:       ## %bb.0:24; CHECK-NEXT:    addb $-1, %dil ## encoding: [0x40,0x80,0xc7,0xff]25; CHECK-NEXT:    adcl (%rdx), %esi ## encoding: [0x13,0x32]26; CHECK-NEXT:    setb %al ## encoding: [0x0f,0x92,0xc0]27; CHECK-NEXT:    movl %esi, (%rcx) ## encoding: [0x89,0x31]28; CHECK-NEXT:    retq ## encoding: [0xc3]29  %b = load i32, ptr %bptr30  %ret = call { i8, i32 } @llvm.x86.addcarry.32(i8 %c, i32 %a, i32 %b)31  %1 = extractvalue { i8, i32 } %ret, 132  store i32 %1, ptr %ptr, align 133  %2 = extractvalue { i8, i32 } %ret, 034  ret i8 %235}36 37declare { i8, i32 } @llvm.x86.addcarry.32(i8, i32, i32)38 39define i8 @test_addcarry_32(i8 %c, i32 %a, i32 %b, ptr %ptr) {40; CHECK-LABEL: test_addcarry_32:41; CHECK:       ## %bb.0:42; CHECK-NEXT:    addb $-1, %dil ## encoding: [0x40,0x80,0xc7,0xff]43; CHECK-NEXT:    adcl %edx, %esi ## encoding: [0x11,0xd6]44; CHECK-NEXT:    setb %al ## encoding: [0x0f,0x92,0xc0]45; CHECK-NEXT:    movl %esi, (%rcx) ## encoding: [0x89,0x31]46; CHECK-NEXT:    retq ## encoding: [0xc3]47  %ret = call { i8, i32 } @llvm.x86.addcarry.32(i8 %c, i32 %a, i32 %b)48  %1 = extractvalue { i8, i32 } %ret, 149  store i32 %1, ptr %ptr, align 150  %2 = extractvalue { i8, i32 } %ret, 051  ret i8 %252}53 54declare { i8, i64 } @llvm.x86.addcarry.64(i8, i64, i64)55 56define i8 @test_addcarry_64(i8 %c, i64 %a, i64 %b, ptr %ptr) {57; CHECK-LABEL: test_addcarry_64:58; CHECK:       ## %bb.0:59; CHECK-NEXT:    addb $-1, %dil ## encoding: [0x40,0x80,0xc7,0xff]60; CHECK-NEXT:    adcq %rdx, %rsi ## encoding: [0x48,0x11,0xd6]61; CHECK-NEXT:    setb %al ## encoding: [0x0f,0x92,0xc0]62; CHECK-NEXT:    movq %rsi, (%rcx) ## encoding: [0x48,0x89,0x31]63; CHECK-NEXT:    retq ## encoding: [0xc3]64  %ret = call { i8, i64 } @llvm.x86.addcarry.64(i8 %c, i64 %a, i64 %b)65  %1 = extractvalue { i8, i64 } %ret, 166  store i64 %1, ptr %ptr, align 167  %2 = extractvalue { i8, i64 } %ret, 068  ret i8 %269}70 71declare { i8, i32 } @llvm.x86.subborrow.32(i8, i32, i32)72 73define i8 @test_subborrow_32(i8 %c, i32 %a, i32 %b, ptr %ptr) {74; CHECK-LABEL: test_subborrow_32:75; CHECK:       ## %bb.0:76; CHECK-NEXT:    addb $-1, %dil ## encoding: [0x40,0x80,0xc7,0xff]77; CHECK-NEXT:    sbbl %edx, %esi ## encoding: [0x19,0xd6]78; CHECK-NEXT:    setb %al ## encoding: [0x0f,0x92,0xc0]79; CHECK-NEXT:    movl %esi, (%rcx) ## encoding: [0x89,0x31]80; CHECK-NEXT:    retq ## encoding: [0xc3]81  %ret = call { i8, i32 } @llvm.x86.subborrow.32(i8 %c, i32 %a, i32 %b)82  %1 = extractvalue { i8, i32 } %ret, 183  store i32 %1, ptr %ptr, align 184  %2 = extractvalue { i8, i32 } %ret, 085  ret i8 %286}87 88declare { i8, i64 } @llvm.x86.subborrow.64(i8, i64, i64)89 90define i8 @test_subborrow_64(i8 %c, i64 %a, i64 %b, ptr %ptr) {91; CHECK-LABEL: test_subborrow_64:92; CHECK:       ## %bb.0:93; CHECK-NEXT:    addb $-1, %dil ## encoding: [0x40,0x80,0xc7,0xff]94; CHECK-NEXT:    sbbq %rdx, %rsi ## encoding: [0x48,0x19,0xd6]95; CHECK-NEXT:    setb %al ## encoding: [0x0f,0x92,0xc0]96; CHECK-NEXT:    movq %rsi, (%rcx) ## encoding: [0x48,0x89,0x31]97; CHECK-NEXT:    retq ## encoding: [0xc3]98  %ret = call { i8, i64 } @llvm.x86.subborrow.64(i8 %c, i64 %a, i64 %b)99  %1 = extractvalue { i8, i64 } %ret, 1100  store i64 %1, ptr %ptr, align 1101  %2 = extractvalue { i8, i64 } %ret, 0102  ret i8 %2103}104 105; Try a version with loads. Previously we crashed on this.106define i32 @load_crash(ptr nocapture readonly %a, ptr nocapture readonly %b, ptr %res)  {107; CHECK-LABEL: load_crash:108; CHECK:       ## %bb.0:109; CHECK-NEXT:    movq (%rdi), %rcx ## encoding: [0x48,0x8b,0x0f]110; CHECK-NEXT:    xorl %eax, %eax ## encoding: [0x31,0xc0]111; CHECK-NEXT:    addq (%rsi), %rcx ## encoding: [0x48,0x03,0x0e]112; CHECK-NEXT:    setb %al ## encoding: [0x0f,0x92,0xc0]113; CHECK-NEXT:    movq %rcx, (%rdx) ## encoding: [0x48,0x89,0x0a]114; CHECK-NEXT:    retq ## encoding: [0xc3]115  %1 = load i64, ptr %a, align 8116  %2 = load i64, ptr %b, align 8117  %3 = call { i8, i64 } @llvm.x86.addcarry.64(i8 0, i64 %1, i64 %2)118  %4 = extractvalue { i8, i64 } %3, 1119  store i64 %4, ptr %res, align 1120  %5 = extractvalue { i8, i64 } %3, 0121  %conv = zext i8 %5 to i32122  ret i32 %conv123}124 125; Try a really simple all zero input case, which also used to crash126define void @allzeros() {127; CHECK-LABEL: allzeros:128; CHECK:       ## %bb.0: ## %entry129; CHECK-NEXT:    movq $0, 0 ## encoding: [0x48,0xc7,0x04,0x25,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00]130; CHECK-NEXT:    retq ## encoding: [0xc3]131entry:132  %0 = call { i8, i64 } @llvm.x86.addcarry.64(i8 0, i64 0, i64 0)133  %1 = extractvalue { i8, i64 } %0, 1134  store i64 %1, ptr null, align 1135  %2 = extractvalue { i8, i64 } %0, 0136  ret void137}138