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 8 declare i32 @llvm.hexagon.A2.addi(i32, i32) 9 define 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 15 declare i32 @llvm.hexagon.A2.add(i32, i32) 16 define 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 22 declare i32 @llvm.hexagon.A2.addsat(i32, i32) 23 define 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 30 declare i32 @llvm.hexagon.A2.and(i32, i32) 31 define 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 37 declare i32 @llvm.hexagon.A2.or(i32, i32) 38 define 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 44 declare i32 @llvm.hexagon.A2.xor(i32, i32) 45 define 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 51 declare i32 @llvm.hexagon.A4.andn(i32, i32) 52 define 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 58 declare i32 @llvm.hexagon.A4.orn(i32, i32) 59 define 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 66 declare i32 @llvm.hexagon.A2.sub(i32, i32) 67 define 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 73 declare i32 @llvm.hexagon.A2.subsat(i32, i32) 74 define 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 81 declare i32 @llvm.hexagon.A2.sxtb(i32) 82 define i32 @A2_sxtb(i32 %a) { 83 %z = call i32 @llvm.hexagon.A2.sxtb(i32 %a) 84 ret i32 %z 85 } 86 ; CHECK: = sxtb({{.*}}) 87 88 declare i32 @llvm.hexagon.A2.sxth(i32) 89 define 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 96 declare i32 @llvm.hexagon.A2.tfril(i32, i32) 97 define 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 103 declare i32 @llvm.hexagon.A2.tfrih(i32, i32) 104 define 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 110 declare i32 @llvm.hexagon.A2.tfrsi(i32) 111 define 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 118 declare i32 @llvm.hexagon.A2.tfr(i32) 119 define 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 126 declare i32 @llvm.hexagon.A2.svaddh(i32, i32) 127 define 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 133 declare i32 @llvm.hexagon.A2.svaddhs(i32, i32) 134 define 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 140 declare i32 @llvm.hexagon.A2.svadduhs(i32, i32) 141 define 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 148 declare i32 @llvm.hexagon.A2.svavgh(i32, i32) 149 define 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 155 declare i32 @llvm.hexagon.A2.svavghs(i32, i32) 156 define 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 162 declare i32 @llvm.hexagon.A2.svnavgh(i32, i32) 163 define 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 170 declare i32 @llvm.hexagon.A2.svsubh(i32, i32) 171 define 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 177 declare i32 @llvm.hexagon.A2.svsubhs(i32, i32) 178 define 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 184 declare i32 @llvm.hexagon.A2.svsubuhs(i32, i32) 185 define 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 192 declare i32 @llvm.hexagon.A2.zxth(i32) 193 define i32 @A2_zxth(i32 %a) { 194 %z = call i32 @llvm.hexagon.A2.zxth(i32 %a) 195 ret i32 %z 196 } 197 ; CHECK: = zxth({{.*}}) 198