Home | History | Annotate | Download | only in Hexagon
      1 ; RUN: llc -march=hexagon < %s | FileCheck %s
      2 
      3 ; CHECK-LABEL: test1
      4 ; CHECK: m[[REG1:([0-1])]] = r0
      5 ; CHECK: cs[[REG1]] = r1
      6 ; CHECK: = memub(r1++#4:circ(m[[REG1]])
      7 define zeroext i8 @test1(i32 %mod, i8* %start) local_unnamed_addr #0 {
      8 entry:
      9   %0 = tail call { i32, i8* } @llvm.hexagon.L2.loadrub.pci(i8* %start, i32 4, i32 %mod, i8* %start)
     10   %1 = extractvalue { i32, i8* } %0, 0
     11   %conv = trunc i32 %1 to i8
     12   ret i8 %conv
     13 }
     14 
     15 declare { i32, i8* } @llvm.hexagon.L2.loadrub.pci(i8*, i32, i32, i8* nocapture) #1
     16 
     17 ; CHECK-LABEL: test2
     18 ; CHECK: m[[REG2:([0-1])]] = r0
     19 ; CHECK: cs[[REG2]] = r1
     20 ; CHECK: = memb(r1++#4:circ(m[[REG2]])
     21 define zeroext i8 @test2(i32 %mod, i8* %start) local_unnamed_addr #0 {
     22 entry:
     23   %0 = tail call { i32, i8* } @llvm.hexagon.L2.loadrb.pci(i8* %start, i32 4, i32 %mod, i8* %start)
     24   %1 = extractvalue { i32, i8* } %0, 0
     25   %conv = trunc i32 %1 to i8
     26   ret i8 %conv
     27 }
     28 
     29 declare { i32, i8* } @llvm.hexagon.L2.loadrb.pci(i8*, i32, i32, i8* nocapture) #1
     30 
     31 ; CHECK-LABEL: test3
     32 ; CHECK: m[[REG3:([0-1])]] = r0
     33 ; CHECK: cs[[REG3]] = r1
     34 ; CHECK: = memuh(r1++#4:circ(m[[REG3]])
     35 define zeroext i16 @test3(i32 %mod, i8* %start) local_unnamed_addr #0 {
     36 entry:
     37   %0 = tail call { i32, i8* } @llvm.hexagon.L2.loadruh.pci(i8* %start, i32 4, i32 %mod, i8* %start)
     38   %1 = extractvalue { i32, i8* } %0, 0
     39   %conv = trunc i32 %1 to i16
     40   ret i16 %conv
     41 }
     42 
     43 declare { i32, i8* } @llvm.hexagon.L2.loadruh.pci(i8*, i32, i32, i8* nocapture) #1
     44 
     45 ; CHECK-LABEL: test4
     46 ; CHECK: m[[REG4:([0-1])]] = r0
     47 ; CHECK: cs[[REG4]] = r1
     48 ; CHECK: = memh(r1++#4:circ(m[[REG4]])
     49 define signext i16 @test4(i32 %mod, i8* %start) local_unnamed_addr #0 {
     50 entry:
     51   %0 = tail call { i32, i8* } @llvm.hexagon.L2.loadrh.pci(i8* %start, i32 4, i32 %mod, i8* %start)
     52   %1 = extractvalue { i32, i8* } %0, 0
     53   %conv = trunc i32 %1 to i16
     54   ret i16 %conv
     55 }
     56 
     57 declare { i32, i8* } @llvm.hexagon.L2.loadrh.pci(i8*, i32, i32, i8* nocapture) #1
     58 
     59 ; CHECK-LABEL: test5
     60 ; CHECK: m[[REG5:([0-1])]] = r0
     61 ; CHECK: cs[[REG5]] = r1
     62 ; CHECK: = memw(r1++#4:circ(m[[REG5]])
     63 define i32 @test5(i32 %mod, i8* %start) local_unnamed_addr #0 {
     64 entry:
     65   %0 = tail call { i32, i8* } @llvm.hexagon.L2.loadri.pci(i8* %start, i32 4, i32 %mod, i8* %start)
     66   %1 = extractvalue { i32, i8* } %0, 0
     67   ret i32 %1
     68 }
     69 
     70 declare { i32, i8* } @llvm.hexagon.L2.loadri.pci(i8*, i32, i32, i8* nocapture) #1
     71 
     72 ; CHECK-LABEL: test6
     73 ; CHECK: m[[REG6:([0-1])]] = r0
     74 ; CHECK: cs[[REG6]] = r1
     75 ; CHECK: = memd(r1++#8:circ(m[[REG6]])
     76 define i64 @test6(i32 %mod, i8* %start) local_unnamed_addr #0 {
     77 entry:
     78   %0 = tail call { i64, i8* } @llvm.hexagon.L2.loadrd.pci(i8* %start, i32 8, i32 %mod, i8* %start)
     79   %1 = extractvalue { i64, i8* } %0, 0
     80   ret i64 %1
     81 }
     82 
     83 declare { i64, i8* } @llvm.hexagon.L2.loadrd.pci(i8*, i32, i32, i8* nocapture) #1
     84 
     85 ; CHECK-LABEL: test7
     86 ; CHECK: m[[REG7:([0-1])]] = r0
     87 ; CHECK: cs[[REG7]] = r1
     88 ; CHECK: = memub(r1++I:circ(m[[REG7]])
     89 define zeroext i8 @test7(i32 %mod, i8* %start) local_unnamed_addr #0 {
     90 entry:
     91   %0 = tail call { i32, i8* } @llvm.hexagon.L2.loadrub.pcr(i8* %start, i32 %mod, i8* %start)
     92   %1 = extractvalue { i32, i8* } %0, 0
     93   %conv = trunc i32 %1 to i8
     94   ret i8 %conv
     95 }
     96 
     97 declare { i32, i8* } @llvm.hexagon.L2.loadrub.pcr(i8*, i32, i8* nocapture) #1
     98 
     99 ; CHECK-LABEL: test8
    100 ; CHECK: m[[REG8:([0-1])]] = r0
    101 ; CHECK: cs[[REG8]] = r1
    102 ; CHECK: = memb(r1++I:circ(m[[REG8]])
    103 define zeroext i8 @test8(i32 %mod, i8* %start) local_unnamed_addr #0 {
    104 entry:
    105   %0 = tail call { i32, i8* } @llvm.hexagon.L2.loadrb.pcr(i8* %start, i32 %mod, i8* %start)
    106   %1 = extractvalue { i32, i8* } %0, 0
    107   %conv = trunc i32 %1 to i8
    108   ret i8 %conv
    109 }
    110 
    111 declare { i32, i8* } @llvm.hexagon.L2.loadrb.pcr(i8*, i32, i8* nocapture) #1
    112 
    113 ; CHECK-LABEL: test9
    114 ; CHECK: m[[REG9:([0-1])]] = r0
    115 ; CHECK: cs[[REG9]] = r1
    116 ; CHECK: = memuh(r1++I:circ(m[[REG9]])
    117 define zeroext i16 @test9(i32 %mod, i8* %start) local_unnamed_addr #0 {
    118 entry:
    119   %0 = tail call { i32, i8* } @llvm.hexagon.L2.loadruh.pcr(i8* %start, i32 %mod, i8* %start)
    120   %1 = extractvalue { i32, i8* } %0, 0
    121   %conv = trunc i32 %1 to i16
    122   ret i16 %conv
    123 }
    124 
    125 declare { i32, i8* } @llvm.hexagon.L2.loadruh.pcr(i8*, i32, i8* nocapture) #1
    126 
    127 ; CHECK-LABEL: test10
    128 ; CHECK: m[[REG10:([0-1])]] = r0
    129 ; CHECK: cs[[REG10]] = r1
    130 ; CHECK: = memh(r1++I:circ(m[[REG10]])
    131 define signext i16 @test10(i32 %mod, i8* %start) local_unnamed_addr #0 {
    132 entry:
    133   %0 = tail call { i32, i8* } @llvm.hexagon.L2.loadrh.pcr(i8* %start, i32 %mod, i8* %start)
    134   %1 = extractvalue { i32, i8* } %0, 0
    135   %conv = trunc i32 %1 to i16
    136   ret i16 %conv
    137 }
    138 
    139 declare { i32, i8* } @llvm.hexagon.L2.loadrh.pcr(i8*, i32, i8* nocapture) #1
    140 
    141 ; CHECK-LABEL: test11
    142 ; CHECK: m[[REG11:([0-1])]] = r0
    143 ; CHECK: cs[[REG11]] = r1
    144 ; CHECK: = memw(r1++I:circ(m[[REG11]])
    145 define i32 @test11(i32 %mod, i8* %start) local_unnamed_addr #0 {
    146 entry:
    147   %0 = tail call { i32, i8* } @llvm.hexagon.L2.loadri.pcr(i8* %start, i32 %mod, i8* %start)
    148   %1 = extractvalue { i32, i8* } %0, 0
    149   ret i32 %1
    150 }
    151 
    152 declare { i32, i8* } @llvm.hexagon.L2.loadri.pcr(i8*, i32, i8* nocapture) #1
    153 
    154 ; CHECK-LABEL: test12
    155 ; CHECK: m[[REG12:([0-1])]] = r0
    156 ; CHECK: cs[[REG12]] = r1
    157 ; CHECK: = memd(r1++I:circ(m[[REG12]])
    158 define i64 @test12(i32 %mod, i8* %start) local_unnamed_addr #0 {
    159 entry:
    160   %0 = tail call { i64, i8* } @llvm.hexagon.L2.loadrd.pcr(i8* %start, i32 %mod, i8* %start)
    161   %1 = extractvalue { i64, i8* } %0, 0
    162   ret i64 %1
    163 }
    164 
    165 declare { i64, i8* } @llvm.hexagon.L2.loadrd.pcr(i8*, i32, i8* nocapture) #1
    166 
    167 ; CHECK-LABEL: test13
    168 ; CHECK: m[[REG13:([0-1])]] = r0
    169 ; CHECK: cs[[REG13]] = r1
    170 ; CHECK: memb(r1++#4:circ(m[[REG13]])) =
    171 define void @test13(i32 %mod, i8* %start, i8 zeroext %v) local_unnamed_addr #0 {
    172 entry:
    173   %conv = zext i8 %v to i32
    174   %0 = tail call i8* @llvm.hexagon.S2.storerb.pci(i8* %start, i32 4, i32 %mod, i32 %conv, i8* %start)
    175   ret void
    176 }
    177 
    178 declare i8* @llvm.hexagon.S2.storerb.pci(i8*, i32, i32, i32, i8* nocapture) #1
    179 
    180 ; CHECK-LABEL: test14
    181 ; CHECK: m[[REG14:([0-1])]] = r0
    182 ; CHECK: cs[[REG14]] = r1
    183 ; CHECK: memh(r1++#4:circ(m[[REG14]])) =
    184 define void @test14(i32 %mod, i8* %start, i16 signext %v) local_unnamed_addr #0 {
    185 entry:
    186   %conv = sext i16 %v to i32
    187   %0 = tail call i8* @llvm.hexagon.S2.storerh.pci(i8* %start, i32 4, i32 %mod, i32 %conv, i8* %start)
    188   ret void
    189 }
    190 
    191 declare i8* @llvm.hexagon.S2.storerh.pci(i8*, i32, i32, i32, i8* nocapture) #1
    192 
    193 ; CHECK-LABEL: test15
    194 ; CHECK: m[[REG15:([0-1])]] = r0
    195 ; CHECK: cs[[REG15]] = r1
    196 ; CHECK: memh(r1++#4:circ(m[[REG15]])) = r{{[0-9]+}}.h
    197 define void @test15(i32 %mod, i8* %start, i16 signext %v) local_unnamed_addr #0 {
    198 entry:
    199   %conv = sext i16 %v to i32
    200   %0 = tail call i8* @llvm.hexagon.S2.storerf.pci(i8* %start, i32 4, i32 %mod, i32 %conv, i8* %start)
    201   ret void
    202 }
    203 
    204 declare i8* @llvm.hexagon.S2.storerf.pci(i8*, i32, i32, i32, i8* nocapture) #1
    205 
    206 ; CHECK-LABEL: test16
    207 ; CHECK: m[[REG16:([0-1])]] = r0
    208 ; CHECK: cs[[REG16]] = r1
    209 ; CHECK: memw(r1++#4:circ(m[[REG16]])) =
    210 define void @test16(i32 %mod, i8* %start, i32 %v) local_unnamed_addr #0 {
    211 entry:
    212   %0 = tail call i8* @llvm.hexagon.S2.storeri.pci(i8* %start, i32 4, i32 %mod, i32 %v, i8* %start)
    213   ret void
    214 }
    215 
    216 declare i8* @llvm.hexagon.S2.storeri.pci(i8*, i32, i32, i32, i8* nocapture) #1
    217 
    218 ; CHECK-LABEL: test17
    219 ; CHECK: m[[REG17:([0-1])]] = r0
    220 ; CHECK: cs[[REG17]] = r1
    221 ; CHECK: memd(r1++#8:circ(m[[REG17]])) =
    222 define void @test17(i32 %mod, i8* %start, i64 %v) local_unnamed_addr #0 {
    223 entry:
    224   %0 = tail call i8* @llvm.hexagon.S2.storerd.pci(i8* %start, i32 8, i32 %mod, i64 %v, i8* %start)
    225   ret void
    226 }
    227 
    228 declare i8* @llvm.hexagon.S2.storerd.pci(i8*, i32, i32, i64, i8* nocapture) #1
    229 
    230 ; CHECK-LABEL: test18
    231 ; CHECK: m[[REG18:([0-1])]] = r0
    232 ; CHECK: cs[[REG18]] = r1
    233 ; CHECK: memb(r1++I:circ(m[[REG18]])) =
    234 define void @test18(i32 %mod, i8* %start, i8 zeroext %v) local_unnamed_addr #0 {
    235 entry:
    236   %conv = zext i8 %v to i32
    237   %0 = tail call i8* @llvm.hexagon.S2.storerb.pcr(i8* %start, i32 %mod, i32 %conv, i8* %start)
    238   ret void
    239 }
    240 
    241 declare i8* @llvm.hexagon.S2.storerb.pcr(i8*, i32, i32, i8* nocapture) #1
    242 
    243 ; CHECK-LABEL: test19
    244 ; CHECK: m[[REG19:([0-1])]] = r0
    245 ; CHECK: cs[[REG19]] = r1
    246 ; CHECK: memh(r1++I:circ(m[[REG19]])) =
    247 define void @test19(i32 %mod, i8* %start, i16 signext %v) local_unnamed_addr #0 {
    248 entry:
    249   %conv = sext i16 %v to i32
    250   %0 = tail call i8* @llvm.hexagon.S2.storerh.pcr(i8* %start, i32 %mod, i32 %conv, i8* %start)
    251   ret void
    252 }
    253 
    254 declare i8* @llvm.hexagon.S2.storerh.pcr(i8*, i32, i32, i8* nocapture) #1
    255 
    256 ; CHECK-LABEL: test20
    257 ; CHECK: m[[REG20:([0-1])]] = r0
    258 ; CHECK: cs[[REG20]] = r1
    259 ; CHECK: memh(r1++I:circ(m[[REG20]])) = r{{[0-9]+}}.h
    260 define void @test20(i32 %mod, i8* %start, i16 signext %v) local_unnamed_addr #0 {
    261 entry:
    262   %conv = sext i16 %v to i32
    263   %0 = tail call i8* @llvm.hexagon.S2.storerf.pcr(i8* %start, i32 %mod, i32 %conv, i8* %start)
    264   ret void
    265 }
    266 
    267 declare i8* @llvm.hexagon.S2.storerf.pcr(i8*, i32, i32, i8* nocapture) #1
    268 
    269 ; CHECK-LABEL: test21
    270 ; CHECK: m[[REG21:([0-1])]] = r0
    271 ; CHECK: cs[[REG21]] = r1
    272 ; CHECK: memw(r1++I:circ(m[[REG21]])) =
    273 define void @test21(i32 %mod, i8* %start, i32 %v) local_unnamed_addr #0 {
    274 entry:
    275   %0 = tail call i8* @llvm.hexagon.S2.storeri.pcr(i8* %start, i32 %mod, i32 %v, i8* %start)
    276   ret void
    277 }
    278 
    279 declare i8* @llvm.hexagon.S2.storeri.pcr(i8*, i32, i32, i8* nocapture) #1
    280 
    281 ; CHECK-LABEL: test22
    282 ; CHECK: m[[REG22:([0-1])]] = r0
    283 ; CHECK: cs[[REG22]] = r1
    284 ; CHECK: memd(r1++I:circ(m[[REG1]])) =
    285 define void @test22(i32 %mod, i8* %start, i64 %v) local_unnamed_addr #0 {
    286 entry:
    287   %0 = tail call i8* @llvm.hexagon.S2.storerd.pcr(i8* %start, i32 %mod, i64 %v, i8* %start)
    288   ret void
    289 }
    290 
    291 declare i8* @llvm.hexagon.S2.storerd.pcr(i8*, i32, i64, i8* nocapture) #1
    292 
    293 attributes #0 = { nounwind "target-cpu"="hexagonv60" }
    294 attributes #1 = { argmemonly nounwind }
    295