Created
March 11, 2014 10:00
-
-
Save chapuni/9482736 to your computer and use it in GitHub Desktop.
Clang :: CodeGen/builtins-arm-exclusive.c
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
; ModuleID = '/home/chapuni/llvm-project/clang/test/CodeGen/builtins-arm-exclusive.c' | |
target datalayout = "e-m:e-p:32:32-i1:8:32-i8:8:32-i16:16:32-i64:64-v128:64:128-a:0:32-n32-S64" | |
target triple = "thumbv7--linux-gnueabi" | |
%struct.Simple = type { i8, i8 } | |
; Function Attrs: nounwind | |
define i32 @atomic_inc(i32* %addr) #0 { | |
br label %1 | |
; <label>:1 ; preds = %1, %0 | |
%2 = tail call i32 @llvm.arm.ldrex.p0i32(i32* %addr) | |
%3 = add nsw i32 %2, 1 | |
%4 = tail call i32 @llvm.arm.strex.p0i32(i32 %3, i32* %addr) | |
%5 = icmp eq i32 %4, 0 | |
br i1 %5, label %6, label %1 | |
; <label>:6 ; preds = %1 | |
ret i32 %2 | |
} | |
; Function Attrs: nounwind | |
declare i32 @llvm.arm.ldrex.p0i32(i32*) #1 | |
; Function Attrs: nounwind | |
declare i32 @llvm.arm.strex.p0i32(i32, i32*) #1 | |
; Function Attrs: nounwind | |
define i32 @test_ldrex(i8* %addr, i64* %addr64, float* %addrfloat) #0 { | |
%1 = tail call i32 @llvm.arm.ldrex.p0i8(i8* %addr) | |
%2 = and i32 %1, 255 | |
%3 = bitcast i8* %addr to i16* | |
%4 = tail call i32 @llvm.arm.ldrex.p0i16(i16* %3) | |
%sext = shl i32 %4, 16 | |
%5 = ashr exact i32 %sext, 16 | |
%6 = bitcast i8* %addr to i32* | |
%7 = tail call i32 @llvm.arm.ldrex.p0i32(i32* %6) | |
%8 = tail call { i32, i32 } @llvm.arm.ldrexd(i8* %addr) | |
%9 = extractvalue { i32, i32 } %8, 0 | |
%10 = bitcast i64* %addr64 to i8* | |
%11 = tail call { i32, i32 } @llvm.arm.ldrexd(i8* %10) | |
%12 = extractvalue { i32, i32 } %11, 0 | |
%13 = add i32 %7, %2 | |
%14 = add i32 %13, %5 | |
%15 = add i32 %14, %9 | |
%16 = add i32 %15, %12 | |
%17 = bitcast float* %addrfloat to i32* | |
%18 = tail call i32 @llvm.arm.ldrex.p0i32(i32* %17) | |
%19 = bitcast i32 %18 to float | |
%20 = sitofp i32 %16 to float | |
%21 = fadd float %19, %20 | |
%22 = fptosi float %21 to i32 | |
%23 = tail call { i32, i32 } @llvm.arm.ldrexd(i8* %addr) | |
%24 = extractvalue { i32, i32 } %23, 1 | |
%25 = zext i32 %24 to i64 | |
%26 = shl nuw i64 %25, 32 | |
%27 = or i64 %26, %25 | |
%28 = bitcast i64 %27 to double | |
%29 = sitofp i32 %22 to double | |
%30 = fadd double %29, %28 | |
%31 = fptosi double %30 to i32 | |
%32 = tail call i32 @llvm.arm.ldrex.p0i32(i32* %6) | |
%33 = inttoptr i32 %32 to i32* | |
%34 = load i32* %33, align 4, !tbaa !1 | |
%35 = tail call i32 @llvm.arm.ldrex.p0i32(i32* %6) | |
%36 = inttoptr i32 %35 to %struct.Simple* | |
%37 = getelementptr inbounds %struct.Simple* %36, i32 0, i32 0 | |
%38 = load i8* %37, align 1, !tbaa !5 | |
%39 = zext i8 %38 to i32 | |
%40 = add i32 %39, %34 | |
%41 = add i32 %40, %31 | |
ret i32 %41 | |
} | |
; Function Attrs: nounwind | |
declare i32 @llvm.arm.ldrex.p0i8(i8*) #1 | |
; Function Attrs: nounwind | |
declare i32 @llvm.arm.ldrex.p0i16(i16*) #1 | |
; Function Attrs: nounwind | |
declare { i32, i32 } @llvm.arm.ldrexd(i8*) #1 | |
; Function Attrs: nounwind | |
define i32 @test_strex(i8* %addr) #0 { | |
%var = alloca i16, align 4 | |
store i16 0, i16* %var, align 4 | |
%1 = call i32 @llvm.arm.strex.p0i8(i32 4, i8* %addr) | |
%2 = bitcast i8* %addr to i16* | |
%3 = call i32 @llvm.arm.strex.p0i16(i32 42, i16* %2) | |
%4 = or i32 %3, %1 | |
%5 = bitcast i8* %addr to i32* | |
%6 = call i32 @llvm.arm.strex.p0i32(i32 42, i32* %5) | |
%7 = or i32 %4, %6 | |
%8 = call i32 @llvm.arm.strexd(i32 42, i32 0, i8* %addr) | |
%9 = or i32 %7, %8 | |
%10 = call i32 @llvm.arm.strex.p0i32(i32 1076754509, i32* %5) | |
%11 = or i32 %9, %10 | |
%12 = call i32 @llvm.arm.strexd(i32 -266631570, i32 1074340345, i8* %addr) | |
%13 = or i32 %11, %12 | |
%14 = ptrtoint i16* %var to i32 | |
%15 = call i32 @llvm.arm.strex.p0i32(i32 %14, i32* %5) | |
%16 = or i32 %13, %15 | |
ret i32 %16 | |
} | |
; Function Attrs: nounwind | |
declare i32 @llvm.arm.strex.p0i8(i32, i8*) #1 | |
; Function Attrs: nounwind | |
declare i32 @llvm.arm.strex.p0i16(i32, i16*) #1 | |
; Function Attrs: nounwind | |
declare i32 @llvm.arm.strexd(i32, i32, i8*) #1 | |
; Function Attrs: nounwind | |
define void @test_clrex() #0 { | |
tail call void @llvm.arm.clrex() | |
ret void | |
} | |
; Function Attrs: nounwind | |
declare void @llvm.arm.clrex() #1 | |
attributes #0 = { nounwind "less-precise-fpmad"="false" "no-frame-pointer-elim"="false" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "no-realign-stack" "stack-protector-buffer-size"="8" "unsafe-fp-math"="false" "use-soft-float"="false" } | |
attributes #1 = { nounwind } | |
!llvm.ident = !{!0} | |
!0 = metadata !{metadata !"clang version 3.5.0 "} | |
!1 = metadata !{metadata !2, metadata !2, i64 0} | |
!2 = metadata !{metadata !"int", metadata !3, i64 0} | |
!3 = metadata !{metadata !"omnipotent char", metadata !4, i64 0} | |
!4 = metadata !{metadata !"Simple C/C++ TBAA"} | |
!5 = metadata !{metadata !6, metadata !3, i64 0} | |
!6 = metadata !{metadata !"Simple", metadata !3, i64 0, metadata !3, i64 1} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment