diff options
-rw-r--r-- | riscV/Asmexpand.ml | 37 |
1 files changed, 25 insertions, 12 deletions
diff --git a/riscV/Asmexpand.ml b/riscV/Asmexpand.ml index 9dd8cac9..f23db36e 100644 --- a/riscV/Asmexpand.ml +++ b/riscV/Asmexpand.ml @@ -586,18 +586,31 @@ let expand_builtin_inline name args res = let expand_instruction instr = match instr with | Pselectl(rd, rb, rt, rf) -> - if not (ireg0_eq rt rf) - then - if (ireg0_eq (X rd) rt) || (ireg0_eq (X rd) rf) - then failwith "Pselectl" - else - begin - emit (Psubl(X31, X0, rb)); - emit (Paddil(rd, rb, Int64.mone)); - emit (Pandl(X31, X X31, rt)); - emit (Pandl(rd, X rd, rf)); - emit (Porl(rd, X rd, X X31)) - end + if not Archi.ptr64 + then failwith "Pselectl not available on RV32, only on RV64" + else + if not (ireg0_eq rt rf) + then + if (ireg0_eq (X rd) rt) + then failwith "Pselectl rd=rt" + else + if (ireg0_eq (X rd) rf) + then + begin + emit (Paddil(X31, rb, Int64.mone)); + emit (Pandl(X31, X X31, rf)); + emit (Psubl(rd, X0, rb)); + emit (Pandl(rd, X rd, rt)); + emit (Porl(rd, X rd, X X31)) + end + else + begin + emit (Psubl(X31, X0, rb)); + emit (Paddil(rd, rb, Int64.mone)); + emit (Pandl(X31, X X31, rt)); + emit (Pandl(rd, X rd, rf)); + emit (Porl(rd, X rd, X X31)) + end | Pallocframe (sz, ofs) -> let sg = get_current_function_sig() in emit (Pmv (X30, X2)); |