Compiler projects using llvm
; RUN: llc < %s -mtriple=ve-unknown-unknown | FileCheck %s

@bufi8 = global [3 x i8] zeroinitializer, align 1
@bufi16 = global [3 x i16] zeroinitializer, align 2
@bufi32 = global [3 x i32] zeroinitializer, align 4
@bufi64 = global [3 x i64] zeroinitializer, align 8
@bufi128 = global [3 x i128] zeroinitializer, align 16
@buff32 = global [3 x float] zeroinitializer, align 4
@buff64 = global [3 x double] zeroinitializer, align 8
@buff128 = global [3 x fp128] zeroinitializer, align 16

; Function Attrs: noinline nounwind optnone
define signext i8 @loadi8s() {
; CHECK-LABEL: loadi8s:
; CHECK:       # %bb.0: # %entry
; CHECK-NEXT:    lea %s0, bufi8@lo
; CHECK-NEXT:    and %s0, %s0, (32)0
; CHECK-NEXT:    lea.sl %s0, bufi8@hi(, %s0)
; CHECK-NEXT:    ld1b.sx %s0, 2(, %s0)
; CHECK-NEXT:    b.l.t (, %s10)
entry:
  %0 = load i8, i8* getelementptr inbounds ([3 x i8], [3 x i8]* @bufi8, i64 0, i64 2), align 1
  ret i8 %0
}

; Function Attrs: noinline nounwind optnone
define signext i16 @loadi16s() {
; CHECK-LABEL: loadi16s:
; CHECK:       # %bb.0: # %entry
; CHECK-NEXT:    lea %s0, bufi16@lo
; CHECK-NEXT:    and %s0, %s0, (32)0
; CHECK-NEXT:    lea.sl %s0, bufi16@hi(, %s0)
; CHECK-NEXT:    ld2b.sx %s0, 4(, %s0)
; CHECK-NEXT:    b.l.t (, %s10)
entry:
  %0 = load i16, i16* getelementptr inbounds ([3 x i16], [3 x i16]* @bufi16, i64 0, i64 2), align 2
  ret i16 %0
}

; Function Attrs: noinline nounwind optnone
define signext i32 @loadi32s() {
; CHECK-LABEL: loadi32s:
; CHECK:       # %bb.0: # %entry
; CHECK-NEXT:    lea %s0, bufi32@lo
; CHECK-NEXT:    and %s0, %s0, (32)0
; CHECK-NEXT:    lea.sl %s0, bufi32@hi(, %s0)
; CHECK-NEXT:    ldl.sx %s0, 8(, %s0)
; CHECK-NEXT:    b.l.t (, %s10)
entry:
  %0 = load i32, i32* getelementptr inbounds ([3 x i32], [3 x i32]* @bufi32, i64 0, i64 2), align 4
  ret i32 %0
}

; Function Attrs: noinline nounwind optnone
define i64 @loadi64s() {
; CHECK-LABEL: loadi64s:
; CHECK:       # %bb.0: # %entry
; CHECK-NEXT:    lea %s0, bufi64@lo
; CHECK-NEXT:    and %s0, %s0, (32)0
; CHECK-NEXT:    lea.sl %s0, bufi64@hi(, %s0)
; CHECK-NEXT:    ld %s0, 16(, %s0)
; CHECK-NEXT:    b.l.t (, %s10)
entry:
  %0 = load i64, i64* getelementptr inbounds ([3 x i64], [3 x i64]* @bufi64, i64 0, i64 2), align 8
  ret i64 %0
}

; Function Attrs: noinline nounwind optnone
define i128 @loadi128s() {
; CHECK-LABEL: loadi128s:
; CHECK:       # %bb.0: # %entry
; CHECK-NEXT:    lea %s0, bufi128@lo
; CHECK-NEXT:    and %s0, %s0, (32)0
; CHECK-NEXT:    lea.sl %s1, bufi128@hi(, %s0)
; CHECK-NEXT:    ld %s0, 32(, %s1)
; CHECK-NEXT:    ld %s1, 40(, %s1)
; CHECK-NEXT:    b.l.t (, %s10)
entry:
  %0 = load i128, i128* getelementptr inbounds ([3 x i128], [3 x i128]* @bufi128, i64 0, i64 2), align 16
  ret i128 %0
}

; Function Attrs: noinline nounwind optnone
define zeroext i8 @loadi8z() {
; CHECK-LABEL: loadi8z:
; CHECK:       # %bb.0: # %entry
; CHECK-NEXT:    lea %s0, bufi8@lo
; CHECK-NEXT:    and %s0, %s0, (32)0
; CHECK-NEXT:    lea.sl %s0, bufi8@hi(, %s0)
; CHECK-NEXT:    ld1b.zx %s0, 2(, %s0)
; CHECK-NEXT:    b.l.t (, %s10)
entry:
  %0 = load i8, i8* getelementptr inbounds ([3 x i8], [3 x i8]* @bufi8, i64 0, i64 2), align 1
  ret i8 %0
}

; Function Attrs: noinline nounwind optnone
define zeroext i16 @loadi16z() {
; CHECK-LABEL: loadi16z:
; CHECK:       # %bb.0: # %entry
; CHECK-NEXT:    lea %s0, bufi16@lo
; CHECK-NEXT:    and %s0, %s0, (32)0
; CHECK-NEXT:    lea.sl %s0, bufi16@hi(, %s0)
; CHECK-NEXT:    ld2b.zx %s0, 4(, %s0)
; CHECK-NEXT:    b.l.t (, %s10)
entry:
  %0 = load i16, i16* getelementptr inbounds ([3 x i16], [3 x i16]* @bufi16, i64 0, i64 2), align 2
  ret i16 %0
}

; Function Attrs: noinline nounwind optnone
define zeroext i32 @loadi32z() {
; CHECK-LABEL: loadi32z:
; CHECK:       # %bb.0: # %entry
; CHECK-NEXT:    lea %s0, bufi32@lo
; CHECK-NEXT:    and %s0, %s0, (32)0
; CHECK-NEXT:    lea.sl %s0, bufi32@hi(, %s0)
; CHECK-NEXT:    ldl.zx %s0, 8(, %s0)
; CHECK-NEXT:    b.l.t (, %s10)
entry:
  %0 = load i32, i32* getelementptr inbounds ([3 x i32], [3 x i32]* @bufi32, i64 0, i64 2), align 4
  ret i32 %0
}

; Function Attrs: noinline nounwind optnone
define i64 @loadi64z() {
; CHECK-LABEL: loadi64z:
; CHECK:       # %bb.0: # %entry
; CHECK-NEXT:    lea %s0, bufi64@lo
; CHECK-NEXT:    and %s0, %s0, (32)0
; CHECK-NEXT:    lea.sl %s0, bufi64@hi(, %s0)
; CHECK-NEXT:    ld %s0, 16(, %s0)
; CHECK-NEXT:    b.l.t (, %s10)
entry:
  %0 = load i64, i64* getelementptr inbounds ([3 x i64], [3 x i64]* @bufi64, i64 0, i64 2), align 8
  ret i64 %0
}

; Function Attrs: noinline nounwind optnone
define i128 @loadi128z() {
; CHECK-LABEL: loadi128z:
; CHECK:       # %bb.0: # %entry
; CHECK-NEXT:    lea %s0, bufi128@lo
; CHECK-NEXT:    and %s0, %s0, (32)0
; CHECK-NEXT:    lea.sl %s1, bufi128@hi(, %s0)
; CHECK-NEXT:    ld %s0, 32(, %s1)
; CHECK-NEXT:    ld %s1, 40(, %s1)
; CHECK-NEXT:    b.l.t (, %s10)
entry:
  %0 = load i128, i128* getelementptr inbounds ([3 x i128], [3 x i128]* @bufi128, i64 0, i64 2), align 16
  ret i128 %0
}

; Function Attrs: noinline nounwind optnone
define float @loadf32() {
; CHECK-LABEL: loadf32:
; CHECK:       # %bb.0: # %entry
; CHECK-NEXT:    lea %s0, buff32@lo
; CHECK-NEXT:    and %s0, %s0, (32)0
; CHECK-NEXT:    lea.sl %s0, buff32@hi(, %s0)
; CHECK-NEXT:    ldu %s0, 8(, %s0)
; CHECK-NEXT:    b.l.t (, %s10)
entry:
  %0 = load float, float* getelementptr inbounds ([3 x float], [3 x float]* @buff32, i64 0, i64 2), align 4
  ret float %0
}

; Function Attrs: noinline nounwind optnone
define double @loadf64() {
; CHECK-LABEL: loadf64:
; CHECK:       # %bb.0: # %entry
; CHECK-NEXT:    lea %s0, buff64@lo
; CHECK-NEXT:    and %s0, %s0, (32)0
; CHECK-NEXT:    lea.sl %s0, buff64@hi(, %s0)
; CHECK-NEXT:    ld %s0, 16(, %s0)
; CHECK-NEXT:    b.l.t (, %s10)
entry:
  %0 = load double, double* getelementptr inbounds ([3 x double], [3 x double]* @buff64, i64 0, i64 2), align 8
  ret double %0
}

; Function Attrs: noinline nounwind optnone
define fp128 @loadf128() {
; CHECK-LABEL: loadf128:
; CHECK:       # %bb.0: # %entry
; CHECK-NEXT:    lea %s0, buff128@lo
; CHECK-NEXT:    and %s0, %s0, (32)0
; CHECK-NEXT:    lea.sl %s2, buff128@hi(, %s0)
; CHECK-NEXT:    ld %s0, 40(, %s2)
; CHECK-NEXT:    ld %s1, 32(, %s2)
; CHECK-NEXT:    b.l.t (, %s10)
entry:
  %0 = load fp128, fp128* getelementptr inbounds ([3 x fp128], [3 x fp128]* @buff128, i64 0, i64 2), align 16
  ret fp128 %0
}