
This patch adds a function attribute `riscv_vls_cc` for RISCV VLS calling convention which takes 0 or 1 argument, the argument is the `ABI_VLEN` which is the `VLEN` for passing the fixed-vector arguments, it wraps the argument as a scalable vector(VLA) using the `ABI_VLEN` and uses the corresponding mechanism to handle it. The range of `ABI_VLEN` is [32, 65536], if not specified, the default value is 128. Here is an example of VLS argument passing: Non-VLS call: ``` void original_call(__attribute__((vector_size(16))) int arg) {} => define void @original_call(i128 noundef %arg) { entry: ... ret void } ``` VLS call: ``` void __attribute__((riscv_vls_cc(256))) vls_call(__attribute__((vector_size(16))) int arg) {} => define riscv_vls_cc void @vls_call(<vscale x 1 x i32> %arg) { entry: ... ret void } } ``` The first Non-VLS call passes generic vector argument of 16 bytes by flattened integer. On the contrary, the VLS call uses `ABI_VLEN=256` which wraps the vector to <vscale x 1 x i32> where the number of scalable vector elements is calaulated by: `ORIG_ELTS * RVV_BITS_PER_BLOCK / ABI_VLEN`. Note: ORIG_ELTS = Vector Size / Type Size = 128 / 32 = 4. PsABI PR: https://github.com/riscv-non-isa/riscv-elf-psabi-doc/pull/418 C-API PR: https://github.com/riscv-non-isa/riscv-c-api-doc/pull/68
123 lines
3.3 KiB
LLVM
123 lines
3.3 KiB
LLVM
; RUN: llvm-as < %s | llvm-dis | FileCheck %s
|
|
; RUN: verify-uselistorder %s
|
|
|
|
; CHECK: define riscv_vls_cc(32) void @no_args_32() {
|
|
define riscv_vls_cc(32) void @no_args_32() {
|
|
ret void
|
|
}
|
|
|
|
; CHECK: define riscv_vls_cc(64) void @no_args_64() {
|
|
define riscv_vls_cc(64) void @no_args_64() {
|
|
ret void
|
|
}
|
|
|
|
; CHECK: define riscv_vls_cc(128) void @no_args_128() {
|
|
define riscv_vls_cc(128) void @no_args_128() {
|
|
ret void
|
|
}
|
|
|
|
; CHECK: define riscv_vls_cc(256) void @no_args_256() {
|
|
define riscv_vls_cc(256) void @no_args_256() {
|
|
ret void
|
|
}
|
|
|
|
; CHECK: define riscv_vls_cc(512) void @no_args_512() {
|
|
define riscv_vls_cc(512) void @no_args_512() {
|
|
ret void
|
|
}
|
|
|
|
; CHECK: define riscv_vls_cc(1024) void @no_args_1024() {
|
|
define riscv_vls_cc(1024) void @no_args_1024() {
|
|
ret void
|
|
}
|
|
|
|
; CHECK: define riscv_vls_cc(2048) void @no_args_2048() {
|
|
define riscv_vls_cc(2048) void @no_args_2048() {
|
|
ret void
|
|
}
|
|
|
|
; CHECK: define riscv_vls_cc(4096) void @no_args_4096() {
|
|
define riscv_vls_cc(4096) void @no_args_4096() {
|
|
ret void
|
|
}
|
|
|
|
; CHECK: define riscv_vls_cc(8192) void @no_args_8192() {
|
|
define riscv_vls_cc(8192) void @no_args_8192() {
|
|
ret void
|
|
}
|
|
|
|
; CHECK: define riscv_vls_cc(16384) void @no_args_16384() {
|
|
define riscv_vls_cc(16384) void @no_args_16384() {
|
|
ret void
|
|
}
|
|
|
|
; CHECK: define riscv_vls_cc(32768) void @no_args_32768() {
|
|
define riscv_vls_cc(32768) void @no_args_32768() {
|
|
ret void
|
|
}
|
|
|
|
; CHECK: define riscv_vls_cc(65536) void @no_args_65536() {
|
|
define riscv_vls_cc(65536) void @no_args_65536() {
|
|
ret void
|
|
}
|
|
|
|
; CHECK: define riscv_vls_cc(32) void @byval_arg_32(ptr byval(i32) %0) {
|
|
define riscv_vls_cc(32) void @byval_arg_32(ptr byval(i32)) {
|
|
ret void
|
|
}
|
|
|
|
; CHECK: define riscv_vls_cc(64) void @byval_arg_64(ptr byval(i32) %0) {
|
|
define riscv_vls_cc(64) void @byval_arg_64(ptr byval(i32)) {
|
|
ret void
|
|
}
|
|
|
|
; CHECK: define riscv_vls_cc(128) void @byval_arg_128(ptr byval(i32) %0) {
|
|
define riscv_vls_cc(128) void @byval_arg_128(ptr byval(i32)) {
|
|
ret void
|
|
}
|
|
|
|
; CHECK: define riscv_vls_cc(256) void @byval_arg_256(ptr byval(i32) %0) {
|
|
define riscv_vls_cc(256) void @byval_arg_256(ptr byval(i32)) {
|
|
ret void
|
|
}
|
|
|
|
; CHECK: define riscv_vls_cc(512) void @byval_arg_512(ptr byval(i32) %0) {
|
|
define riscv_vls_cc(512) void @byval_arg_512(ptr byval(i32)) {
|
|
ret void
|
|
}
|
|
|
|
; CHECK: define riscv_vls_cc(1024) void @byval_arg_1024(ptr byval(i32) %0) {
|
|
define riscv_vls_cc(1024) void @byval_arg_1024(ptr byval(i32)) {
|
|
ret void
|
|
}
|
|
|
|
; CHECK: define riscv_vls_cc(2048) void @byval_arg_2048(ptr byval(i32) %0) {
|
|
define riscv_vls_cc(2048) void @byval_arg_2048(ptr byval(i32)) {
|
|
ret void
|
|
}
|
|
|
|
; CHECK: define riscv_vls_cc(4096) void @byval_arg_4096(ptr byval(i32) %0) {
|
|
define riscv_vls_cc(4096) void @byval_arg_4096(ptr byval(i32)) {
|
|
ret void
|
|
}
|
|
|
|
; CHECK: define riscv_vls_cc(8192) void @byval_arg_8192(ptr byval(i32) %0) {
|
|
define riscv_vls_cc(8192) void @byval_arg_8192(ptr byval(i32)) {
|
|
ret void
|
|
}
|
|
|
|
; CHECK: define riscv_vls_cc(16384) void @byval_arg_16384(ptr byval(i32) %0) {
|
|
define riscv_vls_cc(16384) void @byval_arg_16384(ptr byval(i32)) {
|
|
ret void
|
|
}
|
|
|
|
; CHECK: define riscv_vls_cc(32768) void @byval_arg_32768(ptr byval(i32) %0) {
|
|
define riscv_vls_cc(32768) void @byval_arg_32768(ptr byval(i32)) {
|
|
ret void
|
|
}
|
|
|
|
; CHECK: define riscv_vls_cc(65536) void @byval_arg_65536(ptr byval(i32) %0) {
|
|
define riscv_vls_cc(65536) void @byval_arg_65536(ptr byval(i32)) {
|
|
ret void
|
|
}
|