| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,36 @@ | ||
| //===----------------------------------------------------------------------===// | ||
| // | ||
| // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. | ||
| // See https://llvm.org/LICENSE.txt for license information. | ||
| // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception | ||
| // | ||
| //===----------------------------------------------------------------------===// | ||
|
|
||
| // UNSUPPORTED: c++03, c++11, c++14, c++17 | ||
|
|
||
| // Make sure that std::bit_cast works with std::complex. Test case extracted from | ||
| // https://github.com/llvm/llvm-project/issues/94620. | ||
|
|
||
| #include <bit> | ||
| #include <complex> | ||
|
|
||
| template <class T> | ||
| constexpr void test() { | ||
| using Complex = std::complex<T>; | ||
| unsigned char data[sizeof(Complex)] = {0}; | ||
|
|
||
| [[maybe_unused]] Complex c = std::bit_cast<Complex>(data); | ||
| } | ||
|
|
||
| constexpr bool test_all() { | ||
| test<float>(); | ||
| test<double>(); | ||
| test<long double>(); | ||
| return true; | ||
| } | ||
|
|
||
| int main(int, char**) { | ||
| test_all(); | ||
| static_assert(test_all()); | ||
| return 0; | ||
| } |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,10 @@ | ||
| ; RUN: llc < %s -mtriple=arm64-eabi | FileCheck %s | ||
|
|
||
| define void @foo() nounwind { | ||
| ; CHECK-LABEL: foo | ||
| ; CHECK: hlt #0x2 | ||
| tail call void @llvm.aarch64.hlt(i32 2) | ||
| ret void | ||
| } | ||
|
|
||
| declare void @llvm.aarch64.hlt(i32 immarg) nounwind |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,88 @@ | ||
| // RUN: mlir-opt %s --convert-scf-to-cf --convert-cf-to-llvm --convert-vector-to-llvm \ | ||
| // RUN: --convert-func-to-llvm --convert-arith-to-llvm | \ | ||
| // RUN: mlir-cpu-runner -e entry -entry-point-result=void \ | ||
| // RUN: --shared-libs=%mlir_c_runner_utils | \ | ||
| // RUN: FileCheck %s --match-full-lines | ||
|
|
||
| func.func @addi_i1(%v1 : i1, %v2 : i1) { | ||
| vector.print str "@addi_i1\n" | ||
| %res = arith.addi %v1, %v2 : i1 | ||
| vector.print %res : i1 | ||
| return | ||
| } | ||
|
|
||
| func.func @addi() { | ||
| // ------------------------------------------------ | ||
| // Test i1 | ||
| // ------------------------------------------------ | ||
|
|
||
| // addi on i1 | ||
| // addi(0, 1) : i1 = 1 : i1; addi(0, -1) : i1 = 1 | ||
| %false = arith.constant 0 : i1 | ||
| %true = arith.constant 1 : i1 | ||
|
|
||
| // CHECK-LABEL: @addi_i1 | ||
| // CHECK-NEXT: 1 | ||
| func.call @addi_i1(%false, %true) : (i1, i1) -> () | ||
|
|
||
| // CHECK-LABEL: @addi_i1 | ||
| // CHECK-NEXT: 1 | ||
| %true_based_on_non_zero_val = arith.constant -1 : i1 | ||
| func.call @addi_i1(%false, %true_based_on_non_zero_val) : (i1, i1) -> () | ||
|
|
||
| // ------------------------------------------------ | ||
| // TODO: Test i8, i16 etc.. | ||
| // ------------------------------------------------ | ||
|
|
||
| return | ||
| } | ||
|
|
||
| func.func @addui_extended_i1(%v1 : i1, %v2 : i1) { | ||
| vector.print str "@addui_extended_i1\n" | ||
| %res, %overflow = arith.addui_extended %v1, %v2 : i1, i1 | ||
| vector.print %res : i1 | ||
| vector.print %overflow : i1 | ||
| return | ||
| } | ||
|
|
||
| func.func @addi_extended() { | ||
| // ------------------------------------------------ | ||
| // Test i1 | ||
| // ------------------------------------------------ | ||
|
|
||
| // addui_extended on i1 | ||
| // addui_extended 1 1 : i1 = 0, 1 | ||
| %true = arith.constant 1 : i1 | ||
| %false = arith.constant 0 : i1 | ||
|
|
||
| // CHECK-LABEL: @addui_extended_i1 | ||
| // CHECK-NEXT: 0 | ||
| // CHECK-NEXT: 1 | ||
| func.call @addui_extended_i1(%true, %true) : (i1, i1) -> () | ||
|
|
||
| // CHECK-LABEL: @addui_extended_i1 | ||
| // CHECK-NEXT: 1 | ||
| // CHECK-NEXT: 0 | ||
| func.call @addui_extended_i1(%true, %false) : (i1, i1) -> () | ||
|
|
||
| // CHECK-LABEL: @addui_extended_i1 | ||
| // CHECK-NEXT: 1 | ||
| // CHECK-NEXT: 0 | ||
| func.call @addui_extended_i1(%false, %true) : (i1, i1) -> () | ||
|
|
||
| // CHECK-LABEL: @addui_extended_i1 | ||
| // CHECK-NEXT: 0 | ||
| // CHECK-NEXT: 0 | ||
| func.call @addui_extended_i1(%false, %false) : (i1, i1) -> () | ||
|
|
||
| // ------------------------------------------------ | ||
| // TODO: Test i8, i16 etc.. | ||
| // ------------------------------------------------ | ||
| return | ||
| } | ||
|
|
||
| func.func @entry() { | ||
| func.call @addi() : () -> () | ||
| func.call @addi_extended() : () -> () | ||
| return | ||
| } |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,119 @@ | ||
| // RUN: mlir-opt %s --convert-scf-to-cf --convert-cf-to-llvm --convert-vector-to-llvm \ | ||
| // RUN: --convert-func-to-llvm --convert-arith-to-llvm | \ | ||
| // RUN: mlir-cpu-runner -e entry -entry-point-result=void \ | ||
| // RUN: --shared-libs=%mlir_c_runner_utils | \ | ||
| // RUN: FileCheck %s --match-full-lines | ||
|
|
||
| func.func @mulsi_extended_i1(%v1 : i1, %v2 : i1) { | ||
| vector.print str "@mulsi_extended_i1\n" | ||
| %low, %high = arith.mulsi_extended %v1, %v2 : i1 | ||
| vector.print %low : i1 | ||
| vector.print %high : i1 | ||
| return | ||
| } | ||
|
|
||
| func.func @mulsi_extended_i8(%v1 : i8, %v2 : i8) { | ||
| vector.print str "@mulsi_extended_i8\n" | ||
| %low, %high = arith.mulsi_extended %v1, %v2 : i8 | ||
| vector.print %low : i8 | ||
| vector.print %high : i8 | ||
| return | ||
| } | ||
|
|
||
| func.func @mulsi_extended() { | ||
| // ------------------------------------------------ | ||
| // Test i1 | ||
| // ------------------------------------------------ | ||
|
|
||
| // mulsi_extended on i1, tests for overflow bit | ||
| // mulsi_extended 1, 1 : i1 = (1, 0) | ||
| %true = arith.constant true | ||
| %false = arith.constant false | ||
|
|
||
| // CHECK-LABEL: @mulsi_extended_i1 | ||
| // CHECK-NEXT: 1 | ||
| // CHECK-NEXT: 0 | ||
| func.call @mulsi_extended_i1(%true, %true) : (i1, i1) -> () | ||
|
|
||
| // CHECK-LABEL: @mulsi_extended_i1 | ||
| // CHECK-NEXT: 0 | ||
| // CHECK-NEXT: 0 | ||
| func.call @mulsi_extended_i1(%true, %false) : (i1, i1) -> () | ||
|
|
||
| // CHECK-LABEL: @mulsi_extended_i1 | ||
| // CHECK-NEXT: 0 | ||
| // CHECK-NEXT: 0 | ||
| func.call @mulsi_extended_i1(%false, %true) : (i1, i1) -> () | ||
|
|
||
| // CHECK-LABEL: @mulsi_extended_i1 | ||
| // CHECK-NEXT: 0 | ||
| // CHECK-NEXT: 0 | ||
| func.call @mulsi_extended_i1(%false, %false) : (i1, i1) -> () | ||
|
|
||
| // ------------------------------------------------ | ||
| // Test i8 | ||
| // ------------------------------------------------ | ||
| // mulsi extended versions, with overflow | ||
| %c_100_i8 = arith.constant -100 : i8 | ||
|
|
||
| // mulsi_extended -100, -100 : i8 = (16, 39) | ||
| // CHECK-LABEL: @mulsi_extended_i8 | ||
| // CHECK-NEXT: 16 | ||
| // CHECK-NEXT: 39 | ||
| func.call @mulsi_extended_i8(%c_100_i8, %c_100_i8) : (i8, i8) -> () | ||
|
|
||
| // ------------------------------------------------ | ||
| // TODO: Test i16, i32 etc.. | ||
| // ------------------------------------------------ | ||
| return | ||
| } | ||
|
|
||
| func.func @mului_extended_i8(%v1 : i8, %v2 : i8) { | ||
| vector.print str "@mului_extended_i8\n" | ||
| %low, %high = arith.mului_extended %v1, %v2 : i8 | ||
| vector.print %low : i8 | ||
| vector.print %high : i8 | ||
| return | ||
| } | ||
|
|
||
| func.func @mului_extended() { | ||
| // ------------------------------------------------ | ||
| // Test i8 | ||
| // ------------------------------------------------ | ||
| %c_n100_i8 = arith.constant -100 : i8 | ||
| %c_156_i8 = arith.constant 156 : i8 | ||
|
|
||
| // mului_extended -100, -100 : i8 = (16, 95) | ||
| // and on equivalent representations (e.g. 156 === -100 (mod 256)) | ||
|
|
||
| // CHECK-LABEL: @mului_extended_i8 | ||
| // CHECK-NEXT: 16 | ||
| // CHECK-NEXT: 95 | ||
| func.call @mului_extended_i8(%c_n100_i8, %c_n100_i8) : (i8, i8) -> () | ||
|
|
||
| // CHECK-LABEL: @mului_extended_i8 | ||
| // CHECK-NEXT: 16 | ||
| // CHECK-NEXT: 95 | ||
| func.call @mului_extended_i8(%c_n100_i8, %c_156_i8) : (i8, i8) -> () | ||
|
|
||
| // CHECK-LABEL: @mului_extended_i8 | ||
| // CHECK-NEXT: 16 | ||
| // CHECK-NEXT: 95 | ||
| func.call @mului_extended_i8(%c_156_i8, %c_n100_i8) : (i8, i8) -> () | ||
|
|
||
| // CHECK-LABEL: @mului_extended_i8 | ||
| // CHECK-NEXT: 16 | ||
| // CHECK-NEXT: 95 | ||
| func.call @mului_extended_i8(%c_156_i8, %c_156_i8) : (i8, i8) -> () | ||
|
|
||
| // ------------------------------------------------ | ||
| // TODO: Test i1, i16, i32 etc.. | ||
| // ------------------------------------------------ | ||
| return | ||
| } | ||
|
|
||
| func.func @entry() { | ||
| func.call @mulsi_extended() : () -> () | ||
| func.call @mului_extended() : () -> () | ||
| return | ||
| } |