本文整理汇总了C++中cast函数的典型用法代码示例。如果您正苦于以下问题:C++ cast函数的具体用法?C++ cast怎么用?C++ cast使用的例子?那么恭喜您, 这里精选的函数代码示例或许可以为您提供帮助。
在下文中一共展示了cast函数的20个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于我们的系统推荐出更棒的C++代码示例。
示例1: Reference_Eq
var Reference_Eq(var self, var obj)
{
ReferenceData *rd0 = cast(self, Reference);
ReferenceData *rd1 = cast(obj, Reference);
return bool_var(rd0->ref is rd1->ref);
}
开发者ID:whatot,项目名称:ma_c,代码行数:6,代码来源:Reference.c
示例2: Mold_String_Series
static void Mold_String_Series(const REBVAL *value, REB_MOLD *mold)
{
REBCNT len = VAL_LEN(value);
REBSER *ser = VAL_SERIES(value);
REBCNT idx = VAL_INDEX(value);
REBYTE *bp;
REBUNI *up;
REBUNI *dp;
REBOOL uni = !BYTE_SIZE(ser);
REBCNT n;
REBUNI c;
REB_STRF sf;
CLEARS(&sf);
// Empty string:
if (idx >= VAL_TAIL(value)) {
Append_Unencoded(mold->series, "\"\""); //Trap_DEAD_END(RE_PAST_END);
return;
}
Sniff_String(ser, idx, &sf);
if (!GET_MOPT(mold, MOPT_ANSI_ONLY)) sf.paren = 0;
// Source can be 8 or 16 bits:
if (uni) up = UNI_HEAD(ser);
else bp = STR_HEAD(ser);
// If it is a short quoted string, emit it as "string":
if (len <= MAX_QUOTED_STR && sf.quote == 0 && sf.newline < 3) {
dp = Prep_Uni_Series(mold, len + sf.newline + sf.escape + sf.paren + sf.chr1e + 2);
*dp++ = '"';
for (n = idx; n < VAL_TAIL(value); n++) {
c = uni ? up[n] : cast(REBUNI, bp[n]);
dp = Emit_Uni_Char(dp, c, (REBOOL)GET_MOPT(mold, MOPT_ANSI_ONLY)); // parened
}
*dp++ = '"';
*dp = 0;
return;
}
// It is a braced string, emit it as {string}:
if (!sf.malign) sf.brace_in = sf.brace_out = 0;
dp = Prep_Uni_Series(mold, len + sf.brace_in + sf.brace_out + sf.escape + sf.paren + sf.chr1e + 2);
*dp++ = '{';
for (n = idx; n < VAL_TAIL(value); n++) {
c = uni ? up[n] : cast(REBUNI, bp[n]);
switch (c) {
case '{':
case '}':
if (sf.malign) {
*dp++ = '^';
*dp++ = c;
break;
}
case '\n':
case '"':
*dp++ = c;
break;
default:
dp = Emit_Uni_Char(dp, c, (REBOOL)GET_MOPT(mold, MOPT_ANSI_ONLY)); // parened
}
}
*dp++ = '}';
*dp = 0;
}
开发者ID:draegtun,项目名称:ren-c,代码行数:75,代码来源:s-mold.c
示例3: cast_possible
bool cast_possible(caValue* source, Type* type)
{
CastResult result;
cast(&result, source, type, true);
return result.success;
}
开发者ID:RickMoynihan,项目名称:circa,代码行数:6,代码来源:tagged_value.cpp
示例4: Tree_Delete
var Tree_Delete(var self) {
TreeData* td = cast(self, Tree);
clear(self);
delete(td->keys);
return self;
}
开发者ID:felipecruz,项目名称:CPlus,代码行数:6,代码来源:Tree+.c
示例5: assert
void BVH8Intersector1<robust,PrimitiveIntersector>::intersect(const BVH8* bvh, Ray& ray)
{
/* verify correct input */
assert(ray.tnear >= 0.0f);
assert(ray.tnear <= ray.tfar);
/*! perform per ray precalculations required by the primitive intersector */
Precalculations pre(ray,bvh);
/*! stack state */
StackItemT<NodeRef> stack[stackSize]; //!< stack of nodes
StackItemT<NodeRef>* stackPtr = stack+1; //!< current stack pointer
StackItemT<NodeRef>* stackEnd = stack+stackSize;
stack[0].ptr = bvh->root;
stack[0].dist = neg_inf;
/*! load the ray into SIMD registers */
const Vec3f8 norg(-ray.org.x,-ray.org.y,-ray.org.z);
const Vec3fa ray_rdir = rcp_safe(ray.dir);
const Vec3f8 rdir(ray_rdir.x,ray_rdir.y,ray_rdir.z);
const Vec3fa ray_org_rdir = ray.org*ray_rdir;
const Vec3f8 org_rdir(ray_org_rdir.x,ray_org_rdir.y,ray_org_rdir.z);
const float8 ray_near(ray.tnear);
float8 ray_far(ray.tfar);
/*! offsets to select the side that becomes the lower or upper bound */
const size_t nearX = ray_rdir.x >= 0.0f ? 0*sizeof(float8) : 1*sizeof(float8);
const size_t nearY = ray_rdir.y >= 0.0f ? 2*sizeof(float8) : 3*sizeof(float8);
const size_t nearZ = ray_rdir.z >= 0.0f ? 4*sizeof(float8) : 5*sizeof(float8);
/* pop loop */
while (true) pop:
{
/*! pop next node */
if (unlikely(stackPtr == stack)) break;
stackPtr--;
NodeRef cur = NodeRef(stackPtr->ptr);
/*! if popped node is too far, pop next one */
if (unlikely(*(float*)&stackPtr->dist > ray.tfar))
continue;
/* downtraversal loop */
while (true)
{
/*! stop if we found a leaf */
if (unlikely(cur.isLeaf())) break;
STAT3(normal.trav_nodes,1,1,1);
/*! single ray intersection with 4 boxes */
const Node* node = cur.node();
const size_t farX = nearX ^ sizeof(float8), farY = nearY ^ sizeof(float8), farZ = nearZ ^ sizeof(float8);
#if defined (__AVX2__)
const float8 tNearX = msub(load8f((const char*)node+nearX), rdir.x, org_rdir.x);
const float8 tNearY = msub(load8f((const char*)node+nearY), rdir.y, org_rdir.y);
const float8 tNearZ = msub(load8f((const char*)node+nearZ), rdir.z, org_rdir.z);
const float8 tFarX = msub(load8f((const char*)node+farX ), rdir.x, org_rdir.x);
const float8 tFarY = msub(load8f((const char*)node+farY ), rdir.y, org_rdir.y);
const float8 tFarZ = msub(load8f((const char*)node+farZ ), rdir.z, org_rdir.z);
#else
const float8 tNearX = (norg.x + load8f((const char*)node+nearX)) * rdir.x;
const float8 tNearY = (norg.y + load8f((const char*)node+nearY)) * rdir.y;
const float8 tNearZ = (norg.z + load8f((const char*)node+nearZ)) * rdir.z;
const float8 tFarX = (norg.x + load8f((const char*)node+farX )) * rdir.x;
const float8 tFarY = (norg.y + load8f((const char*)node+farY )) * rdir.y;
const float8 tFarZ = (norg.z + load8f((const char*)node+farZ )) * rdir.z;
#endif
const float round_down = 1.0f-2.0f*float(ulp);
const float round_up = 1.0f+2.0f*float(ulp);
#if defined(__AVX2__)
const float8 tNear = maxi(maxi(tNearX,tNearY),maxi(tNearZ,ray_near));
const float8 tFar = mini(mini(tFarX ,tFarY ),mini(tFarZ ,ray_far ));
const bool8 vmask = robust ? (round_down*tNear > round_up*tFar) : cast(tNear) > cast(tFar);
size_t mask = movemask(vmask)^0xff;
#else
const float8 tNear = max(tNearX,tNearY,tNearZ,ray_near);
const float8 tFar = min(tFarX ,tFarY ,tFarZ ,ray_far);
const bool8 vmask = robust ? (round_down*tNear > round_up*tFar) : tNear <= tFar;
size_t mask = movemask(vmask);
#endif
/*! if no child is hit, pop next node */
if (unlikely(mask == 0))
goto pop;
/*! one child is hit, continue with that child */
size_t r = __bscf(mask);
if (likely(mask == 0)) {
cur = node->child(r); cur.prefetch();
assert(cur != BVH8::emptyNode);
continue;
}
/*! two children are hit, push far child, and continue with closer child */
NodeRef c0 = node->child(r); c0.prefetch(); const unsigned int d0 = ((unsigned int*)&tNear)[r];
r = __bscf(mask);
NodeRef c1 = node->child(r); c1.prefetch(); const unsigned int d1 = ((unsigned int*)&tNear)[r];
assert(c0 != BVH8::emptyNode);
//.........这里部分代码省略.........
开发者ID:baxelrod,项目名称:embree,代码行数:101,代码来源:bvh8_intersector1.cpp
示例6: org
__forceinline void BVH4Intersector8Hybrid<PrimitiveIntersector8>::intersect1(const BVH4* bvh, NodeRef root, size_t k, Ray8& ray,
avx3f ray_org, avx3f ray_dir, avx3f ray_rdir, avxf ray_tnear, avxf ray_tfar)
{
/*! stack state */
StackItem stack[stackSizeSingle]; //!< stack of nodes
StackItem* stackPtr = stack+1; //!< current stack pointer
StackItem* stackEnd = stack+stackSizeSingle;
stack[0].ptr = root;
stack[0].dist = neg_inf;
/*! offsets to select the side that becomes the lower or upper bound */
const size_t nearX = ray_dir.x[k] >= 0.0f ? 0*sizeof(ssef) : 1*sizeof(ssef);
const size_t nearY = ray_dir.y[k] >= 0.0f ? 2*sizeof(ssef) : 3*sizeof(ssef);
const size_t nearZ = ray_dir.z[k] >= 0.0f ? 4*sizeof(ssef) : 5*sizeof(ssef);
/*! load the ray into SIMD registers */
const sse3f org (ray_org .x[k],ray_org .y[k],ray_org .z[k]);
const sse3f rdir(ray_rdir.x[k],ray_rdir.y[k],ray_rdir.z[k]);
const sse3f org_rdir(org*rdir);
ssef rayNear(ray_tnear[k]), rayFar(ray_tfar[k]);
/* pop loop */
while (true) pop:
{
/*! pop next node */
if (unlikely(stackPtr == stack)) break;
stackPtr--;
NodeRef cur = NodeRef(stackPtr->ptr);
/*! if popped node is too far, pop next one */
if (unlikely(stackPtr->dist > ray.tfar[k]))
continue;
/* downtraversal loop */
while (true)
{
/*! stop if we found a leaf */
if (unlikely(cur.isLeaf())) break;
STAT3(normal.trav_nodes,1,1,1);
/*! single ray intersection with 4 boxes */
const Node* node = cur.node();
const size_t farX = nearX ^ 16, farY = nearY ^ 16, farZ = nearZ ^ 16;
#if defined (__AVX2__)
const ssef tNearX = msub(load4f((const char*)node+nearX), rdir.x, org_rdir.x);
const ssef tNearY = msub(load4f((const char*)node+nearY), rdir.y, org_rdir.y);
const ssef tNearZ = msub(load4f((const char*)node+nearZ), rdir.z, org_rdir.z);
const ssef tFarX = msub(load4f((const char*)node+farX ), rdir.x, org_rdir.x);
const ssef tFarY = msub(load4f((const char*)node+farY ), rdir.y, org_rdir.y);
const ssef tFarZ = msub(load4f((const char*)node+farZ ), rdir.z, org_rdir.z);
#else
const ssef tNearX = (load4f((const char*)node+nearX) - org.x) * rdir.x;
const ssef tNearY = (load4f((const char*)node+nearY) - org.y) * rdir.y;
const ssef tNearZ = (load4f((const char*)node+nearZ) - org.z) * rdir.z;
const ssef tFarX = (load4f((const char*)node+farX ) - org.x) * rdir.x;
const ssef tFarY = (load4f((const char*)node+farY ) - org.y) * rdir.y;
const ssef tFarZ = (load4f((const char*)node+farZ ) - org.z) * rdir.z;
#endif
#if defined(__SSE4_1__)
const ssef tNear = maxi(maxi(tNearX,tNearY),maxi(tNearZ,rayNear));
const ssef tFar = mini(mini(tFarX ,tFarY ),mini(tFarZ ,rayFar ));
const sseb vmask = cast(tNear) > cast(tFar);
size_t mask = movemask(vmask)^0xf;
#else
const ssef tNear = max(tNearX,tNearY,tNearZ,rayNear);
const ssef tFar = min(tFarX ,tFarY ,tFarZ ,rayFar);
const sseb vmask = tNear <= tFar;
size_t mask = movemask(vmask);
#endif
/*! if no child is hit, pop next node */
if (unlikely(mask == 0))
goto pop;
/*! one child is hit, continue with that child */
size_t r = bitscan(mask); mask = __btc(mask,r);
if (likely(mask == 0)) {
cur = node->child(r);
assert(cur != BVH4::emptyNode);
continue;
}
/*! two children are hit, push far child, and continue with closer child */
NodeRef c0 = node->child(r); const float d0 = tNear[r];
r = bitscan(mask); mask = __btc(mask,r);
NodeRef c1 = node->child(r); const float d1 = tNear[r];
assert(c0 != BVH4::emptyNode);
assert(c1 != BVH4::emptyNode);
if (likely(mask == 0)) {
assert(stackPtr < stackEnd);
if (d0 < d1) { stackPtr->ptr = c1; stackPtr->dist = d1; stackPtr++; cur = c0; continue; }
else { stackPtr->ptr = c0; stackPtr->dist = d0; stackPtr++; cur = c1; continue; }
}
/*! Here starts the slow path for 3 or 4 hit children. We push
* all nodes onto the stack to sort them there. */
assert(stackPtr < stackEnd);
stackPtr->ptr = c0; stackPtr->dist = d0; stackPtr++;
assert(stackPtr < stackEnd);
//.........这里部分代码省略.........
开发者ID:dboogert,项目名称:embree,代码行数:101,代码来源:bvh4_intersector8_hybrid.cpp
示例7: cast
bool WebNativeEventListener::operator==(const WebCore::EventListener& other)
{
const WebNativeEventListener* ptrOther = cast(&other);
return ptrOther && m_listener == ptrOther->m_listener;
}
开发者ID:mikedougherty,项目名称:webkit,代码行数:5,代码来源:WebNativeEventListener.cpp
示例8: ShadowContainer
static ShadowLayerParent*
ShadowContainer(const OpRaiseToTopChild& op)
{
return cast(op.containerParent());
}
开发者ID:AshishNamdev,项目名称:mozilla-central,代码行数:5,代码来源:ShadowLayersParent.cpp
示例9: ShadowChild
static ShadowLayerParent*
ShadowChild(const OpRaiseToTopChild& op)
{
return cast(op.childLayerParent());
}
开发者ID:AshishNamdev,项目名称:mozilla-central,代码行数:5,代码来源:ShadowLayersParent.cpp
示例10: Reference_Exit
void Reference_Exit(var self)
{
ReferenceData *rd = cast(self, Reference);
delete(rd->ref);
}
开发者ID:whatot,项目名称:ma_c,代码行数:5,代码来源:Reference.c
示例11: ShadowAfter
static ShadowLayerParent*
ShadowAfter(const OpRepositionChild& op)
{
return cast(op.afterParent());
}
开发者ID:AshishNamdev,项目名称:mozilla-central,代码行数:5,代码来源:ShadowLayersParent.cpp
示例12: Reference_Set
void Reference_Set(var self, int i, var x)
{
ReferenceData *rd = cast(self, Reference);
rd->ref = x;
}
开发者ID:whatot,项目名称:ma_c,代码行数:5,代码来源:Reference.c
示例13: Reference_At
var Reference_At(var self, int i)
{
ReferenceData *rd = cast(self, Reference);
return rd->ref;
}
开发者ID:whatot,项目名称:ma_c,代码行数:5,代码来源:Reference.c
示例14: Reference_Hash
long Reference_Hash(var self)
{
ReferenceData *rd = cast(self, Reference);
return (long)(intptr_t) (rd->ref);
}
开发者ID:whatot,项目名称:ma_c,代码行数:5,代码来源:Reference.c
示例15: MOZ_LAYERS_LOG
bool
ShadowLayersParent::RecvUpdate(const InfallibleTArray<Edit>& cset,
const TargetConfig& targetConfig,
const bool& isFirstPaint,
InfallibleTArray<EditReply>* reply)
{
#ifdef COMPOSITOR_PERFORMANCE_WARNING
TimeStamp updateStart = TimeStamp::Now();
#endif
MOZ_LAYERS_LOG(("[ParentSide] received txn with %d edits", cset.Length()));
if (mDestroyed || layer_manager()->IsDestroyed()) {
return true;
}
EditReplyVector replyv;
layer_manager()->BeginTransactionWithTarget(NULL);
for (EditArray::index_type i = 0; i < cset.Length(); ++i) {
const Edit& edit = cset[i];
switch (edit.type()) {
// Create* ops
case Edit::TOpCreateThebesLayer: {
MOZ_LAYERS_LOG(("[ParentSide] CreateThebesLayer"));
nsRefPtr<ShadowThebesLayer> layer =
layer_manager()->CreateShadowThebesLayer();
layer->SetAllocator(this);
AsShadowLayer(edit.get_OpCreateThebesLayer())->Bind(layer);
break;
}
case Edit::TOpCreateContainerLayer: {
MOZ_LAYERS_LOG(("[ParentSide] CreateContainerLayer"));
nsRefPtr<ContainerLayer> layer = layer_manager()->CreateShadowContainerLayer();
AsShadowLayer(edit.get_OpCreateContainerLayer())->Bind(layer);
break;
}
case Edit::TOpCreateImageLayer: {
MOZ_LAYERS_LOG(("[ParentSide] CreateImageLayer"));
nsRefPtr<ShadowImageLayer> layer =
layer_manager()->CreateShadowImageLayer();
AsShadowLayer(edit.get_OpCreateImageLayer())->Bind(layer);
break;
}
case Edit::TOpCreateColorLayer: {
MOZ_LAYERS_LOG(("[ParentSide] CreateColorLayer"));
nsRefPtr<ShadowColorLayer> layer = layer_manager()->CreateShadowColorLayer();
AsShadowLayer(edit.get_OpCreateColorLayer())->Bind(layer);
break;
}
case Edit::TOpCreateCanvasLayer: {
MOZ_LAYERS_LOG(("[ParentSide] CreateCanvasLayer"));
nsRefPtr<ShadowCanvasLayer> layer =
layer_manager()->CreateShadowCanvasLayer();
layer->SetAllocator(this);
AsShadowLayer(edit.get_OpCreateCanvasLayer())->Bind(layer);
break;
}
case Edit::TOpCreateRefLayer: {
MOZ_LAYERS_LOG(("[ParentSide] CreateRefLayer"));
nsRefPtr<ShadowRefLayer> layer =
layer_manager()->CreateShadowRefLayer();
layer->SetAllocator(this);
AsShadowLayer(edit.get_OpCreateRefLayer())->Bind(layer);
break;
}
// Attributes
case Edit::TOpSetLayerAttributes: {
MOZ_LAYERS_LOG(("[ParentSide] SetLayerAttributes"));
const OpSetLayerAttributes& osla = edit.get_OpSetLayerAttributes();
Layer* layer = AsShadowLayer(osla)->AsLayer();
const LayerAttributes& attrs = osla.attrs();
const CommonLayerAttributes& common = attrs.common();
layer->SetVisibleRegion(common.visibleRegion());
layer->SetContentFlags(common.contentFlags());
layer->SetOpacity(common.opacity());
layer->SetClipRect(common.useClipRect() ? &common.clipRect() : NULL);
layer->SetBaseTransform(common.transform().value());
layer->SetPostScale(common.postXScale(), common.postYScale());
static bool fixedPositionLayersEnabled = getenv("MOZ_ENABLE_FIXED_POSITION_LAYERS") != 0;
if (fixedPositionLayersEnabled) {
layer->SetIsFixedPosition(common.isFixedPosition());
layer->SetFixedPositionAnchor(common.fixedPositionAnchor());
}
if (PLayerParent* maskLayer = common.maskLayerParent()) {
layer->SetMaskLayer(cast(maskLayer)->AsLayer());
} else {
layer->SetMaskLayer(NULL);
}
//.........这里部分代码省略.........
开发者ID:AshishNamdev,项目名称:mozilla-central,代码行数:101,代码来源:ShadowLayersParent.cpp
示例16: AsShadowLayer
static ShadowLayerParent*
AsShadowLayer(const OpCreateT& op)
{
return cast(op.layerParent());
}
开发者ID:AshishNamdev,项目名称:mozilla-central,代码行数:5,代码来源:ShadowLayersParent.cpp
示例17: addk
static int addk (FuncState *fs, TObject *k, TObject *v) {
const TObject *idx = luaH_get(fs->h, k);
#if LUA_REFCOUNT
lua_State *L = fs->L; (void)L;
#endif LUA_REFCOUNT
if (ttisnumber(idx)) {
lua_assert(luaO_rawequalObj(&fs->f->k[cast(int, nvalue(idx))], v));
return cast(int, nvalue(idx));
}
else { /* constant not found; create a new entry */
Proto *f = fs->f;
luaM_growvector(fs->L, f->k, fs->nk, f->sizek, TObject,
MAXARG_Bx, "constant table overflow");
setobj2n(&f->k[fs->nk], v);
setnvalue(luaH_set(fs->L, fs->h, k), cast(lua_Number, fs->nk));
return fs->nk++;
}
}
int luaK_stringK (FuncState *fs, TString *s) {
#if LUA_REFCOUNT
lua_State *L = fs->L;
int ret;
TObject o;
setsvalue2n(&o, s);
ret = addk(fs, &o, &o);
setnilvalue(&o);
return ret;
#else !LUA_REFCOUNT
开发者ID:gitrider,项目名称:wxsj2,代码行数:30,代码来源:lcode.c
示例18: call
Tree call(Tree f, Type fty, Coordinate src) {
int n = 0;
Tree args = NULL, r = NULL, e;
Type *proto, rty = unqual(freturn(fty));
Symbol t3 = NULL;
if (fty->u.f.oldstyle)
proto = NULL;
else
proto = fty->u.f.proto;
if (hascall(f))
r = f;
if (isstruct(rty))
{
t3 = temporary(AUTO, unqual(rty));
if (rty->size == 0)
error("illegal use of incomplete type `%t'\n", rty);
}
if (t != ')')
for (;;) {
Tree q = pointer(expr1(0));
if (proto && *proto && *proto != voidtype)
{
Type aty;
q = value(q);
aty = assign(*proto, q);
if (aty)
q = cast(q, aty);
else
error("type error in argument %d to %s; found `%t' expected `%t'\n", n + 1, funcname(f),
q->type, *proto);
if ((isint(q->type) || isenum(q->type))
&& q->type->size != inttype->size)
q = cast(q, promote(q->type));
++proto;
}
else
{
if (!fty->u.f.oldstyle && *proto == NULL)
error("too many arguments to %s\n", funcname(f));
q = value(q);
if (isarray(q->type) || q->type->size == 0)
error("type error in argument %d to %s; `%t' is illegal\n", n + 1, funcname(f), q->type);
else
q = cast(q, promote(q->type));
}
if (!IR->wants_argb && isstruct(q->type))
if (iscallb(q))
q = addrof(q);
else {
Symbol t1 = temporary(AUTO, unqual(q->type));
q = asgn(t1, q);
q = tree(RIGHT, ptr(t1->type),
root(q), lvalue(idtree(t1)));
}
if (q->type->size == 0)
q->type = inttype;
if (hascall(q))
r = r ? tree(RIGHT, voidtype, r, q) : q;
args = tree(mkop(ARG, q->type), q->type, q, args);
n++;
if (Aflag >= 2 && n == 32)
warning("more than 31 arguments in a call to %s\n",
funcname(f));
if (t != ',')
break;
t = gettok();
}
expect(')');
if (proto && *proto && *proto != voidtype)
error("insufficient number of arguments to %s\n",
funcname(f));
if (r)
args = tree(RIGHT, voidtype, r, args);
e = calltree(f, rty, args, t3);
if (events.calls)
apply(events.calls, &src, &e);
return e;
}
开发者ID:UraKn0x,项目名称:gbdk,代码行数:81,代码来源:enode.c
示例19: cast
bool cast(caValue* value, Type* type)
{
CastResult result;
cast(&result, value, type, false);
return result.success;
}
开发者ID:RickMoynihan,项目名称:circa,代码行数:6,代码来源:tagged_value.cpp
示例20: argput
/*
* Do the "hard work" in assigning correct destination for arguments.
* Also convert arguments < INT to inte (default argument promotions).
* XXX - should be dome elsewhere.
*/
static NODE *
argput(NODE *p)
{
NODE *q;
TWORD ty;
int typ, r, ssz;
if (p->n_op == CM) {
p->n_left = argput(p->n_left);
p->n_right = argput(p->n_right);
return p;
}
/* first arg may be struct return pointer */
/* XXX - check if varargs; setup al */
switch (typ = argtyp(p->n_type, p->n_df, p->n_ap)) {
case INTEGER:
case SSE:
if (typ == SSE)
r = XMM0 + nsse++;
else
r = argregsi[ngpr++];
if (p->n_type < INT || p->n_type == BOOL)
p = cast(p, INT, 0);
p = movtoreg(p, r);
break;
case X87:
r = nrsp;
nrsp += SZLDOUBLE;
p = movtomem(p, r, STKREG);
break;
case SSEMEM:
r = nrsp;
nrsp += SZDOUBLE;
p = movtomem(p, r, STKREG);
break;
case INTMEM:
r = nrsp;
nrsp += SZLONG;
p = movtomem(p, r, STKREG);
break;
case STRCPX:
case STRREG: /* Struct in registers */
/* Cast to long pointer and move to the registers */
/* XXX can overrun struct size */
/* XXX check carefully for SSE members */
ssz = tsize(p->n_type, p->n_df, p->n_ap);
if (typ == STRCPX) {
ty = DOUBLE;
r = XMM0 + nsse++;
} else {
ty = LONG;
r = argregsi[ngpr++];
}
if (ssz <= SZLONG) {
q = cast(p->n_left, INCREF(ty), 0);
nfree(p);
q = buildtree(UMUL, q, NIL);
p = movtoreg(q, r);
} else if (ssz <= SZLONG*2) {
NODE *ql, *qr;
if (!ISPTR(p->n_left->n_type))
cerror("no struct arg pointer");
p = nfree(p);
p = makety(p, PTR|ty, 0, 0, 0);
qr = ccopy(ql = tempnode(0, PTR|ty, 0, 0));
p = buildtree(ASSIGN, ql, p);
ql = movtoreg(buildtree(UMUL, ccopy(qr), NIL), r);
p = buildtree(COMOP, p, ql);
ql = buildtree(UMUL, buildtree(PLUS, qr, bcon(1)), NIL);
r = (typ == STRCPX ? XMM0 + nsse++ : argregsi[ngpr++]);
ql = movtoreg(ql, r);
p = buildtree(CM, p, ql);
} else
cerror("STRREG");
break;
case STRMEM: {
struct symtab s;
NODE *l, *t;
q = buildtree(UMUL, p->n_left, NIL);
s.stype = p->n_type;
s.squal = 0;
s.sdf = p->n_df;
//.........这里部分代码省略.........
开发者ID:rheoli,项目名称:pcc,代码行数:101,代码来源:code.c
注:本文中的cast函数示例由纯净天空整理自Github/MSDocs等源码及文档管理平台,相关代码片段筛选自各路编程大神贡献的开源项目,源码版权归原作者所有,传播和使用请参考对应项目的License;未经允许,请勿转载。 |
请发表评论