xref: /llvm-project/clang/test/CodeGen/LoongArch/inline-asm-constraints.c (revision 3391bdc255f1a75c59d71c7305959e84d8d5f468)
1394f3091SWeining Lu // RUN: %clang_cc1 -triple loongarch32 -O2 -emit-llvm %s -o - | FileCheck %s
2394f3091SWeining Lu // RUN: %clang_cc1 -triple loongarch64 -O2 -emit-llvm %s -o - | FileCheck %s
3394f3091SWeining Lu 
4394f3091SWeining Lu /// Test LoongArch specific inline assembly constraints.
5394f3091SWeining Lu 
6394f3091SWeining Lu float f;
7394f3091SWeining Lu double d;
test_f(void)8394f3091SWeining Lu void test_f(void) {
9394f3091SWeining Lu // CHECK-LABEL: define{{.*}} void @test_f()
10394f3091SWeining Lu // CHECK: [[FLT_ARG:%[a-zA-Z_0-9]+]] = load float, ptr @f
11394f3091SWeining Lu // CHECK: call void asm sideeffect "", "f"(float [[FLT_ARG]])
12394f3091SWeining Lu   asm volatile ("" :: "f"(f));
13394f3091SWeining Lu // CHECK: [[FLT_ARG:%[a-zA-Z_0-9]+]] = load double, ptr @d
14394f3091SWeining Lu // CHECK: call void asm sideeffect "", "f"(double [[FLT_ARG]])
15394f3091SWeining Lu   asm volatile ("" :: "f"(d));
16394f3091SWeining Lu }
17394f3091SWeining Lu 
test_k(int * p,int idx)1842b70793SWeining Lu void test_k(int *p, int idx) {
1942b70793SWeining Lu // CHECK-LABEL: define{{.*}} void @test_k(ptr noundef %p, i32 noundef{{.*}} %idx)
2042b70793SWeining Lu // CHECK: call void asm sideeffect "", "*k"(ptr elementtype(i32) %{{.*}})
2142b70793SWeining Lu   asm volatile("" :: "k"(*(p+idx)));
2242b70793SWeining Lu }
2342b70793SWeining Lu 
test_l(void)24394f3091SWeining Lu void test_l(void) {
25394f3091SWeining Lu // CHECK-LABEL: define{{.*}} void @test_l()
26394f3091SWeining Lu // CHECK: call void asm sideeffect "", "l"(i32 32767)
27394f3091SWeining Lu   asm volatile ("" :: "l"(32767));
28394f3091SWeining Lu // CHECK: call void asm sideeffect "", "l"(i32 -32768)
29394f3091SWeining Lu   asm volatile ("" :: "l"(-32768));
30394f3091SWeining Lu }
31394f3091SWeining Lu 
test_m(int * p)3242b70793SWeining Lu void test_m(int *p) {
3342b70793SWeining Lu // CHECK-LABEL: define{{.*}} void @test_m(ptr noundef %p)
3442b70793SWeining Lu // CHECK: call void asm sideeffect "", "*m"(ptr nonnull elementtype(i32) %{{.*}})
3542b70793SWeining Lu   asm volatile("" :: "m"(*(p+4)));
3642b70793SWeining Lu }
3742b70793SWeining Lu 
test_I(void)38394f3091SWeining Lu void test_I(void) {
39394f3091SWeining Lu // CHECK-LABEL: define{{.*}} void @test_I()
40394f3091SWeining Lu // CHECK: call void asm sideeffect "", "I"(i32 2047)
41394f3091SWeining Lu   asm volatile ("" :: "I"(2047));
42394f3091SWeining Lu // CHECK: call void asm sideeffect "", "I"(i32 -2048)
43394f3091SWeining Lu   asm volatile ("" :: "I"(-2048));
44394f3091SWeining Lu }
45394f3091SWeining Lu 
test_J(void)46cd0174aaSWeining Lu void test_J(void) {
47cd0174aaSWeining Lu // CHECK-LABEL: define{{.*}} void @test_J()
48cd0174aaSWeining Lu // CHECK: call void asm sideeffect "", "J"(i32 0)
49cd0174aaSWeining Lu   asm volatile ("" :: "J"(0));
50cd0174aaSWeining Lu }
51cd0174aaSWeining Lu 
test_K(void)52394f3091SWeining Lu void test_K(void) {
53394f3091SWeining Lu // CHECK-LABEL: define{{.*}} void @test_K()
54394f3091SWeining Lu // CHECK: call void asm sideeffect "", "K"(i32 4095)
55394f3091SWeining Lu   asm volatile ("" :: "K"(4095));
56394f3091SWeining Lu // CHECK: call void asm sideeffect "", "K"(i32 0)
57394f3091SWeining Lu   asm volatile ("" :: "K"(0));
58394f3091SWeining Lu }
5942b70793SWeining Lu 
test_ZB(int * p)6042b70793SWeining Lu void test_ZB(int *p) {
6142b70793SWeining Lu // CHECK-LABEL: define{{.*}} void @test_ZB(ptr noundef %p)
62*3391bdc2SNoah Goldstein // CHECK: call void asm sideeffect "", "*^ZB"(ptr elementtype(i32) %p)
6342b70793SWeining Lu   asm volatile ("" :: "ZB"(*p));
6442b70793SWeining Lu }
6542b70793SWeining Lu 
test_ZC(int * p)6642b70793SWeining Lu void test_ZC(int *p) {
6742b70793SWeining Lu // CHECK-LABEL: define{{.*}} void @test_ZC(ptr noundef %p)
68*3391bdc2SNoah Goldstein // CHECK: call void asm sideeffect "", "*^ZC"(ptr elementtype(i32) %p)
6942b70793SWeining Lu   asm volatile ("" :: "ZC"(*p));
7042b70793SWeining Lu }
71