Home | History | Annotate | Download | only in CodeGen
      1 // REQUIRES: arm-registered-target
      2 // RUN: %clang_cc1 -triple armv8-none-linux-gnueabi \
      3 // RUN:   -O3 -S -emit-llvm -o - %s | FileCheck %s
      4 
      5 int crc32b(int a, char b)
      6 {
      7         return __builtin_arm_crc32b(a,b);
      8 // CHECK: [[T0:%[0-9]+]] = zext i8 %b to i32
      9 // CHECK: call i32 @llvm.arm.crc32b(i32 %a, i32 [[T0]])
     10 }
     11 
     12 int crc32cb(int a, char b)
     13 {
     14         return __builtin_arm_crc32cb(a,b);
     15 // CHECK: [[T0:%[0-9]+]] = zext i8 %b to i32
     16 // CHECK: call i32 @llvm.arm.crc32cb(i32 %a, i32 [[T0]])
     17 }
     18 
     19 int crc32h(int a, short b)
     20 {
     21         return __builtin_arm_crc32h(a,b);
     22 // CHECK: [[T0:%[0-9]+]] = zext i16 %b to i32
     23 // CHECK: call i32 @llvm.arm.crc32h(i32 %a, i32 [[T0]])
     24 }
     25 
     26 int crc32ch(int a, short b)
     27 {
     28         return __builtin_arm_crc32ch(a,b);
     29 // CHECK: [[T0:%[0-9]+]] = zext i16 %b to i32
     30 // CHECK: call i32 @llvm.arm.crc32ch(i32 %a, i32 [[T0]])
     31 }
     32 
     33 int crc32w(int a, int b)
     34 {
     35         return __builtin_arm_crc32w(a,b);
     36 // CHECK: call i32 @llvm.arm.crc32w(i32 %a, i32 %b)
     37 }
     38 
     39 int crc32cw(int a, int b)
     40 {
     41         return __builtin_arm_crc32cw(a,b);
     42 // CHECK: call i32 @llvm.arm.crc32cw(i32 %a, i32 %b)
     43 }
     44 
     45 int crc32d(int a, long long b)
     46 {
     47         return __builtin_arm_crc32d(a,b);
     48 // CHECK: [[T0:%[0-9]+]] = trunc i64 %b to i32
     49 // CHECK: [[T1:%[0-9]+]] = lshr i64 %b, 32
     50 // CHECK: [[T2:%[0-9]+]] = trunc i64 [[T1]] to i32
     51 // CHECK: [[T3:%[0-9]+]] = tail call i32 @llvm.arm.crc32w(i32 %a, i32 [[T0]])
     52 // CHECK: call i32 @llvm.arm.crc32w(i32 [[T3]], i32 [[T2]])
     53 }
     54 
     55 int crc32cd(int a, long long b)
     56 {
     57         return __builtin_arm_crc32cd(a,b);
     58 // CHECK: [[T0:%[0-9]+]] = trunc i64 %b to i32
     59 // CHECK: [[T1:%[0-9]+]] = lshr i64 %b, 32
     60 // CHECK: [[T2:%[0-9]+]] = trunc i64 [[T1]] to i32
     61 // CHECK: [[T3:%[0-9]+]] = tail call i32 @llvm.arm.crc32cw(i32 %a, i32 [[T0]])
     62 // CHECK: call i32 @llvm.arm.crc32cw(i32 [[T3]], i32 [[T2]])
     63 }
     64