xref: /llvm-project/clang/test/CodeGen/RISCV/riscv-inline-asm.c (revision 8e8d2595dafa230a3da7f410200d89f05b6e8d87)
1 // RUN: %clang_cc1 -triple riscv32 -O2 -emit-llvm %s -o - \
2 // RUN:     | FileCheck %s
3 // RUN: %clang_cc1 -triple riscv64 -O2 -emit-llvm %s -o - \
4 // RUN:     | FileCheck %s
5 
6 // Test RISC-V specific inline assembly constraints.
7 
8 void test_I(void) {
9 // CHECK-LABEL: define{{.*}} void @test_I()
10 // CHECK: call void asm sideeffect "", "I"(i32 2047)
11   asm volatile ("" :: "I"(2047));
12 // CHECK: call void asm sideeffect "", "I"(i32 -2048)
13   asm volatile ("" :: "I"(-2048));
14 }
15 
16 void test_J(void) {
17 // CHECK-LABEL: define{{.*}} void @test_J()
18 // CHECK: call void asm sideeffect "", "J"(i32 0)
19   asm volatile ("" :: "J"(0));
20 }
21 
22 void test_K(void) {
23 // CHECK-LABEL: define{{.*}} void @test_K()
24 // CHECK: call void asm sideeffect "", "K"(i32 31)
25   asm volatile ("" :: "K"(31));
26 // CHECK: call void asm sideeffect "", "K"(i32 0)
27   asm volatile ("" :: "K"(0));
28 }
29 
30 float f;
31 double d;
32 void test_f(void) {
33 // CHECK-LABEL: define{{.*}} void @test_f()
34 // CHECK: [[FLT_ARG:%[a-zA-Z_0-9]+]] = load float, ptr @f
35 // CHECK: call void asm sideeffect "", "f"(float [[FLT_ARG]])
36   asm volatile ("" :: "f"(f));
37 // CHECK: [[FLT_ARG:%[a-zA-Z_0-9]+]] = load double, ptr @d
38 // CHECK: call void asm sideeffect "", "f"(double [[FLT_ARG]])
39   asm volatile ("" :: "f"(d));
40 }
41 
42 void test_A(int *p) {
43 // CHECK-LABEL: define{{.*}} void @test_A(ptr noundef %p)
44 // CHECK: call void asm sideeffect "", "*A"(ptr elementtype(i32) %p)
45   asm volatile("" :: "A"(*p));
46 }
47 
48 extern int var, arr[2][2];
49 struct Pair { int a, b; } pair;
50 
51 // CHECK-LABEL: test_s(
52 // CHECK:         call void asm sideeffect "// $0 $1 $2", "s,s,s"(ptr nonnull @var, ptr nonnull getelementptr inbounds (i8, ptr @arr, {{.*}}), ptr nonnull @test_s)
53 // CHECK:         call void asm sideeffect "// $0", "s"(ptr nonnull getelementptr inbounds (i8, ptr @pair, {{.*}}))
54 // CHECK:         call void asm sideeffect "// $0 $1 $2", "S,S,S"(ptr nonnull @var, ptr nonnull getelementptr inbounds (i8, ptr @arr, {{.*}}), ptr nonnull @test_s)
55 void test_s(void) {
56   asm("// %0 %1 %2" :: "s"(&var), "s"(&arr[1][1]), "s"(test_s));
57   asm("// %0" :: "s"(&pair.b));
58 
59   asm("// %0 %1 %2" :: "S"(&var), "S"(&arr[1][1]), "S"(test_s));
60 }
61