1; RUN: llc -march=hexagon < %s | FileCheck %s 2; Hexagon Programmer's Reference Manual 11.2 CR 3 4; Corner detection acceleration 5declare i32 @llvm.hexagon.C4.fastcorner9(i32, i32) 6define i32 @C4_fastcorner9(i32 %a, i32 %b) { 7 %z = call i32@llvm.hexagon.C4.fastcorner9(i32 %a, i32 %b) 8 ret i32 %z 9} 10; CHECK: p0 = fastcorner9(p0, p1) 11 12declare i32 @llvm.hexagon.C4.fastcorner9.not(i32, i32) 13define i32 @C4_fastcorner9_not(i32 %a, i32 %b) { 14 %z = call i32@llvm.hexagon.C4.fastcorner9.not(i32 %a, i32 %b) 15 ret i32 %z 16} 17; CHECK: p0 = !fastcorner9(p0, p1) 18 19; Logical reductions on predicates 20declare i32 @llvm.hexagon.C2.any8(i32) 21define i32 @C2_any8(i32 %a) { 22 %z = call i32@llvm.hexagon.C2.any8(i32 %a) 23 ret i32 %z 24} 25; CHECK: p0 = any8(p0) 26 27declare i32 @llvm.hexagon.C2.all8(i32) 28define i32 @C2_all8(i32 %a) { 29 %z = call i32@llvm.hexagon.C2.all8(i32 %a) 30 ret i32 %z 31} 32 33; CHECK: p0 = all8(p0) 34 35; Logical operations on predicates 36declare i32 @llvm.hexagon.C2.and(i32, i32) 37define i32 @C2_and(i32 %a, i32 %b) { 38 %z = call i32@llvm.hexagon.C2.and(i32 %a, i32 %b) 39 ret i32 %z 40} 41; CHECK: p0 = and(p0, p1) 42 43declare i32 @llvm.hexagon.C4.and.and(i32, i32, i32) 44define i32 @C4_and_and(i32 %a, i32 %b, i32 %c) { 45 %z = call i32@llvm.hexagon.C4.and.and(i32 %a, i32 %b, i32 %c) 46 ret i32 %z 47} 48; CHECK: p0 = and(p0, and(p1, p2)) 49 50declare i32 @llvm.hexagon.C2.or(i32, i32) 51define i32 @C2_or(i32 %a, i32 %b) { 52 %z = call i32@llvm.hexagon.C2.or(i32 %a, i32 %b) 53 ret i32 %z 54} 55; CHECK: p0 = or(p0, p1) 56 57declare i32 @llvm.hexagon.C4.and.or(i32, i32, i32) 58define i32 @C4_and_or(i32 %a, i32 %b, i32 %c) { 59 %z = call i32@llvm.hexagon.C4.and.or(i32 %a, i32 %b, i32 %c) 60 ret i32 %z 61} 62; CHECK: p0 = and(p0, or(p1, p2)) 63 64declare i32 @llvm.hexagon.C2.xor(i32, i32) 65define i32 @C2_xor(i32 %a, i32 %b) { 66 %z = call i32@llvm.hexagon.C2.xor(i32 %a, i32 %b) 67 ret i32 %z 68} 69; CHECK: p0 = xor(p0, p1) 70 71declare i32 @llvm.hexagon.C4.or.and(i32, i32, i32) 72define i32 @C4_or_and(i32 %a, i32 %b, i32 %c) { 73 %z = call i32@llvm.hexagon.C4.or.and(i32 %a, i32 %b, i32 %c) 74 ret i32 %z 75} 76; CHECK: p0 = or(p0, and(p1, p2)) 77 78declare i32 @llvm.hexagon.C2.andn(i32, i32) 79define i32 @C2_andn(i32 %a, i32 %b) { 80 %z = call i32@llvm.hexagon.C2.andn(i32 %a, i32 %b) 81 ret i32 %z 82} 83; CHECK: p0 = and(p0, !p1) 84 85declare i32 @llvm.hexagon.C4.or.or(i32, i32, i32) 86define i32 @C4_or_or(i32 %a, i32 %b, i32 %c) { 87 %z = call i32@llvm.hexagon.C4.or.or(i32 %a, i32 %b, i32 %c) 88 ret i32 %z 89} 90; CHECK: p0 = or(p0, or(p1, p2)) 91 92declare i32 @llvm.hexagon.C4.and.andn(i32, i32, i32) 93define i32 @C4_and_andn(i32 %a, i32 %b, i32 %c) { 94 %z = call i32@llvm.hexagon.C4.and.andn(i32 %a, i32 %b, i32 %c) 95 ret i32 %z 96} 97; CHECK: p0 = and(p0, and(p1, !p2)) 98 99declare i32 @llvm.hexagon.C4.and.orn(i32, i32, i32) 100define i32 @C4_and_orn(i32 %a, i32 %b, i32 %c) { 101 %z = call i32@llvm.hexagon.C4.and.orn(i32 %a, i32 %b, i32 %c) 102 ret i32 %z 103} 104; CHECK: p0 = and(p0, or(p1, !p2)) 105 106declare i32 @llvm.hexagon.C2.not(i32) 107define i32 @C2_not(i32 %a) { 108 %z = call i32@llvm.hexagon.C2.not(i32 %a) 109 ret i32 %z 110} 111; CHECK: p0 = not(p0) 112 113declare i32 @llvm.hexagon.C4.or.andn(i32, i32, i32) 114define i32 @C4_or_andn(i32 %a, i32 %b, i32 %c) { 115 %z = call i32@llvm.hexagon.C4.or.andn(i32 %a, i32 %b, i32 %c) 116 ret i32 %z 117} 118; CHECK: p0 = or(p0, and(p1, !p2)) 119 120declare i32 @llvm.hexagon.C2.orn(i32, i32) 121define i32 @C2_orn(i32 %a, i32 %b) { 122 %z = call i32@llvm.hexagon.C2.orn(i32 %a, i32 %b) 123 ret i32 %z 124} 125; CHECK: p0 = or(p0, !p1) 126 127declare i32 @llvm.hexagon.C4.or.orn(i32, i32, i32) 128define i32 @C4_or_orn(i32 %a, i32 %b, i32 %c) { 129 %z = call i32@llvm.hexagon.C4.or.orn(i32 %a, i32 %b, i32 %c) 130 ret i32 %z 131} 132; CHECK: p0 = or(p0, or(p1, !p2)) 133