@@ -2026,3 +2026,28 @@ func.func @test_abs_conversion(%arg0: tensor<9xui64> {func.orig_type = tensor<9x
20262026 %0 = tosa.abs %arg0 : (tensor <9 xui64 >) -> tensor <9 xui64 >
20272027 return %0 : tensor <9 xui64 >
20282028}
2029+
2030+ // -----
2031+
2032+ // CHECK: #[[$MAP:.+]] = affine_map<(d0) -> (d0)>
2033+
2034+ // CHECK-LABEL: func.func @test_cast_fp32_i64(
2035+ // CHECK-SAME: %[[ARG0:.*]]: tensor<1xf32>) -> tensor<1xi64> {
2036+ // CHECK: %[[EMPTY_TENSOR:.*]] = tensor.empty() : tensor<1xi64>
2037+ // CHECK: %[[RESULT:.*]] = linalg.generic {indexing_maps = [#[[$MAP]], #[[$MAP]]], iterator_types = ["parallel"]} ins(%[[ARG0]] : tensor<1xf32>) outs(%[[EMPTY_TENSOR]] : tensor<1xi64>) {
2038+ // CHECK: ^bb0(%[[IN:.*]]: f32, %[[OUT:.*]]: i64):
2039+ // CHECK: %[[ROUND_EVEN:.*]] = math.roundeven %[[IN]] : f32
2040+ // CHECK: %[[FP_INT_MIN:.*]] = arith.constant -9.22337203E+18 : f32
2041+ // CHECK: %[[FP_INT_MAX_PLUS_ONE:.*]] = arith.constant 9.22337203E+18 : f32
2042+ // CHECK: %[[INT_MAX:.*]] = arith.constant 9223372036854775807 : i64
2043+ // CHECK: %[[MAX:.*]] = arith.maximumf %[[ROUND_EVEN]], %[[FP_INT_MIN]] : f32
2044+ // CHECK: %[[FPTOSI:.*]] = arith.fptosi %[[MAX]] : f32 to i64
2045+ // CHECK: %[[CMPF:.*]] = arith.cmpf uge, %[[ROUND_EVEN]], %[[FP_INT_MAX_PLUS_ONE]] : f32
2046+ // CHECK: %[[SELECT:.*]] = arith.select %[[CMPF]], %[[INT_MAX]], %[[FPTOSI]] : i64
2047+ // CHECK: linalg.yield %[[SELECT]] : i64
2048+ // CHECK: } -> tensor<1xi64>
2049+ // CHECK: return %[[RESULT]] : tensor<1xi64>
2050+ func.func @test_cast_fp32_i64 (%arg0: tensor <1 xf32 >) -> (tensor <1 xi64 >) {
2051+ %0 = tosa.cast %arg0 : (tensor <1 xf32 >) -> tensor <1 xi64 >
2052+ return %0: tensor <1 xi64 >
2053+ }
0 commit comments