Home | History | Annotate | Download | only in Hexagon
      1 ; RUN: llc -march=hexagon < %s | FileCheck %s
      2 ; RUN: llc -march=hexagon -verify-machineinstrs=true < %s | FileCheck %s
      3 ; Testing bitreverse load intrinsics:
      4 ;   Q6_bitrev_load_update_D(inputLR, pDelay, nConvLength);
      5 ;   Q6_bitrev_load_update_W(inputLR, pDelay, nConvLength);
      6 ;   Q6_bitrev_load_update_H(inputLR, pDelay, nConvLength);
      7 ;   Q6_bitrev_load_update_UH(inputLR, pDelay, nConvLength);
      8 ;   Q6_bitrev_load_update_UB(inputLR, pDelay, nConvLength);
      9 ;   Q6_bitrev_load_update_B(inputLR, pDelay, nConvLength);
     10 ; producing these instructions:
     11 ;   r3:2 = memd(r0++m0:brev)
     12 ;   r1 = memw(r0++m0:brev)
     13 ;   r1 = memh(r0++m0:brev)
     14 ;   r1 = memuh(r0++m0:brev)
     15 ;   r1 = memub(r0++m0:brev)
     16 ;   r1 = memb(r0++m0:brev)
     17 
     18 target datalayout = "e-m:e-p:32:32:32-a:0-n16:32-i64:64:64-i32:32:32-i16:16:16-i1:8:8-f32:32:32-f64:64:64-v32:32:32-v64:64:64-v512:512:512-v1024:1024:1024-v2048:2048:2048"
     19 target triple = "hexagon-unknown--elf"
     20 
     21 ; CHECK: @call_brev_ldd
     22 define i64* @call_brev_ldd(i64* %ptr, i64 %dst, i32 %mod) local_unnamed_addr #0 {
     23 entry:
     24   %0 = bitcast i64* %ptr to i8*
     25 ; CHECK: = memd(r{{[0-9]*}}++m{{[0-1]}}:brev)
     26   %1 = tail call { i64, i8* } @llvm.hexagon.L2.loadrd.pbr(i8* %0, i32 %mod)
     27   %2 = extractvalue { i64, i8* } %1, 1
     28   %3 = bitcast i8* %2 to i64*
     29   ret i64* %3
     30 }
     31 
     32 ; CHECK: @call_brev_ldw
     33 define i32* @call_brev_ldw(i32* %ptr, i32 %dst, i32 %mod) local_unnamed_addr #0 {
     34 entry:
     35   %0 = bitcast i32* %ptr to i8*
     36 ; CHECK: = memw(r{{[0-9]*}}++m{{[0-1]}}:brev)
     37   %1 = tail call { i32, i8* } @llvm.hexagon.L2.loadri.pbr(i8* %0, i32 %mod)
     38   %2 = extractvalue { i32, i8* } %1, 1
     39   %3 = bitcast i8* %2 to i32*
     40   ret i32* %3
     41 }
     42 
     43 ; CHECK: @call_brev_ldh
     44 define i16* @call_brev_ldh(i16* %ptr, i16 signext %dst, i32 %mod) local_unnamed_addr #0 {
     45 entry:
     46   %0 = bitcast i16* %ptr to i8*
     47 ; CHECK: = memh(r{{[0-9]*}}++m{{[0-1]}}:brev)
     48   %1 = tail call { i32, i8* } @llvm.hexagon.L2.loadrh.pbr(i8* %0, i32 %mod)
     49   %2 = extractvalue { i32, i8* } %1, 1
     50   %3 = bitcast i8* %2 to i16*
     51   ret i16* %3
     52 }
     53 
     54 ; CHECK: @call_brev_lduh
     55 define i16* @call_brev_lduh(i16* %ptr, i16 zeroext %dst, i32 %mod) local_unnamed_addr #0 {
     56 entry:
     57   %0 = bitcast i16* %ptr to i8*
     58 ; CHECK: = memuh(r{{[0-9]*}}++m{{[0-1]}}:brev)
     59   %1 = tail call { i32, i8* } @llvm.hexagon.L2.loadruh.pbr(i8* %0, i32 %mod)
     60   %2 = extractvalue { i32, i8* } %1, 1
     61   %3 = bitcast i8* %2 to i16*
     62   ret i16* %3
     63 }
     64 
     65 ; CHECK: @call_brev_ldb
     66 define i8* @call_brev_ldb(i8* %ptr, i8 signext %dst, i32 %mod) local_unnamed_addr #0 {
     67 entry:
     68 ; CHECK: = memb(r{{[0-9]*}}++m{{[0-1]}}:brev)
     69   %0 = tail call { i32, i8* } @llvm.hexagon.L2.loadrb.pbr(i8* %ptr, i32 %mod)
     70   %1 = extractvalue { i32, i8* } %0, 1
     71   ret i8* %1
     72 }
     73 
     74 ; Function Attrs: nounwind readonly
     75 ; CHECK: @call_brev_ldub
     76 define i8* @call_brev_ldub(i8* %ptr, i8 zeroext %dst, i32 %mod) local_unnamed_addr #0 {
     77 entry:
     78 ; CHECK: = memub(r{{[0-9]*}}++m{{[0-1]}}:brev)
     79   %0 = tail call { i32, i8* } @llvm.hexagon.L2.loadrub.pbr(i8* %ptr, i32 %mod)
     80   %1 = extractvalue { i32, i8* } %0, 1
     81   ret i8* %1
     82 }
     83 
     84 declare { i64, i8* } @llvm.hexagon.L2.loadrd.pbr(i8*, i32) #1
     85 declare { i32, i8* } @llvm.hexagon.L2.loadri.pbr(i8*, i32) #1
     86 declare { i32, i8* } @llvm.hexagon.L2.loadrh.pbr(i8*, i32) #1
     87 declare { i32, i8* } @llvm.hexagon.L2.loadruh.pbr(i8*, i32) #1
     88 declare { i32, i8* } @llvm.hexagon.L2.loadrb.pbr(i8*, i32) #1
     89 declare { i32, i8* } @llvm.hexagon.L2.loadrub.pbr(i8*, i32) #1
     90 
     91 attributes #0 = { nounwind readonly "target-cpu"="hexagonv60" }
     92 attributes #1 = { nounwind readonly }
     93