Files
c3c/test/test_suite2/bitstruct/bitstruct_be.c3t
Christoffer Lerno 63d9853bd3 Fixes to bitstruct.
2022-08-14 18:25:47 +02:00

336 lines
14 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::println("");
foreach (d : z) io::printf(" %x", d);
io::println("");
io::printfln("abc.a = %x", abc.a);
abc.a = 0x1234;
abc.b = 0x5678;
io::printfln("->abc.a = %x", abc.a);
foreach (d : z) io::printf(" %x", d);
io::println("");
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
store %"char[]" { ptr @.str, i64 18 }, ptr %taddr, align 8
%2 = getelementptr inbounds { ptr, i64 }, ptr %taddr, i32 0, i32 0
%lo = load ptr, ptr %2, align 8
%3 = getelementptr inbounds { ptr, i64 }, ptr %taddr, i32 0, i32 1
%hi = load i64, ptr %3, align 8
%4 = insertvalue %variant undef, ptr %x, 0
%5 = insertvalue %variant %4, i64 ptrtoint (ptr @"ct$int" to i64), 1
%6 = getelementptr inbounds [2 x %variant], ptr %varargslots, i64 0, i64 0
store %variant %5, ptr %6, align 16
%7 = load i32, ptr %x, align 4
%8 = call i32 @llvm.bswap.i32(i32 %7)
store i32 %8, ptr %taddr1, align 4
%9 = insertvalue %variant undef, ptr %taddr1, 0
%10 = insertvalue %variant %9, i64 ptrtoint (ptr @"ct$int" to i64), 1
%11 = getelementptr inbounds [2 x %variant], ptr %varargslots, i64 0, i64 1
store %variant %10, ptr %11, align 16
%12 = getelementptr inbounds %"variant[]", ptr %vararg, i32 0, i32 1
store i64 2, ptr %12, align 8
%13 = getelementptr inbounds %"variant[]", ptr %vararg, i32 0, i32 0
store ptr %varargslots, ptr %13, align 8
%14 = getelementptr inbounds { ptr, i64 }, ptr %vararg, i32 0, i32 0
%lo2 = load ptr, ptr %14, align 8
%15 = getelementptr inbounds { ptr, i64 }, ptr %vararg, i32 0, i32 1
%hi3 = load i64, ptr %15, align 8
%16 = call i64 @std_io_printf(ptr %retparam, ptr %lo, i64 %hi, ptr %lo2, i64 %hi3)
%not_err = icmp eq i64 %16, 0
br i1 %not_err, label %after_check, label %voiderr
after_check: ; preds = %entry
br label %voiderr
voiderr: ; preds = %after_check, %entry
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
%17 = load ptr, ptr %z2, align 8
store ptr %17, ptr %.anon, align 8
store i64 0, ptr %.anon4, align 8
br label %loop.cond
loop.cond: ; preds = %voiderr15, %voiderr
%18 = load i64, ptr %.anon4, align 8
%gt = icmp ugt i64 4, %18
br i1 %gt, label %loop.body, label %loop.exit
loop.body: ; preds = %loop.cond
%19 = load ptr, ptr %.anon, align 8
%20 = load i64, ptr %.anon4, align 8
%21 = getelementptr inbounds [4 x i8], ptr %19, i64 0, i64 %20
%22 = load i8, ptr %21, align 1
store i8 %22, ptr %d, align 1
store %"char[]" { ptr @.str.1, i64 3 }, ptr %taddr6, align 8
%23 = getelementptr inbounds { ptr, i64 }, ptr %taddr6, i32 0, i32 0
%lo7 = load ptr, ptr %23, align 8
%24 = getelementptr inbounds { ptr, i64 }, ptr %taddr6, i32 0, i32 1
%hi8 = load i64, ptr %24, align 8
%25 = insertvalue %variant undef, ptr %d, 0
%26 = insertvalue %variant %25, i64 ptrtoint (ptr @"ct$char" to i64), 1
%27 = getelementptr inbounds [1 x %variant], ptr %varargslots10, i64 0, i64 0
store %variant %26, ptr %27, align 16
%28 = getelementptr inbounds %"variant[]", ptr %vararg9, i32 0, i32 1
store i64 1, ptr %28, align 8
%29 = getelementptr inbounds %"variant[]", ptr %vararg9, i32 0, i32 0
store ptr %varargslots10, ptr %29, align 8
%30 = getelementptr inbounds { ptr, i64 }, ptr %vararg9, i32 0, i32 0
%lo11 = load ptr, ptr %30, align 8
%31 = getelementptr inbounds { ptr, i64 }, ptr %vararg9, i32 0, i32 1
%hi12 = load i64, ptr %31, align 8
%32 = call i64 @std_io_printf(ptr %retparam5, ptr %lo7, i64 %hi8, ptr %lo11, i64 %hi12)
%not_err13 = icmp eq i64 %32, 0
br i1 %not_err13, label %after_check14, label %voiderr15
after_check14: ; preds = %loop.body
br label %voiderr15
voiderr15: ; preds = %after_check14, %loop.body
%33 = load i64, ptr %.anon4, align 8
%add = add i64 %33, 1
store i64 %add, ptr %.anon4, align 8
br label %loop.cond
loop.exit: ; preds = %loop.cond
%34 = call i32 @std_io_println(ptr @.str.2) #2
%35 = load ptr, ptr %z, align 8
store ptr %35, ptr %.anon16, align 8
store i64 0, ptr %.anon17, align 8
br label %loop.cond18
loop.cond18: ; preds = %voiderr32, %loop.exit
%36 = load i64, ptr %.anon17, align 8
%gt19 = icmp ugt i64 4, %36
br i1 %gt19, label %loop.body20, label %loop.exit34
loop.body20: ; preds = %loop.cond18
%37 = load ptr, ptr %.anon16, align 8
%38 = load i64, ptr %.anon17, align 8
%39 = getelementptr inbounds [4 x i8], ptr %37, i64 0, i64 %38
%40 = load i8, ptr %39, align 1
store i8 %40, ptr %d21, align 1
store %"char[]" { ptr @.str.3, i64 3 }, ptr %taddr23, align 8
%41 = getelementptr inbounds { ptr, i64 }, ptr %taddr23, i32 0, i32 0
%lo24 = load ptr, ptr %41, align 8
%42 = getelementptr inbounds { ptr, i64 }, ptr %taddr23, i32 0, i32 1
%hi25 = load i64, ptr %42, align 8
%43 = insertvalue %variant undef, ptr %d21, 0
%44 = insertvalue %variant %43, i64 ptrtoint (ptr @"ct$char" to i64), 1
%45 = getelementptr inbounds [1 x %variant], ptr %varargslots27, i64 0, i64 0
store %variant %44, ptr %45, align 16
%46 = getelementptr inbounds %"variant[]", ptr %vararg26, i32 0, i32 1
store i64 1, ptr %46, align 8
%47 = getelementptr inbounds %"variant[]", ptr %vararg26, i32 0, i32 0
store ptr %varargslots27, ptr %47, align 8
%48 = getelementptr inbounds { ptr, i64 }, ptr %vararg26, i32 0, i32 0
%lo28 = load ptr, ptr %48, align 8
%49 = getelementptr inbounds { ptr, i64 }, ptr %vararg26, i32 0, i32 1
%hi29 = load i64, ptr %49, align 8
%50 = call i64 @std_io_printf(ptr %retparam22, ptr %lo24, i64 %hi25, ptr %lo28, i64 %hi29)
%not_err30 = icmp eq i64 %50, 0
br i1 %not_err30, label %after_check31, label %voiderr32
after_check31: ; preds = %loop.body20
br label %voiderr32
voiderr32: ; preds = %after_check31, %loop.body20
%51 = load i64, ptr %.anon17, align 8
%add33 = add i64 %51, 1
store i64 %add33, ptr %.anon17, align 8
br label %loop.cond18
loop.exit34: ; preds = %loop.cond18
%52 = call i32 @std_io_println(ptr @.str.4) #2
store %"char[]" { ptr @.str.5, i64 10 }, ptr %taddr36, align 8
%53 = getelementptr inbounds { ptr, i64 }, ptr %taddr36, i32 0, i32 0
%lo37 = load ptr, ptr %53, align 8
%54 = getelementptr inbounds { ptr, i64 }, ptr %taddr36, i32 0, i32 1
%hi38 = load i64, ptr %54, align 8
%55 = load i32, ptr %abc, align 4
%56 = call i32 @llvm.bswap.i32(i32 %55)
%57 = and i32 65535, %56
%ztrunc = trunc i32 %57 to i16
store i16 %ztrunc, ptr %taddr41, align 2
%58 = insertvalue %variant undef, ptr %taddr41, 0
%59 = insertvalue %variant %58, i64 ptrtoint (ptr @"ct$ushort" to i64), 1
%60 = getelementptr inbounds [1 x %variant], ptr %varargslots40, i64 0, i64 0
store %variant %59, ptr %60, align 16
%61 = getelementptr inbounds %"variant[]", ptr %vararg39, i32 0, i32 1
store i64 1, ptr %61, align 8
%62 = getelementptr inbounds %"variant[]", ptr %vararg39, i32 0, i32 0
store ptr %varargslots40, ptr %62, align 8
%63 = getelementptr inbounds { ptr, i64 }, ptr %vararg39, i32 0, i32 0
%lo42 = load ptr, ptr %63, align 8
%64 = getelementptr inbounds { ptr, i64 }, ptr %vararg39, i32 0, i32 1
%hi43 = load i64, ptr %64, align 8
%65 = call i64 @std_io_printfln(ptr %retparam35, ptr %lo37, i64 %hi38, ptr %lo42, i64 %hi43)
%not_err44 = icmp eq i64 %65, 0
br i1 %not_err44, label %after_check45, label %voiderr46
after_check45: ; preds = %loop.exit34
br label %voiderr46
voiderr46: ; preds = %after_check45, %loop.exit34
%66 = load i32, ptr %abc, align 4
%67 = call i32 @llvm.bswap.i32(i32 %66)
%68 = and i32 %67, -65536
%69 = or i32 %68, 4660
%70 = call i32 @llvm.bswap.i32(i32 %69)
store i32 %70, ptr %abc, align 4
%71 = load i32, ptr %abc, align 4
%72 = call i32 @llvm.bswap.i32(i32 %71)
%73 = and i32 %72, 65535
%74 = or i32 %73, 1450704896
%75 = call i32 @llvm.bswap.i32(i32 %74)
store i32 %75, ptr %abc, align 4
store %"char[]" { ptr @.str.6, i64 12 }, ptr %taddr48, align 8
%76 = getelementptr inbounds { ptr, i64 }, ptr %taddr48, i32 0, i32 0
%lo49 = load ptr, ptr %76, align 8
%77 = getelementptr inbounds { ptr, i64 }, ptr %taddr48, i32 0, i32 1
%hi50 = load i64, ptr %77, align 8
%78 = load i32, ptr %abc, align 4
%79 = call i32 @llvm.bswap.i32(i32 %78)
%80 = and i32 65535, %79
%ztrunc53 = trunc i32 %80 to i16
store i16 %ztrunc53, ptr %taddr54, align 2
%81 = insertvalue %variant undef, ptr %taddr54, 0
%82 = insertvalue %variant %81, i64 ptrtoint (ptr @"ct$ushort" to i64), 1
%83 = getelementptr inbounds [1 x %variant], ptr %varargslots52, i64 0, i64 0
store %variant %82, ptr %83, align 16
%84 = getelementptr inbounds %"variant[]", ptr %vararg51, i32 0, i32 1
store i64 1, ptr %84, align 8
%85 = getelementptr inbounds %"variant[]", ptr %vararg51, i32 0, i32 0
store ptr %varargslots52, ptr %85, align 8
%86 = getelementptr inbounds { ptr, i64 }, ptr %vararg51, i32 0, i32 0
%lo55 = load ptr, ptr %86, align 8
%87 = getelementptr inbounds { ptr, i64 }, ptr %vararg51, i32 0, i32 1
%hi56 = load i64, ptr %87, align 8
%88 = call i64 @std_io_printfln(ptr %retparam47, ptr %lo49, i64 %hi50, ptr %lo55, i64 %hi56)
%not_err57 = icmp eq i64 %88, 0
br i1 %not_err57, label %after_check58, label %voiderr59
after_check58: ; preds = %voiderr46
br label %voiderr59
voiderr59: ; preds = %after_check58, %voiderr46
%89 = load ptr, ptr %z, align 8
store ptr %89, ptr %.anon60, align 8
store i64 0, ptr %.anon61, align 8
br label %loop.cond62
loop.cond62: ; preds = %voiderr76, %voiderr59
%90 = load i64, ptr %.anon61, align 8
%gt63 = icmp ugt i64 4, %90
br i1 %gt63, label %loop.body64, label %loop.exit78
loop.body64: ; preds = %loop.cond62
%91 = load ptr, ptr %.anon60, align 8
%92 = load i64, ptr %.anon61, align 8
%93 = getelementptr inbounds [4 x i8], ptr %91, i64 0, i64 %92
%94 = load i8, ptr %93, align 1
store i8 %94, ptr %d65, align 1
store %"char[]" { ptr @.str.7, i64 3 }, ptr %taddr67, align 8
%95 = getelementptr inbounds { ptr, i64 }, ptr %taddr67, i32 0, i32 0
%lo68 = load ptr, ptr %95, align 8
%96 = getelementptr inbounds { ptr, i64 }, ptr %taddr67, i32 0, i32 1
%hi69 = load i64, ptr %96, align 8
%97 = insertvalue %variant undef, ptr %d65, 0
%98 = insertvalue %variant %97, i64 ptrtoint (ptr @"ct$char" to i64), 1
%99 = getelementptr inbounds [1 x %variant], ptr %varargslots71, i64 0, i64 0
store %variant %98, ptr %99, align 16
%100 = getelementptr inbounds %"variant[]", ptr %vararg70, i32 0, i32 1
store i64 1, ptr %100, align 8
%101 = getelementptr inbounds %"variant[]", ptr %vararg70, i32 0, i32 0
store ptr %varargslots71, ptr %101, align 8
%102 = getelementptr inbounds { ptr, i64 }, ptr %vararg70, i32 0, i32 0
%lo72 = load ptr, ptr %102, align 8
%103 = getelementptr inbounds { ptr, i64 }, ptr %vararg70, i32 0, i32 1
%hi73 = load i64, ptr %103, align 8
%104 = call i64 @std_io_printf(ptr %retparam66, ptr %lo68, i64 %hi69, ptr %lo72, i64 %hi73)
%not_err74 = icmp eq i64 %104, 0
br i1 %not_err74, label %after_check75, label %voiderr76
after_check75: ; preds = %loop.body64
br label %voiderr76
voiderr76: ; preds = %after_check75, %loop.body64
%105 = load i64, ptr %.anon61, align 8
%add77 = add i64 %105, 1
store i64 %add77, ptr %.anon61, align 8
br label %loop.cond62
loop.exit78: ; preds = %loop.cond62
%106 = call i32 @std_io_println(ptr @.str.8) #2
store i32 0, ptr %y, align 4
%107 = load i32, ptr %y, align 4
store i32 123, ptr %y, align 4
store %"char[]" { ptr @.str.9, i64 18 }, ptr %taddr80, align 8
%108 = getelementptr inbounds { ptr, i64 }, ptr %taddr80, i32 0, i32 0
%lo81 = load ptr, ptr %108, align 8
%109 = getelementptr inbounds { ptr, i64 }, ptr %taddr80, i32 0, i32 1
%hi82 = load i64, ptr %109, align 8
%110 = insertvalue %variant undef, ptr %y, 0
%111 = insertvalue %variant %110, i64 ptrtoint (ptr @"ct$int" to i64), 1
%112 = getelementptr inbounds [2 x %variant], ptr %varargslots84, i64 0, i64 0
store %variant %111, ptr %112, align 16
%113 = load i32, ptr %y, align 4
store i32 %113, ptr %taddr85, align 4
%114 = insertvalue %variant undef, ptr %taddr85, 0
%115 = insertvalue %variant %114, i64 ptrtoint (ptr @"ct$int" to i64), 1
%116 = getelementptr inbounds [2 x %variant], ptr %varargslots84, i64 0, i64 1
store %variant %115, ptr %116, align 16
%117 = getelementptr inbounds %"variant[]", ptr %vararg83, i32 0, i32 1
store i64 2, ptr %117, align 8
%118 = getelementptr inbounds %"variant[]", ptr %vararg83, i32 0, i32 0
store ptr %varargslots84, ptr %118, align 8
%119 = getelementptr inbounds { ptr, i64 }, ptr %vararg83, i32 0, i32 0
%lo86 = load ptr, ptr %119, align 8
%120 = getelementptr inbounds { ptr, i64 }, ptr %vararg83, i32 0, i32 1
%hi87 = load i64, ptr %120, align 8
%121 = call i64 @std_io_printf(ptr %retparam79, ptr %lo81, i64 %hi82, ptr %lo86, i64 %hi87)
%not_err88 = icmp eq i64 %121, 0
br i1 %not_err88, label %after_check89, label %voiderr90
after_check89: ; preds = %loop.exit78
br label %voiderr90
voiderr90: ; preds = %after_check89, %loop.exit78
ret void
}