// File: sundale[P]gcode/rs274ngc/interp_convert.cc
// Function: Interp::convert_savehome(int, block_struct*, setup_struct*)
int Interp::convert_savehome(int code, block_pointer block, setup_pointer s) {
    double *p = s->parameters;
    
    if(s->cutter_comp_side != OFF) {
        ERS("Cannot set reference point with cutter compensation in effect");
    }

    double x = PROGRAM_TO_USER_LEN(s->current_x + s->tool_offset.tran.x + s->origin_offset_x + s->axis_offset_x);
    double y = PROGRAM_TO_USER_LEN(s->current_y + s->tool_offset.tran.y + s->origin_offset_y + s->axis_offset_y);
    double z = PROGRAM_TO_USER_LEN(s->current_z + s->tool_offset.tran.z + s->origin_offset_z + s->axis_offset_z);
    double a = PROGRAM_TO_USER_ANG(s->AA_current + s->tool_offset.a + s->AA_origin_offset + s->AA_axis_offset);
    double b = PROGRAM_TO_USER_ANG(s->BB_current + s->tool_offset.b + s->BB_origin_offset + s->BB_axis_offset);
    double c = PROGRAM_TO_USER_ANG(s->CC_current + s->tool_offset.c + s->CC_origin_offset + s->CC_axis_offset);
    double u = PROGRAM_TO_USER_LEN(s->u_current + s->tool_offset.u + s->u_origin_offset + s->u_axis_offset);
    double v = PROGRAM_TO_USER_LEN(s->v_current + s->tool_offset.v + s->v_origin_offset + s->v_axis_offset);
    double w = PROGRAM_TO_USER_LEN(s->w_current + s->tool_offset.w + s->w_origin_offset + s->w_axis_offset);

    if(s->a_axis_wrapped) {
        a = fmod(a, 360.0);
        if(a<0) a += 360.0;
    }

    if(s->b_axis_wrapped) {
        b = fmod(b, 360.0);
        if(b<0) b += 360.0;
    }

    if(s->c_axis_wrapped) {
        c = fmod(c, 360.0);
        if(c<0) c += 360.0;
    }

    if(code == G_28_1) {
        p[5161] = x;
        p[5162] = y;
        p[5163] = z;
        p[5164] = a;
        p[5165] = b;
        p[5166] = c;
        p[5167] = u;
        p[5168] = v;
        p[5169] = w;
    } else if(code == G_30_1) {
        p[5181] = x;
        p[5182] = y;
        p[5183] = z;
        p[5184] = a;
        p[5185] = b;
        p[5186] = c;
        p[5187] = u;
        p[5188] = v;
        p[5189] = w;
    } else {
        ERS("BUG: Code not G28.1 or G38.1");
    }
    return INTERP_OK;
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x190, %rsp            # imm = 0x190
movq %rdi, -0x10(%rbp)
movl %esi, -0x14(%rbp)
movq %rdx, -0x20(%rbp)
movq %rcx, -0x28(%rbp)
movq -0x10(%rbp), %rax
movq %rax, -0x80(%rbp)
movq -0x28(%rbp), %rax
addq $0x17c0, %rax           # imm = 0x17C0
movq %rax, -0x30(%rbp)
movq -0x28(%rbp), %rax
cmpl $0x0, 0x624(%rax)
je 0x2510e
jmp 0x25043
movq -0x80(%rbp), %rdi
leaq 0x55351(%rip), %rsi     # 0x7a39f
movb $0x0, %al
callq 0x10df0
movq 0x61f04(%rip), %rax     # 0x86f60
movl $0x0, 0xd670(%rax)
movq 0x61ef3(%rip), %rax     # 0x86f60
movslq 0xd670(%rax), %rax
movq 0x61ee5(%rip), %rdi     # 0x86f60
addq $0xc6d0, %rdi           # imm = 0xC6D0
imulq $0x50, %rax, %rax
addq %rax, %rdi
leaq 0x5534d(%rip), %rsi     # 0x7a3dd
movl $0x50, %edx
callq 0x10840
movq 0x61ebf(%rip), %rax     # 0x86f60
movslq 0xd670(%rax), %rcx
movq 0x61eb1(%rip), %rax     # 0x86f60
addq $0xc6d0, %rax           # imm = 0xC6D0
imulq $0x50, %rcx, %rcx
addq %rcx, %rax
movb $0x0, 0x4f(%rax)
movq 0x61e99(%rip), %rax     # 0x86f60
movl 0xd670(%rax), %ecx
addl $0x1, %ecx
movq 0x61e89(%rip), %rax     # 0x86f60
movl %ecx, 0xd670(%rax)
movq 0x61e7c(%rip), %rax     # 0x86f60
movslq 0xd670(%rax), %rcx
movq 0x61e6e(%rip), %rax     # 0x86f60
addq $0xc6d0, %rax           # imm = 0xC6D0
imulq $0x50, %rcx, %rcx
addq %rcx, %rax
movb $0x0, (%rax)
movl $0x5, -0x4(%rbp)
jmp 0x25a05
movq -0x28(%rbp), %rax
movsd 0x600(%rax), %xmm0
movq -0x28(%rbp), %rax
addsd 0xd678(%rax), %xmm0
movq -0x28(%rbp), %rax
addsd 0x17a0(%rax), %xmm0
movq -0x28(%rbp), %rax
addsd 0x118(%rax), %xmm0
movsd %xmm0, -0x88(%rbp)
movq 0x61e13(%rip), %rax     # 0x86f60
cmpl $0x1, 0x1690(%rax)
jne 0x25168
movsd 0x53cea(%rip), %xmm0    # 0x78e48
movsd %xmm0, -0x90(%rbp)
jmp 0x251ba
movq 0x61df1(%rip), %rax     # 0x86f60
movl 0x1690(%rax), %eax
movsd 0x53cc3(%rip), %xmm0    # 0x78e40
movsd 0x53c8b(%rip), %xmm1    # 0x78e10
movsd %xmm1, -0xa0(%rbp)
cmpl $0x3, %eax
movsd %xmm0, -0x98(%rbp)
je 0x251aa
movsd -0xa0(%rbp), %xmm0
movsd %xmm0, -0x98(%rbp)
movsd -0x98(%rbp), %xmm0
movsd %xmm0, -0x90(%rbp)
movsd -0x88(%rbp), %xmm0
movsd -0x90(%rbp), %xmm1
mulsd %xmm1, %xmm0
movsd %xmm0, -0xb0(%rbp)
callq 0x11030
movaps %xmm0, %xmm1
movsd -0xb0(%rbp), %xmm0
mulsd %xmm1, %xmm0
movsd %xmm0, -0x38(%rbp)
movq -0x28(%rbp), %rax
movsd 0x608(%rax), %xmm0
movq -0x28(%rbp), %rax
addsd 0xd680(%rax), %xmm0
movq -0x28(%rbp), %rax
addsd 0x17a8(%rax), %xmm0
movq -0x28(%rbp), %rax
addsd 0x120(%rax), %xmm0
movsd %xmm0, -0xa8(%rbp)
movq 0x61d32(%rip), %rax     # 0x86f60
cmpl $0x1, 0x1690(%rax)
jne 0x25249
movsd 0x53c09(%rip), %xmm0    # 0x78e48
movsd %xmm0, -0xb8(%rbp)
jmp 0x2529b
movq 0x61d10(%rip), %rax     # 0x86f60
movl 0x1690(%rax), %eax
movsd 0x53be2(%rip), %xmm0    # 0x78e40
movsd 0x53baa(%rip), %xmm1    # 0x78e10
movsd %xmm1, -0xc8(%rbp)
cmpl $0x3, %eax
movsd %xmm0, -0xc0(%rbp)
je 0x2528b
movsd -0xc8(%rbp), %xmm0
movsd %xmm0, -0xc0(%rbp)
movsd -0xc0(%rbp), %xmm0
movsd %xmm0, -0xb8(%rbp)
movsd -0xa8(%rbp), %xmm0
movsd -0xb8(%rbp), %xmm1
mulsd %xmm1, %xmm0
movsd %xmm0, -0xd8(%rbp)
callq 0x11030
movaps %xmm0, %xmm1
movsd -0xd8(%rbp), %xmm0
mulsd %xmm1, %xmm0
movsd %xmm0, -0x40(%rbp)
movq -0x28(%rbp), %rax
movsd 0x610(%rax), %xmm0
movq -0x28(%rbp), %rax
addsd 0xd688(%rax), %xmm0
movq -0x28(%rbp), %rax
addsd 0x17b0(%rax), %xmm0
movq -0x28(%rbp), %rax
addsd 0x128(%rax), %xmm0
movsd %xmm0, -0xd0(%rbp)
movq 0x61c51(%rip), %rax     # 0x86f60
cmpl $0x1, 0x1690(%rax)
jne 0x2532a
movsd 0x53b28(%rip), %xmm0    # 0x78e48
movsd %xmm0, -0xe0(%rbp)
jmp 0x2537c
movq 0x61c2f(%rip), %rax     # 0x86f60
movl 0x1690(%rax), %eax
movsd 0x53b01(%rip), %xmm0    # 0x78e40
movsd 0x53ac9(%rip), %xmm1    # 0x78e10
movsd %xmm1, -0xf0(%rbp)
cmpl $0x3, %eax
movsd %xmm0, -0xe8(%rbp)
je 0x2536c
movsd -0xf0(%rbp), %xmm0
movsd %xmm0, -0xe8(%rbp)
movsd -0xe8(%rbp), %xmm0
movsd %xmm0, -0xe0(%rbp)
movsd -0xd0(%rbp), %xmm0
movsd -0xe0(%rbp), %xmm1
mulsd %xmm1, %xmm0
movsd %xmm0, -0x118(%rbp)
callq 0x11030
movaps %xmm0, %xmm1
movsd -0x118(%rbp), %xmm0
mulsd %xmm1, %xmm0
movsd %xmm0, -0x48(%rbp)
movq -0x28(%rbp), %rax
movsd 0x8(%rax), %xmm0
movq -0x28(%rbp), %rax
addsd 0xd690(%rax), %xmm0
movq -0x28(%rbp), %rax
addsd 0x10(%rax), %xmm0
movq -0x28(%rbp), %rax
addsd (%rax), %xmm0
movsd %xmm0, -0x110(%rbp)
callq 0x11920
movaps %xmm0, %xmm1
movsd -0x110(%rbp), %xmm0
mulsd %xmm1, %xmm0
movsd %xmm0, -0x50(%rbp)
movq -0x28(%rbp), %rax
movsd 0x20(%rax), %xmm0
movq -0x28(%rbp), %rax
addsd 0xd698(%rax), %xmm0
movq -0x28(%rbp), %rax
addsd 0x28(%rax), %xmm0
movq -0x28(%rbp), %rax
addsd 0x18(%rax), %xmm0
movsd %xmm0, -0x108(%rbp)
callq 0x11920
movaps %xmm0, %xmm1
movsd -0x108(%rbp), %xmm0
mulsd %xmm1, %xmm0
movsd %xmm0, -0x58(%rbp)
movq -0x28(%rbp), %rax
movsd 0x38(%rax), %xmm0
movq -0x28(%rbp), %rax
addsd 0xd6a0(%rax), %xmm0
movq -0x28(%rbp), %rax
addsd 0x40(%rax), %xmm0
movq -0x28(%rbp), %rax
addsd 0x30(%rax), %xmm0
movsd %xmm0, -0x100(%rbp)
callq 0x11920
movaps %xmm0, %xmm1
movsd -0x100(%rbp), %xmm0
mulsd %xmm1, %xmm0
movsd %xmm0, -0x60(%rbp)
movq -0x28(%rbp), %rax
movsd 0x50(%rax), %xmm0
movq -0x28(%rbp), %rax
addsd 0xd6a8(%rax), %xmm0
movq -0x28(%rbp), %rax
addsd 0x58(%rax), %xmm0
movq -0x28(%rbp), %rax
addsd 0x48(%rax), %xmm0
movsd %xmm0, -0xf8(%rbp)
movq 0x61aa2(%rip), %rax     # 0x86f60
cmpl $0x1, 0x1690(%rax)
jne 0x254d9
movsd 0x53979(%rip), %xmm0    # 0x78e48
movsd %xmm0, -0x120(%rbp)
jmp 0x2552b
movq 0x61a80(%rip), %rax     # 0x86f60
movl 0x1690(%rax), %eax
movsd 0x53952(%rip), %xmm0    # 0x78e40
movsd 0x5391a(%rip), %xmm1    # 0x78e10
movsd %xmm1, -0x130(%rbp)
cmpl $0x3, %eax
movsd %xmm0, -0x128(%rbp)
je 0x2551b
movsd -0x130(%rbp), %xmm0
movsd %xmm0, -0x128(%rbp)
movsd -0x128(%rbp), %xmm0
movsd %xmm0, -0x120(%rbp)
movsd -0xf8(%rbp), %xmm0
movsd -0x120(%rbp), %xmm1
mulsd %xmm1, %xmm0
movsd %xmm0, -0x140(%rbp)
callq 0x11030
movaps %xmm0, %xmm1
movsd -0x140(%rbp), %xmm0
mulsd %xmm1, %xmm0
movsd %xmm0, -0x68(%rbp)
movq -0x28(%rbp), %rax
movsd 0x68(%rax), %xmm0
movq -0x28(%rbp), %rax
addsd 0xd6b0(%rax), %xmm0
movq -0x28(%rbp), %rax
addsd 0x70(%rax), %xmm0
movq -0x28(%rbp), %rax
addsd 0x60(%rax), %xmm0
movsd %xmm0, -0x138(%rbp)
movq 0x619ca(%rip), %rax     # 0x86f60
cmpl $0x1, 0x1690(%rax)
jne 0x255b1
movsd 0x538a1(%rip), %xmm0    # 0x78e48
movsd %xmm0, -0x148(%rbp)
jmp 0x25603
movq 0x619a8(%rip), %rax     # 0x86f60
movl 0x1690(%rax), %eax
movsd 0x5387a(%rip), %xmm0    # 0x78e40
movsd 0x53842(%rip), %xmm1    # 0x78e10
movsd %xmm1, -0x158(%rbp)
cmpl $0x3, %eax
movsd %xmm0, -0x150(%rbp)
je 0x255f3
movsd -0x158(%rbp), %xmm0
movsd %xmm0, -0x150(%rbp)
movsd -0x150(%rbp), %xmm0
movsd %xmm0, -0x148(%rbp)
movsd -0x138(%rbp), %xmm0
movsd -0x148(%rbp), %xmm1
mulsd %xmm1, %xmm0
movsd %xmm0, -0x168(%rbp)
callq 0x11030
movaps %xmm0, %xmm1
movsd -0x168(%rbp), %xmm0
mulsd %xmm1, %xmm0
movsd %xmm0, -0x70(%rbp)
movq -0x28(%rbp), %rax
movsd 0x80(%rax), %xmm0
movq -0x28(%rbp), %rax
addsd 0xd6b8(%rax), %xmm0
movq -0x28(%rbp), %rax
addsd 0x88(%rax), %xmm0
movq -0x28(%rbp), %rax
addsd 0x78(%rax), %xmm0
movsd %xmm0, -0x160(%rbp)
movq 0x618ec(%rip), %rax     # 0x86f60
cmpl $0x1, 0x1690(%rax)
jne 0x2568f
movsd 0x537c3(%rip), %xmm0    # 0x78e48
movsd %xmm0, -0x170(%rbp)
jmp 0x256e1
movq 0x618ca(%rip), %rax     # 0x86f60
movl 0x1690(%rax), %eax
movsd 0x5379c(%rip), %xmm0    # 0x78e40
movsd 0x53764(%rip), %xmm1    # 0x78e10
movsd %xmm1, -0x180(%rbp)
cmpl $0x3, %eax
movsd %xmm0, -0x178(%rbp)
je 0x256d1
movsd -0x180(%rbp), %xmm0
movsd %xmm0, -0x178(%rbp)
movsd -0x178(%rbp), %xmm0
movsd %xmm0, -0x170(%rbp)
movsd -0x160(%rbp), %xmm0
movsd -0x170(%rbp), %xmm1
mulsd %xmm1, %xmm0
movsd %xmm0, -0x188(%rbp)
callq 0x11030
movaps %xmm0, %xmm1
movsd -0x188(%rbp), %xmm0
mulsd %xmm1, %xmm0
movsd %xmm0, -0x78(%rbp)
movq -0x28(%rbp), %rax
cmpl $0x0, 0x1e6cc(%rax)
je 0x25758
movsd -0x50(%rbp), %xmm0
movsd 0x53708(%rip), %xmm1    # 0x78e38
callq 0x116b0
movsd %xmm0, -0x50(%rbp)
xorps %xmm0, %xmm0
ucomisd -0x50(%rbp), %xmm0
jbe 0x25756
movsd 0x536ec(%rip), %xmm0    # 0x78e38
addsd -0x50(%rbp), %xmm0
movsd %xmm0, -0x50(%rbp)
jmp 0x25758
movq -0x28(%rbp), %rax
cmpl $0x0, 0x1e6d0(%rax)
je 0x2579a
movsd -0x58(%rbp), %xmm0
movsd 0x536c6(%rip), %xmm1    # 0x78e38
callq 0x116b0
movsd %xmm0, -0x58(%rbp)
xorps %xmm0, %xmm0
ucomisd -0x58(%rbp), %xmm0
jbe 0x25798
movsd 0x536aa(%rip), %xmm0    # 0x78e38
addsd -0x58(%rbp), %xmm0
movsd %xmm0, -0x58(%rbp)
jmp 0x2579a
movq -0x28(%rbp), %rax
cmpl $0x0, 0x1e6d4(%rax)
je 0x257dc
movsd -0x60(%rbp), %xmm0
movsd 0x53684(%rip), %xmm1    # 0x78e38
callq 0x116b0
movsd %xmm0, -0x60(%rbp)
xorps %xmm0, %xmm0
ucomisd -0x60(%rbp), %xmm0
jbe 0x257da
movsd 0x53668(%rip), %xmm0    # 0x78e38
addsd -0x60(%rbp), %xmm0
movsd %xmm0, -0x60(%rbp)
jmp 0x257dc
cmpl $0x119, -0x14(%rbp)     # imm = 0x119
jne 0x25887
movsd -0x38(%rbp), %xmm0
movq -0x30(%rbp), %rax
movsd %xmm0, 0xa148(%rax)
movsd -0x40(%rbp), %xmm0
movq -0x30(%rbp), %rax
movsd %xmm0, 0xa150(%rax)
movsd -0x48(%rbp), %xmm0
movq -0x30(%rbp), %rax
movsd %xmm0, 0xa158(%rax)
movsd -0x50(%rbp), %xmm0
movq -0x30(%rbp), %rax
movsd %xmm0, 0xa160(%rax)
movsd -0x58(%rbp), %xmm0
movq -0x30(%rbp), %rax
movsd %xmm0, 0xa168(%rax)
movsd -0x60(%rbp), %xmm0
movq -0x30(%rbp), %rax
movsd %xmm0, 0xa170(%rax)
movsd -0x68(%rbp), %xmm0
movq -0x30(%rbp), %rax
movsd %xmm0, 0xa178(%rax)
movsd -0x70(%rbp), %xmm0
movq -0x30(%rbp), %rax
movsd %xmm0, 0xa180(%rax)
movsd -0x78(%rbp), %xmm0
movq -0x30(%rbp), %rax
movsd %xmm0, 0xa188(%rax)
jmp 0x259fe
cmpl $0x12d, -0x14(%rbp)     # imm = 0x12D
jne 0x25932
movsd -0x38(%rbp), %xmm0
movq -0x30(%rbp), %rax
movsd %xmm0, 0xa1e8(%rax)
movsd -0x40(%rbp), %xmm0
movq -0x30(%rbp), %rax
movsd %xmm0, 0xa1f0(%rax)
movsd -0x48(%rbp), %xmm0
movq -0x30(%rbp), %rax
movsd %xmm0, 0xa1f8(%rax)
movsd -0x50(%rbp), %xmm0
movq -0x30(%rbp), %rax
movsd %xmm0, 0xa200(%rax)
movsd -0x58(%rbp), %xmm0
movq -0x30(%rbp), %rax
movsd %xmm0, 0xa208(%rax)
movsd -0x60(%rbp), %xmm0
movq -0x30(%rbp), %rax
movsd %xmm0, 0xa210(%rax)
movsd -0x68(%rbp), %xmm0
movq -0x30(%rbp), %rax
movsd %xmm0, 0xa218(%rax)
movsd -0x70(%rbp), %xmm0
movq -0x30(%rbp), %rax
movsd %xmm0, 0xa220(%rax)
movsd -0x78(%rbp), %xmm0
movq -0x30(%rbp), %rax
movsd %xmm0, 0xa228(%rax)
jmp 0x259fc
jmp 0x25934
movq -0x80(%rbp), %rdi
leaq 0x54ade(%rip), %rsi     # 0x7a41d
movb $0x0, %al
callq 0x10df0
movq 0x61613(%rip), %rax     # 0x86f60
movl $0x0, 0xd670(%rax)
movq 0x61602(%rip), %rax     # 0x86f60
movslq 0xd670(%rax), %rax
movq 0x615f4(%rip), %rdi     # 0x86f60
addq $0xc6d0, %rdi           # imm = 0xC6D0
imulq $0x50, %rax, %rax
addq %rax, %rdi
leaq 0x54a5c(%rip), %rsi     # 0x7a3dd
movl $0x50, %edx
callq 0x10840
movq 0x615ce(%rip), %rax     # 0x86f60
movslq 0xd670(%rax), %rcx
movq 0x615c0(%rip), %rax     # 0x86f60
addq $0xc6d0, %rax           # imm = 0xC6D0
imulq $0x50, %rcx, %rcx
addq %rcx, %rax
movb $0x0, 0x4f(%rax)
movq 0x615a8(%rip), %rax     # 0x86f60
movl 0xd670(%rax), %ecx
addl $0x1, %ecx
movq 0x61598(%rip), %rax     # 0x86f60
movl %ecx, 0xd670(%rax)
movq 0x6158b(%rip), %rax     # 0x86f60
movslq 0xd670(%rax), %rcx
movq 0x6157d(%rip), %rax     # 0x86f60
addq $0xc6d0, %rax           # imm = 0xC6D0
imulq $0x50, %rcx, %rcx
addq %rcx, %rax
movb $0x0, (%rax)
movl $0x5, -0x4(%rbp)
jmp 0x25a05
jmp 0x259fe
movl $0x0, -0x4(%rbp)
movl -0x4(%rbp), %eax
addq $0x190, %rsp            # imm = 0x190
popq %rbp
retq
nopw %cs:(%rax,%rax)