// Copyright (c) 2025 Huawei Technologies Co., Ltd.
// This program is free software, you can redistribute it and/or modify it under the terms and conditions of
// CANN Open Software License Agreement Version 2.0 (the "License").
// Please refer to the License for details. You may not use this file except in compliance with the License.
// THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED,
// INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE.
// See LICENSE in the root of the software repository for the full text of the License.

// RUN: ascir-translate -mlir-to-ascendc %s | FileCheck %s

// CHECK-LABEL:void emit_set_fmatrix(int16_t v1, int8_t* v2, int8_t v3) {
// CHECK-NEXT:   AscendC::FmatrixMode v4{v3};
// CHECK-NEXT:   AscendC::SetFmatrix(v1, v1, v2, v4);
// CHECK-NEXT:   return;
// CHECK-NEXT: }
func.func @emit_set_fmatrix(%arg0: i16, %arg1: memref<4xi8>, %arg2: i8) {
  %fm = ascendc.construct !ascendc.fmatrix_mode(%arg2) : i8
  ascendc.set_fmatrix %arg0, %arg0, %arg1, %fm : i16, i16, memref<4xi8>, !ascendc.fmatrix_mode
  return
}

// CHECK-LABEL:void emit_set_load_data_padding_value(float v1) {
// CHECK-NEXT:   AscendC::SetLoadDataPaddingValue(v1);
// CHECK-NEXT:   return;
// CHECK-NEXT: }
func.func @emit_set_load_data_padding_value(%arg0: f32) {
  ascendc.set_load_data_padding_value %arg0 : f32
  return
}

// CHECK-LABEL:void emit_set_load_data_repeat(int16_t v1, int8_t v2) {
// CHECK-NEXT:   AscendC::LoadDataRepeatParam v3{v1, v2, v2};
// CHECK-NEXT:   AscendC::SetLoadDataRepeat(v3);
// CHECK-NEXT:   return;
// CHECK-NEXT: }
func.func @emit_set_load_data_repeat(%arg0: i16, %arg1: i8) {
  %param = ascendc.construct !ascendc.load_data_repeat_param(%arg0, %arg1, %arg1) : i16, i8, i8
  ascendc.set_load_data_repeat %param : !ascendc.load_data_repeat_param
  return
}

// CHECK-LABEL:void emit_set_load_data_boundary(int32_t v1) {
// CHECK-NEXT:   AscendC::SetLoadDataBoundary(v1);
// CHECK-NEXT:   return;
// CHECK-NEXT: }
func.func @emit_set_load_data_boundary(%c0_i32: i32) {
  ascendc.set_load_data_boundary %c0_i32 : i32
  return
}

// CHECK-LABEL:void emit_ffts_cross_core_sync(int32_t v1, int64_t v2) {
// CHECK-NEXT:  constexpr int64_t c3873_i64 = 3873;
// CHECK-NEXT:  constexpr int32_t c5_i32 = 5;
// CHECK-NEXT:  ffts_cross_core_sync(PIPE_MTE3, c3873_i64);
// CHECK-NEXT:  return;
// CHECK-NEXT:}
func.func @emit_ffts_cross_core_sync(%arg0: i32, %arg1: i64) {
  %c3873_i64 = arith.constant 3873 : i64
  %c5_i32 = arith.constant 5 : i32
  ascendc.ffts_cross_core_sync %c3873_i64 {pipe = 5 : i32} : i64
  return
}