Zig 0.17.0-dev (Split by item)

This is an example of documentation generated by ZigDoc, an alternative to Zig's built-in Auto Doc feature. See also examples in other modes/formats. The project being documented here (as the example) is the Zig library itself.

__hexagon_muldf3

hexagon.__hexagon_muldf3
fn __hexagon_muldf3() align(32) callconv(.naked) noreturn

File

lib/compiler_rt/hexagon.zig:1192

Code

fn __hexagon_muldf3() align(32) callconv(.naked) noreturn {
    asm volatile (
        \\  {
        \\   p0 = dfclass(r1:0,#2)
        \\   p0 = dfclass(r3:2,#2)
        \\   r13:12 = combine(##0x40000000,#0)
        \\  }
        \\  {
        \\   r13:12 = insert(r1:0,#52,#11 -1)
        \\   r5:4 = asl(r3:2,#11 -1)
        \\   r28 = #-1024
        \\   r9:8 = #1
        \\  }
        \\  {
        \\   r7:6 = mpyu(r4,r13)
        \\   r5:4 = insert(r9:8,#2,#62)
        \\  }
        \\
        \\
        \\
        \\
        \\  {
        \\   r15:14 = mpyu(r12,r4)
        \\   r7:6 += mpyu(r12,r5)
        \\  }
        \\  {
        \\   r7:6 += lsr(r15:14,#32)
        \\   r11:10 = mpyu(r13,r5)
        \\   r5:4 = combine(##1024 +1024 -4,#0)
        \\  }
        \\  {
        \\   r11:10 += lsr(r7:6,#32)
        \\   if (!p0) jump .Lmul_abnormal
        \\   p1 = cmp.eq(r14,#0)
        \\   p1 = cmp.eq(r6,#0)
        \\  }
        \\  {
        \\   if (!p1) r10 = or(r10,r8)
        \\   r6 = extractu(r1,#11,#20)
        \\   r7 = extractu(r3,#11,#20)
        \\  }
        \\  {
        \\   r15:14 = neg(r11:10)
        \\   r6 += add(r28,r7)
        \\   r28 = xor(r1,r3)
        \\  }
        \\  {
        \\   if (!p2.new) r11:10 = r15:14
        \\   p2 = cmp.gt(r28,#-1)
        \\   p0 = !cmp.gt(r6,r5)
        \\   p0 = cmp.gt(r6,r4)
        \\   if (!p0.new) jump:nt .Lmul_ovf_unf
        \\  }
        \\  {
        \\   r1:0 = convert_d2df(r11:10)
        \\   r6 = add(r6,#-1024 -58)
        \\  }
        \\  {
        \\   r1 += asl(r6,#20)
        \\   jumpr r31
        \\  }
        \\
        \\  .falign
        \\ .Lmul_possible_unf:
        \\  {
        \\   p0 = cmp.eq(r0,#0)
        \\   p0 = bitsclr(r1,r4)
        \\   if (!p0.new) jumpr:t r31
        \\   r5 = #0x7fff
        \\  }
        \\  {
        \\   p0 = bitsset(r13,r5)
        \\   r4 = USR
        \\   r5 = #0x030
        \\  }
        \\  {
        \\   if (p0) r4 = or(r4,r5)
        \\  }
        \\  {
        \\   USR = r4
        \\  }
        \\  {
        \\   p0 = dfcmp.eq(r1:0,r1:0)
        \\   jumpr r31
        \\  }
        \\  .falign
        \\ .Lmul_ovf_unf:
        \\  {
        \\   r1:0 = convert_d2df(r11:10)
        \\   r13:12 = abs(r11:10)
        \\   r7 = add(r6,#-1024 -58)
        \\  }
        \\  {
        \\   r1 += asl(r7,#20)
        \\   r7 = extractu(r1,#11,#20)
        \\   r4 = ##0x7FEFFFFF
        \\  }
        \\  {
        \\   r7 += add(r6,##-1024 -58)
        \\
        \\   r5 = #0
        \\  }
        \\  {
        \\   p0 = cmp.gt(r7,##1024 +1024 -2)
        \\   if (p0.new) jump:nt .Lmul_ovf
        \\  }
        \\  {
        \\   p0 = cmp.gt(r7,#0)
        \\   if (p0.new) jump:nt .Lmul_possible_unf
        \\   r5 = sub(r6,r5)
        \\   r28 = #63
        \\  }
        \\  {
        \\   r4 = #0
        \\   r5 = sub(#5,r5)
        \\  }
        \\  {
        \\   p3 = cmp.gt(r11,#-1)
        \\   r5 = min(r5,r28)
        \\   r11:10 = r13:12
        \\  }
        \\  {
        \\   r28 = USR
        \\   r15:14 = extractu(r11:10,r5:4)
        \\  }
        \\  {
        \\   r11:10 = asr(r11:10,r5)
        \\   r4 = #0x0030
        \\   r1 = insert(r9,#11,#20)
        \\  }
        \\  {
        \\   p0 = cmp.gtu(r9:8,r15:14)
        \\   if (!p0.new) r10 = or(r10,r8)
        \\   r11 = setbit(r11,#20 +3)
        \\  }
        \\  {
        \\   r15:14 = neg(r11:10)
        \\   p1 = bitsclr(r10,#0x7)
        \\   if (!p1.new) r28 = or(r4,r28)
        \\  }
        \\  {
        \\   if (!p3) r11:10 = r15:14
        \\   USR = r28
        \\  }
        \\  {
        \\   r1:0 = convert_d2df(r11:10)
        \\   p0 = dfcmp.eq(r1:0,r1:0)
        \\  }
        \\  {
        \\   r1 = insert(r9,#11 -1,#20 +1)
        \\   jumpr r31
        \\  }
        \\  .falign
        \\ .Lmul_ovf:
        \\
        \\  {
        \\   r28 = USR
        \\   r13:12 = combine(##0x7fefffff,#-1)
        \\   r1:0 = r11:10
        \\  }
        \\  {
        \\   r14 = extractu(r28,#2,#22)
        \\   r28 = or(r28,#0x28)
        \\   r5:4 = combine(##0x7ff00000,#0)
        \\  }
        \\  {
        \\   USR = r28
        \\   r14 ^= lsr(r1,#31)
        \\   r28 = r14
        \\  }
        \\  {
        \\   p0 = !cmp.eq(r28,#1)
        \\   p0 = !cmp.eq(r14,#2)
        \\   if (p0.new) r13:12 = r5:4
        \\   p0 = dfcmp.eq(r1:0,r1:0)
        \\  }
        \\  {
        \\   r1:0 = insert(r13:12,#63,#0)
        \\   jumpr r31
        \\  }
        \\
        \\ .Lmul_abnormal:
        \\  {
        \\   r13:12 = extractu(r1:0,#63,#0)
        \\   r5:4 = extractu(r3:2,#63,#0)
        \\  }
        \\  {
        \\   p3 = cmp.gtu(r13:12,r5:4)
        \\   if (!p3.new) r1:0 = r3:2
        \\   if (!p3.new) r3:2 = r1:0
        \\  }
        \\  {
        \\
        \\   p0 = dfclass(r1:0,#0x0f)
        \\   if (!p0.new) jump:nt .Linvalid_nan
        \\   if (!p3) r13:12 = r5:4
        \\   if (!p3) r5:4 = r13:12
        \\  }
        \\  {
        \\
        \\   p1 = dfclass(r1:0,#0x08)
        \\   p1 = dfclass(r3:2,#0x0e)
        \\  }
        \\  {
        \\
        \\
        \\   p0 = dfclass(r1:0,#0x08)
        \\   p0 = dfclass(r3:2,#0x01)
        \\  }
        \\  {
        \\   if (p1) jump .Ltrue_inf
        \\   p2 = dfclass(r3:2,#0x01)
        \\  }
        \\  {
        \\   if (p0) jump .Linvalid_zeroinf
        \\   if (p2) jump .Ltrue_zero
        \\   r28 = ##0x7c000000
        \\  }
        \\
        \\
        \\
        \\
        \\
        \\  {
        \\   p0 = bitsclr(r1,r28)
        \\   if (p0.new) jump:nt .Lmul_tiny
        \\  }
        \\  {
        \\   r28 = cl0(r5:4)
        \\  }
        \\  {
        \\   r28 = add(r28,#-11)
        \\  }
        \\  {
        \\   r5:4 = asl(r5:4,r28)
        \\  }
        \\  {
        \\   r3:2 = insert(r5:4,#63,#0)
        \\   r1 -= asl(r28,#20)
        \\  }
        \\  jump __hexagon_muldf3
        \\ .Lmul_tiny:
        \\  {
        \\   r28 = USR
        \\   r1:0 = xor(r1:0,r3:2)
        \\  }
        \\  {
        \\   r28 = or(r28,#0x30)
        \\   r1:0 = insert(r9:8,#63,#0)
        \\   r5 = extractu(r28,#2,#22)
        \\  }
        \\  {
        \\   USR = r28
        \\   p0 = cmp.gt(r5,#1)
        \\   if (!p0.new) r0 = #0
        \\   r5 ^= lsr(r1,#31)
        \\  }
        \\  {
        \\   p0 = cmp.eq(r5,#3)
        \\   if (!p0.new) r0 = #0
        \\   jumpr r31
        \\  }
        \\ .Linvalid_zeroinf:
        \\  {
        \\   r28 = USR
        \\  }
        \\  {
        \\   r1:0 = #-1
        \\   r28 = or(r28,#2)
        \\  }
        \\  {
        \\   USR = r28
        \\  }
        \\  {
        \\   p0 = dfcmp.uo(r1:0,r1:0)
        \\   jumpr r31
        \\  }
        \\ .Linvalid_nan:
        \\  {
        \\   p0 = dfclass(r3:2,#0x0f)
        \\   r28 = convert_df2sf(r1:0)
        \\   if (p0.new) r3:2 = r1:0
        \\  }
        \\  {
        \\   r2 = convert_df2sf(r3:2)
        \\   r1:0 = #-1
        \\   jumpr r31
        \\  }
        \\  .falign
        \\ .Ltrue_zero:
        \\  {
        \\   r1:0 = r3:2
        \\   r3:2 = r1:0
        \\  }
        \\ .Ltrue_inf:
        \\  {
        \\   r3 = extract(r3,#1,#31)
        \\  }
        \\  {
        \\   r1 ^= asl(r3,#31)
        \\   jumpr r31
        \\  }
    );
}