1; RUN: llc -march=hexagon -O0 < %s | FileCheck %s 2; RUN: llc -march=hexagon -O0 < %s | FileCheck -check-prefix=CHECK-CALL %s 3; Hexagon Programmer's Reference Manual 11.1.1 ALU32/ALU 4 5; CHECK-CALL-NOT: call 6 7; Add 8declare i32 @llvm.hexagon.A2.addi(i32, i32) 9define i32 @A2_addi(i32 %a) { 10 %z = call i32 @llvm.hexagon.A2.addi(i32 %a, i32 0) 11 ret i32 %z 12} 13; CHECK: = add({{.*}}, #0) 14 15declare i32 @llvm.hexagon.A2.add(i32, i32) 16define i32 @A2_add(i32 %a, i32 %b) { 17 %z = call i32 @llvm.hexagon.A2.add(i32 %a, i32 %b) 18 ret i32 %z 19} 20; CHECK: = add({{.*}}, {{.*}}) 21 22declare i32 @llvm.hexagon.A2.addsat(i32, i32) 23define i32 @A2_addsat(i32 %a, i32 %b) { 24 %z = call i32 @llvm.hexagon.A2.addsat(i32 %a, i32 %b) 25 ret i32 %z 26} 27; CHECK: = add({{.*}}, {{.*}}):sat 28 29; Logical operations 30declare i32 @llvm.hexagon.A2.and(i32, i32) 31define i32 @A2_and(i32 %a, i32 %b) { 32 %z = call i32 @llvm.hexagon.A2.and(i32 %a, i32 %b) 33 ret i32 %z 34} 35; CHECK: = and({{.*}}, {{.*}}) 36 37declare i32 @llvm.hexagon.A2.or(i32, i32) 38define i32 @A2_or(i32 %a, i32 %b) { 39 %z = call i32 @llvm.hexagon.A2.or(i32 %a, i32 %b) 40 ret i32 %z 41} 42; CHECK: = or({{.*}}, {{.*}}) 43 44declare i32 @llvm.hexagon.A2.xor(i32, i32) 45define i32 @A2_xor(i32 %a, i32 %b) { 46 %z = call i32 @llvm.hexagon.A2.xor(i32 %a, i32 %b) 47 ret i32 %z 48} 49; CHECK: = xor({{.*}}, {{.*}}) 50 51declare i32 @llvm.hexagon.A4.andn(i32, i32) 52define i32 @A4_andn(i32 %a, i32 %b) { 53 %z = call i32 @llvm.hexagon.A4.andn(i32 %a, i32 %b) 54 ret i32 %z 55} 56; CHECK: = and({{.*}}, ~{{.*}}) 57 58declare i32 @llvm.hexagon.A4.orn(i32, i32) 59define i32 @A4_orn(i32 %a, i32 %b) { 60 %z = call i32 @llvm.hexagon.A4.orn(i32 %a, i32 %b) 61 ret i32 %z 62} 63; CHECK: = or({{.*}}, ~{{.*}}) 64 65; Subtract 66declare i32 @llvm.hexagon.A2.sub(i32, i32) 67define i32 @A2_sub(i32 %a, i32 %b) { 68 %z = call i32 @llvm.hexagon.A2.sub(i32 %a, i32 %b) 69 ret i32 %z 70} 71; CHECK: = sub({{.*}}, {{.*}}) 72 73declare i32 @llvm.hexagon.A2.subsat(i32, i32) 74define i32 @A2_subsat(i32 %a, i32 %b) { 75 %z = call i32 @llvm.hexagon.A2.subsat(i32 %a, i32 %b) 76 ret i32 %z 77} 78; CHECK: = sub({{.*}}, {{.*}}):sat 79 80; Sign extend 81declare i32 @llvm.hexagon.A2.sxtb(i32) 82define i32 @A2_sxtb(i32 %a) { 83 %z = call i32 @llvm.hexagon.A2.sxtb(i32 %a) 84 ret i32 %z 85} 86; CHECK: = sxtb({{.*}}) 87 88declare i32 @llvm.hexagon.A2.sxth(i32) 89define i32 @A2_sxth(i32 %a) { 90 %z = call i32 @llvm.hexagon.A2.sxth(i32 %a) 91 ret i32 %z 92} 93; CHECK: = sxth({{.*}}) 94 95; Transfer immediate 96declare i32 @llvm.hexagon.A2.tfril(i32, i32) 97define i32 @A2_tfril(i32 %a) { 98 %z = call i32 @llvm.hexagon.A2.tfril(i32 %a, i32 0) 99 ret i32 %z 100} 101; CHECK: = #0 102 103declare i32 @llvm.hexagon.A2.tfrih(i32, i32) 104define i32 @A2_tfrih(i32 %a) { 105 %z = call i32 @llvm.hexagon.A2.tfrih(i32 %a, i32 0) 106 ret i32 %z 107} 108; CHECK: = #0 109 110declare i32 @llvm.hexagon.A2.tfrsi(i32) 111define i32 @A2_tfrsi() { 112 %z = call i32 @llvm.hexagon.A2.tfrsi(i32 0) 113 ret i32 %z 114} 115; CHECK: = #0 116 117; Transfer register 118declare i32 @llvm.hexagon.A2.tfr(i32) 119define i32 @A2_tfr(i32 %a) { 120 %z = call i32 @llvm.hexagon.A2.tfr(i32 %a) 121 ret i32 %z 122} 123; CHECK: = 124 125; Vector add halfwords 126declare i32 @llvm.hexagon.A2.svaddh(i32, i32) 127define i32 @A2_svaddh(i32 %a, i32 %b) { 128 %z = call i32 @llvm.hexagon.A2.svaddh(i32 %a, i32 %b) 129 ret i32 %z 130} 131; CHECK: = vaddh({{.*}}, {{.*}}) 132 133declare i32 @llvm.hexagon.A2.svaddhs(i32, i32) 134define i32 @A2_svaddhs(i32 %a, i32 %b) { 135 %z = call i32 @llvm.hexagon.A2.svaddhs(i32 %a, i32 %b) 136 ret i32 %z 137} 138; CHECK: = vaddh({{.*}}, {{.*}}):sat 139 140declare i32 @llvm.hexagon.A2.svadduhs(i32, i32) 141define i32 @A2_svadduhs(i32 %a, i32 %b) { 142 %z = call i32 @llvm.hexagon.A2.svadduhs(i32 %a, i32 %b) 143 ret i32 %z 144} 145; CHECK: = vadduh({{.*}}, {{.*}}):sat 146 147; Vector average halfwords 148declare i32 @llvm.hexagon.A2.svavgh(i32, i32) 149define i32 @A2_svavgh(i32 %a, i32 %b) { 150 %z = call i32 @llvm.hexagon.A2.svavgh(i32 %a, i32 %b) 151 ret i32 %z 152} 153; CHECK: = vavgh({{.*}}, {{.*}}) 154 155declare i32 @llvm.hexagon.A2.svavghs(i32, i32) 156define i32 @A2_svavghs(i32 %a, i32 %b) { 157 %z = call i32 @llvm.hexagon.A2.svavghs(i32 %a, i32 %b) 158 ret i32 %z 159} 160; CHECK: = vavgh({{.*}}, {{.*}}):rnd 161 162declare i32 @llvm.hexagon.A2.svnavgh(i32, i32) 163define i32 @A2_svnavgh(i32 %a, i32 %b) { 164 %z = call i32 @llvm.hexagon.A2.svnavgh(i32 %a, i32 %b) 165 ret i32 %z 166} 167; CHECK: = vnavgh({{.*}}, {{.*}}) 168 169; Vector subtract halfwords 170declare i32 @llvm.hexagon.A2.svsubh(i32, i32) 171define i32 @A2_svsubh(i32 %a, i32 %b) { 172 %z = call i32 @llvm.hexagon.A2.svsubh(i32 %a, i32 %b) 173 ret i32 %z 174} 175; CHECK: = vsubh({{.*}}, {{.*}}) 176 177declare i32 @llvm.hexagon.A2.svsubhs(i32, i32) 178define i32 @A2_svsubhs(i32 %a, i32 %b) { 179 %z = call i32 @llvm.hexagon.A2.svsubhs(i32 %a, i32 %b) 180 ret i32 %z 181} 182; CHECK: = vsubh({{.*}}, {{.*}}):sat 183 184declare i32 @llvm.hexagon.A2.svsubuhs(i32, i32) 185define i32 @A2_svsubuhs(i32 %a, i32 %b) { 186 %z = call i32 @llvm.hexagon.A2.svsubuhs(i32 %a, i32 %b) 187 ret i32 %z 188} 189; CHECK: = vsubuh({{.*}}, {{.*}}):sat 190 191; Zero extend 192declare i32 @llvm.hexagon.A2.zxth(i32) 193define i32 @A2_zxth(i32 %a) { 194 %z = call i32 @llvm.hexagon.A2.zxth(i32 %a) 195 ret i32 %z 196} 197; CHECK: = zxth({{.*}}) 198