Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 9 additions & 2 deletions riscV/TargetPrinter.ml
Original file line number Diff line number Diff line change
Expand Up @@ -522,10 +522,17 @@ module Target : TARGET =
freg rd label lbl comment (camlfloat_of_coqfloat32 f)
| Pbtbl(r, tbl) ->
let lbl = new_label() in
fprintf oc "%s jumptable [ " comment;
fprintf oc "%s pseudoinstr btbl [ " comment;
List.iter (fun l -> fprintf oc "%a " print_label l) tbl;
fprintf oc "]\n";
fprintf oc " sll x5, %a, 2\n" ireg r;
if Archi.ptr64 then begin
(* Zero-extend [r] (a 32-bit integer) to 64-bit
and multiply it by 4. *)
fprintf oc " sll x5, %a, 32\n" ireg r;
fprintf oc " srl x5, x5, 30\n"
end else begin
fprintf oc " sll x5, %a, 2\n" ireg r
end;
fprintf oc " lla x31, %a\n" label lbl;
fprintf oc " add x5, x31, x5\n";
fprintf oc " lw x5, 0(x5)\n";
Expand Down
2 changes: 1 addition & 1 deletion test
4 changes: 3 additions & 1 deletion x86/TargetPrinter.ml
Original file line number Diff line number Diff line change
Expand Up @@ -752,7 +752,9 @@ module Target(System: SYSTEM):TARGET =
let (tmp1, tmp2) =
if r = RAX then (RDX, RAX) else (RAX, RDX) in
fprintf oc " leaq %a(%%rip), %a\n" label l ireg tmp1;
fprintf oc " movslq (%a, %a, 4), %a\n" ireg tmp1 ireg r ireg tmp2;
(* Normalize r to 32-bit unsigned *)
fprintf oc " movl %a, %a\n" ireg32 r ireg32 tmp2;
fprintf oc " movslq (%a, %a, 4), %a\n" ireg tmp1 ireg tmp2 ireg tmp2;
fprintf oc " addq %a, %a\n" ireg tmp2 ireg tmp1;
fprintf oc " jmp *%a\n" ireg tmp1
end else begin
Expand Down
Loading