Re: Bug in codegen?
[Thread Prev] | [Thread Next]
- Subject: Re: Bug in codegen?
- From: Ori Bernstein <ori@xxxxxxxxxxxxxx>
- Date: Sun, 18 Jan 2015 16:36:47 -0800
- To: Ryan Gonzalez <rymg19@xxxxxxxxx>
- Cc: myrddin-dev@xxxxxxxxxxxxxx
Fixed. Thanks.
On Sun, 18 Jan 2015 15:23:18 -0600
Ryan Gonzalez <rymg19@xxxxxxxxx> wrote:
> Here I am again! With another bug! This is produced by trying to compile
> this program:
>
> pkg interrupt =
> const init_idt : (-> void)
> ;;
>
> const gdt_addr = 0x0000000000001000 /* see Pure64/src/sysvar.asm for more
> info */
>
> extern const on_keyboard_w : (-> void)
> extern const write_port : (-> void)
>
> const Idt_size = 256
>
> type idt_entry = struct
> loffs: uint16
> selec: uint16
> zero : byte
> typea: byte
> hoffs: uint16
> ;;
>
> var idt: idt_entry[Idt_size]
>
> const init_idt = {
> var kaddr = on_keyboard_w castto (uint64)
> idt[0x21] = [.loffs = kaddr & 0xFFFF castto (uint16), .selec =
> gdt_addr, .zero = 0,
> .typea = 0x8e, .hoffs = ((kaddr & 0xffff0000) >> 16 castto
> (uint16))]
> }
>
> This is the shortest thing I can come up with that reproduces the error.
> Trying to build yields this:
>
> /tmp/tmp6120cb341da66-interrupt.myr.s: Assembler messages:
> /tmp/tmp6120cb341da66-interrupt.myr.s:62: Error: operand type mismatch for
> `and'
> Couldn't run assembler
> Aborted (core dumped)
>
> This is the referenced assembler line:
>
> andq $4294901760,%rdx
>
> Looking at GCC's assembler output, it seems like andq needs two registers
> when working with constant that are very large (like 0xffff0000).
>
> The workaround right now is to save the constant into an intermediate
> variable manually:
>
> var kaddr = on_keyboard_w castto (uint64)
> var c = 0xffff0000
> idt[0x21] = [.loffs = kaddr & 0xFFFF castto (uint16), .selec =
> gdt_addr, .zero = 0,
> .typea = 0x8e, .hoffs = ((kaddr & c) >> 16 castto
> (uint16))]
>
> --
> Ryan
> If anybody ever asks me why I prefer C++ to C, my answer will be simple:
> "It's becauseslejfp23(@#Q*(E*EIdc-SEGFAULT. Wait, I don't think that was
> nul-terminated."
> Personal reality distortion fields are immune to contradictory evidence. -
> srean
> Check out my website: http://kirbyfan64.github.io/
--
Ori Bernstein <ori@xxxxxxxxxxxxxx>
| Bug in codegen? | Ryan Gonzalez <rymg19@xxxxxxxxx> |
- Prev by Date: Bug in codegen?
- Next by Date: [PATCH] Add .gitignore
- Previous by thread: Bug in codegen?
- Next by thread: [PATCH] Add .gitignore
- Index(es):