diff --git a/riscV/TargetPrinter.ml b/riscV/TargetPrinter.ml index f4cea9dda..1ca13ff36 100644 --- a/riscV/TargetPrinter.ml +++ b/riscV/TargetPrinter.ml @@ -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"; diff --git a/test b/test index 27899bbab..4df7312a3 160000 --- a/test +++ b/test @@ -1 +1 @@ -Subproject commit 27899bbabecd10148c2a2f1b3b62f55b8edca556 +Subproject commit 4df7312a3ff71037c20856dfeff727e36c77848e diff --git a/x86/TargetPrinter.ml b/x86/TargetPrinter.ml index 3bc863f7d..397ebe78b 100644 --- a/x86/TargetPrinter.ml +++ b/x86/TargetPrinter.ml @@ -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