gallivm: fix pointer type for stmxcsr/ldmxcsr
authorRoland Scheidegger <sroland@vmware.com>
Fri, 13 Dec 2013 20:20:05 +0000 (21:20 +0100)
committerRoland Scheidegger <sroland@vmware.com>
Sat, 14 Dec 2013 16:11:03 +0000 (17:11 +0100)
The argument is a i8 pointer not a i32 pointer (even though the value actually
stored/loaded IS i32). Older llvm versions didn't care but 3.2 and newer do
leading to crashes.

Reviewed-by: Zack Rusin <zackr@vmware.com>
src/gallium/auxiliary/gallivm/lp_bld_arit.c

index 440dd0b6ac25b6b9170cb41fc6f0408d8d955f65..e516ae8214c7f2a09f6afa25d9385675facfd9ba 100644 (file)
@@ -3510,10 +3510,12 @@ lp_build_fpstate_get(struct gallivm_state *gallivm)
          gallivm,
          LLVMInt32TypeInContext(gallivm->context),
          "mxcsr_ptr");
+      LLVMValueRef mxcsr_ptr8 = LLVMBuildPointerCast(builder, mxcsr_ptr,
+          LLVMPointerType(LLVMInt8TypeInContext(gallivm->context), 0), "");
       lp_build_intrinsic(builder,
                          "llvm.x86.sse.stmxcsr",
                          LLVMVoidTypeInContext(gallivm->context),
-                         &mxcsr_ptr, 1);
+                         &mxcsr_ptr8, 1);
       return mxcsr_ptr;
    }
    return 0;
@@ -3554,7 +3556,10 @@ lp_build_fpstate_set(struct gallivm_state *gallivm,
                      LLVMValueRef mxcsr_ptr)
 {
    if (util_cpu_caps.has_sse) {
-      lp_build_intrinsic(gallivm->builder,
+      LLVMBuilderRef builder = gallivm->builder;
+      mxcsr_ptr = LLVMBuildPointerCast(builder, mxcsr_ptr,
+                     LLVMPointerType(LLVMInt8TypeInContext(gallivm->context), 0), "");
+      lp_build_intrinsic(builder,
                          "llvm.x86.sse.ldmxcsr",
                          LLVMVoidTypeInContext(gallivm->context),
                          &mxcsr_ptr, 1);