Files
c3c/test/test_suite/bitstruct/bitstruct_be.c3t
Christoffer Lerno 9a6d83f526 Updated stream API.
2023-09-03 01:14:15 +02:00

199 lines
7.5 KiB
C

// #target: macos-x64
module test;
import std::io;
bitstruct Test : int @bigendian
{
ushort a : 0..15;
ushort b : 16..31;
}
bitstruct Test2 : char[4] @bigendian
{
ushort a : 0..15;
ushort b : 16..31;
}
fn void main()
{
IntBE x;
x.val = 123;
io::printf("BE 123 => %d (%d)\n", (int)x, x.val);
Test abc = { .a = 0x1234, .b = 0x5678 };
Test2 abc2 = { .a = 0x1234, .b = 0x5678 };
char[4]* z = (char[4]*)&abc;
char[4]* z2 = (char[4]*)&abc2;
foreach (d : z2) io::printf(" %x", d);
io::printn("");
foreach (d : z) io::printf(" %x", d);
io::printn("");
io::printfn("abc.a = %x", abc.a);
abc.a = 0x1234;
abc.b = 0x5678;
io::printfn("->abc.a = %x", abc.a);
foreach (d : z) io::printf(" %x", d);
io::printn("");
IntLE y;
y.val = 123;
io::printf("LE 123 => %d (%d)\n", (int)y, y.val);
}
/* #expect: test.ll
%0 = load i32, ptr %x, align 4
%1 = call i32 @llvm.bswap.i32(i32 %0)
store i32 2063597568, ptr %x, align 4
%2 = insertvalue %any undef, ptr %x, 0
%3 = insertvalue %any %2, i64 ptrtoint (ptr @"$ct.int" to i64), 1
%4 = getelementptr inbounds [2 x %any], ptr %varargslots, i64 0, i64 0
store %any %3, ptr %4, align 16
%5 = load i32, ptr %x, align 4
%6 = call i32 @llvm.bswap.i32(i32 %5)
store i32 %6, ptr %taddr, align 4
%7 = insertvalue %any undef, ptr %taddr, 0
%8 = insertvalue %any %7, i64 ptrtoint (ptr @"$ct.int" to i64), 1
%9 = getelementptr inbounds [2 x %any], ptr %varargslots, i64 0, i64 1
store %any %8, ptr %9, align 16
%10 = call i64 @std.io.printf(ptr %retparam, ptr @.str, i64 18, ptr %varargslots, i64 2)
store i32 873625686, ptr %abc, align 4
store [4 x i8] c"\124Vx", ptr %abc2, align 1
store ptr %abc, ptr %z, align 8
store ptr %abc2, ptr %z2, align 8
%11 = load ptr, ptr %z2, align 8
store ptr %11, ptr %.anon, align 8
store i64 0, ptr %.anon1, align 8
br label %loop.cond
loop.cond: ; preds = %loop.body, %entry
%12 = load i64, ptr %.anon1, align 8
%gt = icmp ugt i64 4, %12
br i1 %gt, label %loop.body, label %loop.exit
loop.body: ; preds = %loop.cond
%13 = load ptr, ptr %.anon, align 8
%14 = load i64, ptr %.anon1, align 8
%15 = getelementptr inbounds [4 x i8], ptr %13, i64 0, i64 %14
%16 = load i8, ptr %15, align 1
store i8 %16, ptr %d, align 1
%17 = insertvalue %any undef, ptr %d, 0
%18 = insertvalue %any %17, i64 ptrtoint (ptr @"$ct.char" to i64), 1
%19 = getelementptr inbounds [1 x %any], ptr %varargslots3, i64 0, i64 0
store %any %18, ptr %19, align 16
%20 = call i64 @std.io.printf(ptr %retparam2, ptr @.str.1, i64 3, ptr %varargslots3, i64 1)
%21 = load i64, ptr %.anon1, align 8
%add = add i64 %21, 1
store i64 %add, ptr %.anon1, align 8
br label %loop.cond
loop.exit: ; preds = %loop.cond
%22 = call ptr @std.io.stdout()
%23 = call i64 @std.io.File.printn(ptr %retparam4, ptr %22, ptr null, i64 0)
%24 = load ptr, ptr %z, align 8
store ptr %24, ptr %.anon5, align 8
store i64 0, ptr %.anon6, align 8
br label %loop.cond7
loop.cond7: ; preds = %loop.body9, %loop.exit
%25 = load i64, ptr %.anon6, align 8
%gt8 = icmp ugt i64 4, %25
br i1 %gt8, label %loop.body9, label %loop.exit14
loop.body9: ; preds = %loop.cond7
%26 = load ptr, ptr %.anon5, align 8
%27 = load i64, ptr %.anon6, align 8
%28 = getelementptr inbounds [4 x i8], ptr %26, i64 0, i64 %27
%29 = load i8, ptr %28, align 1
store i8 %29, ptr %d10, align 1
%30 = insertvalue %any undef, ptr %d10, 0
%31 = insertvalue %any %30, i64 ptrtoint (ptr @"$ct.char" to i64), 1
%32 = getelementptr inbounds [1 x %any], ptr %varargslots12, i64 0, i64 0
store %any %31, ptr %32, align 16
%33 = call i64 @std.io.printf(ptr %retparam11, ptr @.str.2, i64 3, ptr %varargslots12, i64 1)
%34 = load i64, ptr %.anon6, align 8
%add13 = add i64 %34, 1
store i64 %add13, ptr %.anon6, align 8
br label %loop.cond7
loop.exit14: ; preds = %loop.cond7
%35 = call ptr @std.io.stdout()
%36 = call i64 @std.io.File.printn(ptr %retparam15, ptr %35, ptr null, i64 0)
%37 = load i32, ptr %abc, align 4
%38 = call i32 @llvm.bswap.i32(i32 %37)
%39 = and i32 65535, %38
%trunc = trunc i32 %39 to i16
store i16 %trunc, ptr %taddr18, align 2
%40 = insertvalue %any undef, ptr %taddr18, 0
%41 = insertvalue %any %40, i64 ptrtoint (ptr @"$ct.ushort" to i64), 1
%42 = getelementptr inbounds [1 x %any], ptr %varargslots17, i64 0, i64 0
store %any %41, ptr %42, align 16
%43 = call i64 @std.io.printfn(ptr %retparam16, ptr @.str.3, i64 10, ptr %varargslots17, i64 1)
%44 = load i32, ptr %abc, align 4
%45 = call i32 @llvm.bswap.i32(i32 %44)
%46 = and i32 %45, -65536
%47 = or i32 %46, 4660
%48 = call i32 @llvm.bswap.i32(i32 %47)
store i32 %48, ptr %abc, align 4
%49 = load i32, ptr %abc, align 4
%50 = call i32 @llvm.bswap.i32(i32 %49)
%51 = and i32 %50, 65535
%52 = or i32 %51, 1450704896
%53 = call i32 @llvm.bswap.i32(i32 %52)
store i32 %53, ptr %abc, align 4
%54 = load i32, ptr %abc, align 4
%55 = call i32 @llvm.bswap.i32(i32 %54)
%56 = and i32 65535, %55
%trunc21 = trunc i32 %56 to i16
store i16 %trunc21, ptr %taddr22, align 2
%57 = insertvalue %any undef, ptr %taddr22, 0
%58 = insertvalue %any %57, i64 ptrtoint (ptr @"$ct.ushort" to i64), 1
%59 = getelementptr inbounds [1 x %any], ptr %varargslots20, i64 0, i64 0
store %any %58, ptr %59, align 16
%60 = call i64 @std.io.printfn(ptr %retparam19, ptr @.str.4, i64 12, ptr %varargslots20, i64 1)
%61 = load ptr, ptr %z, align 8
store ptr %61, ptr %.anon23, align 8
store i64 0, ptr %.anon24, align 8
br label %loop.cond25
loop.cond25: ; preds = %loop.body27, %loop.exit14
%62 = load i64, ptr %.anon24, align 8
%gt26 = icmp ugt i64 4, %62
br i1 %gt26, label %loop.body27, label %loop.exit32
loop.body27: ; preds = %loop.cond25
%63 = load ptr, ptr %.anon23, align 8
%64 = load i64, ptr %.anon24, align 8
%65 = getelementptr inbounds [4 x i8], ptr %63, i64 0, i64 %64
%66 = load i8, ptr %65, align 1
store i8 %66, ptr %d28, align 1
%67 = insertvalue %any undef, ptr %d28, 0
%68 = insertvalue %any %67, i64 ptrtoint (ptr @"$ct.char" to i64), 1
%69 = getelementptr inbounds [1 x %any], ptr %varargslots30, i64 0, i64 0
store %any %68, ptr %69, align 16
%70 = call i64 @std.io.printf(ptr %retparam29, ptr @.str.5, i64 3, ptr %varargslots30, i64 1)
%71 = load i64, ptr %.anon24, align 8
%add31 = add i64 %71, 1
store i64 %add31, ptr %.anon24, align 8
br label %loop.cond25
loop.exit32: ; preds = %loop.cond25
%72 = call ptr @std.io.stdout()
%73 = call i64 @std.io.File.printn(ptr %retparam33, ptr %72, ptr null, i64 0)
store i32 0, ptr %y, align 4
%74 = load i32, ptr %y, align 4
store i32 123, ptr %y, align 4
%75 = insertvalue %any undef, ptr %y, 0
%76 = insertvalue %any %75, i64 ptrtoint (ptr @"$ct.int" to i64), 1
%77 = getelementptr inbounds [2 x %any], ptr %varargslots35, i64 0, i64 0
store %any %76, ptr %77, align 16
%78 = load i32, ptr %y, align 4
store i32 %78, ptr %taddr36, align 4
%79 = insertvalue %any undef, ptr %taddr36, 0
%80 = insertvalue %any %79, i64 ptrtoint (ptr @"$ct.int" to i64), 1
%81 = getelementptr inbounds [2 x %any], ptr %varargslots35, i64 0, i64 1
store %any %80, ptr %81, align 16
%82 = call i64 @std.io.printf(ptr %retparam34, ptr @.str.6, i64 18, ptr %varargslots35, i64 2)
ret void
}