forked from OSchip/llvm-project
				
			
		
			
				
	
	
		
			240 lines
		
	
	
		
			5.1 KiB
		
	
	
	
		
			C
		
	
	
	
			
		
		
	
	
			240 lines
		
	
	
		
			5.1 KiB
		
	
	
	
		
			C
		
	
	
	
| // RUN: %clang_cc1 -triple arm64-apple-ios7 -target-feature +neon -ffreestanding -S -o - -emit-llvm %s | FileCheck %s
 | |
| 
 | |
| // Test ARM64 extract intrinsics
 | |
| // can use as back end test by adding a run line with
 | |
| // -check-prefix=CHECK-CODEGEN on the FileCheck
 | |
| 
 | |
| #include <arm_neon.h>
 | |
| 
 | |
| void test_vext_s8()
 | |
| {
 | |
|   // CHECK: test_vext_s8
 | |
|   int8x8_t xS8x8;
 | |
|   xS8x8 = vext_s8(xS8x8, xS8x8, 1);
 | |
|   // CHECK: shufflevector
 | |
|   // CHECK-CODEGEN: test_vext_s8:
 | |
|   // CHECK-CODEGEN: {{ext.8.*#1}}
 | |
| }
 | |
| 
 | |
| void test_vext_u8()
 | |
| {
 | |
|   // CHECK: test_vext_u8
 | |
|   uint8x8_t xU8x8;
 | |
|   xU8x8 = vext_u8(xU8x8, xU8x8, 2);
 | |
|   // CHECK: shufflevector
 | |
|   // CHECK-CODEGEN: test_vext_u8:
 | |
|   // CHECK-CODEGEN: {{ext.8.*#2}}
 | |
| }
 | |
| 
 | |
| void test_vext_p8()
 | |
| {
 | |
|   // CHECK: test_vext_p8
 | |
|   poly8x8_t xP8x8;
 | |
|   xP8x8 = vext_p8(xP8x8, xP8x8, 3);
 | |
|   // CHECK: shufflevector
 | |
|   // CHECK-CODEGEN: test_vext_p8:
 | |
|   // CHECK-CODEGEN: {{ext.8.*#3}}
 | |
| }
 | |
| 
 | |
| void test_vext_s16()
 | |
| {
 | |
|   // CHECK: test_vext_s16
 | |
|   int16x4_t xS16x4;
 | |
|   xS16x4 = vext_s16(xS16x4, xS16x4, 1);
 | |
|   // CHECK: shufflevector
 | |
|   // CHECK-CODEGEN: test_vext_s16:
 | |
|   // CHECK-CODEGEN: {{ext.8.*#2}}
 | |
| }
 | |
| 
 | |
| void test_vext_u16()
 | |
| {
 | |
|   // CHECK: test_vext_u16
 | |
|   uint16x4_t xU16x4;
 | |
|   xU16x4 = vext_u16(xU16x4, xU16x4, 2);
 | |
|   // CHECK: shufflevector
 | |
|   // CHECK-CODEGEN: test_vext_u16:
 | |
|   // CHECK-CODEGEN: {{ext.8.*#4}}
 | |
| }
 | |
| 
 | |
| void test_vext_p16()
 | |
| {
 | |
|   // CHECK: test_vext_p16
 | |
|   poly16x4_t xP16x4;
 | |
|   xP16x4 = vext_p16(xP16x4, xP16x4, 3);
 | |
|   // CHECK: shufflevector
 | |
|   // CHECK-CODEGEN: test_vext_p16:
 | |
|   // CHECK-CODEGEN: {{ext.8.*#6}}
 | |
| }
 | |
| 
 | |
| void test_vext_s32()
 | |
| {
 | |
|   // CHECK: test_vext_s32
 | |
|   int32x2_t xS32x2;
 | |
|   xS32x2 = vext_s32(xS32x2, xS32x2, 1);
 | |
|   // CHECK: shufflevector
 | |
|   // CHECK-CODEGEN: test_vext_s32:
 | |
|   // CHECK-CODEGEN: {{ext.8.*#4}}
 | |
| }
 | |
| 
 | |
| void test_vext_u32()
 | |
| {
 | |
|   // CHECK: test_vext_u32
 | |
|   uint32x2_t xU32x2;
 | |
|   xU32x2 = vext_u32(xU32x2, xU32x2, 1);
 | |
|   // CHECK: shufflevector
 | |
|   // CHECK-CODEGEN: test_vext_u32:
 | |
|   // CHECK-CODEGEN: {{ext.8.*#4}}
 | |
| }
 | |
| 
 | |
| void test_vext_f32()
 | |
| {
 | |
|   // CHECK: test_vext_f32
 | |
|   float32x2_t xF32x2;
 | |
|   xF32x2 = vext_f32(xF32x2, xF32x2, 1);
 | |
|   // CHECK: shufflevector
 | |
|   // CHECK-CODEGEN: test_vext_f32:
 | |
|   // CHECK-CODEGEN: {{ext.8.*#4}}
 | |
| }
 | |
| 
 | |
| void test_vext_s64()
 | |
| {
 | |
|   // CHECK: test_vext_s64
 | |
|   int64x1_t xS64x1;
 | |
|   // FIXME don't use 1 as index or check for now, clang has a bug?
 | |
|   xS64x1 = vext_s64(xS64x1, xS64x1, /*1*/0);
 | |
|   // CHECK: shufflevector
 | |
|   // CHECK-CODEGEN: test_vext_s64:
 | |
|   // CHECK_FIXME: {{ext.8.*#0}}
 | |
| }
 | |
| 
 | |
| void test_vext_u64()
 | |
| {
 | |
|   // CHECK: test_vext_u64
 | |
|   uint64x1_t xU64x1;
 | |
|   // FIXME don't use 1 as index or check for now, clang has a bug?
 | |
|   xU64x1 = vext_u64(xU64x1, xU64x1, /*1*/0);
 | |
|   // CHECK: shufflevector
 | |
|   // CHECK-CODEGEN: test_vext_u64:
 | |
|   // CHECK_FIXME: {{ext.8.*#0}}
 | |
| }
 | |
| 
 | |
| void test_vextq_s8()
 | |
| {
 | |
|   // CHECK: test_vextq_s8
 | |
|   int8x16_t xS8x16;
 | |
|   xS8x16 = vextq_s8(xS8x16, xS8x16, 4);
 | |
|   // CHECK: shufflevector
 | |
|   // CHECK-CODEGEN: test_vextq_s8:
 | |
|   // CHECK-CODEGEN: {{ext.16.*#4}}
 | |
| }
 | |
| 
 | |
| void test_vextq_u8()
 | |
| {
 | |
|   // CHECK: test_vextq_u8
 | |
|   uint8x16_t xU8x16;
 | |
|   xU8x16 = vextq_u8(xU8x16, xU8x16, 5);
 | |
|   // CHECK: shufflevector
 | |
|   // CHECK-CODEGEN: test_vextq_u8:
 | |
|   // CHECK-CODEGEN: {{ext.16.*#5}}
 | |
| }
 | |
| 
 | |
| void test_vextq_p8()
 | |
| {
 | |
|   // CHECK: test_vextq_p8
 | |
|   poly8x16_t xP8x16;
 | |
|   xP8x16 = vextq_p8(xP8x16, xP8x16, 6);
 | |
|   // CHECK: shufflevector
 | |
|   // CHECK-CODEGEN: test_vextq_p8:
 | |
|   // CHECK-CODEGEN: {{ext.16.*#6}}
 | |
| }
 | |
| 
 | |
| void test_vextq_s16()
 | |
| {
 | |
|   // CHECK: test_vextq_s16
 | |
|   int16x8_t xS16x8;
 | |
|   xS16x8 = vextq_s16(xS16x8, xS16x8, 7);
 | |
|   // CHECK: shufflevector
 | |
|   // CHECK-CODEGEN: test_vextq_s16:
 | |
|   // CHECK-CODEGEN: {{ext.16.*#14}}
 | |
| }
 | |
| 
 | |
| void test_vextq_u16()
 | |
| {
 | |
|   // CHECK: test_vextq_u16
 | |
|   uint16x8_t xU16x8;
 | |
|   xU16x8 = vextq_u16(xU16x8, xU16x8, 4);
 | |
|   // CHECK: shufflevector
 | |
|   // CHECK-CODEGEN: test_vextq_u16:
 | |
|   // CHECK-CODEGEN: {{ext.16.*#8}}
 | |
| }
 | |
| 
 | |
| void test_vextq_p16()
 | |
| {
 | |
|   // CHECK: test_vextq_p16
 | |
|   poly16x8_t xP16x8;
 | |
|   xP16x8 = vextq_p16(xP16x8, xP16x8, 5);
 | |
|   // CHECK: shufflevector
 | |
|   // CHECK-CODEGEN: test_vextq_p16:
 | |
|   // CHECK-CODEGEN: {{ext.16.*#10}}
 | |
| }
 | |
| 
 | |
| void test_vextq_s32()
 | |
| {
 | |
|   // CHECK: test_vextq_s32
 | |
|   int32x4_t xS32x4;
 | |
|   xS32x4 = vextq_s32(xS32x4, xS32x4, 1);
 | |
|   // CHECK: shufflevector
 | |
|   // CHECK-CODEGEN: test_vextq_s32:
 | |
|   // CHECK-CODEGEN: {{ext.16.*#4}}
 | |
| }
 | |
| 
 | |
| void test_vextq_u32()
 | |
| {
 | |
|   // CHECK: test_vextq_u32
 | |
|   uint32x4_t xU32x4;
 | |
|   xU32x4 = vextq_u32(xU32x4, xU32x4, 2);
 | |
|   // CHECK: shufflevector
 | |
|   // CHECK-CODEGEN: test_vextq_u32:
 | |
|   // CHECK-CODEGEN: {{ext.16.*#8}}
 | |
| }
 | |
| 
 | |
| void test_vextq_f32()
 | |
| {
 | |
|   // CHECK: test_vextq_f32
 | |
|   float32x4_t xF32x4;
 | |
|   xF32x4 = vextq_f32(xF32x4, xF32x4, 3);
 | |
|   // CHECK: shufflevector
 | |
|   // CHECK-CODEGEN: test_vextq_f32:
 | |
|   // CHECK-CODEGEN: {{ext.16.*#12}}
 | |
| }
 | |
| 
 | |
| void test_vextq_s64()
 | |
| {
 | |
|   // CHECK: test_vextq_s64
 | |
|   int64x2_t xS64x2;
 | |
|   xS64x2 = vextq_s64(xS64x2, xS64x2, 1);
 | |
|   // CHECK: shufflevector
 | |
|   // CHECK-CODEGEN: test_vextq_s64:
 | |
|   // CHECK-CODEGEN: {{ext.16.*#8}}
 | |
| }
 | |
| 
 | |
| void test_vextq_u64()
 | |
| {
 | |
|   // CHECK: test_vextq_u64
 | |
|   uint64x2_t xU64x2;
 | |
|   xU64x2 = vextq_u64(xU64x2, xU64x2, 1);
 | |
|   // CHECK: shufflevector
 | |
|   // CHECK-CODEGEN: test_vextq_u64:
 | |
|   // CHECK-CODEGEN: {{ext.16.*#8}}
 | |
| }
 | |
| 
 | |
| void test_vextq_f64()
 | |
| {
 | |
|   // CHECK: test_vextq_f64
 | |
|   float64x2_t xF64x2;
 | |
|   xF64x2 = vextq_f64(xF64x2, xF64x2, 1);
 | |
|   // CHECK: shufflevector
 | |
|   // CHECK-CODEGEN: test_vextq_u64:
 | |
|   // CHECK-CODEGEN: {{ext.16.*#8}}
 | |
| }
 |