1*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=powerpc64-unknown-linux-gnu -mcpu=pwr7 -mattr=-vsx | FileCheck %s 2*9880d681SAndroid Build Coastguard Workertarget datalayout = "E-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-a0:0:64-f128:64:128-n32" 3*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=powerpc64-unknown-linux-gnu -mcpu=pwr7 -mattr=+vsx | FileCheck -check-prefix=CHECK-VSX %s 4*9880d681SAndroid Build Coastguard Workertarget datalayout = "E-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-a0:0:64-f128:64:128-n32" 5*9880d681SAndroid Build Coastguard Worker 6*9880d681SAndroid Build Coastguard Workerdefine void @foo1(i16* %p, i16* %r) nounwind { 7*9880d681SAndroid Build Coastguard Workerentry: 8*9880d681SAndroid Build Coastguard Worker %v = load i16, i16* %p, align 1 9*9880d681SAndroid Build Coastguard Worker store i16 %v, i16* %r, align 1 10*9880d681SAndroid Build Coastguard Worker ret void 11*9880d681SAndroid Build Coastguard Worker 12*9880d681SAndroid Build Coastguard Worker; CHECK: @foo1 13*9880d681SAndroid Build Coastguard Worker; CHECK: lhz 14*9880d681SAndroid Build Coastguard Worker; CHECK: sth 15*9880d681SAndroid Build Coastguard Worker 16*9880d681SAndroid Build Coastguard Worker; CHECK-VSX: @foo1 17*9880d681SAndroid Build Coastguard Worker; CHECK-VSX: lhz 18*9880d681SAndroid Build Coastguard Worker; CHECK-VSX: sth 19*9880d681SAndroid Build Coastguard Worker} 20*9880d681SAndroid Build Coastguard Worker 21*9880d681SAndroid Build Coastguard Workerdefine void @foo2(i32* %p, i32* %r) nounwind { 22*9880d681SAndroid Build Coastguard Workerentry: 23*9880d681SAndroid Build Coastguard Worker %v = load i32, i32* %p, align 1 24*9880d681SAndroid Build Coastguard Worker store i32 %v, i32* %r, align 1 25*9880d681SAndroid Build Coastguard Worker ret void 26*9880d681SAndroid Build Coastguard Worker 27*9880d681SAndroid Build Coastguard Worker; CHECK: @foo2 28*9880d681SAndroid Build Coastguard Worker; CHECK: lwz 29*9880d681SAndroid Build Coastguard Worker; CHECK: stw 30*9880d681SAndroid Build Coastguard Worker 31*9880d681SAndroid Build Coastguard Worker; CHECK-VSX: @foo2 32*9880d681SAndroid Build Coastguard Worker; CHECK-VSX: lwz 33*9880d681SAndroid Build Coastguard Worker; CHECK-VSX: stw 34*9880d681SAndroid Build Coastguard Worker} 35*9880d681SAndroid Build Coastguard Worker 36*9880d681SAndroid Build Coastguard Workerdefine void @foo3(i64* %p, i64* %r) nounwind { 37*9880d681SAndroid Build Coastguard Workerentry: 38*9880d681SAndroid Build Coastguard Worker %v = load i64, i64* %p, align 1 39*9880d681SAndroid Build Coastguard Worker store i64 %v, i64* %r, align 1 40*9880d681SAndroid Build Coastguard Worker ret void 41*9880d681SAndroid Build Coastguard Worker 42*9880d681SAndroid Build Coastguard Worker; CHECK: @foo3 43*9880d681SAndroid Build Coastguard Worker; CHECK: ld 44*9880d681SAndroid Build Coastguard Worker; CHECK: std 45*9880d681SAndroid Build Coastguard Worker 46*9880d681SAndroid Build Coastguard Worker; CHECK-VSX: @foo3 47*9880d681SAndroid Build Coastguard Worker; CHECK-VSX: ld 48*9880d681SAndroid Build Coastguard Worker; CHECK-VSX: std 49*9880d681SAndroid Build Coastguard Worker} 50*9880d681SAndroid Build Coastguard Worker 51*9880d681SAndroid Build Coastguard Workerdefine void @foo4(float* %p, float* %r) nounwind { 52*9880d681SAndroid Build Coastguard Workerentry: 53*9880d681SAndroid Build Coastguard Worker %v = load float, float* %p, align 1 54*9880d681SAndroid Build Coastguard Worker store float %v, float* %r, align 1 55*9880d681SAndroid Build Coastguard Worker ret void 56*9880d681SAndroid Build Coastguard Worker 57*9880d681SAndroid Build Coastguard Worker; CHECK: @foo4 58*9880d681SAndroid Build Coastguard Worker; CHECK: lfs 59*9880d681SAndroid Build Coastguard Worker; CHECK: stfs 60*9880d681SAndroid Build Coastguard Worker 61*9880d681SAndroid Build Coastguard Worker; CHECK-VSX: @foo4 62*9880d681SAndroid Build Coastguard Worker; CHECK-VSX: lfs 63*9880d681SAndroid Build Coastguard Worker; CHECK-VSX: stfs 64*9880d681SAndroid Build Coastguard Worker} 65*9880d681SAndroid Build Coastguard Worker 66*9880d681SAndroid Build Coastguard Workerdefine void @foo5(double* %p, double* %r) nounwind { 67*9880d681SAndroid Build Coastguard Workerentry: 68*9880d681SAndroid Build Coastguard Worker %v = load double, double* %p, align 1 69*9880d681SAndroid Build Coastguard Worker store double %v, double* %r, align 1 70*9880d681SAndroid Build Coastguard Worker ret void 71*9880d681SAndroid Build Coastguard Worker 72*9880d681SAndroid Build Coastguard Worker; CHECK: @foo5 73*9880d681SAndroid Build Coastguard Worker; CHECK: lfd 74*9880d681SAndroid Build Coastguard Worker; CHECK: stfd 75*9880d681SAndroid Build Coastguard Worker 76*9880d681SAndroid Build Coastguard Worker; CHECK-VSX: @foo5 77*9880d681SAndroid Build Coastguard Worker; CHECK-VSX: lxsdx 78*9880d681SAndroid Build Coastguard Worker; CHECK-VSX: stxsdx 79*9880d681SAndroid Build Coastguard Worker} 80*9880d681SAndroid Build Coastguard Worker 81*9880d681SAndroid Build Coastguard Workerdefine void @foo6(<4 x float>* %p, <4 x float>* %r) nounwind { 82*9880d681SAndroid Build Coastguard Workerentry: 83*9880d681SAndroid Build Coastguard Worker %v = load <4 x float>, <4 x float>* %p, align 1 84*9880d681SAndroid Build Coastguard Worker store <4 x float> %v, <4 x float>* %r, align 1 85*9880d681SAndroid Build Coastguard Worker ret void 86*9880d681SAndroid Build Coastguard Worker 87*9880d681SAndroid Build Coastguard Worker; These loads and stores are legalized into aligned loads and stores 88*9880d681SAndroid Build Coastguard Worker; using aligned stack slots. 89*9880d681SAndroid Build Coastguard Worker; CHECK: @foo6 90*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: ld 91*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: ld 92*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: stdx 93*9880d681SAndroid Build Coastguard Worker; CHECK: stdx 94*9880d681SAndroid Build Coastguard Worker 95*9880d681SAndroid Build Coastguard Worker; For VSX on P7, unaligned loads and stores are preferable to aligned 96*9880d681SAndroid Build Coastguard Worker; stack slots, but lvsl/vperm is better still. (On P8 lxvw4x is preferable.) 97*9880d681SAndroid Build Coastguard Worker; Using unaligned stxvw4x is preferable on both machines. 98*9880d681SAndroid Build Coastguard Worker; CHECK-VSX: @foo6 99*9880d681SAndroid Build Coastguard Worker; CHECK-VSX-DAG: lvsl 100*9880d681SAndroid Build Coastguard Worker; CHECK-VSX-DAG: lvx 101*9880d681SAndroid Build Coastguard Worker; CHECK-VSX-DAG: lvx 102*9880d681SAndroid Build Coastguard Worker; CHECK-VSX: vperm 103*9880d681SAndroid Build Coastguard Worker; CHECK-VSX: stxvw4x 104*9880d681SAndroid Build Coastguard Worker} 105*9880d681SAndroid Build Coastguard Worker 106