|
const std = @import("std"); |
__builtin_bswap16()returns a quiet NaN. Quiet NaNs have many representations; tagp is used to select one in an implementation-defined way. This implementation is based on the description for __builtin_nan provided in the GCC docs at https://gcc.gnu.org/onlinedocs/gcc/Other-Builtins.html#index-_005f_005fbuiltin_005fnan Comment is reproduced below: Since ISO C99 defines this function in terms of strtod, which we do not implement, a description of the parsing is in order. The string is parsed as by strtol; that is, the base is recognized by leading ‘0’ or ‘0x’ prefixes. The number parsed is placed in the significand such that the least significant bit of the number is at the least significant bit of the significand. The number is truncated to fit the significand field provided. The significand is forced to be a quiet NaN. If tagp contains any non-numeric characters, the function returns a NaN whose significand is zero. If tagp is empty, the function returns a NaN whose significand is zero. |
pub inline fn __builtin_bswap16(val: u16) u16 { return @byteSwap(val); } |
__builtin_bswap32()Similar to isinf, except the return value is -1 for an argument of -Inf and 1 for an argument of +Inf. |
pub inline fn __builtin_bswap32(val: u32) u32 { return @byteSwap(val); } |
__builtin_bswap64() |
pub inline fn __builtin_bswap64(val: u64) u64 { return @byteSwap(val); } |
__builtin_signbit() |
pub inline fn __builtin_signbit(val: f64) c_int { return @intFromBool(std.math.signbit(val)); } |
__builtin_signbitf() |
pub inline fn __builtin_signbitf(val: f32) c_int { return @intFromBool(std.math.signbit(val)); } |
__builtin_popcount() |
pub inline fn __builtin_popcount(val: c_uint) c_int { // popcount of a c_uint will never exceed the capacity of a c_int @setRuntimeSafety(false); return @as(c_int, @bitCast(@as(c_uint, @popCount(val)))); } |
__builtin_ctz() |
pub inline fn __builtin_ctz(val: c_uint) c_int { // Returns the number of trailing 0-bits in val, starting at the least significant bit position. // In C if `val` is 0, the result is undefined; in zig it's the number of bits in a c_uint @setRuntimeSafety(false); return @as(c_int, @bitCast(@as(c_uint, @ctz(val)))); } |
__builtin_clz() |
pub inline fn __builtin_clz(val: c_uint) c_int { // Returns the number of leading 0-bits in x, starting at the most significant bit position. // In C if `val` is 0, the result is undefined; in zig it's the number of bits in a c_uint @setRuntimeSafety(false); return @as(c_int, @bitCast(@as(c_uint, @clz(val)))); } |
__builtin_sqrt() |
pub inline fn __builtin_sqrt(val: f64) f64 { return @sqrt(val); } |
__builtin_sqrtf() |
pub inline fn __builtin_sqrtf(val: f32) f32 { return @sqrt(val); } |
__builtin_sin() |
pub inline fn __builtin_sin(val: f64) f64 { return @sin(val); } |
__builtin_sinf() |
pub inline fn __builtin_sinf(val: f32) f32 { return @sin(val); } |
__builtin_cos() |
pub inline fn __builtin_cos(val: f64) f64 { return @cos(val); } |
__builtin_cosf() |
pub inline fn __builtin_cosf(val: f32) f32 { return @cos(val); } |
__builtin_exp() |
pub inline fn __builtin_exp(val: f64) f64 { return @exp(val); } |
__builtin_expf() |
pub inline fn __builtin_expf(val: f32) f32 { return @exp(val); } |
__builtin_exp2() |
pub inline fn __builtin_exp2(val: f64) f64 { return @exp2(val); } |
__builtin_exp2f() |
pub inline fn __builtin_exp2f(val: f32) f32 { return @exp2(val); } |
__builtin_log() |
pub inline fn __builtin_log(val: f64) f64 { return @log(val); } |
__builtin_logf() |
pub inline fn __builtin_logf(val: f32) f32 { return @log(val); } |
__builtin_log2() |
pub inline fn __builtin_log2(val: f64) f64 { return @log2(val); } |
__builtin_log2f() |
pub inline fn __builtin_log2f(val: f32) f32 { return @log2(val); } |
__builtin_log10() |
pub inline fn __builtin_log10(val: f64) f64 { return @log10(val); } |
__builtin_log10f() |
pub inline fn __builtin_log10f(val: f32) f32 { return @log10(val); } |
__builtin_abs() |
// Standard C Library bug: The absolute value of the most negative integer remains negative. pub inline fn __builtin_abs(val: c_int) c_int { return if (val == std.math.minInt(c_int)) val else @intCast(@abs(val)); } |
__builtin_labs() |
pub inline fn __builtin_labs(val: c_long) c_long { return if (val == std.math.minInt(c_long)) val else @intCast(@abs(val)); } |
__builtin_llabs() |
pub inline fn __builtin_llabs(val: c_longlong) c_longlong { return if (val == std.math.minInt(c_longlong)) val else @intCast(@abs(val)); } |
__builtin_fabs() |
pub inline fn __builtin_fabs(val: f64) f64 { return @abs(val); } |
__builtin_fabsf() |
pub inline fn __builtin_fabsf(val: f32) f32 { return @abs(val); } |
__builtin_floor() |
pub inline fn __builtin_floor(val: f64) f64 { return @floor(val); } |
__builtin_floorf() |
pub inline fn __builtin_floorf(val: f32) f32 { return @floor(val); } |
__builtin_ceil() |
pub inline fn __builtin_ceil(val: f64) f64 { return @ceil(val); } |
__builtin_ceilf() |
pub inline fn __builtin_ceilf(val: f32) f32 { return @ceil(val); } |
__builtin_trunc() |
pub inline fn __builtin_trunc(val: f64) f64 { return @trunc(val); } |
__builtin_truncf() |
pub inline fn __builtin_truncf(val: f32) f32 { return @trunc(val); } |
__builtin_round() |
pub inline fn __builtin_round(val: f64) f64 { return @round(val); } |
__builtin_roundf() |
pub inline fn __builtin_roundf(val: f32) f32 { return @round(val); } |
__builtin_strlen() |
pub inline fn __builtin_strlen(s: [*c]const u8) usize { return std.mem.sliceTo(s, 0).len; } |
__builtin_strcmp() |
pub inline fn __builtin_strcmp(s1: [*c]const u8, s2: [*c]const u8) c_int { return switch (std.mem.orderZ(u8, s1, s2)) { .lt => -1, .eq => 0, .gt => 1, }; } |
__builtin_object_size() |
pub inline fn __builtin_object_size(ptr: ?*const anyopaque, ty: c_int) usize { _ = ptr; // clang semantics match gcc's: https://gcc.gnu.org/onlinedocs/gcc/Object-Size-Checking.html // If it is not possible to determine which objects ptr points to at compile time, // __builtin_object_size should return (size_t) -1 for type 0 or 1 and (size_t) 0 // for type 2 or 3. if (ty == 0 or ty == 1) return @as(usize, @bitCast(-@as(isize, 1))); if (ty == 2 or ty == 3) return 0; unreachable; } |
__builtin___memset_chk() |
pub inline fn __builtin___memset_chk( dst: ?*anyopaque, val: c_int, len: usize, remaining: usize, |
__builtin_memset() |
) ?*anyopaque { if (len > remaining) @panic("std.c.builtins.memset_chk called with len > remaining"); return __builtin_memset(dst, val, len); } |
__builtin___memcpy_chk() |
pub inline fn __builtin_memset(dst: ?*anyopaque, val: c_int, len: usize) ?*anyopaque { const dst_cast = @as([*c]u8, @ptrCast(dst)); @memset(dst_cast[0..len], @as(u8, @bitCast(@as(i8, @truncate(val))))); return dst; } |
__builtin_memcpy() |
pub inline fn __builtin___memcpy_chk( noalias dst: ?*anyopaque, noalias src: ?*const anyopaque, len: usize, remaining: usize, ) ?*anyopaque { if (len > remaining) @panic("std.c.builtins.memcpy_chk called with len > remaining"); return __builtin_memcpy(dst, src, len); } |
__builtin_expect() |
pub inline fn __builtin_memcpy( noalias dst: ?*anyopaque, noalias src: ?*const anyopaque, len: usize, ) ?*anyopaque { if (len > 0) @memcpy( @as([*]u8, @ptrCast(dst.?))[0..len], @as([*]const u8, @ptrCast(src.?)), ); return dst; } |
__builtin_nanf() |
/// The return value of __builtin_expect is `expr`. `c` is the expected value /// of `expr` and is used as a hint to the compiler in C. Here it is unused. pub inline fn __builtin_expect(expr: c_long, c: c_long) c_long { _ = c; return expr; } |
__builtin_huge_valf() |
/// returns a quiet NaN. Quiet NaNs have many representations; tagp is used to select one in an /// implementation-defined way. /// This implementation is based on the description for __builtin_nan provided in the GCC docs at /// https://gcc.gnu.org/onlinedocs/gcc/Other-Builtins.html#index-_005f_005fbuiltin_005fnan /// Comment is reproduced below: /// Since ISO C99 defines this function in terms of strtod, which we do not implement, a description /// of the parsing is in order. /// The string is parsed as by strtol; that is, the base is recognized by leading ‘0’ or ‘0x’ prefixes. /// The number parsed is placed in the significand such that the least significant bit of the number is /// at the least significant bit of the significand. /// The number is truncated to fit the significand field provided. /// The significand is forced to be a quiet NaN. /// /// If tagp contains any non-numeric characters, the function returns a NaN whose significand is zero. /// If tagp is empty, the function returns a NaN whose significand is zero. pub inline fn __builtin_nanf(tagp: []const u8) f32 { const parsed = std.fmt.parseUnsigned(c_ulong, tagp, 0) catch 0; const bits: u23 = @truncate(parsed); // single-precision float trailing significand is 23 bits return @bitCast(@as(u32, bits) | @as(u32, @bitCast(std.math.nan(f32)))); } |
__builtin_inff() |
pub inline fn __builtin_huge_valf() f32 { return std.math.inf(f32); } |
__builtin_isnan() |
pub inline fn __builtin_inff() f32 { return std.math.inf(f32); } |
__builtin_isinf() |
pub inline fn __builtin_isnan(x: anytype) c_int { return @intFromBool(std.math.isNan(x)); } |
__builtin_isinf_sign() |
pub inline fn __builtin_isinf(x: anytype) c_int { return @intFromBool(std.math.isInf(x)); } |
__has_builtin() |
/// Similar to isinf, except the return value is -1 for an argument of -Inf and 1 for an argument of +Inf. pub inline fn __builtin_isinf_sign(x: anytype) c_int { if (!std.math.isInf(x)) return 0; return if (std.math.isPositiveInf(x)) 1 else -1; } |
__builtin_assume() |
pub inline fn __has_builtin(func: anytype) c_int { _ = func; return @intFromBool(true); } |
__builtin_unreachable() |
pub inline fn __builtin_assume(cond: bool) void { if (!cond) unreachable; } |
__builtin_constant_p() |
pub inline fn __builtin_unreachable() noreturn { unreachable; } |
__builtin_mul_overflow() |
pub inline fn __builtin_constant_p(expr: anytype) c_int { _ = expr; return @intFromBool(false); } pub fn __builtin_mul_overflow(a: anytype, b: anytype, result: *@TypeOf(a, b)) c_int { const res = @mulWithOverflow(a, b); result.* = res[0]; return res[1]; } // __builtin_alloca_with_align is not currently implemented. // It is used in a run-translated-c test and a test-translate-c test to ensure that non-implemented // builtins are correctly demoted. If you implement __builtin_alloca_with_align, please update the // run-translated-c test and the test-translate-c test to use a different non-implemented builtin. // pub inline fn __builtin_alloca_with_align(size: usize, alignment: usize) *anyopaque {} |
Generated by zstd-live on 2025-08-12 12:37:55 UTC. |