// #target: macos-x64 module foo; bitstruct BitFieldCross : uint { uint d : 0..4; int a : 5..22; uint c : 23..31; } bitstruct BitFieldCrossU : int { uint d : 0..4; uint a : 5..22; uint c : 23..31; } bitstruct BitFieldCrossUL : long { uint d : 0..4; uint a : 5..22; uint c : 23..40; uint e : 41..61; } bitstruct BitFieldCrossULBE : long @bigendian { uint d : 0..4; uint a : 5..22; uint c : 23..40; uint e : 41..61; } extern fn void printf(char*, ...); fn void main() { BitFieldCross xx = { 0, -15, 0 }; printf("%d\n", xx.a); xx = { 0x1f, -15, 0x7f }; printf("%d\n", xx.a); BitFieldCrossU xxu = { 0x1f, 0x25678, 0x1ff }; printf("%x\n", xxu.a); BitFieldCrossUL xxy = { 0x1f, 0x25678, 0xeffe, 0xa9597 }; printf("%x, %x, %x\n", xxy.a, xxy.c, xxy.e); BitFieldCrossULBE xxybe = { 0x1f, 0x25678, 0xeffe, 0xa9597 }; printf("%x, %x, %x\n", xxybe.a, xxybe.c, xxybe.e); } /* #expect: foo.ll entry: %xx = alloca i32, align 4 %xxu = alloca i32, align 4 %xxy = alloca i64, align 8 %xxybe = alloca i64, align 8 store i32 8388128, ptr %xx, align 4 %0 = load i32, ptr %xx, align 4 %1 = shl i32 %0, 9 %2 = ashr i32 %1, 14 call void (ptr, ...) @printf(ptr @.str, i32 %2) store i32 1073741375, ptr %xx, align 4 %3 = load i32, ptr %xx, align 4 %4 = shl i32 %3, 9 %5 = ashr i32 %4, 14 call void (ptr, ...) @printf(ptr @.str.1, i32 %5) store i32 -3485921, ptr %xxu, align 4 %6 = load i32, ptr %xxu, align 4 %7 = lshr i32 %6, 5 %8 = and i32 262143, %7 call void (ptr, ...) @printf(ptr @.str.2, i32 %8) store i64 1525363991714123551, ptr %xxy, align 8 %9 = load i64, ptr %xxy, align 8 %10 = lshr i64 %9, 5 %11 = and i64 262143, %10 %12 = trunc i64 %11 to i32 %13 = load i64, ptr %xxy, align 8 %14 = lshr i64 %13, 23 %15 = and i64 262143, %14 %16 = trunc i64 %15 to i32 %17 = load i64, ptr %xxy, align 8 %18 = lshr i64 %17, 41 %19 = and i64 2097151, %18 %20 = trunc i64 %19 to i32 call void (ptr, ...) @printf(ptr @.str.3, i32 %12, i32 %16, i32 %20) store i64 2292133196431502101, ptr %xxybe, align 8 %21 = load i64, ptr %xxybe, align 8 %22 = call i64 @llvm.bswap.i64(i64 %21) %23 = lshr i64 %22, 5 %24 = and i64 262143, %23 %25 = trunc i64 %24 to i32 %26 = load i64, ptr %xxybe, align 8 %27 = call i64 @llvm.bswap.i64(i64 %26) %28 = lshr i64 %27, 23 %29 = and i64 262143, %28 %30 = trunc i64 %29 to i32 %31 = load i64, ptr %xxybe, align 8 %32 = call i64 @llvm.bswap.i64(i64 %31) %33 = lshr i64 %32, 41 %34 = and i64 2097151, %33 %35 = trunc i64 %34 to i32 call void (ptr, ...) @printf(ptr @.str.4, i32 %25, i32 %30, i32 %35) ret void }