229 lines · c
1// NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py2// RUN: %clang_cc1 -triple loongarch32 -target-feature +f -O2 -emit-llvm %s -o - \3// RUN: | FileCheck %s -check-prefix=LA324 5#include <larchintrin.h>6 7// LA32-LABEL: @dbar(8// LA32-NEXT: entry:9// LA32-NEXT: tail call void @llvm.loongarch.dbar(i32 0)10// LA32-NEXT: tail call void @llvm.loongarch.dbar(i32 0)11// LA32-NEXT: ret void12//13void dbar() {14 __dbar(0);15 __builtin_loongarch_dbar(0);16}17 18// LA32-LABEL: @ibar(19// LA32-NEXT: entry:20// LA32-NEXT: tail call void @llvm.loongarch.ibar(i32 0)21// LA32-NEXT: tail call void @llvm.loongarch.ibar(i32 0)22// LA32-NEXT: ret void23//24void ibar() {25 __ibar(0);26 __builtin_loongarch_ibar(0);27}28 29// LA32-LABEL: @loongarch_break(30// LA32-NEXT: entry:31// LA32-NEXT: tail call void @llvm.loongarch.break(i32 1)32// LA32-NEXT: tail call void @llvm.loongarch.break(i32 1)33// LA32-NEXT: ret void34//35void loongarch_break() {36 __break(1);37 __builtin_loongarch_break(1);38}39 40// LA32-LABEL: @syscall(41// LA32-NEXT: entry:42// LA32-NEXT: tail call void @llvm.loongarch.syscall(i32 1)43// LA32-NEXT: tail call void @llvm.loongarch.syscall(i32 1)44// LA32-NEXT: ret void45//46void syscall() {47 __syscall(1);48 __builtin_loongarch_syscall(1);49}50 51// LA32-LABEL: @csrrd_w(52// LA32-NEXT: entry:53// LA32-NEXT: [[TMP0:%.*]] = tail call i32 @llvm.loongarch.csrrd.w(i32 1)54// LA32-NEXT: [[TMP1:%.*]] = tail call i32 @llvm.loongarch.csrrd.w(i32 1)55// LA32-NEXT: ret i32 056//57unsigned int csrrd_w() {58 unsigned int a = __csrrd_w(1);59 unsigned int b = __builtin_loongarch_csrrd_w(1);60 return 0;61}62 63// LA32-LABEL: @csrwr_w(64// LA32-NEXT: entry:65// LA32-NEXT: [[TMP0:%.*]] = tail call i32 @llvm.loongarch.csrwr.w(i32 [[A:%.*]], i32 1)66// LA32-NEXT: [[TMP1:%.*]] = tail call i32 @llvm.loongarch.csrwr.w(i32 [[A]], i32 1)67// LA32-NEXT: ret i32 068//69unsigned int csrwr_w(unsigned int a) {70 unsigned int b = __csrwr_w(a, 1);71 unsigned int c = __builtin_loongarch_csrwr_w(a, 1);72 return 0;73}74 75// LA32-LABEL: @csrxchg_w(76// LA32-NEXT: entry:77// LA32-NEXT: [[TMP0:%.*]] = tail call i32 @llvm.loongarch.csrxchg.w(i32 [[A:%.*]], i32 [[B:%.*]], i32 1)78// LA32-NEXT: [[TMP1:%.*]] = tail call i32 @llvm.loongarch.csrxchg.w(i32 [[A]], i32 [[B]], i32 1)79// LA32-NEXT: ret i32 080//81unsigned int csrxchg_w(unsigned int a, unsigned int b) {82 unsigned int c = __csrxchg_w(a, b, 1);83 unsigned int d = __builtin_loongarch_csrxchg_w(a, b, 1);84 return 0;85}86 87// LA32-LABEL: @iocsrrd_b(88// LA32-NEXT: entry:89// LA32-NEXT: [[TMP0:%.*]] = tail call i32 @llvm.loongarch.iocsrrd.b(i32 [[A:%.*]])90// LA32-NEXT: [[TMP1:%.*]] = tail call i32 @llvm.loongarch.iocsrrd.b(i32 [[A]])91// LA32-NEXT: ret i8 092//93unsigned char iocsrrd_b(unsigned int a) {94 unsigned char b = __iocsrrd_b(a);95 unsigned char c = __builtin_loongarch_iocsrrd_b(a);96 return 0;97}98 99// LA32-LABEL: @iocsrrd_h(100// LA32-NEXT: entry:101// LA32-NEXT: [[TMP0:%.*]] = tail call i32 @llvm.loongarch.iocsrrd.h(i32 [[A:%.*]])102// LA32-NEXT: [[TMP1:%.*]] = tail call i32 @llvm.loongarch.iocsrrd.h(i32 [[A]])103// LA32-NEXT: ret i16 0104//105unsigned short iocsrrd_h(unsigned int a) {106 unsigned short b = __iocsrrd_h(a);107 unsigned short c = __builtin_loongarch_iocsrrd_h(a);108 return 0;109}110 111// LA32-LABEL: @iocsrrd_w(112// LA32-NEXT: entry:113// LA32-NEXT: [[TMP0:%.*]] = tail call i32 @llvm.loongarch.iocsrrd.w(i32 [[A:%.*]])114// LA32-NEXT: [[TMP1:%.*]] = tail call i32 @llvm.loongarch.iocsrrd.w(i32 [[A]])115// LA32-NEXT: ret i32 0116//117unsigned int iocsrrd_w(unsigned int a) {118 unsigned int b = __iocsrrd_w(a);119 unsigned int c = __builtin_loongarch_iocsrrd_w(a);120 return 0;121}122 123// LA32-LABEL: @iocsrwr_b(124// LA32-NEXT: entry:125// LA32-NEXT: [[CONV_I:%.*]] = zext i8 [[A:%.*]] to i32126// LA32-NEXT: tail call void @llvm.loongarch.iocsrwr.b(i32 [[CONV_I]], i32 [[B:%.*]])127// LA32-NEXT: tail call void @llvm.loongarch.iocsrwr.b(i32 [[CONV_I]], i32 [[B]])128// LA32-NEXT: ret void129//130void iocsrwr_b(unsigned char a, unsigned int b) {131 __iocsrwr_b(a, b);132 __builtin_loongarch_iocsrwr_b(a, b);133}134 135// LA32-LABEL: @iocsrwr_h(136// LA32-NEXT: entry:137// LA32-NEXT: [[CONV_I:%.*]] = zext i16 [[A:%.*]] to i32138// LA32-NEXT: tail call void @llvm.loongarch.iocsrwr.h(i32 [[CONV_I]], i32 [[B:%.*]])139// LA32-NEXT: tail call void @llvm.loongarch.iocsrwr.h(i32 [[CONV_I]], i32 [[B]])140// LA32-NEXT: ret void141//142void iocsrwr_h(unsigned short a, unsigned int b) {143 __iocsrwr_h(a, b);144 __builtin_loongarch_iocsrwr_h(a, b);145}146 147// LA32-LABEL: @iocsrwr_w(148// LA32-NEXT: entry:149// LA32-NEXT: tail call void @llvm.loongarch.iocsrwr.w(i32 [[A:%.*]], i32 [[B:%.*]])150// LA32-NEXT: tail call void @llvm.loongarch.iocsrwr.w(i32 [[A]], i32 [[B]])151// LA32-NEXT: ret void152//153void iocsrwr_w(unsigned int a, unsigned int b) {154 __iocsrwr_w(a, b);155 __builtin_loongarch_iocsrwr_w(a, b);156}157 158// LA32-LABEL: @cpucfg(159// LA32-NEXT: entry:160// LA32-NEXT: [[TMP0:%.*]] = tail call i32 @llvm.loongarch.cpucfg(i32 [[A:%.*]])161// LA32-NEXT: [[TMP1:%.*]] = tail call i32 @llvm.loongarch.cpucfg(i32 [[A]])162// LA32-NEXT: ret i32 0163//164unsigned int cpucfg(unsigned int a) {165 unsigned int b = __cpucfg(a);166 unsigned int c = __builtin_loongarch_cpucfg(a);167 return 0;168}169 170// LA32-LABEL: @rdtime(171// LA32-NEXT: entry:172// LA32-NEXT: [[TMP0:%.*]] = tail call { i32, i32 } asm sideeffect "rdtimeh.w $0, $1\0A\09", "=&r,=&r"() #[[ATTR1:[0-9]+]], !srcloc [[META2:![0-9]+]]173// LA32-NEXT: [[TMP1:%.*]] = tail call { i32, i32 } asm sideeffect "rdtimel.w $0, $1\0A\09", "=&r,=&r"() #[[ATTR1]], !srcloc [[META3:![0-9]+]]174// LA32-NEXT: ret void175//176void rdtime() {177 __rdtimeh_w();178 __rdtimel_w();179}180 181// LA32-LABEL: @loongarch_movfcsr2gr(182// LA32-NEXT: entry:183// LA32-NEXT: [[TMP0:%.*]] = tail call i32 @llvm.loongarch.movfcsr2gr(i32 1)184// LA32-NEXT: [[TMP1:%.*]] = tail call i32 @llvm.loongarch.movfcsr2gr(i32 1)185// LA32-NEXT: ret i32 0186//187int loongarch_movfcsr2gr() {188 int a = __movfcsr2gr(1);189 int b = __builtin_loongarch_movfcsr2gr(1);190 return 0;191}192 193// LA32-LABEL: @loongarch_movgr2fcsr(194// LA32-NEXT: entry:195// LA32-NEXT: tail call void @llvm.loongarch.movgr2fcsr(i32 1, i32 [[A:%.*]])196// LA32-NEXT: tail call void @llvm.loongarch.movgr2fcsr(i32 1, i32 [[A]])197// LA32-NEXT: ret void198//199void loongarch_movgr2fcsr(int a) {200 __movgr2fcsr(1, a);201 __builtin_loongarch_movgr2fcsr(1, a);202}203 204// LA32-LABEL: @cacop_w(205// LA32-NEXT: entry:206// LA32-NEXT: tail call void @llvm.loongarch.cacop.w(i32 1, i32 [[A:%.*]], i32 1024)207// LA32-NEXT: tail call void @llvm.loongarch.cacop.w(i32 1, i32 [[A]], i32 1024)208// LA32-NEXT: ret void209//210void cacop_w(unsigned long int a) {211 __cacop_w(1, a, 1024);212 __builtin_loongarch_cacop_w(1, a, 1024);213}214 215// LA32-LABEL: @iocsrrd_h_result(216// LA32-NEXT: entry:217// LA32-NEXT: [[TMP0:%.*]] = tail call i32 @llvm.loongarch.iocsrrd.h(i32 [[A:%.*]])218// LA32-NEXT: [[CONV_I:%.*]] = trunc i32 [[TMP0]] to i16219// LA32-NEXT: [[TMP1:%.*]] = tail call i32 @llvm.loongarch.iocsrrd.h(i32 [[A]])220// LA32-NEXT: [[TMP2:%.*]] = trunc i32 [[TMP1]] to i16221// LA32-NEXT: [[CONV3:%.*]] = add i16 [[TMP2]], [[CONV_I]]222// LA32-NEXT: ret i16 [[CONV3]]223//224unsigned short iocsrrd_h_result(unsigned int a) {225 unsigned short b = __iocsrrd_h(a);226 unsigned short c = __builtin_loongarch_iocsrrd_h(a);227 return b+c;228}229