%-----------------------------------------------------------------------------%

:- module unaligned.
:- interface.

:- import_module io.

:- pred main(io::di, io::uo) is det.

%-----------------------------------------------------------------------------%
%-----------------------------------------------------------------------------%

:- implementation.

:- type foo
    --->    foo(int, float).

main(!IO) :-
    alignment_check(!IO),
    mk = foo(_, F),
    my_write_float(F, !IO),
    io.nl(!IO).

:- pred alignment_check(io::di, io::uo) is det.
:- pragma foreign_proc("C",
    alignment_check(_IO0::di, _IO::uo),
    [will_not_call_mercury, promise_pure, thread_safe, tabled_for_io],
"
#ifdef __x86_64__
    __asm__(""pushf; orl $0x40000, (%rsp); popf"");  
#else
    __asm__(""pushf; orl $0x40000, (%esp); popf"");  
#endif
").

:- func mk = foo.
:- pragma no_inline(mk/0).

mk = foo(one, 3.14159265359).

:- func one = int.
:- pragma no_inline(one/0).

one =  1.

:- pred my_write_float(float::in, io::di, io::uo) is det.
:- pragma foreign_proc("C",
    my_write_float(F::in, _IO0::di, _IO::uo),
    [will_not_call_mercury, promise_pure, thread_safe, tabled_for_io],
"
    printf(""%g"", F);
").

%-----------------------------------------------------------------------------%
% vim: ft=mercury ts=4 sts=4 sw=4 et
