1*9880d681SAndroid Build Coastguard Worker; RUN: llc -O0 -mcpu=pwr7 <%s | FileCheck %s 2*9880d681SAndroid Build Coastguard Worker 3*9880d681SAndroid Build Coastguard Worker; Test optimizations of build_vector for 6-bit immediates. 4*9880d681SAndroid Build Coastguard Worker 5*9880d681SAndroid Build Coastguard Workertarget datalayout = "E-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-f128:128:128-v128:128:128-n32:64" 6*9880d681SAndroid Build Coastguard Workertarget triple = "powerpc64-unknown-linux-gnu" 7*9880d681SAndroid Build Coastguard Worker 8*9880d681SAndroid Build Coastguard Worker%v4i32 = type <4 x i32> 9*9880d681SAndroid Build Coastguard Worker%v8i16 = type <8 x i16> 10*9880d681SAndroid Build Coastguard Worker%v16i8 = type <16 x i8> 11*9880d681SAndroid Build Coastguard Worker 12*9880d681SAndroid Build Coastguard Workerdefine void @test_v4i32_pos_even(%v4i32* %P, %v4i32* %S) { 13*9880d681SAndroid Build Coastguard Worker %p = load %v4i32, %v4i32* %P 14*9880d681SAndroid Build Coastguard Worker %r = add %v4i32 %p, < i32 18, i32 18, i32 18, i32 18 > 15*9880d681SAndroid Build Coastguard Worker store %v4i32 %r, %v4i32* %S 16*9880d681SAndroid Build Coastguard Worker ret void 17*9880d681SAndroid Build Coastguard Worker} 18*9880d681SAndroid Build Coastguard Worker 19*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_v4i32_pos_even: 20*9880d681SAndroid Build Coastguard Worker; CHECK: vspltisw [[REG1:[0-9]+]], 9 21*9880d681SAndroid Build Coastguard Worker; CHECK: vadduwm {{[0-9]+}}, [[REG1]], [[REG1]] 22*9880d681SAndroid Build Coastguard Worker 23*9880d681SAndroid Build Coastguard Workerdefine void @test_v4i32_neg_even(%v4i32* %P, %v4i32* %S) { 24*9880d681SAndroid Build Coastguard Worker %p = load %v4i32, %v4i32* %P 25*9880d681SAndroid Build Coastguard Worker %r = add %v4i32 %p, < i32 -28, i32 -28, i32 -28, i32 -28 > 26*9880d681SAndroid Build Coastguard Worker store %v4i32 %r, %v4i32* %S 27*9880d681SAndroid Build Coastguard Worker ret void 28*9880d681SAndroid Build Coastguard Worker} 29*9880d681SAndroid Build Coastguard Worker 30*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_v4i32_neg_even: 31*9880d681SAndroid Build Coastguard Worker; CHECK: vspltisw [[REG1:[0-9]+]], -14 32*9880d681SAndroid Build Coastguard Worker; CHECK: vadduwm {{[0-9]+}}, [[REG1]], [[REG1]] 33*9880d681SAndroid Build Coastguard Worker 34*9880d681SAndroid Build Coastguard Workerdefine void @test_v8i16_pos_even(%v8i16* %P, %v8i16* %S) { 35*9880d681SAndroid Build Coastguard Worker %p = load %v8i16, %v8i16* %P 36*9880d681SAndroid Build Coastguard Worker %r = add %v8i16 %p, < i16 30, i16 30, i16 30, i16 30, i16 30, i16 30, i16 30, i16 30 > 37*9880d681SAndroid Build Coastguard Worker store %v8i16 %r, %v8i16* %S 38*9880d681SAndroid Build Coastguard Worker ret void 39*9880d681SAndroid Build Coastguard Worker} 40*9880d681SAndroid Build Coastguard Worker 41*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_v8i16_pos_even: 42*9880d681SAndroid Build Coastguard Worker; CHECK: vspltish [[REG1:[0-9]+]], 15 43*9880d681SAndroid Build Coastguard Worker; CHECK: vadduhm {{[0-9]+}}, [[REG1]], [[REG1]] 44*9880d681SAndroid Build Coastguard Worker 45*9880d681SAndroid Build Coastguard Workerdefine void @test_v8i16_neg_even(%v8i16* %P, %v8i16* %S) { 46*9880d681SAndroid Build Coastguard Worker %p = load %v8i16, %v8i16* %P 47*9880d681SAndroid Build Coastguard Worker %r = add %v8i16 %p, < i16 -32, i16 -32, i16 -32, i16 -32, i16 -32, i16 -32, i16 -32, i16 -32 > 48*9880d681SAndroid Build Coastguard Worker store %v8i16 %r, %v8i16* %S 49*9880d681SAndroid Build Coastguard Worker ret void 50*9880d681SAndroid Build Coastguard Worker} 51*9880d681SAndroid Build Coastguard Worker 52*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_v8i16_neg_even: 53*9880d681SAndroid Build Coastguard Worker; CHECK: vspltish [[REG1:[0-9]+]], -16 54*9880d681SAndroid Build Coastguard Worker; CHECK: vadduhm {{[0-9]+}}, [[REG1]], [[REG1]] 55*9880d681SAndroid Build Coastguard Worker 56*9880d681SAndroid Build Coastguard Workerdefine void @test_v16i8_pos_even(%v16i8* %P, %v16i8* %S) { 57*9880d681SAndroid Build Coastguard Worker %p = load %v16i8, %v16i8* %P 58*9880d681SAndroid Build Coastguard Worker %r = add %v16i8 %p, < i8 16, i8 16, i8 16, i8 16, i8 16, i8 16, i8 16, i8 16, i8 16, i8 16, i8 16, i8 16, i8 16, i8 16, i8 16, i8 16 > 59*9880d681SAndroid Build Coastguard Worker store %v16i8 %r, %v16i8* %S 60*9880d681SAndroid Build Coastguard Worker ret void 61*9880d681SAndroid Build Coastguard Worker} 62*9880d681SAndroid Build Coastguard Worker 63*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_v16i8_pos_even: 64*9880d681SAndroid Build Coastguard Worker; CHECK: vspltisb [[REG1:[0-9]+]], 8 65*9880d681SAndroid Build Coastguard Worker; CHECK: vaddubm {{[0-9]+}}, [[REG1]], [[REG1]] 66*9880d681SAndroid Build Coastguard Worker 67*9880d681SAndroid Build Coastguard Workerdefine void @test_v16i8_neg_even(%v16i8* %P, %v16i8* %S) { 68*9880d681SAndroid Build Coastguard Worker %p = load %v16i8, %v16i8* %P 69*9880d681SAndroid Build Coastguard Worker %r = add %v16i8 %p, < i8 -18, i8 -18, i8 -18, i8 -18, i8 -18, i8 -18, i8 -18, i8 -18, i8 -18, i8 -18, i8 -18, i8 -18, i8 -18, i8 -18, i8 -18, i8 -18 > 70*9880d681SAndroid Build Coastguard Worker store %v16i8 %r, %v16i8* %S 71*9880d681SAndroid Build Coastguard Worker ret void 72*9880d681SAndroid Build Coastguard Worker} 73*9880d681SAndroid Build Coastguard Worker 74*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_v16i8_neg_even: 75*9880d681SAndroid Build Coastguard Worker; CHECK: vspltisb [[REG1:[0-9]+]], -9 76*9880d681SAndroid Build Coastguard Worker; CHECK: vaddubm {{[0-9]+}}, [[REG1]], [[REG1]] 77*9880d681SAndroid Build Coastguard Worker 78*9880d681SAndroid Build Coastguard Workerdefine void @test_v4i32_pos_odd(%v4i32* %P, %v4i32* %S) { 79*9880d681SAndroid Build Coastguard Worker %p = load %v4i32, %v4i32* %P 80*9880d681SAndroid Build Coastguard Worker %r = add %v4i32 %p, < i32 27, i32 27, i32 27, i32 27 > 81*9880d681SAndroid Build Coastguard Worker store %v4i32 %r, %v4i32* %S 82*9880d681SAndroid Build Coastguard Worker ret void 83*9880d681SAndroid Build Coastguard Worker} 84*9880d681SAndroid Build Coastguard Worker 85*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_v4i32_pos_odd: 86*9880d681SAndroid Build Coastguard Worker; CHECK: vspltisw [[REG2:[0-9]+]], -16 87*9880d681SAndroid Build Coastguard Worker; CHECK: vspltisw [[REG1:[0-9]+]], 11 88*9880d681SAndroid Build Coastguard Worker; CHECK: vsubuwm {{[0-9]+}}, [[REG1]], [[REG2]] 89*9880d681SAndroid Build Coastguard Worker 90*9880d681SAndroid Build Coastguard Workerdefine void @test_v4i32_neg_odd(%v4i32* %P, %v4i32* %S) { 91*9880d681SAndroid Build Coastguard Worker %p = load %v4i32, %v4i32* %P 92*9880d681SAndroid Build Coastguard Worker %r = add %v4i32 %p, < i32 -27, i32 -27, i32 -27, i32 -27 > 93*9880d681SAndroid Build Coastguard Worker store %v4i32 %r, %v4i32* %S 94*9880d681SAndroid Build Coastguard Worker ret void 95*9880d681SAndroid Build Coastguard Worker} 96*9880d681SAndroid Build Coastguard Worker 97*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_v4i32_neg_odd: 98*9880d681SAndroid Build Coastguard Worker; CHECK: vspltisw [[REG2:[0-9]+]], -16 99*9880d681SAndroid Build Coastguard Worker; CHECK: vspltisw [[REG1:[0-9]+]], -11 100*9880d681SAndroid Build Coastguard Worker; CHECK: vadduwm {{[0-9]+}}, [[REG1]], [[REG2]] 101*9880d681SAndroid Build Coastguard Worker 102*9880d681SAndroid Build Coastguard Workerdefine void @test_v8i16_pos_odd(%v8i16* %P, %v8i16* %S) { 103*9880d681SAndroid Build Coastguard Worker %p = load %v8i16, %v8i16* %P 104*9880d681SAndroid Build Coastguard Worker %r = add %v8i16 %p, < i16 31, i16 31, i16 31, i16 31, i16 31, i16 31, i16 31, i16 31 > 105*9880d681SAndroid Build Coastguard Worker store %v8i16 %r, %v8i16* %S 106*9880d681SAndroid Build Coastguard Worker ret void 107*9880d681SAndroid Build Coastguard Worker} 108*9880d681SAndroid Build Coastguard Worker 109*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_v8i16_pos_odd: 110*9880d681SAndroid Build Coastguard Worker; CHECK: vspltish [[REG2:[0-9]+]], -16 111*9880d681SAndroid Build Coastguard Worker; CHECK: vspltish [[REG1:[0-9]+]], 15 112*9880d681SAndroid Build Coastguard Worker; CHECK: vsubuhm {{[0-9]+}}, [[REG1]], [[REG2]] 113*9880d681SAndroid Build Coastguard Worker 114*9880d681SAndroid Build Coastguard Workerdefine void @test_v8i16_neg_odd(%v8i16* %P, %v8i16* %S) { 115*9880d681SAndroid Build Coastguard Worker %p = load %v8i16, %v8i16* %P 116*9880d681SAndroid Build Coastguard Worker %r = add %v8i16 %p, < i16 -31, i16 -31, i16 -31, i16 -31, i16 -31, i16 -31, i16 -31, i16 -31 > 117*9880d681SAndroid Build Coastguard Worker store %v8i16 %r, %v8i16* %S 118*9880d681SAndroid Build Coastguard Worker ret void 119*9880d681SAndroid Build Coastguard Worker} 120*9880d681SAndroid Build Coastguard Worker 121*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_v8i16_neg_odd: 122*9880d681SAndroid Build Coastguard Worker; CHECK: vspltish [[REG2:[0-9]+]], -16 123*9880d681SAndroid Build Coastguard Worker; CHECK: vspltish [[REG1:[0-9]+]], -15 124*9880d681SAndroid Build Coastguard Worker; CHECK: vadduhm {{[0-9]+}}, [[REG1]], [[REG2]] 125*9880d681SAndroid Build Coastguard Worker 126*9880d681SAndroid Build Coastguard Workerdefine void @test_v16i8_pos_odd(%v16i8* %P, %v16i8* %S) { 127*9880d681SAndroid Build Coastguard Worker %p = load %v16i8, %v16i8* %P 128*9880d681SAndroid Build Coastguard Worker %r = add %v16i8 %p, < i8 17, i8 17, i8 17, i8 17, i8 17, i8 17, i8 17, i8 17, i8 17, i8 17, i8 17, i8 17, i8 17, i8 17, i8 17, i8 17 > 129*9880d681SAndroid Build Coastguard Worker store %v16i8 %r, %v16i8* %S 130*9880d681SAndroid Build Coastguard Worker ret void 131*9880d681SAndroid Build Coastguard Worker} 132*9880d681SAndroid Build Coastguard Worker 133*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_v16i8_pos_odd: 134*9880d681SAndroid Build Coastguard Worker; CHECK: vspltisb [[REG2:[0-9]+]], -16 135*9880d681SAndroid Build Coastguard Worker; CHECK: vspltisb [[REG1:[0-9]+]], 1 136*9880d681SAndroid Build Coastguard Worker; CHECK: vsububm {{[0-9]+}}, [[REG1]], [[REG2]] 137*9880d681SAndroid Build Coastguard Worker 138*9880d681SAndroid Build Coastguard Workerdefine void @test_v16i8_neg_odd(%v16i8* %P, %v16i8* %S) { 139*9880d681SAndroid Build Coastguard Worker %p = load %v16i8, %v16i8* %P 140*9880d681SAndroid Build Coastguard Worker %r = add %v16i8 %p, < i8 -17, i8 -17, i8 -17, i8 -17, i8 -17, i8 -17, i8 -17, i8 -17, i8 -17, i8 -17, i8 -17, i8 -17, i8 -17, i8 -17, i8 -17, i8 -17 > 141*9880d681SAndroid Build Coastguard Worker store %v16i8 %r, %v16i8* %S 142*9880d681SAndroid Build Coastguard Worker ret void 143*9880d681SAndroid Build Coastguard Worker} 144*9880d681SAndroid Build Coastguard Worker 145*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_v16i8_neg_odd: 146*9880d681SAndroid Build Coastguard Worker; CHECK: vspltisb [[REG2:[0-9]+]], -16 147*9880d681SAndroid Build Coastguard Worker; CHECK: vspltisb [[REG1:[0-9]+]], -1 148*9880d681SAndroid Build Coastguard Worker; CHECK: vaddubm {{[0-9]+}}, [[REG1]], [[REG2]] 149*9880d681SAndroid Build Coastguard Worker 150