summaryrefslogtreecommitdiffstats
path: root/llvm/test/CodeGen/PowerPC/bitfieldinsert.ll
diff options
context:
space:
mode:
Diffstat (limited to 'llvm/test/CodeGen/PowerPC/bitfieldinsert.ll')
-rw-r--r--llvm/test/CodeGen/PowerPC/bitfieldinsert.ll35
1 files changed, 32 insertions, 3 deletions
diff --git a/llvm/test/CodeGen/PowerPC/bitfieldinsert.ll b/llvm/test/CodeGen/PowerPC/bitfieldinsert.ll
index e654c7d8a0c..76a648b6f13 100644
--- a/llvm/test/CodeGen/PowerPC/bitfieldinsert.ll
+++ b/llvm/test/CodeGen/PowerPC/bitfieldinsert.ll
@@ -1,6 +1,35 @@
; RUN: llc -verify-machineinstrs -mtriple=powerpc64le-unknown-linux-gnu -mcpu=pwr8 < %s | FileCheck %s
; RUN: llc -verify-machineinstrs -mtriple=powerpc64-unknown-linux-gnu -mcpu=pwr8 < %s | FileCheck %s
+; equivalent C code
+; struct s64 {
+; int a:5;
+; int b:16;
+; long c:42;
+; };
+; void bitfieldinsert64(struct s *p, unsigned short v) {
+; p->b = v;
+; }
+
+%struct.s64 = type { i64 }
+
+define void @bitfieldinsert64(%struct.s64* nocapture %p, i16 zeroext %v) {
+; CHECK-LABEL: @bitfieldinsert64
+; CHECK: ld [[REG1:[0-9]+]], 0(3)
+; CHECK-NEXT: rlwimi [[REG1]], 4, 5, 11, 26
+; CHECK-NEXT: std [[REG1]], 0(3)
+; CHECK-NEXT: blr
+entry:
+ %0 = getelementptr inbounds %struct.s64, %struct.s64* %p, i64 0, i32 0
+ %1 = zext i16 %v to i64
+ %bf.load = load i64, i64* %0, align 8
+ %bf.shl = shl nuw nsw i64 %1, 5
+ %bf.clear = and i64 %bf.load, -2097121
+ %bf.set = or i64 %bf.clear, %bf.shl
+ store i64 %bf.set, i64* %0, align 8
+ ret void
+}
+
; bitfieldinsert32: Test for rlwimi
; equivalent C code
; struct s32 {
@@ -17,9 +46,9 @@
define void @bitfieldinsert32(%struct.s32* nocapture %p, i32 zeroext %v) {
; CHECK-LABEL: @bitfieldinsert32
; CHECK: lwz [[REG1:[0-9]+]], 0(3)
-; CHECK: rlwimi [[REG1]], 4, 8, 8, 23
-; CHECK: stw [[REG1]], 0(3)
-; CHECK: blr
+; CHECK-NEXT: rlwimi [[REG1]], 4, 8, 8, 23
+; CHECK-NEXT: stw [[REG1]], 0(3)
+; CHECK-NEXT: blr
entry:
%0 = getelementptr inbounds %struct.s32, %struct.s32* %p, i64 0, i32 0
%bf.load = load i32, i32* %0, align 4
OpenPOWER on IntegriCloud