; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --remove_checks
; RUN: llc < %s -mtriple=colossus -mattr=+ipu1 | FileCheck %s
; RUN: llc < %s -mtriple=colossus -mattr=+ipu2 | FileCheck %s

define <4 x float> @test_ld_r_v4f32(<4 x float>* %ptr) {
; CHECK-LABEL: test_ld_r_v4f32:
; CHECK:       # %bb.0:
; CHECK-NEXT:    ld64 $a0:1, $m0, $m15, 0
; CHECK-NEXT:    ld64 $a2:3, $m0, $m15, 1
; CHECK-NEXT:    br $m10
  %res = load <4 x float>, <4 x float>* %ptr, align 16
  ret <4 x float> %res
}

define <4 x float> @test_ld_rr_v4f32(<4 x float>* %ptr, i32 %off) {
; CHECK-LABEL: test_ld_rr_v4f32:
; CHECK:       # %bb.0:
; CHECK-NEXT:    shl $m1, $m1, 4
; CHECK-NEXT:    ld64 $a0:1, $m0, $m1, 0
; CHECK-NEXT:    ld64 $a2:3, $m0, $m1, 1
; CHECK-NEXT:    br $m10
  %ptr1 = getelementptr <4 x float>, <4 x float>* %ptr, i32 %off
  %res = load <4 x float>, <4 x float>* %ptr1, align 16
  ret <4 x float> %res
}

define <4 x float> @test_ld_rrr_v4f32(i32 %ptr, i32 %delta, i32 %off) {
; CHECK-LABEL: test_ld_rrr_v4f32:
; CHECK:       # %bb.0:
; CHECK-NEXT:    add $m0, $m0, $m1
; CHECK-NEXT:    shl $m1, $m2, 4
; CHECK-NEXT:    ld64 $a0:1, $m0, $m1, 0
; CHECK-NEXT:    ld64 $a2:3, $m0, $m1, 1
; CHECK-NEXT:    br $m10
  %ptr1 = add i32 %ptr, %delta
  %ptr2 = inttoptr i32 %ptr1 to <4 x float>*
  %ptr3 = getelementptr <4 x float>, <4 x float>* %ptr2, i32 %off
  %res = load <4 x float>, <4 x float>* %ptr3, align 16
  ret <4 x float> %res
}

define <4 x float> @test_ld_ri_v4f32(<4 x float>* %ptr) {
; CHECK-LABEL: test_ld_ri_v4f32:
; CHECK:       # %bb.0:
; CHECK-NEXT:    ld64 $a0:1, $m0, $m15, 4094
; CHECK-NEXT:    ld64 $a2:3, $m0, $m15, 4095
; CHECK-NEXT:    br $m10
  %ptr1 = getelementptr <4 x float>, <4 x float>* %ptr, i32 2047
  %res = load <4 x float>, <4 x float>* %ptr1, align 16
  ret <4 x float> %res
}

define <4 x float> @test_ld_rri_v4f32(i32 %ptr, i32 %delta) {
; CHECK-LABEL: test_ld_rri_v4f32:
; CHECK:       # %bb.0:
; CHECK-NEXT:    ld64 $a0:1, $m0, $m1, 4094
; CHECK-NEXT:    ld64 $a2:3, $m0, $m1, 4095
; CHECK-NEXT:    br $m10
  %ptr1 = add i32 %ptr, %delta
  %ptr2 = inttoptr i32 %ptr1 to <4 x float>*
  %ptr3 = getelementptr <4 x float>, <4 x float>* %ptr2, i32 2047
  %res = load <4 x float>, <4 x float>* %ptr3, align 16
  ret <4 x float> %res
}

define <4 x float> @test_ld_fi_v4f32() {
; CHECK-LABEL: test_ld_fi_v4f32:
; CHECK:       # %bb.0:
; CHECK-NEXT:    add $m11, $m11, -2048
; CHECK-NEXT:    .cfi_def_cfa_offset 2048
; CHECK-NEXT:    ld64 $a0:1, $m11, $m15, 0
; CHECK-NEXT:    ld64 $a2:3, $m11, $m15, 1
; CHECK-NEXT:    add $m11, $m11, 2048
; CHECK-NEXT:    .cfi_def_cfa_offset 0
; CHECK-NEXT:    br $m10
  %ptr = alloca <4 x float>, i32 128
  %res = load <4 x float>, <4 x float>* %ptr, align 16
  ret <4 x float> %res
}

define <4 x float> @test_ld_fii_v4f32() {
; CHECK-LABEL: test_ld_fii_v4f32:
; CHECK:       # %bb.0:
; CHECK-NEXT:    add $m11, $m11, -2048
; CHECK-NEXT:    .cfi_def_cfa_offset 2048
; CHECK-NEXT:    ld64 $a0:1, $m11, $m15, 4094
; CHECK-NEXT:    ld64 $a2:3, $m11, $m15, 4095
; CHECK-NEXT:    add $m11, $m11, 2048
; CHECK-NEXT:    .cfi_def_cfa_offset 0
; CHECK-NEXT:    br $m10
  %ptr1 = alloca <4 x float>, i32 128
  %ptr2 = getelementptr <4 x float>, <4 x float>* %ptr1, i32 2047
  %res = load <4 x float>, <4 x float>* %ptr2, align 16
  ret <4 x float> %res
}

define <4 x float> @test_ld_fir_v4f32(i32 %offset) {
; CHECK-LABEL: test_ld_fir_v4f32:
; CHECK:       # %bb.0:
; CHECK-NEXT:    add $m11, $m11, -2048
; CHECK-NEXT:    .cfi_def_cfa_offset 2048
; CHECK-NEXT:    shl $m0, $m0, 4
; CHECK-NEXT:    add $m1, $m11, 0
; CHECK-NEXT:    ld64 $a0:1, $m1, $m0, 0
; CHECK-NEXT:    ld64 $a2:3, $m1, $m0, 1
; CHECK-NEXT:    add $m11, $m11, 2048
; CHECK-NEXT:    .cfi_def_cfa_offset 0
; CHECK-NEXT:    br $m10
  %ptr1 = alloca <4 x float>, i32 128
  %ptr2 = getelementptr <4 x float>, <4 x float>* %ptr1, i32 %offset
  %res = load <4 x float>, <4 x float>* %ptr2, align 16
  ret <4 x float> %res
}

define void @test_st_r_v4f32(<4 x float>* %ptr, <4 x float> %data) {
; CHECK-LABEL: test_st_r_v4f32:
; CHECK:       # %bb.0:
; CHECK-NEXT:    st64 $a2:3, $m0, $m15, 1
; CHECK-NEXT:    st64 $a0:1, $m0, $m15, 0
; CHECK-NEXT:    br $m10
  store <4 x float> %data, <4 x float>*  %ptr, align 16
  ret void
}

define void @test_st_rr_v4f32(<4 x float>* %ptr, i32 %off, <4 x float> %data) {
; CHECK-LABEL: test_st_rr_v4f32:
; CHECK:       # %bb.0:
; CHECK-NEXT:    shl $m1, $m1, 4
; CHECK-NEXT:    st64 $a2:3, $m0, $m1, 1
; CHECK-NEXT:    st64 $a0:1, $m0, $m1, 0
; CHECK-NEXT:    br $m10
  %ptr1 = getelementptr <4 x float>, <4 x float>* %ptr, i32 %off
  store <4 x float> %data, <4 x float>* %ptr1, align 16
  ret void
}

define void @test_st_rrr_v4f32(i32 %ptr, i32 %delta, i32 %off, <4 x float> %data) {
; CHECK-LABEL: test_st_rrr_v4f32:
; CHECK:       # %bb.0:
; CHECK-NEXT:    add $m0, $m0, $m1
; CHECK-NEXT:    shl $m1, $m2, 4
; CHECK-NEXT:    st64 $a2:3, $m0, $m1, 1
; CHECK-NEXT:    st64 $a0:1, $m0, $m1, 0
; CHECK-NEXT:    br $m10
  %ptr1 = add i32 %ptr, %delta
  %ptr2 = inttoptr i32 %ptr1 to <4 x float>*
  %ptr3 = getelementptr <4 x float>, <4 x float>* %ptr2, i32 %off
  store <4 x float> %data, <4 x float>* %ptr3, align 16
  ret void
}

define void @test_st_ri_v4f32(<4 x float>* %ptr, <4 x float> %data) {
; CHECK-LABEL: test_st_ri_v4f32:
; CHECK:       # %bb.0:
; CHECK-NEXT:    st64 $a2:3, $m0, $m15, 4095
; CHECK-NEXT:    st64 $a0:1, $m0, $m15, 4094
; CHECK-NEXT:    br $m10
  %ptr1 = getelementptr <4 x float>, <4 x float>* %ptr, i32 2047
  store <4 x float> %data, <4 x float>* %ptr1, align 16
  ret void
}

define void @test_st_rri_v4f32(i32 %ptr, i32 %delta, <4 x float> %data) {
; CHECK-LABEL: test_st_rri_v4f32:
; CHECK:       # %bb.0:
; CHECK-NEXT:    st64 $a2:3, $m0, $m1, 4095
; CHECK-NEXT:    st64 $a0:1, $m0, $m1, 4094
; CHECK-NEXT:    br $m10
  %ptr1 = add i32 %ptr, %delta
  %ptr2 = inttoptr i32 %ptr1 to <4 x float>*
  %ptr3 = getelementptr <4 x float>, <4 x float>* %ptr2, i32 2047
  store <4 x float> %data, <4 x float>* %ptr3, align 16
  ret void
}

define void @test_st_fi_v4f32(<4 x float> %data) {
; CHECK-LABEL: test_st_fi_v4f32:
; CHECK:       # %bb.0:
; CHECK-NEXT:    add $m11, $m11, -2048
; CHECK-NEXT:    .cfi_def_cfa_offset 2048
; CHECK-NEXT:    st64 $a2:3, $m11, $m15, 1
; CHECK-NEXT:    st64 $a0:1, $m11, $m15, 0
; CHECK-NEXT:    add $m11, $m11, 2048
; CHECK-NEXT:    .cfi_def_cfa_offset 0
; CHECK-NEXT:    br $m10
  %ptr = alloca <4 x float>, i32 128
  store <4 x float> %data, <4 x float>*  %ptr, align 16
  ret void
}

define void @test_st_fii_v4f32(<4 x float> %data) {
; CHECK-LABEL: test_st_fii_v4f32:
; CHECK:       # %bb.0:
; CHECK-NEXT:    add $m11, $m11, -2048
; CHECK-NEXT:    .cfi_def_cfa_offset 2048
; CHECK-NEXT:    st64 $a2:3, $m11, $m15, 4095
; CHECK-NEXT:    st64 $a0:1, $m11, $m15, 4094
; CHECK-NEXT:    add $m11, $m11, 2048
; CHECK-NEXT:    .cfi_def_cfa_offset 0
; CHECK-NEXT:    br $m10
  %ptr1 = alloca <4 x float>, i32 128
  %ptr2 = getelementptr <4 x float>, <4 x float>* %ptr1, i32 2047
  store <4 x float> %data, <4 x float>* %ptr2, align 16
  ret void
}

define void @test_st_fir_v4f32(i32 %offset, <4 x float> %data) {
; CHECK-LABEL: test_st_fir_v4f32:
; CHECK:       # %bb.0:
; CHECK-NEXT:    add $m11, $m11, -2048
; CHECK-NEXT:    .cfi_def_cfa_offset 2048
; CHECK-NEXT:    shl $m0, $m0, 4
; CHECK-NEXT:    add $m1, $m11, 0
; CHECK-NEXT:    st64 $a2:3, $m1, $m0, 1
; CHECK-NEXT:    st64 $a0:1, $m1, $m0, 0
; CHECK-NEXT:    add $m11, $m11, 2048
; CHECK-NEXT:    .cfi_def_cfa_offset 0
; CHECK-NEXT:    br $m10
  %ptr1 = alloca <4 x float>, i32 128
  %ptr2 = getelementptr <4 x float>, <4 x float>* %ptr1, i32 %offset
  store <4 x float> %data, <4 x float>* %ptr2, align 16
  ret void
}

