|
| 1 | +// Check that the wide integer addition emulation produces the same result as |
| 2 | +// wide addition. Emulate i16 ops with i8 ops. |
| 3 | + |
| 4 | +// RUN: mlir-opt %s --convert-scf-to-cf --convert-cf-to-llvm --convert-vector-to-llvm \ |
| 5 | +// RUN: --convert-func-to-llvm --convert-arith-to-llvm | \ |
| 6 | +// RUN: mlir-cpu-runner -e entry -entry-point-result=void \ |
| 7 | +// RUN: --shared-libs=%mlir_lib_dir/libmlir_c_runner_utils%shlibext | \ |
| 8 | +// RUN: FileCheck %s --match-full-lines |
| 9 | + |
| 10 | +// RUN: mlir-opt %s --test-arith-emulate-wide-int="widest-int-supported=8" \ |
| 11 | +// RUN: --convert-scf-to-cf --convert-cf-to-llvm --convert-vector-to-llvm \ |
| 12 | +// RUN: --convert-func-to-llvm --convert-arith-to-llvm | \ |
| 13 | +// RUN: mlir-cpu-runner -e entry -entry-point-result=void \ |
| 14 | +// RUN: --shared-libs=%mlir_lib_dir/libmlir_c_runner_utils%shlibext | \ |
| 15 | +// RUN: FileCheck %s --match-full-lines |
| 16 | + |
| 17 | +// Ops in this function *only* will be emulated using i8 types. |
| 18 | +func.func @emulate_addi(%lhs : i16, %rhs : i16) -> (i16) { |
| 19 | + %res = arith.addi %lhs, %rhs : i16 |
| 20 | + return %res : i16 |
| 21 | +} |
| 22 | + |
| 23 | +func.func @check_addi(%lhs : i16, %rhs : i16) -> () { |
| 24 | + %res = func.call @emulate_addi(%lhs, %rhs) : (i16, i16) -> (i16) |
| 25 | + vector.print %res : i16 |
| 26 | + return |
| 27 | +} |
| 28 | + |
| 29 | +func.func @entry() { |
| 30 | + %cst0 = arith.constant 0 : i16 |
| 31 | + %cst1 = arith.constant 1 : i16 |
| 32 | + %cst_1 = arith.constant -1 : i16 |
| 33 | + %cst_3 = arith.constant -3 : i16 |
| 34 | + |
| 35 | + %cst13 = arith.constant 13 : i16 |
| 36 | + %cst37 = arith.constant 37 : i16 |
| 37 | + %cst42 = arith.constant 42 : i16 |
| 38 | + |
| 39 | + %cst256 = arith.constant 256 : i16 |
| 40 | + %cst_i16_max = arith.constant 32767 : i16 |
| 41 | + %cst_i16_min = arith.constant -32768 : i16 |
| 42 | + |
| 43 | + // CHECK: 0 |
| 44 | + func.call @check_addi(%cst0, %cst0) : (i16, i16) -> () |
| 45 | + // CHECK-NEXT: 1 |
| 46 | + func.call @check_addi(%cst0, %cst1) : (i16, i16) -> () |
| 47 | + // CHECK-NEXT: 2 |
| 48 | + func.call @check_addi(%cst1, %cst1) : (i16, i16) -> () |
| 49 | + // CHECK-NEXT: 0 |
| 50 | + func.call @check_addi(%cst1, %cst_1) : (i16, i16) -> () |
| 51 | + // CHECK-NEXT: -2 |
| 52 | + func.call @check_addi(%cst_1, %cst_1) : (i16, i16) -> () |
| 53 | + // CHECK-NEXT: -2 |
| 54 | + func.call @check_addi(%cst1, %cst_3) : (i16, i16) -> () |
| 55 | + |
| 56 | + // CHECK-NEXT: 26 |
| 57 | + func.call @check_addi(%cst13, %cst13) : (i16, i16) -> () |
| 58 | + // CHECK-NEXT: 50 |
| 59 | + func.call @check_addi(%cst13, %cst37) : (i16, i16) -> () |
| 60 | + // CHECK-NEXT: 79 |
| 61 | + func.call @check_addi(%cst37, %cst42) : (i16, i16) -> () |
| 62 | + |
| 63 | + // CHECK-NEXT: 255 |
| 64 | + func.call @check_addi(%cst_1, %cst256) : (i16, i16) -> () |
| 65 | + // CHECK-NEXT: 269 |
| 66 | + func.call @check_addi(%cst256, %cst13) : (i16, i16) -> () |
| 67 | + // CHECK-NEXT: 293 |
| 68 | + func.call @check_addi(%cst256, %cst37) : (i16, i16) -> () |
| 69 | + // CHECK-NEXT: 253 |
| 70 | + func.call @check_addi(%cst256, %cst_3) : (i16, i16) -> () |
| 71 | + |
| 72 | + // CHECK-NEXT: -32756 |
| 73 | + func.call @check_addi(%cst13, %cst_i16_max) : (i16, i16) -> () |
| 74 | + // CHECK-NEXT: -32731 |
| 75 | + func.call @check_addi(%cst_i16_min, %cst37) : (i16, i16) -> () |
| 76 | + |
| 77 | + // CHECK-NEXT: -2 |
| 78 | + func.call @check_addi(%cst_i16_max, %cst_i16_max) : (i16, i16) -> () |
| 79 | + // CHECK-NEXT: -32755 |
| 80 | + func.call @check_addi(%cst_i16_min, %cst13) : (i16, i16) -> () |
| 81 | + // CHECK-NEXT: 0 |
| 82 | + func.call @check_addi(%cst_i16_min, %cst_i16_min) : (i16, i16) -> () |
| 83 | + |
| 84 | + return |
| 85 | +} |
0 commit comments