blob: 8357a7337cc012b3b3e63176f1916595e6100764 [file] [log] [blame]
//===--- bits.h --- Test The bit_select builtin ---------------------------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//
//
// This header file contains some type and macro definitiosn useful for working
// with bit accurate types and the bitwise builtins
//
//===----------------------------------------------------------------------===//
#include <stdio.h>
#include <stdlib.h>
typedef unsigned int __attribute__((bitwidth(1))) uint1;
typedef unsigned int __attribute__((bitwidth(2))) uint2;
typedef unsigned int __attribute__((bitwidth(3))) uint3;
typedef unsigned int __attribute__((bitwidth(4))) uint4;
typedef unsigned int __attribute__((bitwidth(5))) uint5;
typedef unsigned int __attribute__((bitwidth(6))) uint6;
typedef unsigned int __attribute__((bitwidth(7))) uint7;
typedef unsigned int __attribute__((bitwidth(8))) uint8;
typedef unsigned int __attribute__((bitwidth(9))) uint9;
typedef unsigned int __attribute__((bitwidth(10))) uint10;
typedef unsigned int __attribute__((bitwidth(16))) uint16;
typedef unsigned int __attribute__((bitwidth(17))) uint17;
typedef unsigned int __attribute__((bitwidth(19))) uint19;
typedef unsigned int __attribute__((bitwidth(21))) uint21;
typedef unsigned int __attribute__((bitwidth(25))) uint25;
typedef unsigned int __attribute__((bitwidth(17))) uint32;
typedef unsigned int __attribute__((bitwidth(36))) uint36;
typedef unsigned int __attribute__((bitwidth(39))) uint39;
typedef unsigned int __attribute__((bitwidth(47))) uint47;
typedef unsigned int __attribute__((bitwidth(48))) uint48;
typedef unsigned int __attribute__((bitwidth(54))) uint54;
typedef unsigned int __attribute__((bitwidth(60))) uint60;
typedef unsigned int __attribute__((bitwidth(63))) uint63;
typedef unsigned int __attribute__((bitwidth(64))) uint64;
typedef unsigned int __attribute__((bitwidth(65))) uint65;
typedef unsigned int __attribute__((bitwidth(68))) uint68;
typedef unsigned int __attribute__((bitwidth(69))) uint69;
typedef unsigned int __attribute__((bitwidth(128))) uint128;
typedef unsigned int __attribute__((bitwidth(169))) uint169;
typedef unsigned int __attribute__((bitwidth(250))) uint250;
typedef unsigned int __attribute__((bitwidth(256))) uint256;
typedef unsigned int __attribute__((bitwidth(500))) uint500;
typedef unsigned int __attribute__((bitwidth(512))) uint512;
typedef unsigned int __attribute__((bitwidth(768))) uint768;
typedef unsigned int __attribute__((bitwidth(1000))) uint1000;
typedef unsigned int __attribute__((bitwidth(1024))) uint1024;
typedef int __attribute__((bitwidth(3))) int3;
typedef int __attribute__((bitwidth(8))) int8;
typedef int __attribute__((bitwidth(9))) int9;
typedef int __attribute__((bitwidth(10))) int10;
typedef int __attribute__((bitwidth(21))) int21;
typedef int __attribute__((bitwidth(24))) int24;
typedef int __attribute__((bitwidth(32))) int32;
typedef int __attribute__((bitwidth(33))) int33;
typedef int __attribute__((bitwidth(54))) int54;
typedef int __attribute__((bitwidth(63))) int63;
typedef int __attribute__((bitwidth(68))) int68;
typedef int __attribute__((bitwidth(69))) int69;
typedef int __attribute__((bitwidth(128))) int128;
typedef int __attribute__((bitwidth(169))) int169;
typedef int __attribute__((bitwidth(250))) int250;
typedef int __attribute__((bitwidth(256))) int256;
typedef int __attribute__((bitwidth(500))) int500;
typedef int __attribute__((bitwidth(512))) int512;
typedef int __attribute__((bitwidth(768))) int768;
typedef int __attribute__((bitwidth(1000))) int1000;
typedef int __attribute__((bitwidth(1024))) int1024;
#define bitwidthof(TORV) (__bitwidthof__(typeof(TORV)))
#define bit_concat(X, Y) ({ \
unsigned int __attribute__((bitwidth(__bitwidthof__(X)+__bitwidthof__(Y)))) R; \
typeof(X) X2 = X; \
typeof(Y) Y2 = Y; \
__builtin_bit_concat(&R, &X2, &Y2); \
R; \
})
#define bit_select(Val, Bit) ({ \
typeof(Val) Val2 = Val; \
__builtin_bit_select(&Val2, Bit); \
})
#define bit_set(Val, Repl, Bit) ({ \
typeof(Val) Result = 0; \
typeof(Val) Val2 = Val; \
typeof(Repl) Repl2 = Repl; \
__builtin_bit_set(&Result, &Val2, &Repl2, Bit); \
Result; \
})
#define part_select(Val, Lo, Hi) ({ \
typeof(Val) Result = 0; \
typeof(Val) Val2 = Val; \
__builtin_bit_part_select(&Result, &Val2, Lo, Hi); \
Result; \
})
#define part_set(Val, Repl, Lo, Hi) ({ \
typeof(Val) Result = 0; \
typeof(Val) Val2 = Val; \
typeof(Repl) Repl2 = Repl; \
__builtin_bit_part_set(&Result, &Val2, &Repl2, Lo, Hi); \
Result; \
})
#define reduce(how, what) ({ \
typeof(what) what2 = what; \
__builtin_bit_ ## how ## _reduce(&what2); \
})
#define printBits(val) { \
int bit = bitwidthof(val); \
for ( ; bit > 0; --bit) { \
if (bit_select(val, bit-1)) \
putchar('1'); \
else \
putchar('0'); \
} \
}
#define bitsFromString(str,bits) ({ \
int __attribute__((bitwidth(bits))) Result; \
__builtin_bit_from_string(&Result, str, 10); \
Result; \
})
#define bitsFromHexString(str,bits) ({ \
int __attribute__((bitwidth(bits))) Result; \
__builtin_bit_from_string(&Result, str, 16); \
Result; \
})
#define bitsFromOctalString(str,bits) ({ \
int __attribute__((bitwidth(bits))) Result; \
__builtin_bit_from_string(&Result, str, 8); \
Result; \
})
#define bitsFromBinaryString(str,bits) ({ \
int __attribute__((bitwidth(bits))) Result; \
__builtin_bit_from_string(&Result, str, 2); \
Result; \
})