198 lines
		
	
	
		
			4.9 KiB
		
	
	
	
		
			LLVM
		
	
	
	
			
		
		
	
	
			198 lines
		
	
	
		
			4.9 KiB
		
	
	
	
		
			LLVM
		
	
	
	
; RUN: llc -march=hexagon -O0 < %s | FileCheck %s
 | 
						|
; RUN: llc -march=hexagon -O0 < %s | FileCheck -check-prefix=CHECK-CALL %s
 | 
						|
; Hexagon Programmer's Reference Manual 11.1.1 ALU32/ALU
 | 
						|
 | 
						|
; CHECK-CALL-NOT: call
 | 
						|
 | 
						|
; Add
 | 
						|
declare i32 @llvm.hexagon.A2.addi(i32, i32)
 | 
						|
define i32 @A2_addi(i32 %a) {
 | 
						|
  %z = call i32 @llvm.hexagon.A2.addi(i32 %a, i32 0)
 | 
						|
  ret i32 %z
 | 
						|
}
 | 
						|
; CHECK: = add({{.*}},#0)
 | 
						|
 | 
						|
declare i32 @llvm.hexagon.A2.add(i32, i32)
 | 
						|
define i32 @A2_add(i32 %a, i32 %b) {
 | 
						|
  %z = call i32 @llvm.hexagon.A2.add(i32 %a, i32 %b)
 | 
						|
  ret i32 %z
 | 
						|
}
 | 
						|
; CHECK: = add({{.*}},{{.*}})
 | 
						|
 | 
						|
declare i32 @llvm.hexagon.A2.addsat(i32, i32)
 | 
						|
define i32 @A2_addsat(i32 %a, i32 %b) {
 | 
						|
  %z = call i32 @llvm.hexagon.A2.addsat(i32 %a, i32 %b)
 | 
						|
  ret i32 %z
 | 
						|
}
 | 
						|
; CHECK: = add({{.*}},{{.*}}):sat
 | 
						|
 | 
						|
; Logical operations
 | 
						|
declare i32 @llvm.hexagon.A2.and(i32, i32)
 | 
						|
define i32 @A2_and(i32 %a, i32 %b) {
 | 
						|
  %z = call i32 @llvm.hexagon.A2.and(i32 %a, i32 %b)
 | 
						|
  ret i32 %z
 | 
						|
}
 | 
						|
; CHECK: = and({{.*}},{{.*}})
 | 
						|
 | 
						|
declare i32 @llvm.hexagon.A2.or(i32, i32)
 | 
						|
define i32 @A2_or(i32 %a, i32 %b) {
 | 
						|
  %z = call i32 @llvm.hexagon.A2.or(i32 %a, i32 %b)
 | 
						|
  ret i32 %z
 | 
						|
}
 | 
						|
; CHECK: = or({{.*}},{{.*}})
 | 
						|
 | 
						|
declare i32 @llvm.hexagon.A2.xor(i32, i32)
 | 
						|
define i32 @A2_xor(i32 %a, i32 %b) {
 | 
						|
  %z = call i32 @llvm.hexagon.A2.xor(i32 %a, i32 %b)
 | 
						|
  ret i32 %z
 | 
						|
}
 | 
						|
; CHECK: = xor({{.*}},{{.*}})
 | 
						|
 | 
						|
declare i32 @llvm.hexagon.A4.andn(i32, i32)
 | 
						|
define i32 @A4_andn(i32 %a, i32 %b) {
 | 
						|
  %z = call i32 @llvm.hexagon.A4.andn(i32 %a, i32 %b)
 | 
						|
  ret i32 %z
 | 
						|
}
 | 
						|
; CHECK: = and({{.*}},~{{.*}})
 | 
						|
 | 
						|
declare i32 @llvm.hexagon.A4.orn(i32, i32)
 | 
						|
define i32 @A4_orn(i32 %a, i32 %b) {
 | 
						|
  %z = call i32 @llvm.hexagon.A4.orn(i32 %a, i32 %b)
 | 
						|
  ret i32 %z
 | 
						|
}
 | 
						|
; CHECK: = or({{.*}},~{{.*}})
 | 
						|
 | 
						|
; Subtract
 | 
						|
declare i32 @llvm.hexagon.A2.sub(i32, i32)
 | 
						|
define i32 @A2_sub(i32 %a, i32 %b) {
 | 
						|
  %z = call i32 @llvm.hexagon.A2.sub(i32 %a, i32 %b)
 | 
						|
  ret i32 %z
 | 
						|
}
 | 
						|
; CHECK: = sub({{.*}},{{.*}})
 | 
						|
 | 
						|
declare i32 @llvm.hexagon.A2.subsat(i32, i32)
 | 
						|
define i32 @A2_subsat(i32 %a, i32 %b) {
 | 
						|
  %z = call i32 @llvm.hexagon.A2.subsat(i32 %a, i32 %b)
 | 
						|
  ret i32 %z
 | 
						|
}
 | 
						|
; CHECK: = sub({{.*}},{{.*}}):sat
 | 
						|
 | 
						|
; Sign extend
 | 
						|
declare i32 @llvm.hexagon.A2.sxtb(i32)
 | 
						|
define i32 @A2_sxtb(i32 %a) {
 | 
						|
  %z = call i32 @llvm.hexagon.A2.sxtb(i32 %a)
 | 
						|
  ret i32 %z
 | 
						|
}
 | 
						|
; CHECK: = sxtb({{.*}})
 | 
						|
 | 
						|
declare i32 @llvm.hexagon.A2.sxth(i32)
 | 
						|
define i32 @A2_sxth(i32 %a) {
 | 
						|
  %z = call i32 @llvm.hexagon.A2.sxth(i32 %a)
 | 
						|
  ret i32 %z
 | 
						|
}
 | 
						|
; CHECK: = sxth({{.*}})
 | 
						|
 | 
						|
; Transfer immediate
 | 
						|
declare i32 @llvm.hexagon.A2.tfril(i32, i32)
 | 
						|
define i32 @A2_tfril(i32 %a) {
 | 
						|
  %z = call i32 @llvm.hexagon.A2.tfril(i32 %a, i32 0)
 | 
						|
  ret i32 %z
 | 
						|
}
 | 
						|
; CHECK: = #0
 | 
						|
 | 
						|
declare i32 @llvm.hexagon.A2.tfrih(i32, i32)
 | 
						|
define i32 @A2_tfrih(i32 %a) {
 | 
						|
  %z = call i32 @llvm.hexagon.A2.tfrih(i32 %a, i32 0)
 | 
						|
  ret i32 %z
 | 
						|
}
 | 
						|
; CHECK: = #0
 | 
						|
 | 
						|
declare i32 @llvm.hexagon.A2.tfrsi(i32)
 | 
						|
define i32 @A2_tfrsi() {
 | 
						|
  %z = call i32 @llvm.hexagon.A2.tfrsi(i32 0)
 | 
						|
  ret i32 %z
 | 
						|
}
 | 
						|
; CHECK: = #0
 | 
						|
 | 
						|
; Transfer register
 | 
						|
declare i32 @llvm.hexagon.A2.tfr(i32)
 | 
						|
define i32 @A2_tfr(i32 %a) {
 | 
						|
  %z = call i32 @llvm.hexagon.A2.tfr(i32 %a)
 | 
						|
  ret i32 %z
 | 
						|
}
 | 
						|
; CHECK: =
 | 
						|
 | 
						|
; Vector add halfwords
 | 
						|
declare i32 @llvm.hexagon.A2.svaddh(i32, i32)
 | 
						|
define i32 @A2_svaddh(i32 %a, i32 %b) {
 | 
						|
  %z = call i32 @llvm.hexagon.A2.svaddh(i32 %a, i32 %b)
 | 
						|
  ret i32 %z
 | 
						|
}
 | 
						|
; CHECK: = vaddh({{.*}},{{.*}})
 | 
						|
 | 
						|
declare i32 @llvm.hexagon.A2.svaddhs(i32, i32)
 | 
						|
define i32 @A2_svaddhs(i32 %a, i32 %b) {
 | 
						|
  %z = call i32 @llvm.hexagon.A2.svaddhs(i32 %a, i32 %b)
 | 
						|
  ret i32 %z
 | 
						|
}
 | 
						|
; CHECK: = vaddh({{.*}},{{.*}}):sat
 | 
						|
 | 
						|
declare i32 @llvm.hexagon.A2.svadduhs(i32, i32)
 | 
						|
define i32 @A2_svadduhs(i32 %a, i32 %b) {
 | 
						|
  %z = call i32 @llvm.hexagon.A2.svadduhs(i32 %a, i32 %b)
 | 
						|
  ret i32 %z
 | 
						|
}
 | 
						|
; CHECK: = vadduh({{.*}},{{.*}}):sat
 | 
						|
 | 
						|
; Vector average halfwords
 | 
						|
declare i32 @llvm.hexagon.A2.svavgh(i32, i32)
 | 
						|
define i32 @A2_svavgh(i32 %a, i32 %b) {
 | 
						|
  %z = call i32 @llvm.hexagon.A2.svavgh(i32 %a, i32 %b)
 | 
						|
  ret i32 %z
 | 
						|
}
 | 
						|
; CHECK: = vavgh({{.*}},{{.*}})
 | 
						|
 | 
						|
declare i32 @llvm.hexagon.A2.svavghs(i32, i32)
 | 
						|
define i32 @A2_svavghs(i32 %a, i32 %b) {
 | 
						|
  %z = call i32 @llvm.hexagon.A2.svavghs(i32 %a, i32 %b)
 | 
						|
  ret i32 %z
 | 
						|
}
 | 
						|
; CHECK: = vavgh({{.*}},{{.*}}):rnd
 | 
						|
 | 
						|
declare i32 @llvm.hexagon.A2.svnavgh(i32, i32)
 | 
						|
define i32 @A2_svnavgh(i32 %a, i32 %b) {
 | 
						|
  %z = call i32 @llvm.hexagon.A2.svnavgh(i32 %a, i32 %b)
 | 
						|
  ret i32 %z
 | 
						|
}
 | 
						|
; CHECK: = vnavgh({{.*}},{{.*}})
 | 
						|
 | 
						|
; Vector subtract halfwords
 | 
						|
declare i32 @llvm.hexagon.A2.svsubh(i32, i32)
 | 
						|
define i32 @A2_svsubh(i32 %a, i32 %b) {
 | 
						|
  %z = call i32 @llvm.hexagon.A2.svsubh(i32 %a, i32 %b)
 | 
						|
  ret i32 %z
 | 
						|
}
 | 
						|
; CHECK: = vsubh({{.*}},{{.*}})
 | 
						|
 | 
						|
declare i32 @llvm.hexagon.A2.svsubhs(i32, i32)
 | 
						|
define i32 @A2_svsubhs(i32 %a, i32 %b) {
 | 
						|
  %z = call i32 @llvm.hexagon.A2.svsubhs(i32 %a, i32 %b)
 | 
						|
  ret i32 %z
 | 
						|
}
 | 
						|
; CHECK: = vsubh({{.*}},{{.*}}):sat
 | 
						|
 | 
						|
declare i32 @llvm.hexagon.A2.svsubuhs(i32, i32)
 | 
						|
define i32 @A2_svsubuhs(i32 %a, i32 %b) {
 | 
						|
  %z = call i32 @llvm.hexagon.A2.svsubuhs(i32 %a, i32 %b)
 | 
						|
  ret i32 %z
 | 
						|
}
 | 
						|
; CHECK: = vsubuh({{.*}},{{.*}}):sat
 | 
						|
 | 
						|
; Zero extend
 | 
						|
declare i32 @llvm.hexagon.A2.zxth(i32)
 | 
						|
define i32 @A2_zxth(i32 %a) {
 | 
						|
  %z = call i32 @llvm.hexagon.A2.zxth(i32 %a)
 | 
						|
  ret i32 %z
 | 
						|
}
 | 
						|
; CHECK: = zxth({{.*}})
 |