diff --git a/gas/config/tc-riscv.c b/gas/config/tc-riscv.c index 9f65048d778..3492208e2fb 100644 --- a/gas/config/tc-riscv.c +++ b/gas/config/tc-riscv.c @@ -5126,6 +5126,8 @@ s_riscv_option (int x ATTRIBUTE_UNUSED) riscv_update_subset (&riscv_rps_as, "-c"); riscv_reset_subsets_list_arch_str (); riscv_set_rvc (false); + if (riscv_subset_supports (&riscv_rps_as, "zca")) + riscv_set_rvc (true); } else if (strcmp (name, "pic") == 0) riscv_opts.pic = true; diff --git a/gas/testsuite/gas/riscv/zc-zca-option-march.d b/gas/testsuite/gas/riscv/zc-zca-option-march.d new file mode 100644 index 00000000000..a3767d6c0ff --- /dev/null +++ b/gas/testsuite/gas/riscv/zc-zca-option-march.d @@ -0,0 +1,12 @@ +#as: -march=rv32i +#source: zc-zca-option-march.s +#objdump: -d -Mno-aliases + +.*:[ ]+file format .* + + +Disassembly of section .text: + +0+000 : +[ ]+0:[ ]+0001[ ]+c.addi[ ]+zero,0 +#... diff --git a/gas/testsuite/gas/riscv/zc-zca-option-march.s b/gas/testsuite/gas/riscv/zc-zca-option-march.s new file mode 100644 index 00000000000..2c9bfb66987 --- /dev/null +++ b/gas/testsuite/gas/riscv/zc-zca-option-march.s @@ -0,0 +1,6 @@ + .attribute 5, "rv32i" + .option rvc + .option arch, +zca + .option norvc +testcase: + c.nop diff --git a/gas/testsuite/gas/riscv/zc-zcmt-emit-jal-relax.s b/gas/testsuite/gas/riscv/zc-zcmt-emit-jal-relax.s new file mode 100644 index 00000000000..2a91f4031ce --- /dev/null +++ b/gas/testsuite/gas/riscv/zc-zcmt-emit-jal-relax.s @@ -0,0 +1,46 @@ +.macro PADDIING_32_BYTES + .option push + .option arch, -zcmt + .option arch, -zca + nop + nop + nop + nop + nop + nop + nop + nop + .option pop +.endm + +.macro PADDIING_256_BYTES + PADDIING_32_BYTES + PADDIING_32_BYTES + PADDIING_32_BYTES + PADDIING_32_BYTES + PADDIING_32_BYTES + PADDIING_32_BYTES + PADDIING_32_BYTES + PADDIING_32_BYTES +.endm + +.macro PADDIING_2048_BYTES + PADDIING_256_BYTES + PADDIING_256_BYTES + PADDIING_256_BYTES + PADDIING_256_BYTES + PADDIING_256_BYTES + PADDIING_256_BYTES + PADDIING_256_BYTES + PADDIING_256_BYTES +.endm + +.option relax +target: + c.bnez s0, target + jal Far + c.bnez s0, Far + PADDIING_2048_BYTES + PADDIING_2048_BYTES +Far: + ret diff --git a/gas/testsuite/gas/riscv/zc-zcmt-relax-c-branch.s b/gas/testsuite/gas/riscv/zc-zcmt-relax-c-branch.s new file mode 100644 index 00000000000..8fd07956236 --- /dev/null +++ b/gas/testsuite/gas/riscv/zc-zcmt-relax-c-branch.s @@ -0,0 +1,50 @@ +.macro PADDIING_32_BYTES + .option push + .option arch, -zcmt + .option arch, -zca + nop + nop + nop + nop + nop + nop + nop + nop + .option pop +.endm + +.macro PADDIING_256_BYTES + PADDIING_32_BYTES + PADDIING_32_BYTES + PADDIING_32_BYTES + PADDIING_32_BYTES + PADDIING_32_BYTES + PADDIING_32_BYTES + PADDIING_32_BYTES + PADDIING_32_BYTES +.endm + +.macro PADDIING_2048_BYTES + PADDIING_256_BYTES + PADDIING_256_BYTES + PADDIING_256_BYTES + PADDIING_256_BYTES + PADDIING_256_BYTES + PADDIING_256_BYTES + PADDIING_256_BYTES + PADDIING_256_BYTES +.endm + +.option norelax +target: + c.beqz s0, C_BRANCH_RANGE +C_BRANCH_RANGE: + c.bnez s0, EXPAND_TO_BRANCH + PADDIING_256_BYTES +EXPAND_TO_BRANCH: + c.bnez s0, FLIP_C_BRANCH_AND_JUMP + PADDIING_2048_BYTES + PADDIING_2048_BYTES +FLIP_C_BRANCH_AND_JUMP: + c.beqz s0, -4 + ret