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