mirror of
https://github.com/c3lang/c3c.git
synced 2026-02-27 20:11:17 +00:00
138 lines
3.9 KiB
Plaintext
138 lines
3.9 KiB
Plaintext
// #target: macos-x64
|
|
module foo;
|
|
|
|
module foo;
|
|
|
|
bitstruct BitField3 : char[4] @bigendian
|
|
{
|
|
uint c : 4..19;
|
|
}
|
|
|
|
bitstruct BitField4 : char[4]
|
|
{
|
|
uint c : 4..19;
|
|
}
|
|
|
|
extern fn void printf(char*, ...);
|
|
|
|
fn void main()
|
|
{
|
|
test3();
|
|
}
|
|
fn void test3()
|
|
{
|
|
//BitField3 xx = { 0xdeadbeef };
|
|
BitField3 xx = { 0xbeaf };
|
|
printf("%x = beaf\n", xx.c);
|
|
BitField4 xy = { 0xbeaf };
|
|
void *abc = &xy;
|
|
char[4]* z = abc;
|
|
printf("%x = beaf\n", xy.c);
|
|
xy.c = 0xbeef;
|
|
printf("%x = beef\n", xy.c);
|
|
xx.c = 0xbeef;
|
|
printf("%x = beef\n", xx.c);
|
|
}
|
|
|
|
|
|
/* #expect: foo.ll
|
|
|
|
define void @foo.test3() #0 {
|
|
entry:
|
|
%xx = alloca [4 x i8], align 1
|
|
%xy = alloca [4 x i8], align 1
|
|
%abc = alloca ptr, align 8
|
|
%z = alloca ptr, align 8
|
|
store [4 x i8] c"\E0\FB\0A\00", ptr %xx, align 1
|
|
%0 = load i8, ptr %xx, align 1
|
|
%zext = zext i8 %0 to i32
|
|
%lshrl = lshr i32 %zext, 4
|
|
%ptradd = getelementptr inbounds i8, ptr %xx, i64 1
|
|
%1 = load i8, ptr %ptradd, align 1
|
|
%zext1 = zext i8 %1 to i32
|
|
%shl = shl i32 %zext1, 4
|
|
%2 = or i32 %shl, %lshrl
|
|
%ptradd2 = getelementptr inbounds i8, ptr %xx, i64 2
|
|
%3 = load i8, ptr %ptradd2, align 1
|
|
%zext3 = zext i8 %3 to i32
|
|
%shl4 = shl i32 %zext3, 12
|
|
%4 = or i32 %shl4, %2
|
|
%shl5 = shl i32 %4, 16
|
|
%5 = call i32 @llvm.bswap.i32(i32 %shl5)
|
|
%6 = and i32 65535, %5
|
|
call void (ptr, ...) @printf(ptr @.str, i32 %6)
|
|
store [4 x i8] c"\F0\EA\0B\00", ptr %xy, align 1
|
|
store ptr %xy, ptr %abc, align 8
|
|
%7 = load ptr, ptr %abc, align 8
|
|
store ptr %7, ptr %z, align 8
|
|
%8 = load i8, ptr %xy, align 1
|
|
%zext6 = zext i8 %8 to i32
|
|
%lshrl7 = lshr i32 %zext6, 4
|
|
%ptradd8 = getelementptr inbounds i8, ptr %xy, i64 1
|
|
%9 = load i8, ptr %ptradd8, align 1
|
|
%zext9 = zext i8 %9 to i32
|
|
%shl10 = shl i32 %zext9, 4
|
|
%10 = or i32 %shl10, %lshrl7
|
|
%ptradd11 = getelementptr inbounds i8, ptr %xy, i64 2
|
|
%11 = load i8, ptr %ptradd11, align 1
|
|
%zext12 = zext i8 %11 to i32
|
|
%shl13 = shl i32 %zext12, 12
|
|
%12 = or i32 %shl13, %10
|
|
%13 = and i32 65535, %12
|
|
call void (ptr, ...) @printf(ptr @.str.1, i32 %13)
|
|
%14 = load i8, ptr %xy, align 1
|
|
%15 = and i8 %14, 15
|
|
%16 = or i8 %15, -16
|
|
store i8 %16, ptr %xy, align 1
|
|
%ptradd14 = getelementptr inbounds i8, ptr %xy, i64 1
|
|
store i8 -18, ptr %ptradd14, align 1
|
|
%ptradd15 = getelementptr inbounds i8, ptr %xy, i64 2
|
|
%17 = load i8, ptr %ptradd15, align 1
|
|
%18 = and i8 %17, -16
|
|
%19 = or i8 %18, 11
|
|
store i8 %18, ptr %ptradd15, align 1
|
|
%20 = load i8, ptr %xy, align 1
|
|
%zext16 = zext i8 %20 to i32
|
|
%lshrl17 = lshr i32 %zext16, 4
|
|
%ptradd18 = getelementptr inbounds i8, ptr %xy, i64 1
|
|
%21 = load i8, ptr %ptradd18, align 1
|
|
%zext19 = zext i8 %21 to i32
|
|
%shl20 = shl i32 %zext19, 4
|
|
%22 = or i32 %shl20, %lshrl17
|
|
%ptradd21 = getelementptr inbounds i8, ptr %xy, i64 2
|
|
%23 = load i8, ptr %ptradd21, align 1
|
|
%zext22 = zext i8 %23 to i32
|
|
%shl23 = shl i32 %zext22, 12
|
|
%24 = or i32 %shl23, %22
|
|
%25 = and i32 65535, %24
|
|
call void (ptr, ...) @printf(ptr @.str.2, i32 %25)
|
|
%26 = load i8, ptr %xx, align 1
|
|
%27 = and i8 %26, 15
|
|
%28 = or i8 %27, -32
|
|
store i8 %28, ptr %xx, align 1
|
|
%ptradd24 = getelementptr inbounds i8, ptr %xx, i64 1
|
|
store i8 -5, ptr %ptradd24, align 1
|
|
%ptradd25 = getelementptr inbounds i8, ptr %xx, i64 2
|
|
%29 = load i8, ptr %ptradd25, align 1
|
|
%30 = and i8 %29, -16
|
|
%31 = or i8 %30, 14
|
|
store i8 %30, ptr %ptradd25, align 1
|
|
%32 = load i8, ptr %xx, align 1
|
|
%zext26 = zext i8 %32 to i32
|
|
%lshrl27 = lshr i32 %zext26, 4
|
|
%ptradd28 = getelementptr inbounds i8, ptr %xx, i64 1
|
|
%33 = load i8, ptr %ptradd28, align 1
|
|
%zext29 = zext i8 %33 to i32
|
|
%shl30 = shl i32 %zext29, 4
|
|
%34 = or i32 %shl30, %lshrl27
|
|
%ptradd31 = getelementptr inbounds i8, ptr %xx, i64 2
|
|
%35 = load i8, ptr %ptradd31, align 1
|
|
%zext32 = zext i8 %35 to i32
|
|
%shl33 = shl i32 %zext32, 12
|
|
%36 = or i32 %shl33, %34
|
|
%shl34 = shl i32 %36, 16
|
|
%37 = call i32 @llvm.bswap.i32(i32 %shl34)
|
|
%38 = and i32 65535, %37
|
|
call void (ptr, ...) @printf(ptr @.str.3, i32 %38)
|
|
ret void
|
|
} |