Bruno Cardoso Lopes | 6a32adc | 2011-07-25 23:05:25 +0000 | [diff] [blame] | 1 | ; RUN: llc < %s -mtriple=x86_64-apple-darwin -mcpu=corei7-avx -mattr=+avx | FileCheck %s |
Bruno Cardoso Lopes | 8c05a85 | 2010-08-12 02:06:36 +0000 | [diff] [blame] | 2 | |
| 3 | @x = common global <8 x float> zeroinitializer, align 32 |
| 4 | @y = common global <4 x double> zeroinitializer, align 32 |
Bruno Cardoso Lopes | b33ea56 | 2011-08-09 03:04:23 +0000 | [diff] [blame] | 5 | @z = common global <4 x float> zeroinitializer, align 16 |
Bruno Cardoso Lopes | 8c05a85 | 2010-08-12 02:06:36 +0000 | [diff] [blame] | 6 | |
Bruno Cardoso Lopes | b33ea56 | 2011-08-09 03:04:23 +0000 | [diff] [blame] | 7 | define void @zero128() nounwind ssp { |
| 8 | entry: |
Jakob Stoklund Olesen | 3e5d5c5 | 2011-11-07 19:15:58 +0000 | [diff] [blame] | 9 | ; CHECK: vxorps |
Bruno Cardoso Lopes | b33ea56 | 2011-08-09 03:04:23 +0000 | [diff] [blame] | 10 | ; CHECK: vmovaps |
| 11 | store <4 x float> zeroinitializer, <4 x float>* @z, align 16 |
| 12 | ret void |
| 13 | } |
| 14 | |
| 15 | define void @zero256() nounwind ssp { |
Bruno Cardoso Lopes | 8c05a85 | 2010-08-12 02:06:36 +0000 | [diff] [blame] | 16 | entry: |
| 17 | ; CHECK: vxorps |
| 18 | ; CHECK: vmovaps |
| 19 | ; CHECK: vmovaps |
| 20 | store <8 x float> zeroinitializer, <8 x float>* @x, align 32 |
| 21 | store <4 x double> zeroinitializer, <4 x double>* @y, align 32 |
| 22 | ret void |
| 23 | } |
Bruno Cardoso Lopes | 863bd9d | 2011-07-25 23:05:32 +0000 | [diff] [blame] | 24 | |
| 25 | ; CHECK: vpcmpeqd |
| 26 | ; CHECK: vinsertf128 $1 |
| 27 | define void @ones([0 x float]* nocapture %RET, [0 x float]* nocapture %aFOO) nounwind { |
| 28 | allocas: |
| 29 | %ptr2vec615 = bitcast [0 x float]* %RET to <8 x float>* |
| 30 | store <8 x float> <float 0xFFFFFFFFE0000000, float 0xFFFFFFFFE0000000, float |
| 31 | 0xFFFFFFFFE0000000, float 0xFFFFFFFFE0000000, float 0xFFFFFFFFE0000000, float |
| 32 | 0xFFFFFFFFE0000000, float 0xFFFFFFFFE0000000, float 0xFFFFFFFFE0000000>, <8 x |
| 33 | float>* %ptr2vec615, align 32 |
| 34 | ret void |
| 35 | } |
Bruno Cardoso Lopes | 531f19f | 2011-08-01 19:51:53 +0000 | [diff] [blame] | 36 | |
| 37 | ; CHECK: vpcmpeqd |
| 38 | ; CHECK: vinsertf128 $1 |
| 39 | define void @ones2([0 x i32]* nocapture %RET, [0 x i32]* nocapture %aFOO) nounwind { |
| 40 | allocas: |
| 41 | %ptr2vec615 = bitcast [0 x i32]* %RET to <8 x i32>* |
| 42 | store <8 x i32> <i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1>, <8 x i32>* %ptr2vec615, align 32 |
| 43 | ret void |
| 44 | } |
Bruno Cardoso Lopes | 59353b4 | 2011-08-11 18:59:13 +0000 | [diff] [blame] | 45 | |
| 46 | ;;; Just make sure this doesn't crash |
| 47 | ; CHECK: _ISelCrash |
| 48 | define <4 x i64> @ISelCrash(<4 x i64> %a) nounwind uwtable readnone ssp { |
| 49 | entry: |
| 50 | %shuffle = shufflevector <4 x i64> %a, <4 x i64> undef, <4 x i32> <i32 2, i32 3, i32 4, i32 4> |
| 51 | ret <4 x i64> %shuffle |
| 52 | } |
Bruno Cardoso Lopes | 3b86598 | 2011-08-16 18:21:54 +0000 | [diff] [blame] | 53 | |
| 54 | ;;; |
| 55 | ;;; Check that some 256-bit vectors are xformed into 128 ops |
| 56 | ; CHECK: _A |
| 57 | ; CHECK: vshufpd $1 |
| 58 | ; CHECK-NEXT: vextractf128 $1 |
| 59 | ; CHECK-NEXT: vshufpd $1 |
| 60 | ; CHECK-NEXT: vinsertf128 $1 |
| 61 | define <4 x i64> @A(<4 x i64> %a, <4 x i64> %b) nounwind uwtable readnone ssp { |
| 62 | entry: |
| 63 | %shuffle = shufflevector <4 x i64> %a, <4 x i64> %b, <4 x i32> <i32 1, i32 0, i32 7, i32 6> |
| 64 | ret <4 x i64> %shuffle |
| 65 | } |
| 66 | |
Bruno Cardoso Lopes | 07b7f67 | 2011-08-25 02:58:26 +0000 | [diff] [blame] | 67 | ; CHECK: _B |
| 68 | ; CHECK: vshufpd $1, %ymm |
Bruno Cardoso Lopes | 3b86598 | 2011-08-16 18:21:54 +0000 | [diff] [blame] | 69 | define <4 x i64> @B(<4 x i64> %a, <4 x i64> %b) nounwind uwtable readnone ssp { |
| 70 | entry: |
| 71 | %shuffle = shufflevector <4 x i64> %a, <4 x i64> %b, <4 x i32> <i32 1, i32 undef, i32 undef, i32 6> |
| 72 | ret <4 x i64> %shuffle |
| 73 | } |
| 74 | |
| 75 | ; CHECK: movlhps |
| 76 | ; CHECK-NEXT: vextractf128 $1 |
| 77 | ; CHECK-NEXT: movlhps |
| 78 | ; CHECK-NEXT: vinsertf128 $1 |
| 79 | define <4 x i64> @C(<4 x i64> %a, <4 x i64> %b) nounwind uwtable readnone ssp { |
| 80 | entry: |
| 81 | %shuffle = shufflevector <4 x i64> %a, <4 x i64> %b, <4 x i32> <i32 undef, i32 0, i32 undef, i32 6> |
| 82 | ret <4 x i64> %shuffle |
| 83 | } |
| 84 | |
| 85 | ; CHECK: vpshufd $-96 |
| 86 | ; CHECK: vpshufd $-6 |
| 87 | ; CHECK: vinsertf128 $1 |
| 88 | define <8 x i32> @D(<8 x i32> %a, <8 x i32> %b) nounwind uwtable readnone ssp { |
| 89 | entry: |
| 90 | %shuffle = shufflevector <8 x i32> %a, <8 x i32> %b, <8 x i32> <i32 0, i32 0, i32 2, i32 2, i32 10, i32 10, i32 11, i32 11> |
| 91 | ret <8 x i32> %shuffle |
| 92 | } |
| 93 | |
Bruno Cardoso Lopes | 5fc4810 | 2011-09-12 22:59:23 +0000 | [diff] [blame] | 94 | ;;; Don't crash on movd |
| 95 | ; CHECK: _VMOVZQI2PQI |
| 96 | ; CHECK: vmovd (% |
| 97 | define <8 x i32> @VMOVZQI2PQI([0 x float]* nocapture %aFOO) nounwind { |
| 98 | allocas: |
| 99 | %ptrcast.i33.i = bitcast [0 x float]* %aFOO to i32* |
| 100 | %val.i34.i = load i32* %ptrcast.i33.i, align 4 |
| 101 | %ptroffset.i22.i992 = getelementptr [0 x float]* %aFOO, i64 0, i64 1 |
| 102 | %ptrcast.i23.i = bitcast float* %ptroffset.i22.i992 to i32* |
| 103 | %val.i24.i = load i32* %ptrcast.i23.i, align 4 |
| 104 | %updatedret.i30.i = insertelement <8 x i32> undef, i32 %val.i34.i, i32 1 |
| 105 | ret <8 x i32> %updatedret.i30.i |
| 106 | } |
| 107 | |
Chad Rosier | a860b18 | 2011-12-15 01:02:25 +0000 | [diff] [blame] | 108 | ;;;; Don't crash on fneg |
| 109 | ; rdar://10566486 |
| 110 | ; CHECK: fneg |
| 111 | ; CHECK: vxorps |
| 112 | define <16 x float> @fneg(<16 x float> addrspace(1)* nocapture %out) nounwind { |
| 113 | %1 = fsub <16 x float> <float -0.000000e+00, float -0.000000e+00, float -0.000000e+00, float -0.000000e+00, float -0.000000e+00, float -0.000000e+00, float -0.000000e+00, float -0.000000e+00, float -0.000000e+00, float -0.000000e+00, float -0.000000e+00, float -0.000000e+00, float -0.000000e+00, float -0.000000e+00, float -0.000000e+00, float -0.000000e+00>, <float 1.000000e+00, float 1.000000e+00, float 1.000000e+00, float 1.000000e+00, float 1.000000e+00, float 1.000000e+00, float 1.000000e+00, float 1.000000e+00, float 1.000000e+00, float 1.000000e+00, float 1.000000e+00, float 1.000000e+00, float 1.000000e+00, float 1.000000e+00, float 1.000000e+00, float 1.000000e+00> |
| 114 | ret <16 x float> %1 |
| 115 | } |
Chad Rosier | 0660cfe | 2011-12-15 21:34:44 +0000 | [diff] [blame^] | 116 | |
| 117 | ;;; Don't crash on build vector |
| 118 | ; CHECK: @build_vec_16x16 |
| 119 | ; CHECK: vmovd |
| 120 | define <16 x i16> @build_vec_16x16(i16 %a) nounwind readonly { |
| 121 | %res = insertelement <16 x i16> <i16 undef, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0>, i16 %a, i32 0 |
| 122 | ret <16 x i16> %res |
| 123 | } |