You've already forked linux-packaging-mono
							
							
		
			
	
	
		
			96 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			LLVM
		
	
	
	
	
	
		
		
			
		
	
	
			96 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			LLVM
		
	
	
	
	
	
|   | ; Test the Test Data Class instruction, selected manually via the intrinsic.
 | ||
|  | ;
 | ||
|  | ; RUN: llc < %s -mtriple=s390x-linux-gnu | FileCheck %s
 | ||
|  | 
 | ||
|  | declare i32 @llvm.s390.tdc.f32(float, i64) | ||
|  | declare i32 @llvm.s390.tdc.f64(double, i64) | ||
|  | declare i32 @llvm.s390.tdc.f128(fp128, i64) | ||
|  | 
 | ||
|  | ; Check using as i32 - f32
 | ||
|  | define i32 @f1(float %x) { | ||
|  | ; CHECK-LABEL: f1
 | ||
|  | ; CHECK: tceb %f0, 123
 | ||
|  | ; CHECK: ipm %r2
 | ||
|  | ; CHECK: srl %r2, 28
 | ||
|  |   %res = call i32 @llvm.s390.tdc.f32(float %x, i64 123) | ||
|  |   ret i32 %res | ||
|  | } | ||
|  | 
 | ||
|  | ; Check using as i32 - f64
 | ||
|  | define i32 @f2(double %x) { | ||
|  | ; CHECK-LABEL: f2
 | ||
|  | ; CHECK: tcdb %f0, 123
 | ||
|  | ; CHECK: ipm %r2
 | ||
|  | ; CHECK: srl %r2, 28
 | ||
|  |   %res = call i32 @llvm.s390.tdc.f64(double %x, i64 123) | ||
|  |   ret i32 %res | ||
|  | } | ||
|  | 
 | ||
|  | ; Check using as i32 - f128
 | ||
|  | define i32 @f3(fp128 %x) { | ||
|  | ; CHECK-LABEL: f3
 | ||
|  | ; CHECK: ld %f0, 0(%r2)
 | ||
|  | ; CHECK: ld %f2, 8(%r2)
 | ||
|  | ; CHECK: tcxb %f0, 123
 | ||
|  | ; CHECK: ipm %r2
 | ||
|  | ; CHECK: srl %r2, 28
 | ||
|  |   %res = call i32 @llvm.s390.tdc.f128(fp128 %x, i64 123) | ||
|  |   ret i32 %res | ||
|  | } | ||
|  | 
 | ||
|  | declare void @g() | ||
|  | 
 | ||
|  | ; Check branch
 | ||
|  | define void @f4(float %x) { | ||
|  | ; CHECK-LABEL: f4
 | ||
|  | ; CHECK: tceb %f0, 123
 | ||
|  | ; CHECK: jgl g
 | ||
|  | ; CHECK: br %r14
 | ||
|  |   %res = call i32 @llvm.s390.tdc.f32(float %x, i64 123) | ||
|  |   %cond = icmp ne i32 %res, 0 | ||
|  |   br i1 %cond, label %call, label %exit | ||
|  | 
 | ||
|  | call: | ||
|  |   tail call void @g() | ||
|  |   br label %exit | ||
|  | 
 | ||
|  | exit: | ||
|  |   ret void | ||
|  | } | ||
|  | 
 | ||
|  | ; Check branch negated
 | ||
|  | define void @f5(float %x) { | ||
|  | ; CHECK-LABEL: f5
 | ||
|  | ; CHECK: tceb %f0, 123
 | ||
|  | ; CHECK: jge g
 | ||
|  | ; CHECK: br %r14
 | ||
|  |   %res = call i32 @llvm.s390.tdc.f32(float %x, i64 123) | ||
|  |   %cond = icmp eq i32 %res, 0 | ||
|  |   br i1 %cond, label %call, label %exit | ||
|  | 
 | ||
|  | call: | ||
|  |   tail call void @g() | ||
|  |   br label %exit | ||
|  | 
 | ||
|  | exit: | ||
|  |   ret void | ||
|  | } | ||
|  | 
 | ||
|  | ; Check non-const mask
 | ||
|  | define void @f6(float %x, i64 %y) { | ||
|  | ; CHECK-LABEL: f6
 | ||
|  | ; CHECK: tceb %f0, 0(%r2)
 | ||
|  | ; CHECK: jge g
 | ||
|  | ; CHECK: br %r14
 | ||
|  |   %res = call i32 @llvm.s390.tdc.f32(float %x, i64 %y) | ||
|  |   %cond = icmp eq i32 %res, 0 | ||
|  |   br i1 %cond, label %call, label %exit | ||
|  | 
 | ||
|  | call: | ||
|  |   tail call void @g() | ||
|  |   br label %exit | ||
|  | 
 | ||
|  | exit: | ||
|  |   ret void | ||
|  | } |