| ; Test floating-point control register intrinsics. | |
| ; | |
| ; RUN: llc < %s -mtriple=s390x-linux-gnu | FileCheck %s | |
| declare void @llvm.s390.sfpc(i32) | |
| declare i32 @llvm.s390.efpc() | |
| ; SFPC. | |
| define void @test_sfpc(i32 %fpc) { | |
| ; CHECK-LABEL: test_sfpc: | |
| ; CHECK: sfpc %r2 | |
| ; CHECK: br %r14 | |
| call void @llvm.s390.sfpc(i32 %fpc) | |
| ret void | |
| } | |
| ; EFPC. | |
| define i32 @test_efpc() { | |
| ; CHECK-LABEL: test_efpc: | |
| ; CHECK: efpc %r2 | |
| ; CHECK: br %r14 | |
| %res = call i32 @llvm.s390.efpc() | |
| ret i32 %res | |
| } | |
| ; LFPC. | |
| define void @test_lfpc1(i32 *%ptr) { | |
| ; CHECK-LABEL: test_lfpc1: | |
| ; CHECK: lfpc 0(%r2) | |
| ; CHECK: br %r14 | |
| %fpc = load i32, i32 *%ptr | |
| call void @llvm.s390.sfpc(i32 %fpc) | |
| ret void | |
| } | |
| ; LFPC with offset. | |
| define void @test_lfpc2(i32 *%ptr) { | |
| ; CHECK-LABEL: test_lfpc2: | |
| ; CHECK: lfpc 4092(%r2) | |
| ; CHECK: br %r14 | |
| %ptr1 = getelementptr i32, i32 *%ptr, i32 1023 | |
| %fpc = load i32, i32 *%ptr1 | |
| call void @llvm.s390.sfpc(i32 %fpc) | |
| ret void | |
| } | |
| ; STFPC. | |
| define void @test_stfpc1(i32 *%ptr) { | |
| ; CHECK-LABEL: test_stfpc1: | |
| ; CHECK: stfpc 0(%r2) | |
| ; CHECK: br %r14 | |
| %fpc = call i32 @llvm.s390.efpc() | |
| store i32 %fpc, i32 *%ptr | |
| ret void | |
| } | |
| ; STFPC with offset. | |
| define void @test_stfpc2(i32 *%ptr) { | |
| ; CHECK-LABEL: test_stfpc2: | |
| ; CHECK: stfpc 4092(%r2) | |
| ; CHECK: br %r14 | |
| %fpc = call i32 @llvm.s390.efpc() | |
| %ptr1 = getelementptr i32, i32 *%ptr, i32 1023 | |
| store i32 %fpc, i32 *%ptr1 | |
| ret void | |
| } | |