|  | ; 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 | 
|  | } | 
|  |  |